/* Mapbox GL JS is licensed under the 3-Clause BSD License. Full text of license: https://github.com/mapbox/mapbox-gl-js/blob/v1.12.1-3/LICENSE.txt * Copyright (c) 2016, Mapbox * Copyright© 2000 - 2023 SuperMap Software Co. Ltd * 20230908 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = global || self, global.mapboxgl = factory()); }(this, (function () { 'use strict'; /* eslint-disable */ var shared, worker, mapboxgl; // define gets called three times: one for each chunk. we rely on the order // they're imported to know which is which function define(_, chunk) { if (!shared) { shared = chunk; } else if (!worker) { worker = chunk; } else { var workerBundleString = 'var sharedChunk = {}; (' + shared + ')(sharedChunk); (' + worker + ')(sharedChunk);' var sharedChunk = {}; shared(sharedChunk); mapboxgl = chunk(sharedChunk); if (typeof window !== 'undefined') { mapboxgl.workerUrl = window.URL.createObjectURL(new Blob([workerBundleString], { type: 'text/javascript' })); } } } define(['exports'], function (exports) { 'use strict'; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function commonjsRequire () { throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); } function unwrapExports (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } function getCjsExportFromNamespace (n) { return n && n['default'] || n; } /* object-assign (c) Sindre Sorhus @license MIT */ 'use strict'; /* eslint-disable no-unused-vars */ var getOwnPropertySymbols = Object.getOwnPropertySymbols; var hasOwnProperty = Object.prototype.hasOwnProperty; var propIsEnumerable = Object.prototype.propertyIsEnumerable; function toObject(val) { if (val === null || val === undefined) { throw new TypeError('Object.assign cannot be called with null or undefined'); } return Object(val); } function shouldUseNative() { try { if (!Object.assign) { return false; } // Detect buggy property enumeration order in older V8 versions. // https://bugs.chromium.org/p/v8/issues/detail?id=4118 var test1 = new String('abc'); // eslint-disable-line no-new-wrappers test1[5] = 'de'; if (Object.getOwnPropertyNames(test1)[0] === '5') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test2 = {}; for (var i = 0; i < 10; i++) { test2['_' + String.fromCharCode(i)] = i; } var order2 = Object.getOwnPropertyNames(test2).map(function (n) { return test2[n]; }); if (order2.join('') !== '0123456789') { return false; } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 var test3 = {}; 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { test3[letter] = letter; }); if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { return false; } return true; } catch (err) { // We don't expect any of the above to throw, but better to be safe. return false; } } var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { var arguments$1 = arguments; var from; var to = toObject(target); var symbols; for (var s = 1; s < arguments.length; s++) { from = Object(arguments$1[s]); for (var key in from) { if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } if (getOwnPropertySymbols) { symbols = getOwnPropertySymbols(from); for (var i = 0; i < symbols.length; i++) { if (propIsEnumerable.call(from, symbols[i])) { to[symbols[i]] = from[symbols[i]]; } } } } return to; }; var isBufferBrowser = function isBuffer(arg) { return arg && typeof arg === 'object' && typeof arg.copy === 'function' && typeof arg.fill === 'function' && typeof arg.readUInt8 === 'function'; }; var inherits_browser = createCommonjsModule(function (module) { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; }; } }); var util = createCommonjsModule(function (module, exports) { // Copyright Joyent, Inc. and other Node contributors. // // 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. var formatRegExp = /%[sdj%]/g; exports.format = function(f) { var arguments$1 = arguments; if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments$1[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') { return '%'; } if (i >= len) { return x; } switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) { debugEnviron = process.env.NODE_DEBUG || ''; } set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) { ctx.depth = arguments[2]; } if (arguments.length >= 4) { ctx.colors = arguments[3]; } if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } // set default options if (isUndefined(ctx.showHidden)) { ctx.showHidden = false; } if (isUndefined(ctx.depth)) { ctx.depth = 2; } if (isUndefined(ctx.colors)) { ctx.colors = false; } if (isUndefined(ctx.customInspect)) { ctx.customInspect = true; } if (ctx.colors) { ctx.stylize = stylizeWithColor; } return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics inspect.colors = { 'bold' : [1, 22], 'italic' : [3, 23], 'underline' : [4, 24], 'inverse' : [7, 27], 'white' : [37, 39], 'grey' : [90, 39], 'black' : [30, 39], 'blue' : [34, 39], 'cyan' : [36, 39], 'green' : [32, 39], 'magenta' : [35, 39], 'red' : [31, 39], 'yellow' : [33, 39] }; // Don't use 'blue' not visible on cmd.exe inspect.styles = { 'special': 'cyan', 'number': 'yellow', 'boolean': 'yellow', 'undefined': 'grey', 'null': 'bold', 'string': 'green', 'date': 'magenta', // "name": intentionally not styling 'regexp': 'red' }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function(val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // IE doesn't make error fields non-enumerable // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { return formatError(value); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) { return ctx.stylize('undefined', 'undefined'); } if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) { return ctx.stylize('' + value, 'number'); } if (isBoolean(value)) { return ctx.stylize('' + value, 'boolean'); } // For some reason typeof null is "object", so special case here. if (isNull(value)) { return ctx.stylize('null', 'null'); } } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) { if (array) { str = str.split('\n').map(function(line) { return ' ' + line; }).join('\n').substr(2); } else { str = '\n' + str.split('\n').map(function(line) { return ' ' + line; }).join('\n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function(prev, cur) { numLinesEst++; if (cur.indexOf('\n') >= 0) { numLinesEst++; } return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } // NOTE: These type checking functions intentionally don't use `instanceof` // because it is fragile and can be easily faked with `Object.create()`. function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === 'boolean'; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === 'number'; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; function isSymbol(arg) { return typeof arg === 'symbol'; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } exports.isRegExp = isRegExp; function isObject(arg) { return typeof arg === 'object' && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } exports.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } exports.isError = isError; function isFunction(arg) { return typeof arg === 'function'; } exports.isFunction = isFunction; function isPrimitive(arg) { return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol typeof arg === 'undefined'; } exports.isPrimitive = isPrimitive; exports.isBuffer = isBufferBrowser; function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = inherits_browser; exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) { return origin; } var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }); var util_1 = util.format; var util_2 = util.deprecate; var util_3 = util.debuglog; var util_4 = util.inspect; var util_5 = util.isArray; var util_6 = util.isBoolean; var util_7 = util.isNull; var util_8 = util.isNullOrUndefined; var util_9 = util.isNumber; var util_10 = util.isString; var util_11 = util.isSymbol; var util_12 = util.isUndefined; var util_13 = util.isRegExp; var util_14 = util.isObject; var util_15 = util.isDate; var util_16 = util.isError; var util_17 = util.isFunction; var util_18 = util.isPrimitive; var util_19 = util.isBuffer; var util_20 = util.log; var util_21 = util.inherits; var util_22 = util._extend; var assert_1 = createCommonjsModule(function (module) { 'use strict'; // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js // original notice: /*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh * @license MIT */ function compare(a, b) { if (a === b) { return 0; } var x = a.length; var y = b.length; for (var i = 0, len = Math.min(x, y); i < len; ++i) { if (a[i] !== b[i]) { x = a[i]; y = b[i]; break; } } if (x < y) { return -1; } if (y < x) { return 1; } return 0; } function isBuffer(b) { if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { return global.Buffer.isBuffer(b); } return !!(b != null && b._isBuffer); } // based on node assert, original notice: // NB: The URL to the CommonJS spec is kept just for tradition. // node-assert has evolved a lot since then, both in API and behavior. // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // 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 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. var hasOwn = Object.prototype.hasOwnProperty; var pSlice = Array.prototype.slice; var functionsHaveNames = (function () { return function foo() {}.name === 'foo'; }()); function pToString (obj) { return Object.prototype.toString.call(obj); } function isView(arrbuf) { if (isBuffer(arrbuf)) { return false; } if (typeof global.ArrayBuffer !== 'function') { return false; } if (typeof ArrayBuffer.isView === 'function') { return ArrayBuffer.isView(arrbuf); } if (!arrbuf) { return false; } if (arrbuf instanceof DataView) { return true; } if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { return true; } return false; } // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = module.exports = ok; // 2. The AssertionError is defined in assert. // new assert.AssertionError({ message: message, // actual: actual, // expected: expected }) var regex = /\s*function\s+([^\(\s]*)\s*/; // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js function getName(func) { if (!util.isFunction(func)) { return; } if (functionsHaveNames) { return func.name; } var str = func.toString(); var match = str.match(regex); return match && match[1]; } assert.AssertionError = function AssertionError(options) { this.name = 'AssertionError'; this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; if (options.message) { this.message = options.message; this.generatedMessage = false; } else { this.message = getMessage(this); this.generatedMessage = true; } var stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); } else { // non v8 browsers so we can have a stacktrace var err = new Error(); if (err.stack) { var out = err.stack; // try to strip useless frames var fn_name = getName(stackStartFunction); var idx = out.indexOf('\n' + fn_name); if (idx >= 0) { // once we have located the function frame // we need to strip out everything before it (and its line) var next_line = out.indexOf('\n', idx + 1); out = out.substring(next_line + 1); } this.stack = out; } } }; // assert.AssertionError instanceof Error util.inherits(assert.AssertionError, Error); function truncate(s, n) { if (typeof s === 'string') { return s.length < n ? s : s.slice(0, n); } else { return s; } } function inspect(something) { if (functionsHaveNames || !util.isFunction(something)) { return util.inspect(something); } var rawname = getName(something); var name = rawname ? ': ' + rawname : ''; return '[Function' + name + ']'; } function getMessage(self) { return truncate(inspect(self.actual), 128) + ' ' + self.operator + ' ' + truncate(inspect(self.expected), 128); } // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. function ok(value, message) { if (!value) { fail(value, true, message, '==', assert.ok); } } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) { fail(actual, expected, message, '==', assert.equal); } }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { if (!_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); } }; function _deepEqual(actual, expected, strict, memos) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (isBuffer(actual) && isBuffer(expected)) { return compare(actual, expected) === 0; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. } else if (util.isDate(actual) && util.isDate(expected)) { return actual.getTime() === expected.getTime(); // 7.3 If the expected value is a RegExp object, the actual value is // equivalent if it is also a RegExp object with the same source and // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). } else if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && actual.global === expected.global && actual.multiline === expected.multiline && actual.lastIndex === expected.lastIndex && actual.ignoreCase === expected.ignoreCase; // 7.4. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if ((actual === null || typeof actual !== 'object') && (expected === null || typeof expected !== 'object')) { return strict ? actual === expected : actual == expected; // If both values are instances of typed arrays, wrap their underlying // ArrayBuffers in a Buffer each to increase performance // This optimization requires the arrays to have the same type as checked by // Object.prototype.toString (aka pToString). Never perform binary // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their // bit patterns are not identical. } else if (isView(actual) && isView(expected) && pToString(actual) === pToString(expected) && !(actual instanceof Float32Array || actual instanceof Float64Array)) { return compare(new Uint8Array(actual.buffer), new Uint8Array(expected.buffer)) === 0; // 7.5 For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else if (isBuffer(actual) !== isBuffer(expected)) { return false; } else { memos = memos || {actual: [], expected: []}; var actualIndex = memos.actual.indexOf(actual); if (actualIndex !== -1) { if (actualIndex === memos.expected.indexOf(expected)) { return true; } } memos.actual.push(actual); memos.expected.push(expected); return objEquiv(actual, expected, strict, memos); } } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv(a, b, strict, actualVisitedObjects) { if (a === null || a === undefined || b === null || b === undefined) { return false; } // if one is a primitive, the other must be same if (util.isPrimitive(a) || util.isPrimitive(b)) { return a === b; } if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) { return false; } var aIsArgs = isArguments(a); var bIsArgs = isArguments(b); if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) { return false; } if (aIsArgs) { a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b, strict); } var ka = objectKeys(a); var kb = objectKeys(b); var key, i; // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length !== kb.length) { return false; } //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] !== kb[i]) { return false; } } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) { return false; } } return true; } // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (_deepEqual(actual, expected, false)) { fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); } }; assert.notDeepStrictEqual = notDeepStrictEqual; function notDeepStrictEqual(actual, expected, message) { if (_deepEqual(actual, expected, true)) { fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); } } // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { fail(actual, expected, message, '===', assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as // determined by !==. assert.notStrictEqual(actual, expected, message_opt); assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { fail(actual, expected, message, '!==', assert.notStrictEqual); } }; function expectedException(actual, expected) { if (!actual || !expected) { return false; } if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); } try { if (actual instanceof expected) { return true; } } catch (e) { // Ignore. The instanceof check doesn't work for arrow functions. } if (Error.isPrototypeOf(expected)) { return false; } return expected.call({}, actual) === true; } function _tryBlock(block) { var error; try { block(); } catch (e) { error = e; } return error; } function _throws(shouldThrow, block, expected, message) { var actual; if (typeof block !== 'function') { throw new TypeError('"block" argument must be a function'); } if (typeof expected === 'string') { message = expected; expected = null; } actual = _tryBlock(block); message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); if (shouldThrow && !actual) { fail(actual, expected, 'Missing expected exception' + message); } var userProvidedMessage = typeof message === 'string'; var isUnwantedException = !shouldThrow && util.isError(actual); var isUnexpectedException = !shouldThrow && actual && !expected; if ((isUnwantedException && userProvidedMessage && expectedException(actual, expected)) || isUnexpectedException) { fail(actual, expected, 'Got unwanted exception' + message); } if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws(true, block, error, message); }; // EXTENSION! This is annoying to write outside this module. assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { _throws(false, block, error, message); }; assert.ifError = function(err) { if (err) { throw err; } }; // Expose a strict only variant of assert function strict(value, message) { if (!value) { fail(value, true, message, '==', strict); } } assert.strict = objectAssign(strict, assert, { equal: assert.strictEqual, deepEqual: assert.deepStrictEqual, notEqual: assert.notStrictEqual, notDeepEqual: assert.notDeepStrictEqual }); assert.strict.strict = assert.strict; var objectKeys = Object.keys || function (obj) { var keys = []; for (var key in obj) { if (hasOwn.call(obj, key)) { keys.push(key); } } return keys; }; }); var name = "mapbox-gl"; var description = "A WebGL interactive maps library"; var version = "1.12.1-3"; var main = "dist/mapbox-gl.js"; var style = "dist/mapbox-gl.css"; var license = "SEE LICENSE IN LICENSE.txt"; var repository = { type: "git", url: "git://github.com/mapbox/mapbox-gl-js.git" }; var engines = { node: ">=6.4.0" }; var dependencies = { "@mapbox/geojson-rewind": "^0.5.0", "@mapbox/geojson-types": "^1.0.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^1.5.0", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^1.1.1", "@mapbox/unitbezier": "^0.0.0", "@mapbox/whoots-js": "^3.1.0", csscolorparser: "~1.0.3", earcut: "^2.2.2", "geojson-vt": "^3.2.1", "gl-matrix": "^3.2.1", "grid-index": "^1.1.0", kdbush: "^3.0.0", minimist: "^1.2.5", "murmurhash-js": "^1.0.0", pbf: "^3.2.1", potpack: "^1.0.1", proj4: "^2.9.0", quickselect: "^2.0.0", rw: "^1.3.3", tinyqueue: "^2.0.3", "vt-pbf": "^3.1.1" }; var devDependencies = { "@babel/core": "^7.9.0", "@mapbox/flow-remove-types": "^1.3.0-await.upstream.2", "@mapbox/gazetteer": "^4.0.4", "@mapbox/mapbox-gl-rtl-text": "^0.2.1", "@mapbox/mvt-fixtures": "^3.6.0", "@octokit/rest": "^16.30.1", "@rollup/plugin-strip": "^1.3.1", address: "^1.1.2", "babel-eslint": "^10.0.1", babelify: "^10.0.0", benchmark: "^2.1.4", browserify: "^16.5.0", canvas: "^2.6.1", chalk: "^3.0.0", chokidar: "^3.0.2", cssnano: "^4.1.10", d3: "^4.12.0", diff: "^4.0.1", documentation: "~12.1.1", ejs: "^2.5.7", eslint: "^5.15.3", "eslint-config-mourner": "^3.0.0", "eslint-plugin-flowtype": "^3.9.1", "eslint-plugin-html": "^5.0.5", "eslint-plugin-import": "^2.16.0", "eslint-plugin-jsdoc": "^17.1.2", "eslint-plugin-react": "^7.12.4", esm: "~3.0.84", "flow-bin": "^0.100.0", gl: "^4.5.3", glob: "^7.1.4", "is-builtin-module": "^3.0.0", jsdom: "^13.0.0", "json-stringify-pretty-compact": "^2.0.0", jsonwebtoken: "^8.3.0", "list-npm-contents": "^1.0.2", "lodash.template": "^4.5.0", "mapbox-gl-styles": "^2.0.2", "mock-geolocation": "^1.0.11", "node-notifier": "^5.4.3", "npm-font-open-sans": "^1.1.0", "npm-packlist": "^2.1.1", "npm-run-all": "^4.1.5", nyc: "^13.3.0", pirates: "^4.0.1", pixelmatch: "^5.1.0", pngjs: "^3.4.0", "postcss-cli": "^6.1.2", "postcss-inline-svg": "^3.1.1", "pretty-bytes": "^5.1.0", puppeteer: "^1.18.0", "qrcode-terminal": "^0.12.0", react: "^16.8.6", "react-dom": "^16.8.6", request: "^2.88.0", rollup: "^1.23.1", "rollup-plugin-buble": "^0.19.8", "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-json": "^4.0.0", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-replace": "^2.2.0", "rollup-plugin-sourcemaps": "^0.4.2", "rollup-plugin-terser": "^5.1.2", "rollup-plugin-unassert": "^0.3.0", "selenium-webdriver": "^4.0.0-alpha.5", "shuffle-seed": "^1.1.6", sinon: "^7.3.2", st: "^1.2.2", stylelint: "^9.10.1", "stylelint-config-standard": "^18.2.0", tap: "~12.4.1", "tap-parser": "^10.0.1", tape: "^4.13.2", "tape-filter": "^1.0.4", testem: "^3.0.0" }; var browser = { "./src/shaders/index.js": "./src/shaders/shaders.js", "./src/util/window.js": "./src/util/browser/window.js", "./src/util/web_worker.js": "./src/util/browser/web_worker.js" }; var esm = true; var scripts = { "build-dev": "rollup -c --environment BUILD:dev", "watch-dev": "rollup -c --environment BUILD:dev --watch", "build-prod": "rollup -c --environment BUILD:production", "build-prod-min": "rollup -c --environment BUILD:production,MINIFY:true", "build-csp": "rollup -c rollup.config.csp.js", "build-query-suite": "rollup -c test/integration/rollup.config.test.js", "build-flow-types": "mkdir -p dist && cp build/mapbox-gl.js.flow dist/mapbox-gl.js.flow && cp build/mapbox-gl.js.flow dist/mapbox-gl-dev.js.flow", "build-css": "postcss -o dist/mapbox-gl.css src/css/mapbox-gl.css", "build-style-spec": "cd src/style-spec && npm run build && cd ../.. && mkdir -p dist/style-spec && cp src/style-spec/dist/* dist/style-spec", "watch-css": "postcss --watch -o dist/mapbox-gl.css src/css/mapbox-gl.css", "build-token": "node build/generate-access-token-script.js", "build-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/versions/rollup_config_benchmarks.js", "watch-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/rollup_config_benchmarks.js -w", "start-server": "st --no-cache -H 0.0.0.0 --port 9966 --index index.html .", start: "run-p build-token watch-css watch-query watch-benchmarks start-server", "start-debug": "run-p build-token watch-css watch-dev start-server", "start-tests": "run-p build-token watch-css watch-query start-server", "start-bench": "run-p build-token watch-benchmarks start-server", "start-release": "run-s build-token build-prod-min build-css print-release-url start-server", "diff-tarball": "build/run-node build/diff-tarball && echo \"Please confirm the above is correct [y/n]? \"; read answer; if [ \"$answer\" = \"${answer#[Yy]}\" ]; then false; fi", "prepare-publish": "git clean -fdx && yarn install", lint: "eslint --cache --ignore-path .gitignore src test bench debug/*.html", "lint-docs": "documentation lint src/index.js", "lint-css": "stylelint 'src/css/mapbox-gl.css'", test: "run-s lint lint-css lint-docs test-flow test-unit", "test-suite": "run-s test-render test-query test-expressions", "test-suite-clean": "find test/integration/{render,query, expressions}-tests -mindepth 2 -type d -exec test -e \"{}/actual.png\" \\; -not \\( -exec test -e \"{}/style.json\" \\; \\) -print | xargs -t rm -r", "test-unit": "build/run-tap --reporter classic --no-coverage test/unit", "test-build": "build/run-tap --no-coverage test/build/**/*.test.js", "test-browser": "build/run-tap --reporter spec --no-coverage test/browser/**/*.test.js", "test-render": "node --max-old-space-size=2048 test/render.test.js", "test-query-node": "node test/query.test.js", "watch-query": "testem -f test/integration/testem.js", "test-query": "testem ci -f test/integration/testem.js -R xunit > test/integration/query-tests/test-results.xml", "test-expressions": "build/run-node test/expression.test.js", "test-flow": "build/run-node build/generate-flow-typed-style-spec && flow .", "test-cov": "nyc --require=@mapbox/flow-remove-types/register --reporter=text-summary --reporter=lcov --cache run-s test-unit test-expressions test-query test-render", prepublishOnly: "run-s prepare-publish build-flow-types build-dev build-prod-min build-prod build-csp build-css build-style-spec test-build diff-tarball", "print-release-url": "node build/print-release-url.js", codegen: "build/run-node build/generate-style-code.js && build/run-node build/generate-struct-arrays.js" }; var files = [ "build/", "dist/mapbox-gl*", "dist/style-spec/", "flow-typed/*.js", "src/", ".flowconfig" ]; var _package = { name: name, description: description, version: version, main: main, style: style, license: license, repository: repository, engines: engines, dependencies: dependencies, devDependencies: devDependencies, browser: browser, esm: esm, scripts: scripts, files: files }; /* * Copyright (C) 2008 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Ported from Webkit * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h */ var unitbezier = UnitBezier; function UnitBezier(p1x, p1y, p2x, p2y) { // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). this.cx = 3.0 * p1x; this.bx = 3.0 * (p2x - p1x) - this.cx; this.ax = 1.0 - this.cx - this.bx; this.cy = 3.0 * p1y; this.by = 3.0 * (p2y - p1y) - this.cy; this.ay = 1.0 - this.cy - this.by; this.p1x = p1x; this.p1y = p2y; this.p2x = p2x; this.p2y = p2y; } UnitBezier.prototype.sampleCurveX = function(t) { // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. return ((this.ax * t + this.bx) * t + this.cx) * t; }; UnitBezier.prototype.sampleCurveY = function(t) { return ((this.ay * t + this.by) * t + this.cy) * t; }; UnitBezier.prototype.sampleCurveDerivativeX = function(t) { return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; }; UnitBezier.prototype.solveCurveX = function(x, epsilon) { if (typeof epsilon === 'undefined') { epsilon = 1e-6; } var t0, t1, t2, x2, i; // First try a few iterations of Newton's method -- normally very fast. for (t2 = x, i = 0; i < 8; i++) { x2 = this.sampleCurveX(t2) - x; if (Math.abs(x2) < epsilon) { return t2; } var d2 = this.sampleCurveDerivativeX(t2); if (Math.abs(d2) < 1e-6) { break; } t2 = t2 - x2 / d2; } // Fall back to the bisection method for reliability. t0 = 0.0; t1 = 1.0; t2 = x; if (t2 < t0) { return t0; } if (t2 > t1) { return t1; } while (t0 < t1) { x2 = this.sampleCurveX(t2); if (Math.abs(x2 - x) < epsilon) { return t2; } if (x > x2) { t0 = t2; } else { t1 = t2; } t2 = (t1 - t0) * 0.5 + t0; } // Failure. return t2; }; UnitBezier.prototype.solve = function(x, epsilon) { return this.sampleCurveY(this.solveCurveX(x, epsilon)); }; 'use strict'; var pointGeometry = Point; /** * A standalone point geometry with useful accessor, comparison, and * modification methods. * * @class Point * @param {Number} x the x-coordinate. this could be longitude or screen * pixels, or any other sort of unit. * @param {Number} y the y-coordinate. this could be latitude or screen * pixels, or any other sort of unit. * @example * var point = new Point(-77, 38); */ function Point(x, y) { this.x = x; this.y = y; } Point.prototype = { /** * Clone this point, returning a new point that can be modified * without affecting the old one. * @return {Point} the clone */ clone: function() { return new Point(this.x, this.y); }, /** * Add this point's x & y coordinates to another point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ add: function(p) { return this.clone()._add(p); }, /** * Subtract this point's x & y coordinates to from point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ sub: function(p) { return this.clone()._sub(p); }, /** * Multiply this point's x & y coordinates by point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ multByPoint: function(p) { return this.clone()._multByPoint(p); }, /** * Divide this point's x & y coordinates by point, * yielding a new point. * @param {Point} p the other point * @return {Point} output point */ divByPoint: function(p) { return this.clone()._divByPoint(p); }, /** * Multiply this point's x & y coordinates by a factor, * yielding a new point. * @param {Point} k factor * @return {Point} output point */ mult: function(k) { return this.clone()._mult(k); }, /** * Divide this point's x & y coordinates by a factor, * yielding a new point. * @param {Point} k factor * @return {Point} output point */ div: function(k) { return this.clone()._div(k); }, /** * Rotate this point around the 0, 0 origin by an angle a, * given in radians * @param {Number} a angle to rotate around, in radians * @return {Point} output point */ rotate: function(a) { return this.clone()._rotate(a); }, /** * Rotate this point around p point by an angle a, * given in radians * @param {Number} a angle to rotate around, in radians * @param {Point} p Point to rotate around * @return {Point} output point */ rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); }, /** * Multiply this point by a 4x1 transformation matrix * @param {Array} m transformation matrix * @return {Point} output point */ matMult: function(m) { return this.clone()._matMult(m); }, /** * Calculate this point but as a unit vector from 0, 0, meaning * that the distance from the resulting point to the 0, 0 * coordinate will be equal to 1 and the angle from the resulting * point to the 0, 0 coordinate will be the same as before. * @return {Point} unit vector point */ unit: function() { return this.clone()._unit(); }, /** * Compute a perpendicular point, where the new y coordinate * is the old x coordinate and the new x coordinate is the old y * coordinate multiplied by -1 * @return {Point} perpendicular point */ perp: function() { return this.clone()._perp(); }, /** * Return a version of this point with the x & y coordinates * rounded to integers. * @return {Point} rounded point */ round: function() { return this.clone()._round(); }, /** * Return the magitude of this point: this is the Euclidean * distance from the 0, 0 coordinate to this point's x and y * coordinates. * @return {Number} magnitude */ mag: function() { return Math.sqrt(this.x * this.x + this.y * this.y); }, /** * Judge whether this point is equal to another point, returning * true or false. * @param {Point} other the other point * @return {boolean} whether the points are equal */ equals: function(other) { return this.x === other.x && this.y === other.y; }, /** * Calculate the distance from this point to another point * @param {Point} p the other point * @return {Number} distance */ dist: function(p) { return Math.sqrt(this.distSqr(p)); }, /** * Calculate the distance from this point to another point, * without the square root step. Useful if you're comparing * relative distances. * @param {Point} p the other point * @return {Number} distance */ distSqr: function(p) { var dx = p.x - this.x, dy = p.y - this.y; return dx * dx + dy * dy; }, /** * Get the angle from the 0, 0 coordinate to this point, in radians * coordinates. * @return {Number} angle */ angle: function() { return Math.atan2(this.y, this.x); }, /** * Get the angle from this point to another point, in radians * @param {Point} b the other point * @return {Number} angle */ angleTo: function(b) { return Math.atan2(this.y - b.y, this.x - b.x); }, /** * Get the angle between this point and another point, in radians * @param {Point} b the other point * @return {Number} angle */ angleWith: function(b) { return this.angleWithSep(b.x, b.y); }, /* * Find the angle of the two vectors, solving the formula for * the cross product a x b = |a||b|sin(θ) for θ. * @param {Number} x the x-coordinate * @param {Number} y the y-coordinate * @return {Number} the angle in radians */ angleWithSep: function(x, y) { return Math.atan2( this.x * y - this.y * x, this.x * x + this.y * y); }, _matMult: function(m) { var x = m[0] * this.x + m[1] * this.y, y = m[2] * this.x + m[3] * this.y; this.x = x; this.y = y; return this; }, _add: function(p) { this.x += p.x; this.y += p.y; return this; }, _sub: function(p) { this.x -= p.x; this.y -= p.y; return this; }, _mult: function(k) { this.x *= k; this.y *= k; return this; }, _div: function(k) { this.x /= k; this.y /= k; return this; }, _multByPoint: function(p) { this.x *= p.x; this.y *= p.y; return this; }, _divByPoint: function(p) { this.x /= p.x; this.y /= p.y; return this; }, _unit: function() { this._div(this.mag()); return this; }, _perp: function() { var y = this.y; this.y = this.x; this.x = -y; return this; }, _rotate: function(angle) { var cos = Math.cos(angle), sin = Math.sin(angle), x = cos * this.x - sin * this.y, y = sin * this.x + cos * this.y; this.x = x; this.y = y; return this; }, _rotateAround: function(angle, p) { var cos = Math.cos(angle), sin = Math.sin(angle), x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y), y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y); this.x = x; this.y = y; return this; }, _round: function() { this.x = Math.round(this.x); this.y = Math.round(this.y); return this; } }; /** * Construct a point from an array if necessary, otherwise if the input * is already a Point, or an unknown type, return it unchanged * @param {Array|Point|*} a any kind of input value * @return {Point} constructed point, or passed-through value. * @example * // this * var point = Point.convert([0, 1]); * // is equivalent to * var point = new Point(0, 1); */ Point.convert = function (a) { if (a instanceof Point) { return a; } if (Array.isArray(a)) { return new Point(a[0], a[1]); } return a; }; // /* eslint-env browser */ // shim window for the case of requiring the browser bundle in Node var window$1 = typeof self !== 'undefined' ? (self ) : (({} ) ); // /** * Deeply compares two object literals. * * @private */ function deepEqual(a , b ) { if (Array.isArray(a)) { if (!Array.isArray(b) || a.length !== b.length) { return false; } for (var i = 0; i < a.length; i++) { if (!deepEqual(a[i], b[i])) { return false; } } return true; } if (typeof a === 'object' && a !== null && b !== null) { if (!(typeof b === 'object')) { return false; } var keys = Object.keys(a); if (keys.length !== Object.keys(b).length) { return false; } for (var key in a) { if (!deepEqual(a[key], b[key])) { return false; } } return true; } return a === b; } // // Number.MAX_SAFE_INTEGER not available in IE var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; /** * @module util * @private */ /** * Given a value `t` that varies between 0 and 1, return * an interpolation function that eases between 0 and 1 in a pleasing * cubic in-out fashion. * * @private */ function easeCubicInOut(t ) { if (t <= 0) { return 0; } if (t >= 1) { return 1; } var t2 = t * t, t3 = t2 * t; return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); } /** * Given given (x, y), (x1, y1) control points for a bezier curve, * return a function that interpolates along that curve. * * @param p1x control point 1 x coordinate * @param p1y control point 1 y coordinate * @param p2x control point 2 x coordinate * @param p2y control point 2 y coordinate * @private */ function bezier(p1x , p1y , p2x , p2y ) { var bezier = new unitbezier(p1x, p1y, p2x, p2y); return function(t ) { return bezier.solve(t); }; } /** * A default bezier-curve powered easing function with * control points (0.25, 0.1) and (0.25, 1) * * @private */ var ease = bezier(0.25, 0.1, 0.25, 1); /** * constrain n to the given range via min + max * * @param n value * @param min the minimum value to be returned * @param max the maximum value to be returned * @returns the clamped value * @private */ function clamp(n , min , max ) { return Math.min(max, Math.max(min, n)); } /** * constrain n to the given range, excluding the minimum, via modular arithmetic * * @param n value * @param min the minimum value to be returned, exclusive * @param max the maximum value to be returned, inclusive * @returns constrained number * @private */ function wrap(n , min , max ) { var d = max - min; var w = ((n - min) % d + d) % d + min; return (w === min) ? max : w; } /* * Call an asynchronous function on an array of arguments, * calling `callback` with the completed results of all calls. * * @param array input to each call of the async function. * @param fn an async function with signature (data, callback) * @param callback a callback run after all async work is done. * called with an array, containing the results of each async call. * @private */ function asyncAll ( array , fn , callback ) { if (!array.length) { return callback(null, []); } var remaining = array.length; var results = new Array(array.length); var error = null; array.forEach(function (item, i) { fn(item, function (err, result) { if (err) { error = err; } results[i] = ((result ) ); // https://github.com/facebook/flow/issues/2123 if (--remaining === 0) { callback(error, results); } }); }); } /* * Polyfill for Object.values. Not fully spec compliant, but we don't * need it to be. * * @private */ function values (obj ) { var result = []; for (var k in obj) { result.push(obj[k]); } return result; } /* * Compute the difference between the keys in one object and the keys * in another object. * * @returns keys difference * @private */ function keysDifference (obj , other ) { var difference = []; for (var i in obj) { if (!(i in other)) { difference.push(i); } } return difference; } /** * Given a destination object and optionally many source objects, * copy all properties from the source objects into the destination. * The last source object given overrides properties from previous * source objects. * * @param dest destination object * @param sources sources from which properties are pulled * @private */ function extend(dest ) { var sources = [], len = arguments.length - 1; while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; for (var i = 0, list = sources; i < list.length; i += 1) { var src = list[i]; for (var k in src) { dest[k] = src[k]; } } return dest; } /** * Given an object and a number of properties as strings, return version * of that object with only those properties. * * @param src the object * @param properties an array of property names chosen * to appear on the resulting object. * @returns object with limited properties. * @example * var foo = { name: 'Charlie', age: 10 }; * var justName = pick(foo, ['name']); * // justName = { name: 'Charlie' } * @private */ function pick(src , properties ) { var result = {}; for (var i = 0; i < properties.length; i++) { var k = properties[i]; if (k in src) { result[k] = src[k]; } } return result; } var id = 1; /** * Return a unique numeric id, starting at 1 and incrementing with * each call. * * @returns unique numeric id. * @private */ function uniqueId() { return id++; } /** * Return a random UUID (v4). Taken from: https://gist.github.com/jed/982883 * @private */ function uuid() { function b(a) { return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : //$FlowFixMe: Flow doesn't like the implied array literal conversion here ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, b); } return b(); } /** * Return whether a given value is a power of two * @private */ function isPowerOfTwo(value ) { return (Math.log(value) / Math.LN2) % 1 === 0; } /** * Return the next power of two, or the input value if already a power of two * @private */ function nextPowerOfTwo(value ) { if (value <= 1) { return 1; } return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); } /** * Validate a string to match UUID(v4) of the * form: xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx * @param str string to validate. * @private */ function validateUuid(str ) { return str ? /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str) : false; } /** * Given an array of member function names as strings, replace all of them * with bound versions that will always refer to `context` as `this`. This * is useful for classes where otherwise event bindings would reassign * `this` to the evented object or some other value: this lets you ensure * the `this` value always. * * @param fns list of member function names * @param context the context value * @example * function MyClass() { * bindAll(['ontimer'], this); * this.name = 'Tom'; * } * MyClass.prototype.ontimer = function() { * alert(this.name); * }; * var myClass = new MyClass(); * setTimeout(myClass.ontimer, 100); * @private */ function bindAll(fns , context ) { fns.forEach(function (fn) { if (!context[fn]) { return; } context[fn] = context[fn].bind(context); }); } /** * Determine if a string ends with a particular substring * * @private */ function endsWith(string , suffix ) { return string.indexOf(suffix, string.length - suffix.length) !== -1; } /** * Create an object by mapping all the values of an existing object while * preserving their keys. * * @private */ function mapObject(input , iterator , context ) { var output = {}; for (var key in input) { output[key] = iterator.call(context || this, input[key], key, input); } return output; } /** * Create an object by filtering out values of an existing object. * * @private */ function filterObject(input , iterator , context ) { var output = {}; for (var key in input) { if (iterator.call(context || this, input[key], key, input)) { output[key] = input[key]; } } return output; } /** * Deeply clones two objects. * * @private */ function clone (input ) { if (Array.isArray(input)) { return input.map(clone); } else if (typeof input === 'object' && input) { return ((mapObject(input, clone) ) ); } else { return input; } } /** * Check if two arrays have at least one common element. * * @private */ function arraysIntersect (a , b ) { for (var l = 0; l < a.length; l++) { if (b.indexOf(a[l]) >= 0) { return true; } } return false; } /** * Print a warning message to the console and ensure duplicate warning messages * are not printed. * * @private */ var warnOnceHistory = {}; function warnOnce(message ) { if (!warnOnceHistory[message]) { // console isn't defined in some WebWorkers, see #2558 if (typeof console !== "undefined") { console.warn(message); } warnOnceHistory[message] = true; } } /** * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order * * @private * @returns true for a counter clockwise set of points */ // http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/ function isCounterClockwise(a , b , c ) { return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x); } /** * Returns the signed area for the polygon ring. Postive areas are exterior rings and * have a clockwise winding. Negative areas are interior rings and have a counter clockwise * ordering. * * @private * @param ring Exterior or interior ring */ function calculateSignedArea(ring ) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1 = (void 0), p2 = (void 0); i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } /** * Detects closed polygons, first + last point are equal * * @private * @param points array of points * @return true if the points are a closed polygon */ function isClosedPolygon(points ) { // If it is 2 points that are the same then it is a point // If it is 3 points with start and end the same then it is a line if (points.length < 4) { return false; } var p1 = points[0]; var p2 = points[points.length - 1]; if (Math.abs(p1.x - p2.x) > 0 || Math.abs(p1.y - p2.y) > 0) { return false; } // polygon simplification can produce polygons with zero area and more than 3 points return Math.abs(calculateSignedArea(points)) > 0.01; } /** * Converts spherical coordinates to cartesian coordinates. * * @private * @param spherical Spherical coordinates, in [radial, azimuthal, polar] * @return cartesian coordinates in [x, y, z] */ function sphericalToCartesian(ref ) { var r = ref[0]; var azimuthal = ref[1]; var polar = ref[2]; // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2): // correct for that here azimuthal += 90; // Convert azimuthal and polar angles to radians azimuthal *= Math.PI / 180; polar *= Math.PI / 180; return { x: r * Math.cos(azimuthal) * Math.sin(polar), y: r * Math.sin(azimuthal) * Math.sin(polar), z: r * Math.cos(polar) }; } /* global self, WorkerGlobalScope */ /** * Retuns true if the when run in the web-worker context. * * @private * @returns {boolean} */ function isWorker() { return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope; } /** * Parses data from 'Cache-Control' headers. * * @private * @param cacheControl Value of 'Cache-Control' header * @return object containing parsed header info. */ function parseCacheControl(cacheControl ) { // Taken from [Wreck](https://github.com/hapijs/wreck) var re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; var header = {}; cacheControl.replace(re, function ($0, $1, $2, $3) { var value = $2 || $3; header[$1] = value ? value.toLowerCase() : true; return ''; }); if (header['max-age']) { var maxAge = parseInt(header['max-age'], 10); if (isNaN(maxAge)) { delete header['max-age']; } else { header['max-age'] = maxAge; } } return header; } var _isSafari = null; /** * Returns true when run in WebKit derived browsers. * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to * transfer data between WebWorkers and the main thread. * https://github.com/mapbox/mapbox-gl-js/issues/8771 * * This should be removed once the underlying Safari issue is fixed. * * @private * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context, * let the calling scope pass in the global scope object. * @returns {boolean} */ function isSafari(scope ) { if (_isSafari == null) { var userAgent = scope.navigator ? scope.navigator.userAgent : null; _isSafari = !!scope.safari || !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome')))); } return _isSafari; } function storageAvailable(type ) { try { var storage = window$1[type]; storage.setItem('_mapbox_test_', 1); storage.removeItem('_mapbox_test_'); return true; } catch (e) { return false; } } // The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem //Unicode compliant base64 encoder for strings function b64EncodeUnicode(str ) { return window$1.btoa( encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) { return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line } ) ); } // Unicode compliant decoder for base64-encoded strings function b64DecodeUnicode(str ) { return decodeURIComponent(window$1.atob(str).split('').map(function (c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line }).join('')); } // strict var now = window$1.performance && window$1.performance.now ? window$1.performance.now.bind(window$1.performance) : Date.now.bind(Date); var raf = window$1.requestAnimationFrame || window$1.mozRequestAnimationFrame || window$1.webkitRequestAnimationFrame || window$1.msRequestAnimationFrame; var cancel = window$1.cancelAnimationFrame || window$1.mozCancelAnimationFrame || window$1.webkitCancelAnimationFrame || window$1.msCancelAnimationFrame; var linkEl; var reducedMotionQuery ; /** * @private */ var exported = { /** * Provides a function that outputs milliseconds: either performance.now() * or a fallback to Date.now() */ now: now, frame: function frame(fn ) { var frame = raf(fn); return {cancel: function () { return cancel(frame); }}; }, getImageData: function getImageData(img , padding) { if ( padding === void 0 ) padding = 0; var canvas = window$1.document.createElement('canvas'); var context = canvas.getContext('2d'); if (!context) { throw new Error('failed to create canvas 2d context'); } canvas.width = img.width; canvas.height = img.height; context.drawImage(img, 0, 0, img.width, img.height); return context.getImageData(-padding, -padding, img.width + 2 * padding, img.height + 2 * padding); }, resolveURL: function resolveURL(path ) { if (!linkEl) { linkEl = window$1.document.createElement('a'); } linkEl.href = path; return linkEl.href; }, hardwareConcurrency: window$1.navigator && window$1.navigator.hardwareConcurrency || 4, get devicePixelRatio() { return window$1.devicePixelRatio; }, get prefersReducedMotion() { if (!window$1.matchMedia) { return false; } //Lazily initialize media query if (reducedMotionQuery == null) { reducedMotionQuery = window$1.matchMedia('(prefers-reduced-motion: reduce)'); } return reducedMotionQuery.matches; }, }; // strict var config = { API_URL: 'https://api.mapbox.com', get EVENTS_URL() { if (!this.API_URL) { return null; } if (this.API_URL.indexOf('https://api.mapbox.cn') === 0) { return 'https://events.mapbox.cn/events/v2'; } else if (this.API_URL.indexOf('https://api.mapbox.com') === 0) { return 'https://events.mapbox.com/events/v2'; } else { return null; } }, FEEDBACK_URL: 'https://apps.mapbox.com/feedback', REQUIRE_ACCESS_TOKEN: true, ACCESS_TOKEN: null, MAX_PARALLEL_IMAGE_REQUESTS: 16 }; // strict var exported$1 = { supported: false, testSupport: testSupport }; var glForTesting; var webpCheckComplete = false; var webpImgTest; var webpImgTestOnloadComplete = false; if (window$1.document) { webpImgTest = window$1.document.createElement('img'); webpImgTest.onload = function() { if (glForTesting) { testWebpTextureUpload(glForTesting); } glForTesting = null; webpImgTestOnloadComplete = true; }; webpImgTest.onerror = function() { webpCheckComplete = true; glForTesting = null; }; webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA='; } function testSupport(gl ) { if (webpCheckComplete || !webpImgTest) { return; } // HTMLImageElement.complete is set when an image is done loading it's source // regardless of whether the load was successful or not. // It's possible for an error to set HTMLImageElement.complete to true which would trigger // testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp // To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload // after a successful image load event. if (webpImgTestOnloadComplete) { testWebpTextureUpload(gl); } else { glForTesting = gl; } } function testWebpTextureUpload(gl ) { // Edge 18 supports WebP but not uploading a WebP image to a gl texture // Test support for this before allowing WebP images. // https://github.com/mapbox/mapbox-gl-js/issues/7671 var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); try { gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest); // The error does not get triggered in Edge if the context is lost if (gl.isContextLost()) { return; } exported$1.supported = true; } catch (e) { // Catch "Unspecified Error." in Edge 18. } gl.deleteTexture(texture); webpCheckComplete = true; } // /***** START WARNING - IF YOU USE THIS CODE WITH MAPBOX MAPPING APIS, REMOVAL OR * MODIFICATION OF THE FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ****** * The following code is used to access Mapbox's Mapping APIs. Removal or modification * of this code when used with Mapbox's Mapping APIs can result in higher fees and/or * termination of your account with Mapbox. * * Under the Mapbox Terms of Service, you may not use this code to access Mapbox * Mapping APIs other than through Mapbox SDKs. * * The Mapping APIs documentation is available at https://docs.mapbox.com/api/maps/#maps * and the Mapbox Terms of Service are available at https://www.mapbox.com/tos/ ******************************************************************************/ var SKU_ID = '01'; function createSkuToken() { // SKU_ID and TOKEN_VERSION are specified by an internal schema and should not change var TOKEN_VERSION = '1'; var base62chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // sessionRandomizer is a randomized 10-digit base-62 number var sessionRandomizer = ''; for (var i = 0; i < 10; i++) { sessionRandomizer += base62chars[Math.floor(Math.random() * 62)]; } var expiration = 12 * 60 * 60 * 1000; // 12 hours var token = [TOKEN_VERSION, SKU_ID, sessionRandomizer].join(''); var tokenExpiresAt = Date.now() + expiration; return {token: token, tokenExpiresAt: tokenExpiresAt}; } /***** END WARNING - REMOVAL OR MODIFICATION OF THE PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ function globals(defs) { defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"); defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"); defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"); defs.WGS84 = defs['EPSG:4326']; defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857 defs.GOOGLE = defs['EPSG:3857']; defs['EPSG:900913'] = defs['EPSG:3857']; defs['EPSG:102113'] = defs['EPSG:3857']; } var PJD_3PARAM = 1; var PJD_7PARAM = 2; var PJD_GRIDSHIFT = 3; var PJD_WGS84 = 4; // WGS84 or equivalent var PJD_NODATUM = 5; // WGS84 or equivalent var SRS_WGS84_SEMIMAJOR = 6378137.0; // only used in grid shift transforms var SRS_WGS84_SEMIMINOR = 6356752.314; // only used in grid shift transforms var SRS_WGS84_ESQUARED = 0.0066943799901413165; // only used in grid shift transforms var SEC_TO_RAD = 4.84813681109535993589914102357e-6; var HALF_PI = Math.PI/2; // ellipoid pj_set_ell.c var SIXTH = 0.1666666666666666667; /* 1/6 */ var RA4 = 0.04722222222222222222; /* 17/360 */ var RA6 = 0.02215608465608465608; var EPSLN = 1.0e-10; // you'd think you could use Number.EPSILON above but that makes // Mollweide get into an infinate loop. var D2R = 0.01745329251994329577; var R2D = 57.29577951308232088; var FORTPI = Math.PI/4; var TWO_PI = Math.PI * 2; // SPI is slightly greater than Math.PI, so values that exceed the -180..180 // degree range by a tiny amount don't get wrapped. This prevents points that // have drifted from their original location along the 180th meridian (due to // floating point error) from changing their sign. var SPI = 3.14159265359; var exports$1 = {}; exports$1.greenwich = 0.0; //"0dE", exports$1.lisbon = -9.131906111111; //"9d07'54.862\"W", exports$1.paris = 2.337229166667; //"2d20'14.025\"E", exports$1.bogota = -74.080916666667; //"74d04'51.3\"W", exports$1.madrid = -3.687938888889; //"3d41'16.58\"W", exports$1.rome = 12.452333333333; //"12d27'8.4\"E", exports$1.bern = 7.439583333333; //"7d26'22.5\"E", exports$1.jakarta = 106.807719444444; //"106d48'27.79\"E", exports$1.ferro = -17.666666666667; //"17d40'W", exports$1.brussels = 4.367975; //"4d22'4.71\"E", exports$1.stockholm = 18.058277777778; //"18d3'29.8\"E", exports$1.athens = 23.7163375; //"23d42'58.815\"E", exports$1.oslo = 10.722916666667; //"10d43'22.5\"E" var units = { ft: {to_meter: 0.3048}, 'us-ft': {to_meter: 1200 / 3937} }; var ignoredChar = /[\s_\-\/\(\)]/g; function match(obj, key) { if (obj[key]) { return obj[key]; } var keys = Object.keys(obj); var lkey = key.toLowerCase().replace(ignoredChar, ''); var i = -1; var testkey, processedKey; while (++i < keys.length) { testkey = keys[i]; processedKey = testkey.toLowerCase().replace(ignoredChar, ''); if (processedKey === lkey) { return obj[testkey]; } } } function projStr(defData) { var self = {}; var paramObj = defData.split('+').map(function(v) { return v.trim(); }).filter(function(a) { return a; }).reduce(function(p, a) { var split = a.split('='); split.push(true); p[split[0].toLowerCase()] = split[1]; return p; }, {}); var paramName, paramVal, paramOutname; var params = { proj: 'projName', datum: 'datumCode', rf: function(v) { self.rf = parseFloat(v); }, lat_0: function(v) { self.lat0 = v * D2R; }, lat_1: function(v) { self.lat1 = v * D2R; }, lat_2: function(v) { self.lat2 = v * D2R; }, lat_ts: function(v) { self.lat_ts = v * D2R; }, lon_0: function(v) { self.long0 = v * D2R; }, lon_1: function(v) { self.long1 = v * D2R; }, lon_2: function(v) { self.long2 = v * D2R; }, alpha: function(v) { self.alpha = parseFloat(v) * D2R; }, gamma: function(v) { self.rectified_grid_angle = parseFloat(v); }, lonc: function(v) { self.longc = v * D2R; }, x_0: function(v) { self.x0 = parseFloat(v); }, y_0: function(v) { self.y0 = parseFloat(v); }, k_0: function(v) { self.k0 = parseFloat(v); }, k: function(v) { self.k0 = parseFloat(v); }, a: function(v) { self.a = parseFloat(v); }, b: function(v) { self.b = parseFloat(v); }, r_a: function() { self.R_A = true; }, zone: function(v) { self.zone = parseInt(v, 10); }, south: function() { self.utmSouth = true; }, towgs84: function(v) { self.datum_params = v.split(",").map(function(a) { return parseFloat(a); }); }, to_meter: function(v) { self.to_meter = parseFloat(v); }, units: function(v) { self.units = v; var unit = match(units, v); if (unit) { self.to_meter = unit.to_meter; } }, from_greenwich: function(v) { self.from_greenwich = v * D2R; }, pm: function(v) { var pm = match(exports$1, v); self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R; }, nadgrids: function(v) { if (v === '@null') { self.datumCode = 'none'; } else { self.nadgrids = v; } }, axis: function(v) { var legalAxis = "ewnsud"; if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) { self.axis = v; } }, approx: function() { self.approx = true; } }; for (paramName in paramObj) { paramVal = paramObj[paramName]; if (paramName in params) { paramOutname = params[paramName]; if (typeof paramOutname === 'function') { paramOutname(paramVal); } else { self[paramOutname] = paramVal; } } else { self[paramName] = paramVal; } } if(typeof self.datumCode === 'string' && self.datumCode !== "WGS84"){ self.datumCode = self.datumCode.toLowerCase(); } return self; } var NEUTRAL = 1; var KEYWORD = 2; var NUMBER = 3; var QUOTED = 4; var AFTERQUOTE = 5; var ENDED = -1; var whitespace = /\s/; var latin = /[A-Za-z]/; var keyword = /[A-Za-z84_]/; var endThings = /[,\]]/; var digets = /[\d\.E\-\+]/; // const ignoredChar = /[\s_\-\/\(\)]/g; function Parser(text) { if (typeof text !== 'string') { throw new Error('not a string'); } this.text = text.trim(); this.level = 0; this.place = 0; this.root = null; this.stack = []; this.currentObject = null; this.state = NEUTRAL; } Parser.prototype.readCharicter = function() { var char = this.text[this.place++]; if (this.state !== QUOTED) { while (whitespace.test(char)) { if (this.place >= this.text.length) { return; } char = this.text[this.place++]; } } switch (this.state) { case NEUTRAL: return this.neutral(char); case KEYWORD: return this.keyword(char) case QUOTED: return this.quoted(char); case AFTERQUOTE: return this.afterquote(char); case NUMBER: return this.number(char); case ENDED: return; } }; Parser.prototype.afterquote = function(char) { if (char === '"') { this.word += '"'; this.state = QUOTED; return; } if (endThings.test(char)) { this.word = this.word.trim(); this.afterItem(char); return; } throw new Error('havn\'t handled "' +char + '" in afterquote yet, index ' + this.place); }; Parser.prototype.afterItem = function(char) { if (char === ',') { if (this.word !== null) { this.currentObject.push(this.word); } this.word = null; this.state = NEUTRAL; return; } if (char === ']') { this.level--; if (this.word !== null) { this.currentObject.push(this.word); this.word = null; } this.state = NEUTRAL; this.currentObject = this.stack.pop(); if (!this.currentObject) { this.state = ENDED; } return; } }; Parser.prototype.number = function(char) { if (digets.test(char)) { this.word += char; return; } if (endThings.test(char)) { this.word = parseFloat(this.word); this.afterItem(char); return; } throw new Error('havn\'t handled "' +char + '" in number yet, index ' + this.place); }; Parser.prototype.quoted = function(char) { if (char === '"') { this.state = AFTERQUOTE; return; } this.word += char; return; }; Parser.prototype.keyword = function(char) { if (keyword.test(char)) { this.word += char; return; } if (char === '[') { var newObjects = []; newObjects.push(this.word); this.level++; if (this.root === null) { this.root = newObjects; } else { this.currentObject.push(newObjects); } this.stack.push(this.currentObject); this.currentObject = newObjects; this.state = NEUTRAL; return; } if (endThings.test(char)) { this.afterItem(char); return; } throw new Error('havn\'t handled "' +char + '" in keyword yet, index ' + this.place); }; Parser.prototype.neutral = function(char) { if (latin.test(char)) { this.word = char; this.state = KEYWORD; return; } if (char === '"') { this.word = ''; this.state = QUOTED; return; } if (digets.test(char)) { this.word = char; this.state = NUMBER; return; } if (endThings.test(char)) { this.afterItem(char); return; } throw new Error('havn\'t handled "' +char + '" in neutral yet, index ' + this.place); }; Parser.prototype.output = function() { while (this.place < this.text.length) { this.readCharicter(); } if (this.state === ENDED) { return this.root; } throw new Error('unable to parse string "' +this.text + '". State is ' + this.state); }; function parseString(txt) { var parser = new Parser(txt); return parser.output(); } function mapit(obj, key, value) { if (Array.isArray(key)) { value.unshift(key); key = null; } var thing = key ? {} : obj; var out = value.reduce(function(newObj, item) { sExpr(item, newObj); return newObj }, thing); if (key) { obj[key] = out; } } function sExpr(v, obj) { if (!Array.isArray(v)) { obj[v] = true; return; } var key = v.shift(); if (key === 'PARAMETER') { key = v.shift(); } if (v.length === 1) { if (Array.isArray(v[0])) { obj[key] = {}; sExpr(v[0], obj[key]); return; } obj[key] = v[0]; return; } if (!v.length) { obj[key] = true; return; } if (key === 'TOWGS84') { obj[key] = v; return; } if (key === 'AXIS') { if (!(key in obj)) { obj[key] = []; } obj[key].push(v); return; } if (!Array.isArray(key)) { obj[key] = {}; } var i; switch (key) { case 'UNIT': case 'PRIMEM': case 'VERT_DATUM': obj[key] = { name: v[0].toLowerCase(), convert: v[1] }; if (v.length === 3) { sExpr(v[2], obj[key]); } return; case 'SPHEROID': case 'ELLIPSOID': obj[key] = { name: v[0], a: v[1], rf: v[2] }; if (v.length === 4) { sExpr(v[3], obj[key]); } return; case 'PROJECTEDCRS': case 'PROJCRS': case 'GEOGCS': case 'GEOCCS': case 'PROJCS': case 'LOCAL_CS': case 'GEODCRS': case 'GEODETICCRS': case 'GEODETICDATUM': case 'EDATUM': case 'ENGINEERINGDATUM': case 'VERT_CS': case 'VERTCRS': case 'VERTICALCRS': case 'COMPD_CS': case 'COMPOUNDCRS': case 'ENGINEERINGCRS': case 'ENGCRS': case 'FITTED_CS': case 'LOCAL_DATUM': case 'DATUM': v[0] = ['name', v[0]]; mapit(obj, key, v); return; default: i = -1; while (++i < v.length) { if (!Array.isArray(v[i])) { return sExpr(v, obj[key]); } } return mapit(obj, key, v); } } var D2R$1 = 0.01745329251994329577; function rename(obj, params) { var outName = params[0]; var inName = params[1]; if (!(outName in obj) && (inName in obj)) { obj[outName] = obj[inName]; if (params.length === 3) { obj[outName] = params[2](obj[outName]); } } } function d2r(input) { return input * D2R$1; } function cleanWKT(wkt) { if (wkt.type === 'GEOGCS') { wkt.projName = 'longlat'; } else if (wkt.type === 'LOCAL_CS') { wkt.projName = 'identity'; wkt.local = true; } else { if (typeof wkt.PROJECTION === 'object') { wkt.projName = Object.keys(wkt.PROJECTION)[0]; } else { wkt.projName = wkt.PROJECTION; } } if (wkt.AXIS) { var axisOrder = ''; for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) { var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()]; if (axis[0].indexOf('north') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'north')) { axisOrder += 'n'; } else if (axis[0].indexOf('south') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'south')) { axisOrder += 's'; } else if (axis[0].indexOf('east') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'east')) { axisOrder += 'e'; } else if (axis[0].indexOf('west') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'west')) { axisOrder += 'w'; } } if (axisOrder.length === 2) { axisOrder += 'u'; } if (axisOrder.length === 3) { wkt.axis = axisOrder; } } if (wkt.UNIT) { wkt.units = wkt.UNIT.name.toLowerCase(); if (wkt.units === 'metre') { wkt.units = 'meter'; } if (wkt.UNIT.convert) { if (wkt.type === 'GEOGCS') { if (wkt.DATUM && wkt.DATUM.SPHEROID) { wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a; } } else { wkt.to_meter = wkt.UNIT.convert; } } } var geogcs = wkt.GEOGCS; if (wkt.type === 'GEOGCS') { geogcs = wkt; } if (geogcs) { //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){ // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R; //} if (geogcs.DATUM) { wkt.datumCode = geogcs.DATUM.name.toLowerCase(); } else { wkt.datumCode = geogcs.name.toLowerCase(); } if (wkt.datumCode.slice(0, 2) === 'd_') { wkt.datumCode = wkt.datumCode.slice(2); } if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') { wkt.datumCode = 'nzgd49'; } if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') { if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') { wkt.sphere = true; } wkt.datumCode = 'wgs84'; } if (wkt.datumCode.slice(-6) === '_ferro') { wkt.datumCode = wkt.datumCode.slice(0, - 6); } if (wkt.datumCode.slice(-8) === '_jakarta') { wkt.datumCode = wkt.datumCode.slice(0, - 8); } if (~wkt.datumCode.indexOf('belge')) { wkt.datumCode = 'rnb72'; } if (geogcs.DATUM && geogcs.DATUM.SPHEROID) { wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk'); if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') { wkt.ellps = 'intl'; } wkt.a = geogcs.DATUM.SPHEROID.a; wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10); } if (geogcs.DATUM && geogcs.DATUM.TOWGS84) { wkt.datum_params = geogcs.DATUM.TOWGS84; } if (~wkt.datumCode.indexOf('osgb_1936')) { wkt.datumCode = 'osgb36'; } if (~wkt.datumCode.indexOf('osni_1952')) { wkt.datumCode = 'osni52'; } if (~wkt.datumCode.indexOf('tm65') || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) { wkt.datumCode = 'ire65'; } if (wkt.datumCode === 'ch1903+') { wkt.datumCode = 'ch1903'; } if (~wkt.datumCode.indexOf('israel')) { wkt.datumCode = 'isr93'; } } if (wkt.b && !isFinite(wkt.b)) { wkt.b = wkt.a; } function toMeter(input) { var ratio = wkt.to_meter || 1; return input * ratio; } var renamer = function(a) { return rename(wkt, a); }; var list = [ ['standard_parallel_1', 'Standard_Parallel_1'], ['standard_parallel_1', 'Latitude of 1st standard parallel'], ['standard_parallel_2', 'Standard_Parallel_2'], ['standard_parallel_2', 'Latitude of 2nd standard parallel'], ['false_easting', 'False_Easting'], ['false_easting', 'False easting'], ['false-easting', 'Easting at false origin'], ['false_northing', 'False_Northing'], ['false_northing', 'False northing'], ['false_northing', 'Northing at false origin'], ['central_meridian', 'Central_Meridian'], ['central_meridian', 'Longitude of natural origin'], ['central_meridian', 'Longitude of false origin'], ['latitude_of_origin', 'Latitude_Of_Origin'], ['latitude_of_origin', 'Central_Parallel'], ['latitude_of_origin', 'Latitude of natural origin'], ['latitude_of_origin', 'Latitude of false origin'], ['scale_factor', 'Scale_Factor'], ['k0', 'scale_factor'], ['latitude_of_center', 'Latitude_Of_Center'], ['latitude_of_center', 'Latitude_of_center'], ['lat0', 'latitude_of_center', d2r], ['longitude_of_center', 'Longitude_Of_Center'], ['longitude_of_center', 'Longitude_of_center'], ['longc', 'longitude_of_center', d2r], ['x0', 'false_easting', toMeter], ['y0', 'false_northing', toMeter], ['long0', 'central_meridian', d2r], ['lat0', 'latitude_of_origin', d2r], ['lat0', 'standard_parallel_1', d2r], ['lat1', 'standard_parallel_1', d2r], ['lat2', 'standard_parallel_2', d2r], ['azimuth', 'Azimuth'], ['alpha', 'azimuth', d2r], ['srsCode', 'name'] ]; list.forEach(renamer); if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) { wkt.long0 = wkt.longc; } if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) { wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90); wkt.lat_ts = wkt.lat1; } } function wkt(wkt) { var lisp = parseString(wkt); var type = lisp.shift(); var name = lisp.shift(); lisp.unshift(['name', name]); lisp.unshift(['type', type]); var obj = {}; sExpr(lisp, obj); cleanWKT(obj); return obj; } function defs(name) { /*global console*/ var that = this; if (arguments.length === 2) { var def = arguments[1]; if (typeof def === 'string') { if (def.charAt(0) === '+') { defs[name] = projStr(arguments[1]); } else { defs[name] = wkt(arguments[1]); } } else { defs[name] = def; } } else if (arguments.length === 1) { if (Array.isArray(name)) { return name.map(function(v) { if (Array.isArray(v)) { defs.apply(that, v); } else { defs(v); } }); } else if (typeof name === 'string') { if (name in defs) { return defs[name]; } } else if ('EPSG' in name) { defs['EPSG:' + name.EPSG] = name; } else if ('ESRI' in name) { defs['ESRI:' + name.ESRI] = name; } else if ('IAU2000' in name) { defs['IAU2000:' + name.IAU2000] = name; } else { console.log(name); } return; } } globals(defs); function testObj(code){ return typeof code === 'string'; } function testDef(code){ return code in defs; } var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS']; function testWKT(code){ return codeWords.some(function (word) { return code.indexOf(word) > -1; }); } var codes = ['3857', '900913', '3785', '102113']; function checkMercator(item) { var auth = match(item, 'authority'); if (!auth) { return; } var code = match(auth, 'epsg'); return code && codes.indexOf(code) > -1; } function checkProjStr(item) { var ext = match(item, 'extension'); if (!ext) { return; } return match(ext, 'proj4'); } function testProj(code){ return code[0] === '+'; } function parse(code){ if (testObj(code)) { //check to see if this is a WKT string if (testDef(code)) { return defs[code]; } if (testWKT(code)) { var out = wkt(code); // test of spetial case, due to this being a very common and often malformed if (checkMercator(out)) { return defs['EPSG:3857']; } var maybeProjStr = checkProjStr(out); if (maybeProjStr) { return projStr(maybeProjStr); } return out; } if (testProj(code)) { return projStr(code); } }else { return code; } } function extend$1(destination, source) { destination = destination || {}; var value, property; if (!source) { return destination; } for (property in source) { value = source[property]; if (value !== undefined) { destination[property] = value; } } return destination; } function msfnz(eccent, sinphi, cosphi) { var con = eccent * sinphi; return cosphi / (Math.sqrt(1 - con * con)); } function sign(x) { return x<0 ? -1 : 1; } function adjust_lon(x) { return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI)); } function tsfnz(eccent, phi, sinphi) { var con = eccent * sinphi; var com = 0.5 * eccent; con = Math.pow(((1 - con) / (1 + con)), com); return (Math.tan(0.5 * (HALF_PI - phi)) / con); } function phi2z(eccent, ts) { var eccnth = 0.5 * eccent; var con, dphi; var phi = HALF_PI - 2 * Math.atan(ts); for (var i = 0; i <= 15; i++) { con = eccent * Math.sin(phi); dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi; phi += dphi; if (Math.abs(dphi) <= 0.0000000001) { return phi; } } //console.log("phi2z has NoConvergence"); return -9999; } function init() { var con = this.b / this.a; this.es = 1 - con * con; if(!('x0' in this)){ this.x0 = 0; } if(!('y0' in this)){ this.y0 = 0; } this.e = Math.sqrt(this.es); if (this.lat_ts) { if (this.sphere) { this.k0 = Math.cos(this.lat_ts); } else { this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); } } else { if (!this.k0) { if (this.k) { this.k0 = this.k; } else { this.k0 = 1; } } } } /* Mercator forward equations--mapping lat,long to x,y --------------------------------------------------*/ function forward(p) { var lon = p.x; var lat = p.y; // convert to radians if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) { return null; } var x, y; if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { return null; } else { if (this.sphere) { x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat)); } else { var sinphi = Math.sin(lat); var ts = tsfnz(this.e, lat, sinphi); x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); y = this.y0 - this.a * this.k0 * Math.log(ts); } p.x = x; p.y = y; return p; } } /* Mercator inverse equations--mapping x,y to lat/long --------------------------------------------------*/ function inverse(p) { var x = p.x - this.x0; var y = p.y - this.y0; var lon, lat; if (this.sphere) { lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0))); } else { var ts = Math.exp(-y / (this.a * this.k0)); lat = phi2z(this.e, ts); if (lat === -9999) { return null; } } lon = adjust_lon(this.long0 + x / (this.a * this.k0)); p.x = lon; p.y = lat; return p; } var names = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"]; var merc = { init: init, forward: forward, inverse: inverse, names: names }; function init$1() { //no-op for longlat } function identity(pt) { return pt; } var names$1 = ["longlat", "identity"]; var longlat = { init: init$1, forward: identity, inverse: identity, names: names$1 }; var projs = [merc, longlat]; var names$2 = {}; var projStore = []; function add(proj, i) { var len = projStore.length; if (!proj.names) { console.log(i); return true; } projStore[len] = proj; proj.names.forEach(function(n) { names$2[n.toLowerCase()] = len; }); return this; } function get(name) { if (!name) { return false; } var n = name.toLowerCase(); if (typeof names$2[n] !== 'undefined' && projStore[names$2[n]]) { return projStore[names$2[n]]; } } function start() { projs.forEach(add); } var projections = { start: start, add: add, get: get }; var exports$2 = {}; exports$2.MERIT = { a: 6378137.0, rf: 298.257, ellipseName: "MERIT 1983" }; exports$2.SGS85 = { a: 6378136.0, rf: 298.257, ellipseName: "Soviet Geodetic System 85" }; exports$2.GRS80 = { a: 6378137.0, rf: 298.257222101, ellipseName: "GRS 1980(IUGG, 1980)" }; exports$2.IAU76 = { a: 6378140.0, rf: 298.257, ellipseName: "IAU 1976" }; exports$2.airy = { a: 6377563.396, b: 6356256.910, ellipseName: "Airy 1830" }; exports$2.APL4 = { a: 6378137, rf: 298.25, ellipseName: "Appl. Physics. 1965" }; exports$2.NWL9D = { a: 6378145.0, rf: 298.25, ellipseName: "Naval Weapons Lab., 1965" }; exports$2.mod_airy = { a: 6377340.189, b: 6356034.446, ellipseName: "Modified Airy" }; exports$2.andrae = { a: 6377104.43, rf: 300.0, ellipseName: "Andrae 1876 (Den., Iclnd.)" }; exports$2.aust_SA = { a: 6378160.0, rf: 298.25, ellipseName: "Australian Natl & S. Amer. 1969" }; exports$2.GRS67 = { a: 6378160.0, rf: 298.2471674270, ellipseName: "GRS 67(IUGG 1967)" }; exports$2.bessel = { a: 6377397.155, rf: 299.1528128, ellipseName: "Bessel 1841" }; exports$2.bess_nam = { a: 6377483.865, rf: 299.1528128, ellipseName: "Bessel 1841 (Namibia)" }; exports$2.clrk66 = { a: 6378206.4, b: 6356583.8, ellipseName: "Clarke 1866" }; exports$2.clrk80 = { a: 6378249.145, rf: 293.4663, ellipseName: "Clarke 1880 mod." }; exports$2.clrk80ign = { a: 6378249.2, b: 6356515, rf: 293.4660213, ellipseName: "Clarke 1880 (IGN)" }; exports$2.clrk58 = { a: 6378293.645208759, rf: 294.2606763692654, ellipseName: "Clarke 1858" }; exports$2.CPM = { a: 6375738.7, rf: 334.29, ellipseName: "Comm. des Poids et Mesures 1799" }; exports$2.delmbr = { a: 6376428.0, rf: 311.5, ellipseName: "Delambre 1810 (Belgium)" }; exports$2.engelis = { a: 6378136.05, rf: 298.2566, ellipseName: "Engelis 1985" }; exports$2.evrst30 = { a: 6377276.345, rf: 300.8017, ellipseName: "Everest 1830" }; exports$2.evrst48 = { a: 6377304.063, rf: 300.8017, ellipseName: "Everest 1948" }; exports$2.evrst56 = { a: 6377301.243, rf: 300.8017, ellipseName: "Everest 1956" }; exports$2.evrst69 = { a: 6377295.664, rf: 300.8017, ellipseName: "Everest 1969" }; exports$2.evrstSS = { a: 6377298.556, rf: 300.8017, ellipseName: "Everest (Sabah & Sarawak)" }; exports$2.fschr60 = { a: 6378166.0, rf: 298.3, ellipseName: "Fischer (Mercury Datum) 1960" }; exports$2.fschr60m = { a: 6378155.0, rf: 298.3, ellipseName: "Fischer 1960" }; exports$2.fschr68 = { a: 6378150.0, rf: 298.3, ellipseName: "Fischer 1968" }; exports$2.helmert = { a: 6378200.0, rf: 298.3, ellipseName: "Helmert 1906" }; exports$2.hough = { a: 6378270.0, rf: 297.0, ellipseName: "Hough" }; exports$2.intl = { a: 6378388.0, rf: 297.0, ellipseName: "International 1909 (Hayford)" }; exports$2.kaula = { a: 6378163.0, rf: 298.24, ellipseName: "Kaula 1961" }; exports$2.lerch = { a: 6378139.0, rf: 298.257, ellipseName: "Lerch 1979" }; exports$2.mprts = { a: 6397300.0, rf: 191.0, ellipseName: "Maupertius 1738" }; exports$2.new_intl = { a: 6378157.5, b: 6356772.2, ellipseName: "New International 1967" }; exports$2.plessis = { a: 6376523.0, rf: 6355863.0, ellipseName: "Plessis 1817 (France)" }; exports$2.krass = { a: 6378245.0, rf: 298.3, ellipseName: "Krassovsky, 1942" }; exports$2.SEasia = { a: 6378155.0, b: 6356773.3205, ellipseName: "Southeast Asia" }; exports$2.walbeck = { a: 6376896.0, b: 6355834.8467, ellipseName: "Walbeck" }; exports$2.WGS60 = { a: 6378165.0, rf: 298.3, ellipseName: "WGS 60" }; exports$2.WGS66 = { a: 6378145.0, rf: 298.25, ellipseName: "WGS 66" }; exports$2.WGS7 = { a: 6378135.0, rf: 298.26, ellipseName: "WGS 72" }; var WGS84 = exports$2.WGS84 = { a: 6378137.0, rf: 298.257223563, ellipseName: "WGS 84" }; exports$2.sphere = { a: 6370997.0, b: 6370997.0, ellipseName: "Normal Sphere (r=6370997)" }; function eccentricity(a, b, rf, R_A) { var a2 = a * a; // used in geocentric var b2 = b * b; // used in geocentric var es = (a2 - b2) / a2; // e ^ 2 var e = 0; if (R_A) { a *= 1 - es * (SIXTH + es * (RA4 + es * RA6)); a2 = a * a; es = 0; } else { e = Math.sqrt(es); // eccentricity } var ep2 = (a2 - b2) / b2; // used in geocentric return { es: es, e: e, ep2: ep2 }; } function sphere(a, b, rf, ellps, sphere) { if (!a) { // do we have an ellipsoid? var ellipse = match(exports$2, ellps); if (!ellipse) { ellipse = WGS84; } a = ellipse.a; b = ellipse.b; rf = ellipse.rf; } if (rf && !b) { b = (1.0 - 1.0 / rf) * a; } if (rf === 0 || Math.abs(a - b) < EPSLN) { sphere = true; b = a; } return { a: a, b: b, rf: rf, sphere: sphere }; } var exports$3 = {}; exports$3.wgs84 = { towgs84: "0,0,0", ellipse: "WGS84", datumName: "WGS84" }; exports$3.ch1903 = { towgs84: "674.374,15.056,405.346", ellipse: "bessel", datumName: "swiss" }; exports$3.ggrs87 = { towgs84: "-199.87,74.79,246.62", ellipse: "GRS80", datumName: "Greek_Geodetic_Reference_System_1987" }; exports$3.nad83 = { towgs84: "0,0,0", ellipse: "GRS80", datumName: "North_American_Datum_1983" }; exports$3.nad27 = { nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", ellipse: "clrk66", datumName: "North_American_Datum_1927" }; exports$3.potsdam = { towgs84: "598.1,73.7,418.2,0.202,0.045,-2.455,6.7", ellipse: "bessel", datumName: "Potsdam Rauenberg 1950 DHDN" }; exports$3.carthage = { towgs84: "-263.0,6.0,431.0", ellipse: "clark80", datumName: "Carthage 1934 Tunisia" }; exports$3.hermannskogel = { towgs84: "577.326,90.129,463.919,5.137,1.474,5.297,2.4232", ellipse: "bessel", datumName: "Hermannskogel" }; exports$3.osni52 = { towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", ellipse: "airy", datumName: "Irish National" }; exports$3.ire65 = { towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", ellipse: "mod_airy", datumName: "Ireland 1965" }; exports$3.rassadiran = { towgs84: "-133.63,-157.5,-158.62", ellipse: "intl", datumName: "Rassadiran" }; exports$3.nzgd49 = { towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", ellipse: "intl", datumName: "New Zealand Geodetic Datum 1949" }; exports$3.osgb36 = { towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", ellipse: "airy", datumName: "Airy 1830" }; exports$3.s_jtsk = { towgs84: "589,76,480", ellipse: 'bessel', datumName: 'S-JTSK (Ferro)' }; exports$3.beduaram = { towgs84: '-106,-87,188', ellipse: 'clrk80', datumName: 'Beduaram' }; exports$3.gunung_segara = { towgs84: '-403,684,41', ellipse: 'bessel', datumName: 'Gunung Segara Jakarta' }; exports$3.rnb72 = { towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1", ellipse: "intl", datumName: "Reseau National Belge 1972" }; function datum(datumCode, datum_params, a, b, es, ep2, nadgrids) { var out = {}; if (datumCode === undefined || datumCode === 'none') { out.datum_type = PJD_NODATUM; } else { out.datum_type = PJD_WGS84; } if (datum_params) { out.datum_params = datum_params.map(parseFloat); if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) { out.datum_type = PJD_3PARAM; } if (out.datum_params.length > 3) { if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) { out.datum_type = PJD_7PARAM; out.datum_params[3] *= SEC_TO_RAD; out.datum_params[4] *= SEC_TO_RAD; out.datum_params[5] *= SEC_TO_RAD; out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0; } } } if (nadgrids) { out.datum_type = PJD_GRIDSHIFT; out.grids = nadgrids; } out.a = a; //datum object also uses these values out.b = b; out.es = es; out.ep2 = ep2; return out; } /** * Resources for details of NTv2 file formats: * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm */ var loadedNadgrids = {}; /** * Load a binary NTv2 file (.gsb) to a key that can be used in a proj string like +nadgrids=. Pass the NTv2 file * as an ArrayBuffer. */ function nadgrid(key, data) { var view = new DataView(data); var isLittleEndian = detectLittleEndian(view); var header = readHeader(view, isLittleEndian); if (header.nSubgrids > 1) { console.log('Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored'); } var subgrids = readSubgrids(view, header, isLittleEndian); var nadgrid = {header: header, subgrids: subgrids}; loadedNadgrids[key] = nadgrid; return nadgrid; } /** * Given a proj4 value for nadgrids, return an array of loaded grids */ function getNadgrids(nadgrids) { // Format details: http://proj.maptools.org/gen_parms.html if (nadgrids === undefined) { return null; } var grids = nadgrids.split(','); return grids.map(parseNadgridString); } function parseNadgridString(value) { if (value.length === 0) { return null; } var optional = value[0] === '@'; if (optional) { value = value.slice(1); } if (value === 'null') { return {name: 'null', mandatory: !optional, grid: null, isNull: true}; } return { name: value, mandatory: !optional, grid: loadedNadgrids[value] || null, isNull: false }; } function secondsToRadians(seconds) { return (seconds / 3600) * Math.PI / 180; } function detectLittleEndian(view) { var nFields = view.getInt32(8, false); if (nFields === 11) { return false; } nFields = view.getInt32(8, true); if (nFields !== 11) { console.warn('Failed to detect nadgrid endian-ness, defaulting to little-endian'); } return true; } function readHeader(view, isLittleEndian) { return { nFields: view.getInt32(8, isLittleEndian), nSubgridFields: view.getInt32(24, isLittleEndian), nSubgrids: view.getInt32(40, isLittleEndian), shiftType: decodeString(view, 56, 56 + 8).trim(), fromSemiMajorAxis: view.getFloat64(120, isLittleEndian), fromSemiMinorAxis: view.getFloat64(136, isLittleEndian), toSemiMajorAxis: view.getFloat64(152, isLittleEndian), toSemiMinorAxis: view.getFloat64(168, isLittleEndian), }; } function decodeString(view, start, end) { return String.fromCharCode.apply(null, new Uint8Array(view.buffer.slice(start, end))); } function readSubgrids(view, header, isLittleEndian) { var gridOffset = 176; var grids = []; for (var i = 0; i < header.nSubgrids; i++) { var subHeader = readGridHeader(view, gridOffset, isLittleEndian); var nodes = readGridNodes(view, gridOffset, subHeader, isLittleEndian); var lngColumnCount = Math.round( 1 + (subHeader.upperLongitude - subHeader.lowerLongitude) / subHeader.longitudeInterval); var latColumnCount = Math.round( 1 + (subHeader.upperLatitude - subHeader.lowerLatitude) / subHeader.latitudeInterval); // Proj4 operates on radians whereas the coordinates are in seconds in the grid grids.push({ ll: [secondsToRadians(subHeader.lowerLongitude), secondsToRadians(subHeader.lowerLatitude)], del: [secondsToRadians(subHeader.longitudeInterval), secondsToRadians(subHeader.latitudeInterval)], lim: [lngColumnCount, latColumnCount], count: subHeader.gridNodeCount, cvs: mapNodes(nodes) }); } return grids; } function mapNodes(nodes) { return nodes.map(function (r) {return [secondsToRadians(r.longitudeShift), secondsToRadians(r.latitudeShift)];}); } function readGridHeader(view, offset, isLittleEndian) { return { name: decodeString(view, offset + 8, offset + 16).trim(), parent: decodeString(view, offset + 24, offset + 24 + 8).trim(), lowerLatitude: view.getFloat64(offset + 72, isLittleEndian), upperLatitude: view.getFloat64(offset + 88, isLittleEndian), lowerLongitude: view.getFloat64(offset + 104, isLittleEndian), upperLongitude: view.getFloat64(offset + 120, isLittleEndian), latitudeInterval: view.getFloat64(offset + 136, isLittleEndian), longitudeInterval: view.getFloat64(offset + 152, isLittleEndian), gridNodeCount: view.getInt32(offset + 168, isLittleEndian) }; } function readGridNodes(view, offset, gridHeader, isLittleEndian) { var nodesOffset = offset + 176; var gridRecordLength = 16; var gridShiftRecords = []; for (var i = 0; i < gridHeader.gridNodeCount; i++) { var record = { latitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength, isLittleEndian), longitudeShift: view.getFloat32(nodesOffset + i * gridRecordLength + 4, isLittleEndian), latitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 8, isLittleEndian), longitudeAccuracy: view.getFloat32(nodesOffset + i * gridRecordLength + 12, isLittleEndian), }; gridShiftRecords.push(record); } return gridShiftRecords; } function Projection(srsCode,callback) { if (!(this instanceof Projection)) { return new Projection(srsCode); } callback = callback || function(error){ if(error){ throw error; } }; var json = parse(srsCode); if(typeof json !== 'object'){ callback(srsCode); return; } var ourProj = Projection.projections.get(json.projName); if(!ourProj){ callback(srsCode); return; } if (json.datumCode && json.datumCode !== 'none') { var datumDef = match(exports$3, json.datumCode); if (datumDef) { json.datum_params = json.datum_params || (datumDef.towgs84 ? datumDef.towgs84.split(',') : null); json.ellps = datumDef.ellipse; json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode; } } json.k0 = json.k0 || 1.0; json.axis = json.axis || 'enu'; json.ellps = json.ellps || 'wgs84'; json.lat1 = json.lat1 || json.lat0; // Lambert_Conformal_Conic_1SP, for example, needs this var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere); var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A); var nadgrids = getNadgrids(json.nadgrids); var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2, nadgrids); extend$1(this, json); // transfer everything over from the projection because we don't know what we'll need extend$1(this, ourProj); // transfer all the methods from the projection // copy the 4 things over we calculated in deriveConstants.sphere this.a = sphere_.a; this.b = sphere_.b; this.rf = sphere_.rf; this.sphere = sphere_.sphere; // copy the 3 things we calculated in deriveConstants.eccentricity this.es = ecc.es; this.e = ecc.e; this.ep2 = ecc.ep2; // add in the datum object this.datum = datumObj; // init the projection this.init(); // legecy callback from back in the day when it went to spatialreference.org callback(null, this); } Projection.projections = projections; Projection.projections.start(); 'use strict'; function compareDatums(source, dest) { if (source.datum_type !== dest.datum_type) { return false; // false, datums are not equal } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) { // the tolerance for es is to ensure that GRS80 and WGS84 // are considered identical return false; } else if (source.datum_type === PJD_3PARAM) { return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]); } else if (source.datum_type === PJD_7PARAM) { return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]); } else { return true; // datums are equal } } // cs_compare_datums() /* * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), * according to the current ellipsoid parameters. * * Latitude : Geodetic latitude in radians (input) * Longitude : Geodetic longitude in radians (input) * Height : Geodetic height, in meters (input) * X : Calculated Geocentric X coordinate, in meters (output) * Y : Calculated Geocentric Y coordinate, in meters (output) * Z : Calculated Geocentric Z coordinate, in meters (output) * */ function geodeticToGeocentric(p, es, a) { var Longitude = p.x; var Latitude = p.y; var Height = p.z ? p.z : 0; //Z value not always supplied var Rn; /* Earth radius at location */ var Sin_Lat; /* Math.sin(Latitude) */ var Sin2_Lat; /* Square of Math.sin(Latitude) */ var Cos_Lat; /* Math.cos(Latitude) */ /* ** Don't blow up if Latitude is just a little out of the value ** range as it may just be a rounding issue. Also removed longitude ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001. */ if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) { Latitude = -HALF_PI; } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) { Latitude = HALF_PI; } else if (Latitude < -HALF_PI) { /* Latitude out of range */ //..reportError('geocent:lat out of range:' + Latitude); return { x: -Infinity, y: -Infinity, z: p.z }; } else if (Latitude > HALF_PI) { /* Latitude out of range */ return { x: Infinity, y: Infinity, z: p.z }; } if (Longitude > Math.PI) { Longitude -= (2 * Math.PI); } Sin_Lat = Math.sin(Latitude); Cos_Lat = Math.cos(Latitude); Sin2_Lat = Sin_Lat * Sin_Lat; Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat)); return { x: (Rn + Height) * Cos_Lat * Math.cos(Longitude), y: (Rn + Height) * Cos_Lat * Math.sin(Longitude), z: ((Rn * (1 - es)) + Height) * Sin_Lat }; } // cs_geodetic_to_geocentric() function geocentricToGeodetic(p, es, a, b) { /* local defintions and variables */ /* end-criterium of loop, accuracy of sin(Latitude) */ var genau = 1e-12; var genau2 = (genau * genau); var maxiter = 30; var P; /* distance between semi-minor axis and location */ var RR; /* distance between center and location */ var CT; /* sin of geocentric latitude */ var ST; /* cos of geocentric latitude */ var RX; var RK; var RN; /* Earth radius at location */ var CPHI0; /* cos of start or old geodetic latitude in iterations */ var SPHI0; /* sin of start or old geodetic latitude in iterations */ var CPHI; /* cos of searched geodetic latitude */ var SPHI; /* sin of searched geodetic latitude */ var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */ var X = p.x; var Y = p.y; var Z = p.z ? p.z : 0.0; //Z value not always supplied var Longitude; var Latitude; var Height; P = Math.sqrt(X * X + Y * Y); RR = Math.sqrt(X * X + Y * Y + Z * Z); /* special cases for latitude and longitude */ if (P / a < genau) { /* special case, if P=0. (X=0., Y=0.) */ Longitude = 0.0; /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis * of ellipsoid (=center of mass), Latitude becomes PI/2 */ if (RR / a < genau) { Latitude = HALF_PI; Height = -b; return { x: p.x, y: p.y, z: p.z }; } } else { /* ellipsoidal (geodetic) longitude * interval: -PI < Longitude <= +PI */ Longitude = Math.atan2(Y, X); } /* -------------------------------------------------------------- * Following iterative algorithm was developped by * "Institut for Erdmessung", University of Hannover, July 1988. * Internet: www.ife.uni-hannover.de * Iterative computation of CPHI,SPHI and Height. * Iteration of CPHI and SPHI to 10**-12 radian resp. * 2*10**-7 arcsec. * -------------------------------------------------------------- */ CT = Z / RR; ST = P / RR; RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST); CPHI0 = ST * (1.0 - es) * RX; SPHI0 = CT * RX; iter = 0; /* loop to find sin(Latitude) resp. Latitude * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ do { iter++; RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0); /* ellipsoidal (geodetic) height */ Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0); RK = es * RN / (RN + Height); RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST); CPHI = ST * (1.0 - RK) * RX; SPHI = CT * RX; SDPHI = SPHI * CPHI0 - CPHI * SPHI0; CPHI0 = CPHI; SPHI0 = SPHI; } while (SDPHI * SDPHI > genau2 && iter < maxiter); /* ellipsoidal (geodetic) latitude */ Latitude = Math.atan(SPHI / Math.abs(CPHI)); return { x: Longitude, y: Latitude, z: Height }; } // cs_geocentric_to_geodetic() /****************************************************************/ // pj_geocentic_to_wgs84( p ) // p = point to transform in geocentric coordinates (x,y,z) /** point object, nothing fancy, just allows values to be passed back and forth by reference rather than by value. Other point classes may be used as long as they have x and y properties, which will get modified in the transform method. */ function geocentricToWgs84(p, datum_type, datum_params) { if (datum_type === PJD_3PARAM) { // if( x[io] === HUGE_VAL ) // continue; return { x: p.x + datum_params[0], y: p.y + datum_params[1], z: p.z + datum_params[2], }; } else if (datum_type === PJD_7PARAM) { var Dx_BF = datum_params[0]; var Dy_BF = datum_params[1]; var Dz_BF = datum_params[2]; var Rx_BF = datum_params[3]; var Ry_BF = datum_params[4]; var Rz_BF = datum_params[5]; var M_BF = datum_params[6]; // if( x[io] === HUGE_VAL ) // continue; return { x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF, y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF, z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF }; } } // cs_geocentric_to_wgs84 /****************************************************************/ // pj_geocentic_from_wgs84() // coordinate system definition, // point to transform in geocentric coordinates (x,y,z) function geocentricFromWgs84(p, datum_type, datum_params) { if (datum_type === PJD_3PARAM) { //if( x[io] === HUGE_VAL ) // continue; return { x: p.x - datum_params[0], y: p.y - datum_params[1], z: p.z - datum_params[2], }; } else if (datum_type === PJD_7PARAM) { var Dx_BF = datum_params[0]; var Dy_BF = datum_params[1]; var Dz_BF = datum_params[2]; var Rx_BF = datum_params[3]; var Ry_BF = datum_params[4]; var Rz_BF = datum_params[5]; var M_BF = datum_params[6]; var x_tmp = (p.x - Dx_BF) / M_BF; var y_tmp = (p.y - Dy_BF) / M_BF; var z_tmp = (p.z - Dz_BF) / M_BF; //if( x[io] === HUGE_VAL ) // continue; return { x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp, y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp, z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp }; } //cs_geocentric_from_wgs84() } function checkParams(type) { return (type === PJD_3PARAM || type === PJD_7PARAM); } function datum_transform(source, dest, point) { // Short cut if the datums are identical. if (compareDatums(source, dest)) { return point; // in this case, zero is sucess, // whereas cs_compare_datums returns 1 to indicate TRUE // confusing, should fix this } // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) { return point; } // If this datum requires grid shifts, then apply it to geodetic coordinates. var source_a = source.a; var source_es = source.es; if (source.datum_type === PJD_GRIDSHIFT) { var gridShiftCode = applyGridShift(source, false, point); if (gridShiftCode !== 0) { return undefined; } source_a = SRS_WGS84_SEMIMAJOR; source_es = SRS_WGS84_ESQUARED; } var dest_a = dest.a; var dest_b = dest.b; var dest_es = dest.es; if (dest.datum_type === PJD_GRIDSHIFT) { dest_a = SRS_WGS84_SEMIMAJOR; dest_b = SRS_WGS84_SEMIMINOR; dest_es = SRS_WGS84_ESQUARED; } // Do we need to go through geocentric coordinates? if (source_es === dest_es && source_a === dest_a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) { return point; } // Convert to geocentric coordinates. point = geodeticToGeocentric(point, source_es, source_a); // Convert between datums if (checkParams(source.datum_type)) { point = geocentricToWgs84(point, source.datum_type, source.datum_params); } if (checkParams(dest.datum_type)) { point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params); } point = geocentricToGeodetic(point, dest_es, dest_a, dest_b); if (dest.datum_type === PJD_GRIDSHIFT) { var destGridShiftResult = applyGridShift(dest, true, point); if (destGridShiftResult !== 0) { return undefined; } } return point; } function applyGridShift(source, inverse, point) { if (source.grids === null || source.grids.length === 0) { console.log('Grid shift grids not found'); return -1; } var input = {x: -point.x, y: point.y}; var output = {x: Number.NaN, y: Number.NaN}; var onlyMandatoryGrids = false; var attemptedGrids = []; for (var i = 0; i < source.grids.length; i++) { var grid = source.grids[i]; attemptedGrids.push(grid.name); if (grid.isNull) { output = input; break; } onlyMandatoryGrids = grid.mandatory; if (grid.grid === null) { if (grid.mandatory) { console.log("Unable to find mandatory grid '" + grid.name + "'"); return -1; } continue; } var subgrid = grid.grid.subgrids[0]; // skip tables that don't match our point at all var epsilon = (Math.abs(subgrid.del[1]) + Math.abs(subgrid.del[0])) / 10000.0; var minX = subgrid.ll[0] - epsilon; var minY = subgrid.ll[1] - epsilon; var maxX = subgrid.ll[0] + (subgrid.lim[0] - 1) * subgrid.del[0] + epsilon; var maxY = subgrid.ll[1] + (subgrid.lim[1] - 1) * subgrid.del[1] + epsilon; if (minY > input.y || minX > input.x || maxY < input.y || maxX < input.x ) { continue; } output = applySubgridShift(input, inverse, subgrid); if (!isNaN(output.x)) { break; } } if (isNaN(output.x)) { console.log("Failed to find a grid shift table for location '"+ -input.x * R2D + " " + input.y * R2D + " tried: '" + attemptedGrids + "'"); return -1; } point.x = -output.x; point.y = output.y; return 0; } function applySubgridShift(pin, inverse, ct) { var val = {x: Number.NaN, y: Number.NaN}; if (isNaN(pin.x)) { return val; } var tb = {x: pin.x, y: pin.y}; tb.x -= ct.ll[0]; tb.y -= ct.ll[1]; tb.x = adjust_lon(tb.x - Math.PI) + Math.PI; var t = nadInterpolate(tb, ct); if (inverse) { if (isNaN(t.x)) { return val; } t.x = tb.x - t.x; t.y = tb.y - t.y; var i = 9, tol = 1e-12; var dif, del; do { del = nadInterpolate(t, ct); if (isNaN(del.x)) { console.log("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation."); break; } dif = {x: tb.x - (del.x + t.x), y: tb.y - (del.y + t.y)}; t.x += dif.x; t.y += dif.y; } while (i-- && Math.abs(dif.x) > tol && Math.abs(dif.y) > tol); if (i < 0) { console.log("Inverse grid shift iterator failed to converge."); return val; } val.x = adjust_lon(t.x + ct.ll[0]); val.y = t.y + ct.ll[1]; } else { if (!isNaN(t.x)) { val.x = pin.x + t.x; val.y = pin.y + t.y; } } return val; } function nadInterpolate(pin, ct) { var t = {x: pin.x / ct.del[0], y: pin.y / ct.del[1]}; var indx = {x: Math.floor(t.x), y: Math.floor(t.y)}; var frct = {x: t.x - 1.0 * indx.x, y: t.y - 1.0 * indx.y}; var val= {x: Number.NaN, y: Number.NaN}; var inx; if (indx.x < 0 || indx.x >= ct.lim[0]) { return val; } if (indx.y < 0 || indx.y >= ct.lim[1]) { return val; } inx = (indx.y * ct.lim[0]) + indx.x; var f00 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; inx++; var f10= {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; inx += ct.lim[0]; var f11 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; inx--; var f01 = {x: ct.cvs[inx][0], y: ct.cvs[inx][1]}; var m11 = frct.x * frct.y, m10 = frct.x * (1.0 - frct.y), m00 = (1.0 - frct.x) * (1.0 - frct.y), m01 = (1.0 - frct.x) * frct.y; val.x = (m00 * f00.x + m10 * f10.x + m01 * f01.x + m11 * f11.x); val.y = (m00 * f00.y + m10 * f10.y + m01 * f01.y + m11 * f11.y); return val; } function adjust_axis(crs, denorm, point) { var xin = point.x, yin = point.y, zin = point.z || 0.0; var v, t, i; var out = {}; for (i = 0; i < 3; i++) { if (denorm && i === 2 && point.z === undefined) { continue; } if (i === 0) { v = xin; if ("ew".indexOf(crs.axis[i]) !== -1) { t = 'x'; } else { t = 'y'; } } else if (i === 1) { v = yin; if ("ns".indexOf(crs.axis[i]) !== -1) { t = 'y'; } else { t = 'x'; } } else { v = zin; t = 'z'; } switch (crs.axis[i]) { case 'e': out[t] = v; break; case 'w': out[t] = -v; break; case 'n': out[t] = v; break; case 's': out[t] = -v; break; case 'u': if (point[t] !== undefined) { out.z = v; } break; case 'd': if (point[t] !== undefined) { out.z = -v; } break; default: //console.log("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); return null; } } return out; } function common (array){ var out = { x: array[0], y: array[1] }; if (array.length>2) { out.z = array[2]; } if (array.length>3) { out.m = array[3]; } return out; } function checkSanity (point) { checkCoord(point.x); checkCoord(point.y); } function checkCoord(num) { if (typeof Number.isFinite === 'function') { if (Number.isFinite(num)) { return; } throw new TypeError('coordinates must be finite numbers'); } if (typeof num !== 'number' || num !== num || !isFinite(num)) { throw new TypeError('coordinates must be finite numbers'); } } function checkNotWGS(source, dest) { return ( (source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM || source.datum.datum_type === PJD_GRIDSHIFT) && dest.datumCode !== 'WGS84') || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM || dest.datum.datum_type === PJD_GRIDSHIFT) && source.datumCode !== 'WGS84'); } function transform(source, dest, point, enforceAxis) { var wgs84; if (Array.isArray(point)) { point = common(point); } else { // Clone the point object so inputs don't get modified point = { x: point.x, y: point.y, z: point.z, m: point.m }; } var hasZ = point.z !== undefined; checkSanity(point); // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 if (source.datum && dest.datum && checkNotWGS(source, dest)) { wgs84 = new Projection('WGS84'); point = transform(source, wgs84, point, enforceAxis); source = wgs84; } // DGR, 2010/11/12 if (enforceAxis && source.axis !== 'enu') { point = adjust_axis(source, false, point); } // Transform source points to long/lat, if they aren't already. if (source.projName === 'longlat') { point = { x: point.x * D2R, y: point.y * D2R, z: point.z || 0 }; } else { if (source.to_meter) { point = { x: point.x * source.to_meter, y: point.y * source.to_meter, z: point.z || 0 }; } point = source.inverse(point); // Convert Cartesian to longlat if (!point) { return; } } // Adjust for the prime meridian if necessary if (source.from_greenwich) { point.x += source.from_greenwich; } // Convert datums if needed, and if possible. point = datum_transform(source.datum, dest.datum, point); if (!point) { return; } // Adjust for the prime meridian if necessary if (dest.from_greenwich) { point = { x: point.x - dest.from_greenwich, y: point.y, z: point.z || 0 }; } if (dest.projName === 'longlat') { // convert radians to decimal degrees point = { x: point.x * R2D, y: point.y * R2D, z: point.z || 0 }; } else { // else project point = dest.forward(point); if (dest.to_meter) { point = { x: point.x / dest.to_meter, y: point.y / dest.to_meter, z: point.z || 0 }; } } // DGR, 2010/11/12 if (enforceAxis && dest.axis !== 'enu') { return adjust_axis(dest, true, point); } if (!hasZ) { delete point.z; } return point; } var wgs84 = Projection('WGS84'); function transformer(from, to, coords, enforceAxis) { var transformedArray, out, keys; if (Array.isArray(coords)) { transformedArray = transform(from, to, coords, enforceAxis) || {x: NaN, y: NaN}; if (coords.length > 2) { if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) { if (typeof transformedArray.z === 'number') { return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.splice(3)); } else { return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.splice(3)); } } else { return [transformedArray.x, transformedArray.y].concat(coords.splice(2)); } } else { return [transformedArray.x, transformedArray.y]; } } else { out = transform(from, to, coords, enforceAxis); keys = Object.keys(coords); if (keys.length === 2) { return out; } keys.forEach(function (key) { if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) { if (key === 'x' || key === 'y' || key === 'z') { return; } } else { if (key === 'x' || key === 'y') { return; } } out[key] = coords[key]; }); return out; } } function checkProj(item) { if (item instanceof Projection) { return item; } if (item.oProj) { return item.oProj; } return Projection(item); } function proj4(fromProj, toProj, coord) { fromProj = checkProj(fromProj); var single = false; var obj; if (typeof toProj === 'undefined') { toProj = fromProj; fromProj = wgs84; single = true; } else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) { coord = toProj; toProj = fromProj; fromProj = wgs84; single = true; } toProj = checkProj(toProj); if (coord) { return transformer(fromProj, toProj, coord); } else { obj = { forward: function (coords, enforceAxis) { return transformer(fromProj, toProj, coords, enforceAxis); }, inverse: function (coords, enforceAxis) { return transformer(toProj, fromProj, coords, enforceAxis); } }; if (single) { obj.oProj = toProj; } return obj; } } /** * UTM zones are grouped, and assigned to one of a group of 6 * sets. * * {int} @private */ var NUM_100K_SETS = 6; /** * The column letters (for easting) of the lower left value, per * set. * * {string} @private */ var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS'; /** * The row letters (for northing) of the lower left value, per * set. * * {string} @private */ var SET_ORIGIN_ROW_LETTERS = 'AFAFAF'; var A = 65; // A var I = 73; // I var O = 79; // O var V = 86; // V var Z = 90; // Z var mgrs = { forward: forward$1, inverse: inverse$1, toPoint: toPoint }; /** * Conversion of lat/lon to MGRS. * * @param {object} ll Object literal with lat and lon properties on a * WGS84 ellipsoid. * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for * 100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5. * @return {string} the MGRS string for the given location and accuracy. */ function forward$1(ll, accuracy) { accuracy = accuracy || 5; // default accuracy 1m return encode(LLtoUTM({ lat: ll[1], lon: ll[0] }), accuracy); }; /** * Conversion of MGRS to lat/lon. * * @param {string} mgrs MGRS string. * @return {array} An array with left (longitude), bottom (latitude), right * (longitude) and top (latitude) values in WGS84, representing the * bounding box for the provided MGRS reference. */ function inverse$1(mgrs) { var bbox = UTMtoLL(decode(mgrs.toUpperCase())); if (bbox.lat && bbox.lon) { return [bbox.lon, bbox.lat, bbox.lon, bbox.lat]; } return [bbox.left, bbox.bottom, bbox.right, bbox.top]; }; function toPoint(mgrs) { var bbox = UTMtoLL(decode(mgrs.toUpperCase())); if (bbox.lat && bbox.lon) { return [bbox.lon, bbox.lat]; } return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2]; }; /** * Conversion from degrees to radians. * * @private * @param {number} deg the angle in degrees. * @return {number} the angle in radians. */ function degToRad(deg) { return (deg * (Math.PI / 180.0)); } /** * Conversion from radians to degrees. * * @private * @param {number} rad the angle in radians. * @return {number} the angle in degrees. */ function radToDeg(rad) { return (180.0 * (rad / Math.PI)); } /** * Converts a set of Longitude and Latitude co-ordinates to UTM * using the WGS84 ellipsoid. * * @private * @param {object} ll Object literal with lat and lon properties * representing the WGS84 coordinate to be converted. * @return {object} Object literal containing the UTM value with easting, * northing, zoneNumber and zoneLetter properties, and an optional * accuracy property in digits. Returns null if the conversion failed. */ function LLtoUTM(ll) { var Lat = ll.lat; var Long = ll.lon; var a = 6378137.0; //ellip.radius; var eccSquared = 0.00669438; //ellip.eccsq; var k0 = 0.9996; var LongOrigin; var eccPrimeSquared; var N, T, C, A, M; var LatRad = degToRad(Lat); var LongRad = degToRad(Long); var LongOriginRad; var ZoneNumber; // (int) ZoneNumber = Math.floor((Long + 180) / 6) + 1; //Make sure the longitude 180.00 is in Zone 60 if (Long === 180) { ZoneNumber = 60; } // Special zone for Norway if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) { ZoneNumber = 32; } // Special zones for Svalbard if (Lat >= 72.0 && Lat < 84.0) { if (Long >= 0.0 && Long < 9.0) { ZoneNumber = 31; } else if (Long >= 9.0 && Long < 21.0) { ZoneNumber = 33; } else if (Long >= 21.0 && Long < 33.0) { ZoneNumber = 35; } else if (Long >= 33.0 && Long < 42.0) { ZoneNumber = 37; } } LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin // in middle of // zone LongOriginRad = degToRad(LongOrigin); eccPrimeSquared = (eccSquared) / (1 - eccSquared); N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); T = Math.tan(LatRad) * Math.tan(LatRad); C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); A = Math.cos(LatRad) * (LongRad - LongOriginRad); M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad)); var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0); var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0))); if (Lat < 0.0) { UTMNorthing += 10000000.0; //10000000 meter offset for // southern hemisphere } return { northing: Math.round(UTMNorthing), easting: Math.round(UTMEasting), zoneNumber: ZoneNumber, zoneLetter: getLetterDesignator(Lat) }; } /** * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience * class where the Zone can be specified as a single string eg."60N" which * is then broken down into the ZoneNumber and ZoneLetter. * * @private * @param {object} utm An object literal with northing, easting, zoneNumber * and zoneLetter properties. If an optional accuracy property is * provided (in meters), a bounding box will be returned instead of * latitude and longitude. * @return {object} An object literal containing either lat and lon values * (if no accuracy was provided), or top, right, bottom and left values * for the bounding box calculated according to the provided accuracy. * Returns null if the conversion failed. */ function UTMtoLL(utm) { var UTMNorthing = utm.northing; var UTMEasting = utm.easting; var zoneLetter = utm.zoneLetter; var zoneNumber = utm.zoneNumber; // check the ZoneNummber is valid if (zoneNumber < 0 || zoneNumber > 60) { return null; } var k0 = 0.9996; var a = 6378137.0; //ellip.radius; var eccSquared = 0.00669438; //ellip.eccsq; var eccPrimeSquared; var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared)); var N1, T1, C1, R1, D, M; var LongOrigin; var mu, phi1Rad; // remove 500,000 meter offset for longitude var x = UTMEasting - 500000.0; var y = UTMNorthing; // We must know somehow if we are in the Northern or Southern // hemisphere, this is the only time we use the letter So even // if the Zone letter isn't exactly correct it should indicate // the hemisphere correctly if (zoneLetter < 'N') { y -= 10000000.0; // remove 10,000,000 meter offset used // for southern hemisphere } // There are 60 zones with zone 1 being at West -180 to -174 LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin // in middle of // zone eccPrimeSquared = (eccSquared) / (1 - eccSquared); M = y / k0; mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)); phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu); // double phi1 = ProjMath.radToDeg(phi1Rad); N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad)); T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad); C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad); R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5); D = x / (N1 * k0); var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720); lat = radToDeg(lat); var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad); lon = LongOrigin + radToDeg(lon); var result; if (utm.accuracy) { var topRight = UTMtoLL({ northing: utm.northing + utm.accuracy, easting: utm.easting + utm.accuracy, zoneLetter: utm.zoneLetter, zoneNumber: utm.zoneNumber }); result = { top: topRight.lat, right: topRight.lon, bottom: lat, left: lon }; } else { result = { lat: lat, lon: lon }; } return result; } /** * Calculates the MGRS letter designator for the given latitude. * * @private * @param {number} lat The latitude in WGS84 to get the letter designator * for. * @return {char} The letter designator. */ function getLetterDesignator(lat) { //This is here as an error flag to show that the Latitude is //outside MGRS limits var LetterDesignator = 'Z'; if ((84 >= lat) && (lat >= 72)) { LetterDesignator = 'X'; } else if ((72 > lat) && (lat >= 64)) { LetterDesignator = 'W'; } else if ((64 > lat) && (lat >= 56)) { LetterDesignator = 'V'; } else if ((56 > lat) && (lat >= 48)) { LetterDesignator = 'U'; } else if ((48 > lat) && (lat >= 40)) { LetterDesignator = 'T'; } else if ((40 > lat) && (lat >= 32)) { LetterDesignator = 'S'; } else if ((32 > lat) && (lat >= 24)) { LetterDesignator = 'R'; } else if ((24 > lat) && (lat >= 16)) { LetterDesignator = 'Q'; } else if ((16 > lat) && (lat >= 8)) { LetterDesignator = 'P'; } else if ((8 > lat) && (lat >= 0)) { LetterDesignator = 'N'; } else if ((0 > lat) && (lat >= -8)) { LetterDesignator = 'M'; } else if ((-8 > lat) && (lat >= -16)) { LetterDesignator = 'L'; } else if ((-16 > lat) && (lat >= -24)) { LetterDesignator = 'K'; } else if ((-24 > lat) && (lat >= -32)) { LetterDesignator = 'J'; } else if ((-32 > lat) && (lat >= -40)) { LetterDesignator = 'H'; } else if ((-40 > lat) && (lat >= -48)) { LetterDesignator = 'G'; } else if ((-48 > lat) && (lat >= -56)) { LetterDesignator = 'F'; } else if ((-56 > lat) && (lat >= -64)) { LetterDesignator = 'E'; } else if ((-64 > lat) && (lat >= -72)) { LetterDesignator = 'D'; } else if ((-72 > lat) && (lat >= -80)) { LetterDesignator = 'C'; } return LetterDesignator; } /** * Encodes a UTM location as MGRS string. * * @private * @param {object} utm An object literal with easting, northing, * zoneLetter, zoneNumber * @param {number} accuracy Accuracy in digits (1-5). * @return {string} MGRS string for the given UTM location. */ function encode(utm, accuracy) { // prepend with leading zeroes var seasting = "00000" + utm.easting, snorthing = "00000" + utm.northing; return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy); } /** * Get the two letter 100k designator for a given UTM easting, * northing and zone number value. * * @private * @param {number} easting * @param {number} northing * @param {number} zoneNumber * @return the two letter 100k designator for the given UTM location. */ function get100kID(easting, northing, zoneNumber) { var setParm = get100kSetForZone(zoneNumber); var setColumn = Math.floor(easting / 100000); var setRow = Math.floor(northing / 100000) % 20; return getLetter100kID(setColumn, setRow, setParm); } /** * Given a UTM zone number, figure out the MGRS 100K set it is in. * * @private * @param {number} i An UTM zone number. * @return {number} the 100k set the UTM zone is in. */ function get100kSetForZone(i) { var setParm = i % NUM_100K_SETS; if (setParm === 0) { setParm = NUM_100K_SETS; } return setParm; } /** * Get the two-letter MGRS 100k designator given information * translated from the UTM northing, easting and zone number. * * @private * @param {number} column the column index as it relates to the MGRS * 100k set spreadsheet, created from the UTM easting. * Values are 1-8. * @param {number} row the row index as it relates to the MGRS 100k set * spreadsheet, created from the UTM northing value. Values * are from 0-19. * @param {number} parm the set block, as it relates to the MGRS 100k set * spreadsheet, created from the UTM zone. Values are from * 1-60. * @return two letter MGRS 100k code. */ function getLetter100kID(column, row, parm) { // colOrigin and rowOrigin are the letters at the origin of the set var index = parm - 1; var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index); var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index); // colInt and rowInt are the letters to build to return var colInt = colOrigin + column - 1; var rowInt = rowOrigin + row; var rollover = false; if (colInt > Z) { colInt = colInt - Z + A - 1; rollover = true; } if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) { colInt++; } if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) { colInt++; if (colInt === I) { colInt++; } } if (colInt > Z) { colInt = colInt - Z + A - 1; } if (rowInt > V) { rowInt = rowInt - V + A - 1; rollover = true; } else { rollover = false; } if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) { rowInt++; } if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) { rowInt++; if (rowInt === I) { rowInt++; } } if (rowInt > V) { rowInt = rowInt - V + A - 1; } var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt); return twoLetter; } /** * Decode the UTM parameters from a MGRS string. * * @private * @param {string} mgrsString an UPPERCASE coordinate string is expected. * @return {object} An object literal with easting, northing, zoneLetter, * zoneNumber and accuracy (in meters) properties. */ function decode(mgrsString) { if (mgrsString && mgrsString.length === 0) { throw ("MGRSPoint coverting from nothing"); } var length = mgrsString.length; var hunK = null; var sb = ""; var testChar; var i = 0; // get Zone number while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) { if (i >= 2) { throw ("MGRSPoint bad conversion from: " + mgrsString); } sb += testChar; i++; } var zoneNumber = parseInt(sb, 10); if (i === 0 || i + 3 > length) { // A good MGRS string has to be 4-5 digits long, // ##AAA/#AAA at least. throw ("MGRSPoint bad conversion from: " + mgrsString); } var zoneLetter = mgrsString.charAt(i++); // Should we check the zone letter here? Why not. if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') { throw ("MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString); } hunK = mgrsString.substring(i, i += 2); var set = get100kSetForZone(zoneNumber); var east100k = getEastingFromChar(hunK.charAt(0), set); var north100k = getNorthingFromChar(hunK.charAt(1), set); // We have a bug where the northing may be 2000000 too low. // How // do we know when to roll over? while (north100k < getMinNorthing(zoneLetter)) { north100k += 2000000; } // calculate the char index for easting/northing separator var remainder = length - i; if (remainder % 2 !== 0) { throw ("MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString); } var sep = remainder / 2; var sepEasting = 0.0; var sepNorthing = 0.0; var accuracyBonus, sepEastingString, sepNorthingString, easting, northing; if (sep > 0) { accuracyBonus = 100000.0 / Math.pow(10, sep); sepEastingString = mgrsString.substring(i, i + sep); sepEasting = parseFloat(sepEastingString) * accuracyBonus; sepNorthingString = mgrsString.substring(i + sep); sepNorthing = parseFloat(sepNorthingString) * accuracyBonus; } easting = sepEasting + east100k; northing = sepNorthing + north100k; return { easting: easting, northing: northing, zoneLetter: zoneLetter, zoneNumber: zoneNumber, accuracy: accuracyBonus }; } /** * Given the first letter from a two-letter MGRS 100k zone, and given the * MGRS table set for the zone number, figure out the easting value that * should be added to the other, secondary easting value. * * @private * @param {char} e The first letter from a two-letter MGRS 100´k zone. * @param {number} set The MGRS table set for the zone number. * @return {number} The easting value for the given letter and set. */ function getEastingFromChar(e, set) { // colOrigin is the letter at the origin of the set for the // column var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1); var eastingValue = 100000.0; var rewindMarker = false; while (curCol !== e.charCodeAt(0)) { curCol++; if (curCol === I) { curCol++; } if (curCol === O) { curCol++; } if (curCol > Z) { if (rewindMarker) { throw ("Bad character: " + e); } curCol = A; rewindMarker = true; } eastingValue += 100000.0; } return eastingValue; } /** * Given the second letter from a two-letter MGRS 100k zone, and given the * MGRS table set for the zone number, figure out the northing value that * should be added to the other, secondary northing value. You have to * remember that Northings are determined from the equator, and the vertical * cycle of letters mean a 2000000 additional northing meters. This happens * approx. every 18 degrees of latitude. This method does *NOT* count any * additional northings. You have to figure out how many 2000000 meters need * to be added for the zone letter of the MGRS coordinate. * * @private * @param {char} n Second letter of the MGRS 100k zone * @param {number} set The MGRS table set number, which is dependent on the * UTM zone number. * @return {number} The northing value for the given letter and set. */ function getNorthingFromChar(n, set) { if (n > 'V') { throw ("MGRSPoint given invalid Northing " + n); } // rowOrigin is the letter at the origin of the set for the // column var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1); var northingValue = 0.0; var rewindMarker = false; while (curRow !== n.charCodeAt(0)) { curRow++; if (curRow === I) { curRow++; } if (curRow === O) { curRow++; } // fixing a bug making whole application hang in this loop // when 'n' is a wrong character if (curRow > V) { if (rewindMarker) { // making sure that this loop ends throw ("Bad character: " + n); } curRow = A; rewindMarker = true; } northingValue += 100000.0; } return northingValue; } /** * The function getMinNorthing returns the minimum northing value of a MGRS * zone. * * Ported from Geotrans' c Lattitude_Band_Value structure table. * * @private * @param {char} zoneLetter The MGRS zone to get the min northing for. * @return {number} */ function getMinNorthing(zoneLetter) { var northing; switch (zoneLetter) { case 'C': northing = 1100000.0; break; case 'D': northing = 2000000.0; break; case 'E': northing = 2800000.0; break; case 'F': northing = 3700000.0; break; case 'G': northing = 4600000.0; break; case 'H': northing = 5500000.0; break; case 'J': northing = 6400000.0; break; case 'K': northing = 7300000.0; break; case 'L': northing = 8200000.0; break; case 'M': northing = 9100000.0; break; case 'N': northing = 0.0; break; case 'P': northing = 800000.0; break; case 'Q': northing = 1700000.0; break; case 'R': northing = 2600000.0; break; case 'S': northing = 3500000.0; break; case 'T': northing = 4400000.0; break; case 'U': northing = 5300000.0; break; case 'V': northing = 6200000.0; break; case 'W': northing = 7000000.0; break; case 'X': northing = 7900000.0; break; default: northing = -1.0; } if (northing >= 0.0) { return northing; } else { throw ("Invalid zone letter: " + zoneLetter); } } function Point$1(x, y, z) { if (!(this instanceof Point$1)) { return new Point$1(x, y, z); } if (Array.isArray(x)) { this.x = x[0]; this.y = x[1]; this.z = x[2] || 0.0; } else if(typeof x === 'object') { this.x = x.x; this.y = x.y; this.z = x.z || 0.0; } else if (typeof x === 'string' && typeof y === 'undefined') { var coords = x.split(','); this.x = parseFloat(coords[0], 10); this.y = parseFloat(coords[1], 10); this.z = parseFloat(coords[2], 10) || 0.0; } else { this.x = x; this.y = y; this.z = z || 0.0; } console.warn('proj4.Point will be removed in version 3, use proj4.toPoint'); } Point$1.fromMGRS = function(mgrsStr) { return new Point$1(toPoint(mgrsStr)); }; Point$1.prototype.toMGRS = function(accuracy) { return forward$1([this.x, this.y], accuracy); }; var C00 = 1; var C02 = 0.25; var C04 = 0.046875; var C06 = 0.01953125; var C08 = 0.01068115234375; var C22 = 0.75; var C44 = 0.46875; var C46 = 0.01302083333333333333; var C48 = 0.00712076822916666666; var C66 = 0.36458333333333333333; var C68 = 0.00569661458333333333; var C88 = 0.3076171875; function pj_enfn(es) { var en = []; en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); var t = es * es; en[2] = t * (C44 - es * (C46 + es * C48)); t *= es; en[3] = t * (C66 - es * C68); en[4] = t * es * C88; return en; } function pj_mlfn(phi, sphi, cphi, en) { cphi *= sphi; sphi *= sphi; return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4])))); } var MAX_ITER = 20; function pj_inv_mlfn(arg, es, en) { var k = 1 / (1 - es); var phi = arg; for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */ var s = Math.sin(phi); var t = 1 - es * s * s; //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; //phi -= t * (t * Math.sqrt(t)) * k; t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; phi -= t; if (Math.abs(t) < EPSLN) { return phi; } } //..reportError("cass:pj_inv_mlfn: Convergence error"); return phi; } // Heavily based on this tmerc projection implementation function init$2() { this.x0 = this.x0 !== undefined ? this.x0 : 0; this.y0 = this.y0 !== undefined ? this.y0 : 0; this.long0 = this.long0 !== undefined ? this.long0 : 0; this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; if (this.es) { this.en = pj_enfn(this.es); this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en); } } /** Transverse Mercator Forward - long/lat to x/y long/lat in radians */ function forward$2(p) { var lon = p.x; var lat = p.y; var delta_lon = adjust_lon(lon - this.long0); var con; var x, y; var sin_phi = Math.sin(lat); var cos_phi = Math.cos(lat); if (!this.es) { var b = cos_phi * Math.sin(delta_lon); if ((Math.abs(Math.abs(b) - 1)) < EPSLN) { return (93); } else { x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0; y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2)); b = Math.abs(y); if (b >= 1) { if ((b - 1) > EPSLN) { return (93); } else { y = 0; } } else { y = Math.acos(y); } if (lat < 0) { y = -y; } y = this.a * this.k0 * (y - this.lat0) + this.y0; } } else { var al = cos_phi * delta_lon; var als = Math.pow(al, 2); var c = this.ep2 * Math.pow(cos_phi, 2); var cs = Math.pow(c, 2); var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0; var t = Math.pow(tq, 2); var ts = Math.pow(t, 2); con = 1 - this.es * Math.pow(sin_phi, 2); al = al / Math.sqrt(con); var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en); x = this.a * (this.k0 * al * (1 + als / 6 * (1 - t + c + als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c + als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) + this.x0; y = this.a * (this.k0 * (ml - this.ml0 + sin_phi * delta_lon * al / 2 * (1 + als / 12 * (5 - t + 9 * c + 4 * cs + als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c + als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) + this.y0; } p.x = x; p.y = y; return p; } /** Transverse Mercator Inverse - x/y to long/lat */ function inverse$2(p) { var con, phi; var lat, lon; var x = (p.x - this.x0) * (1 / this.a); var y = (p.y - this.y0) * (1 / this.a); if (!this.es) { var f = Math.exp(x / this.k0); var g = 0.5 * (f - 1 / f); var temp = this.lat0 + y / this.k0; var h = Math.cos(temp); con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2))); lat = Math.asin(con); if (y < 0) { lat = -lat; } if ((g === 0) && (h === 0)) { lon = 0; } else { lon = adjust_lon(Math.atan2(g, h) + this.long0); } } else { // ellipsoidal form con = this.ml0 + y / this.k0; phi = pj_inv_mlfn(con, this.es, this.en); if (Math.abs(phi) < HALF_PI) { var sin_phi = Math.sin(phi); var cos_phi = Math.cos(phi); var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0; var c = this.ep2 * Math.pow(cos_phi, 2); var cs = Math.pow(c, 2); var t = Math.pow(tan_phi, 2); var ts = Math.pow(t, 2); con = 1 - this.es * Math.pow(sin_phi, 2); var d = x * Math.sqrt(con) / this.k0; var ds = Math.pow(d, 2); con = con * tan_phi; lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 - ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs - ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c - ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t)))); lon = adjust_lon(this.long0 + (d * (1 - ds / 6 * (1 + 2 * t + c - ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c - ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi)); } else { lat = HALF_PI * sign(y); lon = 0; } } p.x = lon; p.y = lat; return p; } var names$3 = ["Fast_Transverse_Mercator", "Fast Transverse Mercator"]; var tmerc = { init: init$2, forward: forward$2, inverse: inverse$2, names: names$3 }; function sinh(x) { var r = Math.exp(x); r = (r - 1 / r) / 2; return r; } function hypot(x, y) { x = Math.abs(x); y = Math.abs(y); var a = Math.max(x, y); var b = Math.min(x, y) / (a ? a : 1); return a * Math.sqrt(1 + Math.pow(b, 2)); } function log1py(x) { var y = 1 + x; var z = y - 1; return z === 0 ? x : x * Math.log(y) / z; } function asinhy(x) { var y = Math.abs(x); y = log1py(y * (1 + y / (hypot(1, y) + 1))); return x < 0 ? -y : y; } function gatg(pp, B) { var cos_2B = 2 * Math.cos(2 * B); var i = pp.length - 1; var h1 = pp[i]; var h2 = 0; var h; while (--i >= 0) { h = -h2 + cos_2B * h1 + pp[i]; h2 = h1; h1 = h; } return (B + h * Math.sin(2 * B)); } function clens(pp, arg_r) { var r = 2 * Math.cos(arg_r); var i = pp.length - 1; var hr1 = pp[i]; var hr2 = 0; var hr; while (--i >= 0) { hr = -hr2 + r * hr1 + pp[i]; hr2 = hr1; hr1 = hr; } return Math.sin(arg_r) * hr; } function cosh(x) { var r = Math.exp(x); r = (r + 1 / r) / 2; return r; } function clens_cmplx(pp, arg_r, arg_i) { var sin_arg_r = Math.sin(arg_r); var cos_arg_r = Math.cos(arg_r); var sinh_arg_i = sinh(arg_i); var cosh_arg_i = cosh(arg_i); var r = 2 * cos_arg_r * cosh_arg_i; var i = -2 * sin_arg_r * sinh_arg_i; var j = pp.length - 1; var hr = pp[j]; var hi1 = 0; var hr1 = 0; var hi = 0; var hr2; var hi2; while (--j >= 0) { hr2 = hr1; hi2 = hi1; hr1 = hr; hi1 = hi; hr = -hr2 + r * hr1 - i * hi1 + pp[j]; hi = -hi2 + i * hr1 + r * hi1; } r = sin_arg_r * cosh_arg_i; i = cos_arg_r * sinh_arg_i; return [r * hr - i * hi, r * hi + i * hr]; } // Heavily based on this etmerc projection implementation function init$3() { if (!this.approx && (isNaN(this.es) || this.es <= 0)) { throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.'); } if (this.approx) { // When '+approx' is set, use tmerc instead tmerc.init.apply(this); this.forward = tmerc.forward; this.inverse = tmerc.inverse; } this.x0 = this.x0 !== undefined ? this.x0 : 0; this.y0 = this.y0 !== undefined ? this.y0 : 0; this.long0 = this.long0 !== undefined ? this.long0 : 0; this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; this.cgb = []; this.cbg = []; this.utg = []; this.gtu = []; var f = this.es / (1 + Math.sqrt(1 - this.es)); var n = f / (2 - f); var np = n; this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 )))))); this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725)))))); np = np * n; this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945))))); this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945))))); np = np * n; this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835)))); this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835)))); np = np * n; this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175))); this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175))); np = np * n; this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237)); this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185)); np = np * n; this.cgb[5] = np * (601676 / 22275); this.cbg[5] = np * (444337 / 155925); np = Math.pow(n, 2); this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256))); this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800)))))); this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800)))))); this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720))))); this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360))))); np = np * n; this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 )))); this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440)))); np = np * n; this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600))); this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600))); np = np * n; this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680)); this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840)); np = np * n; this.utg[5] = np * (-20648693 / 638668800); this.gtu[5] = np * (212378941 / 319334400); var Z = gatg(this.cbg, this.lat0); this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z)); } function forward$3(p) { var Ce = adjust_lon(p.x - this.long0); var Cn = p.y; Cn = gatg(this.cbg, Cn); var sin_Cn = Math.sin(Cn); var cos_Cn = Math.cos(Cn); var sin_Ce = Math.sin(Ce); var cos_Ce = Math.cos(Ce); Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn); Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce)); Ce = asinhy(Math.tan(Ce)); var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce); Cn = Cn + tmp[0]; Ce = Ce + tmp[1]; var x; var y; if (Math.abs(Ce) <= 2.623395162778) { x = this.a * (this.Qn * Ce) + this.x0; y = this.a * (this.Qn * Cn + this.Zb) + this.y0; } else { x = Infinity; y = Infinity; } p.x = x; p.y = y; return p; } function inverse$3(p) { var Ce = (p.x - this.x0) * (1 / this.a); var Cn = (p.y - this.y0) * (1 / this.a); Cn = (Cn - this.Zb) / this.Qn; Ce = Ce / this.Qn; var lon; var lat; if (Math.abs(Ce) <= 2.623395162778) { var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce); Cn = Cn + tmp[0]; Ce = Ce + tmp[1]; Ce = Math.atan(sinh(Ce)); var sin_Cn = Math.sin(Cn); var cos_Cn = Math.cos(Cn); var sin_Ce = Math.sin(Ce); var cos_Ce = Math.cos(Ce); Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn)); Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn); lon = adjust_lon(Ce + this.long0); lat = gatg(this.cgb, Cn); } else { lon = Infinity; lat = Infinity; } p.x = lon; p.y = lat; return p; } var names$4 = ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc", "Transverse_Mercator", "Transverse Mercator", "tmerc"]; var etmerc = { init: init$3, forward: forward$3, inverse: inverse$3, names: names$4 }; function adjust_zone(zone, lon) { if (zone === undefined) { zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1; if (zone < 0) { return 0; } else if (zone > 60) { return 60; } } return zone; } var dependsOn = 'etmerc'; function init$4() { var zone = adjust_zone(this.zone, this.long0); if (zone === undefined) { throw new Error('unknown utm zone'); } this.lat0 = 0; this.long0 = ((6 * Math.abs(zone)) - 183) * D2R; this.x0 = 500000; this.y0 = this.utmSouth ? 10000000 : 0; this.k0 = 0.9996; etmerc.init.apply(this); this.forward = etmerc.forward; this.inverse = etmerc.inverse; } var names$5 = ["Universal Transverse Mercator System", "utm"]; var utm = { init: init$4, names: names$5, dependsOn: dependsOn }; function srat(esinp, exp) { return (Math.pow((1 - esinp) / (1 + esinp), exp)); } var MAX_ITER$1 = 20; function init$5() { var sphi = Math.sin(this.lat0); var cphi = Math.cos(this.lat0); cphi *= cphi; this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es)); this.phic0 = Math.asin(sphi / this.C); this.ratexp = 0.5 * this.C * this.e; this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); } function forward$4(p) { var lon = p.x; var lat = p.y; p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; p.x = this.C * lon; return p; } function inverse$4(p) { var DEL_TOL = 1e-14; var lon = p.x / this.C; var lat = p.y; var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); for (var i = MAX_ITER$1; i > 0; --i) { lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI; if (Math.abs(lat - p.y) < DEL_TOL) { break; } p.y = lat; } /* convergence failed */ if (!i) { return null; } p.x = lon; p.y = lat; return p; } var names$6 = ["gauss"]; var gauss = { init: init$5, forward: forward$4, inverse: inverse$4, names: names$6 }; function init$6() { gauss.init.apply(this); if (!this.rc) { return; } this.sinc0 = Math.sin(this.phic0); this.cosc0 = Math.cos(this.phic0); this.R2 = 2 * this.rc; if (!this.title) { this.title = "Oblique Stereographic Alternative"; } } function forward$5(p) { var sinc, cosc, cosl, k; p.x = adjust_lon(p.x - this.long0); gauss.forward.apply(this, [p]); sinc = Math.sin(p.y); cosc = Math.cos(p.y); cosl = Math.cos(p.x); k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); p.x = k * cosc * Math.sin(p.x); p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); p.x = this.a * p.x + this.x0; p.y = this.a * p.y + this.y0; return p; } function inverse$5(p) { var sinc, cosc, lon, lat, rho; p.x = (p.x - this.x0) / this.a; p.y = (p.y - this.y0) / this.a; p.x /= this.k0; p.y /= this.k0; if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) { var c = 2 * Math.atan2(rho, this.R2); sinc = Math.sin(c); cosc = Math.cos(c); lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); } else { lat = this.phic0; lon = 0; } p.x = lon; p.y = lat; gauss.inverse.apply(this, [p]); p.x = adjust_lon(p.x + this.long0); return p; } var names$7 = ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea","Oblique Stereographic Alternative","Double_Stereographic"]; var sterea = { init: init$6, forward: forward$5, inverse: inverse$5, names: names$7 }; function ssfn_(phit, sinphi, eccen) { sinphi *= eccen; return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen)); } function init$7() { this.coslat0 = Math.cos(this.lat0); this.sinlat0 = Math.sin(this.lat0); if (this.sphere) { if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts)); } } else { if (Math.abs(this.coslat0) <= EPSLN) { if (this.lat0 > 0) { //North pole //trace('stere:north pole'); this.con = 1; } else { //South pole //trace('stere:south pole'); this.con = -1; } } this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)); if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts)); } this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0); this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI; this.cosX0 = Math.cos(this.X0); this.sinX0 = Math.sin(this.X0); } } // Stereographic forward equations--mapping lat,long to x,y function forward$6(p) { var lon = p.x; var lat = p.y; var sinlat = Math.sin(lat); var coslat = Math.cos(lat); var A, X, sinX, cosX, ts, rh; var dlon = adjust_lon(lon - this.long0); if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) { //case of the origine point //trace('stere:this is the origin point'); p.x = NaN; p.y = NaN; return p; } if (this.sphere) { //trace('stere:sphere case'); A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon)); p.x = this.a * A * coslat * Math.sin(dlon) + this.x0; p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0; return p; } else { X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI; cosX = Math.cos(X); sinX = Math.sin(X); if (Math.abs(this.coslat0) <= EPSLN) { ts = tsfnz(this.e, lat * this.con, this.con * sinlat); rh = 2 * this.a * this.k0 * ts / this.cons; p.x = this.x0 + rh * Math.sin(lon - this.long0); p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0); //trace(p.toString()); return p; } else if (Math.abs(this.sinlat0) < EPSLN) { //Eq //trace('stere:equateur'); A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon)); p.y = A * sinX; } else { //other case //trace('stere:normal case'); A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon))); p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0; } p.x = A * cosX * Math.sin(dlon) + this.x0; } //trace(p.toString()); return p; } //* Stereographic inverse equations--mapping x,y to lat/long function inverse$6(p) { p.x -= this.x0; p.y -= this.y0; var lon, lat, ts, ce, Chi; var rh = Math.sqrt(p.x * p.x + p.y * p.y); if (this.sphere) { var c = 2 * Math.atan(rh / (2 * this.a * this.k0)); lon = this.long0; lat = this.lat0; if (rh <= EPSLN) { p.x = lon; p.y = lat; return p; } lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh); if (Math.abs(this.coslat0) < EPSLN) { if (this.lat0 > 0) { lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); } else { lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); } } else { lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c))); } p.x = lon; p.y = lat; return p; } else { if (Math.abs(this.coslat0) <= EPSLN) { if (rh <= EPSLN) { lat = this.lat0; lon = this.long0; p.x = lon; p.y = lat; //trace(p.toString()); return p; } p.x *= this.con; p.y *= this.con; ts = rh * this.cons / (2 * this.a * this.k0); lat = this.con * phi2z(this.e, ts); lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y)); } else { ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1)); lon = this.long0; if (rh <= EPSLN) { Chi = this.X0; } else { Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh); lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce))); } lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi))); } } p.x = lon; p.y = lat; //trace(p.toString()); return p; } var names$8 = ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)"]; var stere = { init: init$7, forward: forward$6, inverse: inverse$6, names: names$8, ssfn_: ssfn_ }; /* references: Formules et constantes pour le Calcul pour la projection cylindrique conforme à axe oblique et pour la transformation entre des systèmes de référence. http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf */ function init$8() { var phy0 = this.lat0; this.lambda0 = this.long0; var sinPhy0 = Math.sin(phy0); var semiMajorAxis = this.a; var invF = this.rf; var flattening = 1 / invF; var e2 = 2 * flattening - Math.pow(flattening, 2); var e = this.e = Math.sqrt(e2); this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2)); this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4)); this.b0 = Math.asin(sinPhy0 / this.alpha); var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)); var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2)); var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0)); this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3; } function forward$7(p) { var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2)); var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y))); var S = -this.alpha * (Sa1 + Sa2) + this.K; // spheric latitude var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4); // spheric longitude var I = this.alpha * (p.x - this.lambda0); // psoeudo equatorial rotation var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I))); var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0; p.x = this.R * rotI + this.x0; return p; } function inverse$7(p) { var Y = p.x - this.x0; var X = p.y - this.y0; var rotI = Y / this.R; var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4); var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB))); var lambda = this.lambda0 + I / this.alpha; var S = 0; var phy = b; var prevPhy = -1000; var iteration = 0; while (Math.abs(phy - prevPhy) > 0.0000001) { if (++iteration > 20) { //...reportError("omercFwdInfinity"); return; } //S = Math.log(Math.tan(Math.PI / 4 + phy / 2)); S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2)); prevPhy = phy; phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2; } p.x = lambda; p.y = phy; return p; } var names$9 = ["somerc"]; var somerc = { init: init$8, forward: forward$7, inverse: inverse$7, names: names$9 }; var TOL = 1e-7; function isTypeA(P) { var typeAProjections = ['Hotine_Oblique_Mercator','Hotine_Oblique_Mercator_Azimuth_Natural_Origin']; var projectionName = typeof P.PROJECTION === "object" ? Object.keys(P.PROJECTION)[0] : P.PROJECTION; return 'no_uoff' in P || 'no_off' in P || typeAProjections.indexOf(projectionName) !== -1; } /* Initialize the Oblique Mercator projection ------------------------------------------*/ function init$9() { var con, com, cosph0, D, F, H, L, sinph0, p, J, gamma = 0, gamma0, lamc = 0, lam1 = 0, lam2 = 0, phi1 = 0, phi2 = 0, alpha_c = 0, AB; // only Type A uses the no_off or no_uoff property // https://github.com/OSGeo/proj.4/issues/104 this.no_off = isTypeA(this); this.no_rot = 'no_rot' in this; var alp = false; if ("alpha" in this) { alp = true; } var gam = false; if ("rectified_grid_angle" in this) { gam = true; } if (alp) { alpha_c = this.alpha; } if (gam) { gamma = (this.rectified_grid_angle * D2R); } if (alp || gam) { lamc = this.longc; } else { lam1 = this.long1; phi1 = this.lat1; lam2 = this.long2; phi2 = this.lat2; if (Math.abs(phi1 - phi2) <= TOL || (con = Math.abs(phi1)) <= TOL || Math.abs(con - HALF_PI) <= TOL || Math.abs(Math.abs(this.lat0) - HALF_PI) <= TOL || Math.abs(Math.abs(phi2) - HALF_PI) <= TOL) { throw new Error(); } } var one_es = 1.0 - this.es; com = Math.sqrt(one_es); if (Math.abs(this.lat0) > EPSLN) { sinph0 = Math.sin(this.lat0); cosph0 = Math.cos(this.lat0); con = 1 - this.es * sinph0 * sinph0; this.B = cosph0 * cosph0; this.B = Math.sqrt(1 + this.es * this.B * this.B / one_es); this.A = this.B * this.k0 * com / con; D = this.B * com / (cosph0 * Math.sqrt(con)); F = D * D -1; if (F <= 0) { F = 0; } else { F = Math.sqrt(F); if (this.lat0 < 0) { F = -F; } } this.E = F += D; this.E *= Math.pow(tsfnz(this.e, this.lat0, sinph0), this.B); } else { this.B = 1 / com; this.A = this.k0; this.E = D = F = 1; } if (alp || gam) { if (alp) { gamma0 = Math.asin(Math.sin(alpha_c) / D); if (!gam) { gamma = alpha_c; } } else { gamma0 = gamma; alpha_c = Math.asin(D * Math.sin(gamma0)); } this.lam0 = lamc - Math.asin(0.5 * (F - 1 / F) * Math.tan(gamma0)) / this.B; } else { H = Math.pow(tsfnz(this.e, phi1, Math.sin(phi1)), this.B); L = Math.pow(tsfnz(this.e, phi2, Math.sin(phi2)), this.B); F = this.E / H; p = (L - H) / (L + H); J = this.E * this.E; J = (J - L * H) / (J + L * H); con = lam1 - lam2; if (con < -Math.pi) { lam2 -=TWO_PI; } else if (con > Math.pi) { lam2 += TWO_PI; } this.lam0 = adjust_lon(0.5 * (lam1 + lam2) - Math.atan(J * Math.tan(0.5 * this.B * (lam1 - lam2)) / p) / this.B); gamma0 = Math.atan(2 * Math.sin(this.B * adjust_lon(lam1 - this.lam0)) / (F - 1 / F)); gamma = alpha_c = Math.asin(D * Math.sin(gamma0)); } this.singam = Math.sin(gamma0); this.cosgam = Math.cos(gamma0); this.sinrot = Math.sin(gamma); this.cosrot = Math.cos(gamma); this.rB = 1 / this.B; this.ArB = this.A * this.rB; this.BrA = 1 / this.ArB; AB = this.A * this.B; if (this.no_off) { this.u_0 = 0; } else { this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(D * D - 1) / Math.cos(alpha_c))); if (this.lat0 < 0) { this.u_0 = - this.u_0; } } F = 0.5 * gamma0; this.v_pole_n = this.ArB * Math.log(Math.tan(FORTPI - F)); this.v_pole_s = this.ArB * Math.log(Math.tan(FORTPI + F)); } /* Oblique Mercator forward equations--mapping lat,long to x,y ----------------------------------------------------------*/ function forward$8(p) { var coords = {}; var S, T, U, V, W, temp, u, v; p.x = p.x - this.lam0; if (Math.abs(Math.abs(p.y) - HALF_PI) > EPSLN) { W = this.E / Math.pow(tsfnz(this.e, p.y, Math.sin(p.y)), this.B); temp = 1 / W; S = 0.5 * (W - temp); T = 0.5 * (W + temp); V = Math.sin(this.B * p.x); U = (S * this.singam - V * this.cosgam) / T; if (Math.abs(Math.abs(U) - 1.0) < EPSLN) { throw new Error(); } v = 0.5 * this.ArB * Math.log((1 - U)/(1 + U)); temp = Math.cos(this.B * p.x); if (Math.abs(temp) < TOL) { u = this.A * p.x; } else { u = this.ArB * Math.atan2((S * this.cosgam + V * this.singam), temp); } } else { v = p.y > 0 ? this.v_pole_n : this.v_pole_s; u = this.ArB * p.y; } if (this.no_rot) { coords.x = u; coords.y = v; } else { u -= this.u_0; coords.x = v * this.cosrot + u * this.sinrot; coords.y = u * this.cosrot - v * this.sinrot; } coords.x = (this.a * coords.x + this.x0); coords.y = (this.a * coords.y + this.y0); return coords; } function inverse$8(p) { var u, v, Qp, Sp, Tp, Vp, Up; var coords = {}; p.x = (p.x - this.x0) * (1.0 / this.a); p.y = (p.y - this.y0) * (1.0 / this.a); if (this.no_rot) { v = p.y; u = p.x; } else { v = p.x * this.cosrot - p.y * this.sinrot; u = p.y * this.cosrot + p.x * this.sinrot + this.u_0; } Qp = Math.exp(-this.BrA * v); Sp = 0.5 * (Qp - 1 / Qp); Tp = 0.5 * (Qp + 1 / Qp); Vp = Math.sin(this.BrA * u); Up = (Vp * this.cosgam + Sp * this.singam) / Tp; if (Math.abs(Math.abs(Up) - 1) < EPSLN) { coords.x = 0; coords.y = Up < 0 ? -HALF_PI : HALF_PI; } else { coords.y = this.E / Math.sqrt((1 + Up) / (1 - Up)); coords.y = phi2z(this.e, Math.pow(coords.y, 1 / this.B)); if (coords.y === Infinity) { throw new Error(); } coords.x = -this.rB * Math.atan2((Sp * this.cosgam - Vp * this.singam), Math.cos(this.BrA * u)); } coords.x += this.lam0; return coords; } var names$a = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Two_Point_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "Oblique_Mercator", "omerc"]; var omerc = { init: init$9, forward: forward$8, inverse: inverse$8, names: names$a }; function init$a() { //double lat0; /* the reference latitude */ //double long0; /* the reference longitude */ //double lat1; /* first standard parallel */ //double lat2; /* second standard parallel */ //double r_maj; /* major axis */ //double r_min; /* minor axis */ //double false_east; /* x offset in meters */ //double false_north; /* y offset in meters */ //the above value can be set with proj4.defs //example: proj4.defs("EPSG:2154","+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"); if (!this.lat2) { this.lat2 = this.lat1; } //if lat2 is not defined if (!this.k0) { this.k0 = 1; } this.x0 = this.x0 || 0; this.y0 = this.y0 || 0; // Standard Parallels cannot be equal and on opposite sides of the equator if (Math.abs(this.lat1 + this.lat2) < EPSLN) { return; } var temp = this.b / this.a; this.e = Math.sqrt(1 - temp * temp); var sin1 = Math.sin(this.lat1); var cos1 = Math.cos(this.lat1); var ms1 = msfnz(this.e, sin1, cos1); var ts1 = tsfnz(this.e, this.lat1, sin1); var sin2 = Math.sin(this.lat2); var cos2 = Math.cos(this.lat2); var ms2 = msfnz(this.e, sin2, cos2); var ts2 = tsfnz(this.e, this.lat2, sin2); var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0)); if (Math.abs(this.lat1 - this.lat2) > EPSLN) { this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); } else { this.ns = sin1; } if (isNaN(this.ns)) { this.ns = sin1; } this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); if (!this.title) { this.title = "Lambert Conformal Conic"; } } // Lambert Conformal conic forward equations--mapping lat,long to x,y // ----------------------------------------------------------------- function forward$9(p) { var lon = p.x; var lat = p.y; // singular cases : if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { lat = sign(lat) * (HALF_PI - 2 * EPSLN); } var con = Math.abs(Math.abs(lat) - HALF_PI); var ts, rh1; if (con > EPSLN) { ts = tsfnz(this.e, lat, Math.sin(lat)); rh1 = this.a * this.f0 * Math.pow(ts, this.ns); } else { con = lat * this.ns; if (con <= 0) { return null; } rh1 = 0; } var theta = this.ns * adjust_lon(lon - this.long0); p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; return p; } // Lambert Conformal Conic inverse equations--mapping x,y to lat/long // ----------------------------------------------------------------- function inverse$9(p) { var rh1, con, ts; var lat, lon; var x = (p.x - this.x0) / this.k0; var y = (this.rh - (p.y - this.y0) / this.k0); if (this.ns > 0) { rh1 = Math.sqrt(x * x + y * y); con = 1; } else { rh1 = -Math.sqrt(x * x + y * y); con = -1; } var theta = 0; if (rh1 !== 0) { theta = Math.atan2((con * x), (con * y)); } if ((rh1 !== 0) || (this.ns > 0)) { con = 1 / this.ns; ts = Math.pow((rh1 / (this.a * this.f0)), con); lat = phi2z(this.e, ts); if (lat === -9999) { return null; } } else { lat = -HALF_PI; } lon = adjust_lon(theta / this.ns + this.long0); p.x = lon; p.y = lat; return p; } var names$b = [ "Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_1SP", "Lambert_Conformal_Conic_2SP", "lcc", "Lambert Conic Conformal (1SP)", "Lambert Conic Conformal (2SP)" ]; var lcc = { init: init$a, forward: forward$9, inverse: inverse$9, names: names$b }; function init$b() { this.a = 6377397.155; this.es = 0.006674372230614; this.e = Math.sqrt(this.es); if (!this.lat0) { this.lat0 = 0.863937979737193; } if (!this.long0) { this.long0 = 0.7417649320975901 - 0.308341501185665; } /* if scale not set default to 0.9999 */ if (!this.k0) { this.k0 = 0.9999; } this.s45 = 0.785398163397448; /* 45 */ this.s90 = 2 * this.s45; this.fi0 = this.lat0; this.e2 = this.es; this.e = Math.sqrt(this.e2); this.alfa = Math.sqrt(1 + (this.e2 * Math.pow(Math.cos(this.fi0), 4)) / (1 - this.e2)); this.uq = 1.04216856380474; this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa); this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2); this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g; this.k1 = this.k0; this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2)); this.s0 = 1.37008346281555; this.n = Math.sin(this.s0); this.ro0 = this.k1 * this.n0 / Math.tan(this.s0); this.ad = this.s90 - this.uq; } /* ellipsoid */ /* calculate xy from lat/lon */ /* Constants, identical to inverse transform function */ function forward$a(p) { var gfi, u, deltav, s, d, eps, ro; var lon = p.x; var lat = p.y; var delta_lon = adjust_lon(lon - this.long0); /* Transformation */ gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2)); u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45); deltav = -delta_lon * this.alfa; s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); eps = this.n * d; ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n); p.y = ro * Math.cos(eps) / 1; p.x = ro * Math.sin(eps) / 1; if (!this.czech) { p.y *= -1; p.x *= -1; } return (p); } /* calculate lat/lon from xy */ function inverse$a(p) { var u, deltav, s, d, eps, ro, fi1; var ok; /* Transformation */ /* revert y, x*/ var tmp = p.x; p.x = p.y; p.y = tmp; if (!this.czech) { p.y *= -1; p.x *= -1; } ro = Math.sqrt(p.x * p.x + p.y * p.y); eps = Math.atan2(p.y, p.x); d = eps / Math.sin(this.s0); s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45); u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); p.x = this.long0 - deltav / this.alfa; fi1 = u; ok = 0; var iter = 0; do { p.y = 2 * (Math.atan(Math.pow(this.k, - 1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45); if (Math.abs(fi1 - p.y) < 0.0000000001) { ok = 1; } fi1 = p.y; iter += 1; } while (ok === 0 && iter < 15); if (iter >= 15) { return null; } return (p); } var names$c = ["Krovak", "krovak"]; var krovak = { init: init$b, forward: forward$a, inverse: inverse$a, names: names$c }; function mlfn(e0, e1, e2, e3, phi) { return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi)); } function e0fn(x) { return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x))); } function e1fn(x) { return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x))); } function e2fn(x) { return (0.05859375 * x * x * (1 + 0.75 * x)); } function e3fn(x) { return (x * x * x * (35 / 3072)); } function gN(a, e, sinphi) { var temp = e * sinphi; return a / Math.sqrt(1 - temp * temp); } function adjust_lat(x) { return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI)); } function imlfn(ml, e0, e1, e2, e3) { var phi; var dphi; phi = ml / e0; for (var i = 0; i < 15; i++) { dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi)); phi += dphi; if (Math.abs(dphi) <= 0.0000000001) { return phi; } } //..reportError("IMLFN-CONV:Latitude failed to converge after 15 iterations"); return NaN; } function init$c() { if (!this.sphere) { this.e0 = e0fn(this.es); this.e1 = e1fn(this.es); this.e2 = e2fn(this.es); this.e3 = e3fn(this.es); this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); } } /* Cassini forward equations--mapping lat,long to x,y -----------------------------------------------------------------------*/ function forward$b(p) { /* Forward equations -----------------*/ var x, y; var lam = p.x; var phi = p.y; lam = adjust_lon(lam - this.long0); if (this.sphere) { x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam)); y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0); } else { //ellipsoid var sinphi = Math.sin(phi); var cosphi = Math.cos(phi); var nl = gN(this.a, this.e, sinphi); var tl = Math.tan(phi) * Math.tan(phi); var al = lam * Math.cos(phi); var asq = al * al; var cl = this.es * cosphi * cosphi / (1 - this.es); var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120)); y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24); } p.x = x + this.x0; p.y = y + this.y0; return p; } /* Inverse equations -----------------*/ function inverse$b(p) { p.x -= this.x0; p.y -= this.y0; var x = p.x / this.a; var y = p.y / this.a; var phi, lam; if (this.sphere) { var dd = y + this.lat0; phi = Math.asin(Math.sin(dd) * Math.cos(x)); lam = Math.atan2(Math.tan(x), Math.cos(dd)); } else { /* ellipsoid */ var ml1 = this.ml0 / this.a + y; var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3); if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) { p.x = this.long0; p.y = HALF_PI; if (y < 0) { p.y *= -1; } return p; } var nl1 = gN(this.a, this.e, Math.sin(phi1)); var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es); var tl1 = Math.pow(Math.tan(phi1), 2); var dl = x * this.a / nl1; var dsq = dl * dl; phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24); lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1); } p.x = adjust_lon(lam + this.long0); p.y = adjust_lat(phi); return p; } var names$d = ["Cassini", "Cassini_Soldner", "cass"]; var cass = { init: init$c, forward: forward$b, inverse: inverse$b, names: names$d }; function qsfnz(eccent, sinphi) { var con; if (eccent > 1.0e-7) { con = eccent * sinphi; return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con)))); } else { return (2 * sinphi); } } /* reference "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. */ var S_POLE = 1; var N_POLE = 2; var EQUIT = 3; var OBLIQ = 4; /* Initialize the Lambert Azimuthal Equal Area projection ------------------------------------------------------*/ function init$d() { var t = Math.abs(this.lat0); if (Math.abs(t - HALF_PI) < EPSLN) { this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE; } else if (Math.abs(t) < EPSLN) { this.mode = this.EQUIT; } else { this.mode = this.OBLIQ; } if (this.es > 0) { var sinphi; this.qp = qsfnz(this.e, 1); this.mmf = 0.5 / (1 - this.es); this.apa = authset(this.es); switch (this.mode) { case this.N_POLE: this.dd = 1; break; case this.S_POLE: this.dd = 1; break; case this.EQUIT: this.rq = Math.sqrt(0.5 * this.qp); this.dd = 1 / this.rq; this.xmf = 1; this.ymf = 0.5 * this.qp; break; case this.OBLIQ: this.rq = Math.sqrt(0.5 * this.qp); sinphi = Math.sin(this.lat0); this.sinb1 = qsfnz(this.e, sinphi) / this.qp; this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1); this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1); this.ymf = (this.xmf = this.rq) / this.dd; this.xmf *= this.dd; break; } } else { if (this.mode === this.OBLIQ) { this.sinph0 = Math.sin(this.lat0); this.cosph0 = Math.cos(this.lat0); } } } /* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y -----------------------------------------------------------------------*/ function forward$c(p) { /* Forward equations -----------------*/ var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi; var lam = p.x; var phi = p.y; lam = adjust_lon(lam - this.long0); if (this.sphere) { sinphi = Math.sin(phi); cosphi = Math.cos(phi); coslam = Math.cos(lam); if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; if (y <= EPSLN) { return null; } y = Math.sqrt(2 / y); x = y * cosphi * Math.sin(lam); y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { if (this.mode === this.N_POLE) { coslam = -coslam; } if (Math.abs(phi + this.lat0) < EPSLN) { return null; } y = FORTPI - phi * 0.5; y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y)); x = y * Math.sin(lam); y *= coslam; } } else { sinb = 0; cosb = 0; b = 0; coslam = Math.cos(lam); sinlam = Math.sin(lam); sinphi = Math.sin(phi); q = qsfnz(this.e, sinphi); if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { sinb = q / this.qp; cosb = Math.sqrt(1 - sinb * sinb); } switch (this.mode) { case this.OBLIQ: b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam; break; case this.EQUIT: b = 1 + cosb * coslam; break; case this.N_POLE: b = HALF_PI + phi; q = this.qp - q; break; case this.S_POLE: b = phi - HALF_PI; q = this.qp + q; break; } if (Math.abs(b) < EPSLN) { return null; } switch (this.mode) { case this.OBLIQ: case this.EQUIT: b = Math.sqrt(2 / b); if (this.mode === this.OBLIQ) { y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); } else { y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf; } x = this.xmf * b * cosb * sinlam; break; case this.N_POLE: case this.S_POLE: if (q >= 0) { x = (b = Math.sqrt(q)) * sinlam; y = coslam * ((this.mode === this.S_POLE) ? b : -b); } else { x = y = 0; } break; } } p.x = this.a * x + this.x0; p.y = this.a * y + this.y0; return p; } /* Inverse equations -----------------*/ function inverse$c(p) { p.x -= this.x0; p.y -= this.y0; var x = p.x / this.a; var y = p.y / this.a; var lam, phi, cCe, sCe, q, rho, ab; if (this.sphere) { var cosz = 0, rh, sinz = 0; rh = Math.sqrt(x * x + y * y); phi = rh * 0.5; if (phi > 1) { return null; } phi = 2 * Math.asin(phi); if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { sinz = Math.sin(phi); cosz = Math.cos(phi); } switch (this.mode) { case this.EQUIT: phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh); x *= sinz; y = cosz * rh; break; case this.OBLIQ: phi = (Math.abs(rh) <= EPSLN) ? this.lat0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh); x *= sinz * this.cosph0; y = (cosz - Math.sin(phi) * this.sinph0) * rh; break; case this.N_POLE: y = -y; phi = HALF_PI - phi; break; case this.S_POLE: phi -= HALF_PI; break; } lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y); } else { ab = 0; if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { x /= this.dd; y *= this.dd; rho = Math.sqrt(x * x + y * y); if (rho < EPSLN) { p.x = this.long0; p.y = this.lat0; return p; } sCe = 2 * Math.asin(0.5 * rho / this.rq); cCe = Math.cos(sCe); x *= (sCe = Math.sin(sCe)); if (this.mode === this.OBLIQ) { ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho; q = this.qp * ab; y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; } else { ab = y * sCe / rho; q = this.qp * ab; y = rho * cCe; } } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { if (this.mode === this.N_POLE) { y = -y; } q = (x * x + y * y); if (!q) { p.x = this.long0; p.y = this.lat0; return p; } ab = 1 - q / this.qp; if (this.mode === this.S_POLE) { ab = -ab; } } lam = Math.atan2(x, y); phi = authlat(Math.asin(ab), this.apa); } p.x = adjust_lon(this.long0 + lam); p.y = phi; return p; } /* determine latitude from authalic latitude */ var P00 = 0.33333333333333333333; var P01 = 0.17222222222222222222; var P02 = 0.10257936507936507936; var P10 = 0.06388888888888888888; var P11 = 0.06640211640211640211; var P20 = 0.01641501294219154443; function authset(es) { var t; var APA = []; APA[0] = es * P00; t = es * es; APA[0] += t * P01; APA[1] = t * P10; t *= es; APA[0] += t * P02; APA[1] += t * P11; APA[2] = t * P20; return APA; } function authlat(beta, APA) { var t = beta + beta; return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t)); } var names$e = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"]; var laea = { init: init$d, forward: forward$c, inverse: inverse$c, names: names$e, S_POLE: S_POLE, N_POLE: N_POLE, EQUIT: EQUIT, OBLIQ: OBLIQ }; function asinz(x) { if (Math.abs(x) > 1) { x = (x > 1) ? 1 : -1; } return Math.asin(x); } function init$e() { if (Math.abs(this.lat1 + this.lat2) < EPSLN) { return; } this.temp = this.b / this.a; this.es = 1 - Math.pow(this.temp, 2); this.e3 = Math.sqrt(this.es); this.sin_po = Math.sin(this.lat1); this.cos_po = Math.cos(this.lat1); this.t1 = this.sin_po; this.con = this.sin_po; this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po); this.qs1 = qsfnz(this.e3, this.sin_po); this.sin_po = Math.sin(this.lat2); this.cos_po = Math.cos(this.lat2); this.t2 = this.sin_po; this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po); this.qs2 = qsfnz(this.e3, this.sin_po); this.sin_po = Math.sin(this.lat0); this.cos_po = Math.cos(this.lat0); this.t3 = this.sin_po; this.qs0 = qsfnz(this.e3, this.sin_po); if (Math.abs(this.lat1 - this.lat2) > EPSLN) { this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1); } else { this.ns0 = this.con; } this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1; this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0; } /* Albers Conical Equal Area forward equations--mapping lat,long to x,y -------------------------------------------------------------------*/ function forward$d(p) { var lon = p.x; var lat = p.y; this.sin_phi = Math.sin(lat); this.cos_phi = Math.cos(lat); var qs = qsfnz(this.e3, this.sin_phi); var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0; var theta = this.ns0 * adjust_lon(lon - this.long0); var x = rh1 * Math.sin(theta) + this.x0; var y = this.rh - rh1 * Math.cos(theta) + this.y0; p.x = x; p.y = y; return p; } function inverse$d(p) { var rh1, qs, con, theta, lon, lat; p.x -= this.x0; p.y = this.rh - p.y + this.y0; if (this.ns0 >= 0) { rh1 = Math.sqrt(p.x * p.x + p.y * p.y); con = 1; } else { rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); con = -1; } theta = 0; if (rh1 !== 0) { theta = Math.atan2(con * p.x, con * p.y); } con = rh1 * this.ns0 / this.a; if (this.sphere) { lat = Math.asin((this.c - con * con) / (2 * this.ns0)); } else { qs = (this.c - con * con) / this.ns0; lat = this.phi1z(this.e3, qs); } lon = adjust_lon(theta / this.ns0 + this.long0); p.x = lon; p.y = lat; return p; } /* Function to compute phi1, the latitude for the inverse of the Albers Conical Equal-Area projection. -------------------------------------------*/ function phi1z(eccent, qs) { var sinphi, cosphi, con, com, dphi; var phi = asinz(0.5 * qs); if (eccent < EPSLN) { return phi; } var eccnts = eccent * eccent; for (var i = 1; i <= 25; i++) { sinphi = Math.sin(phi); cosphi = Math.cos(phi); con = eccent * sinphi; com = 1 - con * con; dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con))); phi = phi + dphi; if (Math.abs(dphi) <= 1e-7) { return phi; } } return null; } var names$f = ["Albers_Conic_Equal_Area", "Albers", "aea"]; var aea = { init: init$e, forward: forward$d, inverse: inverse$d, names: names$f, phi1z: phi1z }; /* reference: Wolfram Mathworld "Gnomonic Projection" http://mathworld.wolfram.com/GnomonicProjection.html Accessed: 12th November 2009 */ function init$f() { /* Place parameters in static storage for common use -------------------------------------------------*/ this.sin_p14 = Math.sin(this.lat0); this.cos_p14 = Math.cos(this.lat0); // Approximation for projecting points to the horizon (infinity) this.infinity_dist = 1000 * this.a; this.rc = 1; } /* Gnomonic forward equations--mapping lat,long to x,y ---------------------------------------------------*/ function forward$e(p) { var sinphi, cosphi; /* sin and cos value */ var dlon; /* delta longitude value */ var coslon; /* cos of longitude */ var ksp; /* scale factor */ var g; var x, y; var lon = p.x; var lat = p.y; /* Forward equations -----------------*/ dlon = adjust_lon(lon - this.long0); sinphi = Math.sin(lat); cosphi = Math.cos(lat); coslon = Math.cos(dlon); g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; ksp = 1; if ((g > 0) || (Math.abs(g) <= EPSLN)) { x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; } else { // Point is in the opposing hemisphere and is unprojectable // We still need to return a reasonable point, so we project // to infinity, on a bearing // equivalent to the northern hemisphere equivalent // This is a reasonable approximation for short shapes and lines that // straddle the horizon. x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); } p.x = x; p.y = y; return p; } function inverse$e(p) { var rh; /* Rho */ var sinc, cosc; var c; var lon, lat; /* Inverse equations -----------------*/ p.x = (p.x - this.x0) / this.a; p.y = (p.y - this.y0) / this.a; p.x /= this.k0; p.y /= this.k0; if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) { c = Math.atan2(rh, this.rc); sinc = Math.sin(c); cosc = Math.cos(c); lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh); lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc); lon = adjust_lon(this.long0 + lon); } else { lat = this.phic0; lon = 0; } p.x = lon; p.y = lat; return p; } var names$g = ["gnom"]; var gnom = { init: init$f, forward: forward$e, inverse: inverse$e, names: names$g }; function iqsfnz(eccent, q) { var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent)); if (Math.abs(Math.abs(q) - temp) < 1.0E-6) { if (q < 0) { return (-1 * HALF_PI); } else { return HALF_PI; } } //var phi = 0.5* q/(1-eccent*eccent); var phi = Math.asin(0.5 * q); var dphi; var sin_phi; var cos_phi; var con; for (var i = 0; i < 30; i++) { sin_phi = Math.sin(phi); cos_phi = Math.cos(phi); con = eccent * sin_phi; dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con))); phi += dphi; if (Math.abs(dphi) <= 0.0000000001) { return phi; } } //console.log("IQSFN-CONV:Latitude failed to converge after 30 iterations"); return NaN; } /* reference: "Cartographic Projection Procedures for the UNIX Environment- A User's Manual" by Gerald I. Evenden, USGS Open File Report 90-284and Release 4 Interim Reports (2003) */ function init$g() { //no-op if (!this.sphere) { this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); } } /* Cylindrical Equal Area forward equations--mapping lat,long to x,y ------------------------------------------------------------*/ function forward$f(p) { var lon = p.x; var lat = p.y; var x, y; /* Forward equations -----------------*/ var dlon = adjust_lon(lon - this.long0); if (this.sphere) { x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); } else { var qs = qsfnz(this.e, Math.sin(lat)); x = this.x0 + this.a * this.k0 * dlon; y = this.y0 + this.a * qs * 0.5 / this.k0; } p.x = x; p.y = y; return p; } /* Cylindrical Equal Area inverse equations--mapping x,y to lat/long ------------------------------------------------------------*/ function inverse$f(p) { p.x -= this.x0; p.y -= this.y0; var lon, lat; if (this.sphere) { lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts)); lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts)); } else { lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a); lon = adjust_lon(this.long0 + p.x / (this.a * this.k0)); } p.x = lon; p.y = lat; return p; } var names$h = ["cea"]; var cea = { init: init$g, forward: forward$f, inverse: inverse$f, names: names$h }; function init$h() { this.x0 = this.x0 || 0; this.y0 = this.y0 || 0; this.lat0 = this.lat0 || 0; this.long0 = this.long0 || 0; this.lat_ts = this.lat_ts || 0; this.title = this.title || "Equidistant Cylindrical (Plate Carre)"; this.rc = Math.cos(this.lat_ts); } // forward equations--mapping lat,long to x,y // ----------------------------------------------------------------- function forward$g(p) { var lon = p.x; var lat = p.y; var dlon = adjust_lon(lon - this.long0); var dlat = adjust_lat(lat - this.lat0); p.x = this.x0 + (this.a * dlon * this.rc); p.y = this.y0 + (this.a * dlat); return p; } // inverse equations--mapping x,y to lat/long // ----------------------------------------------------------------- function inverse$g(p) { var x = p.x; var y = p.y; p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc))); p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a))); return p; } var names$i = ["Equirectangular", "Equidistant_Cylindrical", "eqc"]; var eqc = { init: init$h, forward: forward$g, inverse: inverse$g, names: names$i }; var MAX_ITER$2 = 20; function init$i() { /* Place parameters in static storage for common use -------------------------------------------------*/ this.temp = this.b / this.a; this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles this.e = Math.sqrt(this.es); this.e0 = e0fn(this.es); this.e1 = e1fn(this.es); this.e2 = e2fn(this.es); this.e3 = e3fn(this.es); this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas } /* Polyconic forward equations--mapping lat,long to x,y ---------------------------------------------------*/ function forward$h(p) { var lon = p.x; var lat = p.y; var x, y, el; var dlon = adjust_lon(lon - this.long0); el = dlon * Math.sin(lat); if (this.sphere) { if (Math.abs(lat) <= EPSLN) { x = this.a * dlon; y = -1 * this.a * this.lat0; } else { x = this.a * Math.sin(el) / Math.tan(lat); y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat)); } } else { if (Math.abs(lat) <= EPSLN) { x = this.a * dlon; y = -1 * this.ml0; } else { var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat); x = nl * Math.sin(el); y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el)); } } p.x = x + this.x0; p.y = y + this.y0; return p; } /* Inverse equations -----------------*/ function inverse$h(p) { var lon, lat, x, y, i; var al, bl; var phi, dphi; x = p.x - this.x0; y = p.y - this.y0; if (this.sphere) { if (Math.abs(y + this.a * this.lat0) <= EPSLN) { lon = adjust_lon(x / this.a + this.long0); lat = 0; } else { al = this.lat0 + y / this.a; bl = x * x / this.a / this.a + al * al; phi = al; var tanphi; for (i = MAX_ITER$2; i; --i) { tanphi = Math.tan(phi); dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1); phi += dphi; if (Math.abs(dphi) <= EPSLN) { lat = phi; break; } } lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat)); } } else { if (Math.abs(y + this.ml0) <= EPSLN) { lat = 0; lon = adjust_lon(this.long0 + x / this.a); } else { al = (this.ml0 + y) / this.a; bl = x * x / this.a / this.a + al * al; phi = al; var cl, mln, mlnp, ma; var con; for (i = MAX_ITER$2; i; --i) { con = this.e * Math.sin(phi); cl = Math.sqrt(1 - con * con) * Math.tan(phi); mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi); ma = mln / this.a; dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp); phi -= dphi; if (Math.abs(dphi) <= EPSLN) { lat = phi; break; } } //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0); cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat); lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat)); } } p.x = lon; p.y = lat; return p; } var names$j = ["Polyconic", "poly"]; var poly = { init: init$i, forward: forward$h, inverse: inverse$h, names: names$j }; /* reference Department of Land and Survey Technical Circular 1973/32 http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf OSG Technical Report 4.1 http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf */ /** * iterations: Number of iterations to refine inverse transform. * 0 -> km accuracy * 1 -> m accuracy -- suitable for most mapping applications * 2 -> mm accuracy */ var iterations = 1; function init$j() { this.A = []; this.A[1] = 0.6399175073; this.A[2] = -0.1358797613; this.A[3] = 0.063294409; this.A[4] = -0.02526853; this.A[5] = 0.0117879; this.A[6] = -0.0055161; this.A[7] = 0.0026906; this.A[8] = -0.001333; this.A[9] = 0.00067; this.A[10] = -0.00034; this.B_re = []; this.B_im = []; this.B_re[1] = 0.7557853228; this.B_im[1] = 0; this.B_re[2] = 0.249204646; this.B_im[2] = 0.003371507; this.B_re[3] = -0.001541739; this.B_im[3] = 0.041058560; this.B_re[4] = -0.10162907; this.B_im[4] = 0.01727609; this.B_re[5] = -0.26623489; this.B_im[5] = -0.36249218; this.B_re[6] = -0.6870983; this.B_im[6] = -1.1651967; this.C_re = []; this.C_im = []; this.C_re[1] = 1.3231270439; this.C_im[1] = 0; this.C_re[2] = -0.577245789; this.C_im[2] = -0.007809598; this.C_re[3] = 0.508307513; this.C_im[3] = -0.112208952; this.C_re[4] = -0.15094762; this.C_im[4] = 0.18200602; this.C_re[5] = 1.01418179; this.C_im[5] = 1.64497696; this.C_re[6] = 1.9660549; this.C_im[6] = 2.5127645; this.D = []; this.D[1] = 1.5627014243; this.D[2] = 0.5185406398; this.D[3] = -0.03333098; this.D[4] = -0.1052906; this.D[5] = -0.0368594; this.D[6] = 0.007317; this.D[7] = 0.01220; this.D[8] = 0.00394; this.D[9] = -0.0013; } /** New Zealand Map Grid Forward - long/lat to x/y long/lat in radians */ function forward$i(p) { var n; var lon = p.x; var lat = p.y; var delta_lat = lat - this.lat0; var delta_lon = lon - this.long0; // 1. Calculate d_phi and d_psi ... // and d_lambda // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians. var d_phi = delta_lat / SEC_TO_RAD * 1E-5; var d_lambda = delta_lon; var d_phi_n = 1; // d_phi^0 var d_psi = 0; for (n = 1; n <= 10; n++) { d_phi_n = d_phi_n * d_phi; d_psi = d_psi + this.A[n] * d_phi_n; } // 2. Calculate theta var th_re = d_psi; var th_im = d_lambda; // 3. Calculate z var th_n_re = 1; var th_n_im = 0; // theta^0 var th_n_re1; var th_n_im1; var z_re = 0; var z_im = 0; for (n = 1; n <= 6; n++) { th_n_re1 = th_n_re * th_re - th_n_im * th_im; th_n_im1 = th_n_im * th_re + th_n_re * th_im; th_n_re = th_n_re1; th_n_im = th_n_im1; z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im; z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im; } // 4. Calculate easting and northing p.x = (z_im * this.a) + this.x0; p.y = (z_re * this.a) + this.y0; return p; } /** New Zealand Map Grid Inverse - x/y to long/lat */ function inverse$i(p) { var n; var x = p.x; var y = p.y; var delta_x = x - this.x0; var delta_y = y - this.y0; // 1. Calculate z var z_re = delta_y / this.a; var z_im = delta_x / this.a; // 2a. Calculate theta - first approximation gives km accuracy var z_n_re = 1; var z_n_im = 0; // z^0 var z_n_re1; var z_n_im1; var th_re = 0; var th_im = 0; for (n = 1; n <= 6; n++) { z_n_re1 = z_n_re * z_re - z_n_im * z_im; z_n_im1 = z_n_im * z_re + z_n_re * z_im; z_n_re = z_n_re1; z_n_im = z_n_im1; th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im; th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im; } // 2b. Iterate to refine the accuracy of the calculation // 0 iterations gives km accuracy // 1 iteration gives m accuracy -- good enough for most mapping applications // 2 iterations bives mm accuracy for (var i = 0; i < this.iterations; i++) { var th_n_re = th_re; var th_n_im = th_im; var th_n_re1; var th_n_im1; var num_re = z_re; var num_im = z_im; for (n = 2; n <= 6; n++) { th_n_re1 = th_n_re * th_re - th_n_im * th_im; th_n_im1 = th_n_im * th_re + th_n_re * th_im; th_n_re = th_n_re1; th_n_im = th_n_im1; num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); } th_n_re = 1; th_n_im = 0; var den_re = this.B_re[1]; var den_im = this.B_im[1]; for (n = 2; n <= 6; n++) { th_n_re1 = th_n_re * th_re - th_n_im * th_im; th_n_im1 = th_n_im * th_re + th_n_re * th_im; th_n_re = th_n_re1; th_n_im = th_n_im1; den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); } // Complex division var den2 = den_re * den_re + den_im * den_im; th_re = (num_re * den_re + num_im * den_im) / den2; th_im = (num_im * den_re - num_re * den_im) / den2; } // 3. Calculate d_phi ... // and d_lambda var d_psi = th_re; var d_lambda = th_im; var d_psi_n = 1; // d_psi^0 var d_phi = 0; for (n = 1; n <= 9; n++) { d_psi_n = d_psi_n * d_psi; d_phi = d_phi + this.D[n] * d_psi_n; } // 4. Calculate latitude and longitude // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians. var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5); var lon = this.long0 + d_lambda; p.x = lon; p.y = lat; return p; } var names$k = ["New_Zealand_Map_Grid", "nzmg"]; var nzmg = { init: init$j, forward: forward$i, inverse: inverse$i, names: names$k }; /* reference "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. */ /* Initialize the Miller Cylindrical projection -------------------------------------------*/ function init$k() { //no-op } /* Miller Cylindrical forward equations--mapping lat,long to x,y ------------------------------------------------------------*/ function forward$j(p) { var lon = p.x; var lat = p.y; /* Forward equations -----------------*/ var dlon = adjust_lon(lon - this.long0); var x = this.x0 + this.a * dlon; var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25; p.x = x; p.y = y; return p; } /* Miller Cylindrical inverse equations--mapping x,y to lat/long ------------------------------------------------------------*/ function inverse$j(p) { p.x -= this.x0; p.y -= this.y0; var lon = adjust_lon(this.long0 + p.x / this.a); var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4); p.x = lon; p.y = lat; return p; } var names$l = ["Miller_Cylindrical", "mill"]; var mill = { init: init$k, forward: forward$j, inverse: inverse$j, names: names$l }; var MAX_ITER$3 = 20; function init$l() { /* Place parameters in static storage for common use -------------------------------------------------*/ if (!this.sphere) { this.en = pj_enfn(this.es); } else { this.n = 1; this.m = 0; this.es = 0; this.C_y = Math.sqrt((this.m + 1) / this.n); this.C_x = this.C_y / (this.m + 1); } } /* Sinusoidal forward equations--mapping lat,long to x,y -----------------------------------------------------*/ function forward$k(p) { var x, y; var lon = p.x; var lat = p.y; /* Forward equations -----------------*/ lon = adjust_lon(lon - this.long0); if (this.sphere) { if (!this.m) { lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat; } else { var k = this.n * Math.sin(lat); for (var i = MAX_ITER$3; i; --i) { var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat)); lat -= V; if (Math.abs(V) < EPSLN) { break; } } } x = this.a * this.C_x * lon * (this.m + Math.cos(lat)); y = this.a * this.C_y * lat; } else { var s = Math.sin(lat); var c = Math.cos(lat); y = this.a * pj_mlfn(lat, s, c, this.en); x = this.a * lon * c / Math.sqrt(1 - this.es * s * s); } p.x = x; p.y = y; return p; } function inverse$k(p) { var lat, temp, lon, s; p.x -= this.x0; lon = p.x / this.a; p.y -= this.y0; lat = p.y / this.a; if (this.sphere) { lat /= this.C_y; lon = lon / (this.C_x * (this.m + Math.cos(lat))); if (this.m) { lat = asinz((this.m * lat + Math.sin(lat)) / this.n); } else if (this.n !== 1) { lat = asinz(Math.sin(lat) / this.n); } lon = adjust_lon(lon + this.long0); lat = adjust_lat(lat); } else { lat = pj_inv_mlfn(p.y / this.a, this.es, this.en); s = Math.abs(lat); if (s < HALF_PI) { s = Math.sin(lat); temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat)); //temp = this.long0 + p.x / (this.a * Math.cos(lat)); lon = adjust_lon(temp); } else if ((s - EPSLN) < HALF_PI) { lon = this.long0; } } p.x = lon; p.y = lat; return p; } var names$m = ["Sinusoidal", "sinu"]; var sinu = { init: init$l, forward: forward$k, inverse: inverse$k, names: names$m }; function init$m() {} /* Mollweide forward equations--mapping lat,long to x,y ----------------------------------------------------*/ function forward$l(p) { /* Forward equations -----------------*/ var lon = p.x; var lat = p.y; var delta_lon = adjust_lon(lon - this.long0); var theta = lat; var con = Math.PI * Math.sin(lat); /* Iterate using the Newton-Raphson method to find theta -----------------------------------------------------*/ while (true) { var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta)); theta += delta_theta; if (Math.abs(delta_theta) < EPSLN) { break; } } theta /= 2; /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" this is done here because of precision problems with "cos(theta)" --------------------------------------------------------------------------*/ if (Math.PI / 2 - Math.abs(lat) < EPSLN) { delta_lon = 0; } var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; p.x = x; p.y = y; return p; } function inverse$l(p) { var theta; var arg; /* Inverse equations -----------------*/ p.x -= this.x0; p.y -= this.y0; arg = p.y / (1.4142135623731 * this.a); /* Because of division by zero problems, 'arg' can not be 1. Therefore a number very close to one is used instead. -------------------------------------------------------------------*/ if (Math.abs(arg) > 0.999999999999) { arg = 0.999999999999; } theta = Math.asin(arg); var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta)))); if (lon < (-Math.PI)) { lon = -Math.PI; } if (lon > Math.PI) { lon = Math.PI; } arg = (2 * theta + Math.sin(2 * theta)) / Math.PI; if (Math.abs(arg) > 1) { arg = 1; } var lat = Math.asin(arg); p.x = lon; p.y = lat; return p; } var names$n = ["Mollweide", "moll"]; var moll = { init: init$m, forward: forward$l, inverse: inverse$l, names: names$n }; function init$n() { /* Place parameters in static storage for common use -------------------------------------------------*/ // Standard Parallels cannot be equal and on opposite sides of the equator if (Math.abs(this.lat1 + this.lat2) < EPSLN) { return; } this.lat2 = this.lat2 || this.lat1; this.temp = this.b / this.a; this.es = 1 - Math.pow(this.temp, 2); this.e = Math.sqrt(this.es); this.e0 = e0fn(this.es); this.e1 = e1fn(this.es); this.e2 = e2fn(this.es); this.e3 = e3fn(this.es); this.sinphi = Math.sin(this.lat1); this.cosphi = Math.cos(this.lat1); this.ms1 = msfnz(this.e, this.sinphi, this.cosphi); this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1); if (Math.abs(this.lat1 - this.lat2) < EPSLN) { this.ns = this.sinphi; } else { this.sinphi = Math.sin(this.lat2); this.cosphi = Math.cos(this.lat2); this.ms2 = msfnz(this.e, this.sinphi, this.cosphi); this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); } this.g = this.ml1 + this.ms1 / this.ns; this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); this.rh = this.a * (this.g - this.ml0); } /* Equidistant Conic forward equations--mapping lat,long to x,y -----------------------------------------------------------*/ function forward$m(p) { var lon = p.x; var lat = p.y; var rh1; /* Forward equations -----------------*/ if (this.sphere) { rh1 = this.a * (this.g - lat); } else { var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat); rh1 = this.a * (this.g - ml); } var theta = this.ns * adjust_lon(lon - this.long0); var x = this.x0 + rh1 * Math.sin(theta); var y = this.y0 + this.rh - rh1 * Math.cos(theta); p.x = x; p.y = y; return p; } /* Inverse equations -----------------*/ function inverse$m(p) { p.x -= this.x0; p.y = this.rh - p.y + this.y0; var con, rh1, lat, lon; if (this.ns >= 0) { rh1 = Math.sqrt(p.x * p.x + p.y * p.y); con = 1; } else { rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); con = -1; } var theta = 0; if (rh1 !== 0) { theta = Math.atan2(con * p.x, con * p.y); } if (this.sphere) { lon = adjust_lon(this.long0 + theta / this.ns); lat = adjust_lat(this.g - rh1 / this.a); p.x = lon; p.y = lat; return p; } else { var ml = this.g - rh1 / this.a; lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3); lon = adjust_lon(this.long0 + theta / this.ns); p.x = lon; p.y = lat; return p; } } var names$o = ["Equidistant_Conic", "eqdc"]; var eqdc = { init: init$n, forward: forward$m, inverse: inverse$m, names: names$o }; /* Initialize the Van Der Grinten projection ----------------------------------------*/ function init$o() { //this.R = 6370997; //Radius of earth this.R = this.a; } function forward$n(p) { var lon = p.x; var lat = p.y; /* Forward equations -----------------*/ var dlon = adjust_lon(lon - this.long0); var x, y; if (Math.abs(lat) <= EPSLN) { x = this.x0 + this.R * dlon; y = this.y0; } var theta = asinz(2 * Math.abs(lat / Math.PI)); if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) { x = this.x0; if (lat >= 0) { y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta); } else { y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta); } // return(OK); } var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI)); var asq = al * al; var sinth = Math.sin(theta); var costh = Math.cos(theta); var g = costh / (sinth + costh - 1); var gsq = g * g; var m = g * (2 / sinth - 1); var msq = m * m; var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); if (dlon < 0) { con = -con; } x = this.x0 + con; //con = Math.abs(con / (Math.PI * this.R)); var q = asq + g; con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq); if (lat >= 0) { //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); y = this.y0 + con; } else { //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); y = this.y0 - con; } p.x = x; p.y = y; return p; } /* Van Der Grinten inverse equations--mapping x,y to lat/long ---------------------------------------------------------*/ function inverse$n(p) { var lon, lat; var xx, yy, xys, c1, c2, c3; var a1; var m1; var con; var th1; var d; /* inverse equations -----------------*/ p.x -= this.x0; p.y -= this.y0; con = Math.PI * this.R; xx = p.x / con; yy = p.y / con; xys = xx * xx + yy * yy; c1 = -Math.abs(yy) * (1 + xys); c2 = c1 - 2 * yy * yy + xx * xx; c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys; d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27; a1 = (c1 - c2 * c2 / 3 / c3) / c3; m1 = 2 * Math.sqrt(-a1 / 3); con = ((3 * d) / a1) / m1; if (Math.abs(con) > 1) { if (con >= 0) { con = 1; } else { con = -1; } } th1 = Math.acos(con) / 3; if (p.y >= 0) { lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; } else { lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; } if (Math.abs(xx) < EPSLN) { lon = this.long0; } else { lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx); } p.x = lon; p.y = lat; return p; } var names$p = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"]; var vandg = { init: init$o, forward: forward$n, inverse: inverse$n, names: names$p }; function init$p() { this.sin_p12 = Math.sin(this.lat0); this.cos_p12 = Math.cos(this.lat0); } function forward$o(p) { var lon = p.x; var lat = p.y; var sinphi = Math.sin(p.y); var cosphi = Math.cos(p.y); var dlon = adjust_lon(lon - this.long0); var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5; if (this.sphere) { if (Math.abs(this.sin_p12 - 1) <= EPSLN) { //North Pole case p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon); p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon); return p; } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { //South Pole case p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon); p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon); return p; } else { //default case cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon); c = Math.acos(cos_c); kp = c ? c / Math.sin(c) : 1; p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon); p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon)); return p; } } else { e0 = e0fn(this.es); e1 = e1fn(this.es); e2 = e2fn(this.es); e3 = e3fn(this.es); if (Math.abs(this.sin_p12 - 1) <= EPSLN) { //North Pole case Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); Ml = this.a * mlfn(e0, e1, e2, e3, lat); p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon); p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon); return p; } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { //South Pole case Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); Ml = this.a * mlfn(e0, e1, e2, e3, lat); p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon); p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon); return p; } else { //Default case tanphi = sinphi / cosphi; Nl1 = gN(this.a, this.e, this.sin_p12); Nl = gN(this.a, this.e, sinphi); psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi)); Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon)); if (Az === 0) { s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); } else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) { s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); } else { s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az)); } G = this.e * this.sin_p12 / Math.sqrt(1 - this.es); H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es); GH = G * H; Hs = H * H; s2 = s * s; s3 = s2 * s; s4 = s3 * s; s5 = s4 * s; c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH); p.x = this.x0 + c * Math.sin(Az); p.y = this.y0 + c * Math.cos(Az); return p; } } } function inverse$o(p) { p.x -= this.x0; p.y -= this.y0; var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F, sinpsi; if (this.sphere) { rh = Math.sqrt(p.x * p.x + p.y * p.y); if (rh > (2 * HALF_PI * this.a)) { return; } z = rh / this.a; sinz = Math.sin(z); cosz = Math.cos(z); lon = this.long0; if (Math.abs(rh) <= EPSLN) { lat = this.lat0; } else { lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh); con = Math.abs(this.lat0) - HALF_PI; if (Math.abs(con) <= EPSLN) { if (this.lat0 >= 0) { lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y)); } else { lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); } } else { /*con = cosz - this.sin_p12 * Math.sin(lat); if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) { //no-op, just keep the lon value as is } else { var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); }*/ lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz)); } } p.x = lon; p.y = lat; return p; } else { e0 = e0fn(this.es); e1 = e1fn(this.es); e2 = e2fn(this.es); e3 = e3fn(this.es); if (Math.abs(this.sin_p12 - 1) <= EPSLN) { //North pole case Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); rh = Math.sqrt(p.x * p.x + p.y * p.y); M = Mlp - rh; lat = imlfn(M / this.a, e0, e1, e2, e3); lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); p.x = lon; p.y = lat; return p; } else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { //South pole case Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); rh = Math.sqrt(p.x * p.x + p.y * p.y); M = rh - Mlp; lat = imlfn(M / this.a, e0, e1, e2, e3); lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); p.x = lon; p.y = lat; return p; } else { //default case rh = Math.sqrt(p.x * p.x + p.y * p.y); Az = Math.atan2(p.x, p.y); N1 = gN(this.a, this.e, this.sin_p12); cosAz = Math.cos(Az); tmp = this.e * this.cos_p12 * cosAz; A = -tmp * tmp / (1 - this.es); B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es); D = rh / N1; Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24; F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6; psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz); lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi))); sinpsi = Math.sin(psi); lat = Math.atan2((sinpsi - this.es * F * this.sin_p12) * Math.tan(psi), sinpsi * (1 - this.es)); p.x = lon; p.y = lat; return p; } } } var names$q = ["Azimuthal_Equidistant", "aeqd"]; var aeqd = { init: init$p, forward: forward$o, inverse: inverse$o, names: names$q }; function init$q() { //double temp; /* temporary variable */ /* Place parameters in static storage for common use -------------------------------------------------*/ this.sin_p14 = Math.sin(this.lat0); this.cos_p14 = Math.cos(this.lat0); } /* Orthographic forward equations--mapping lat,long to x,y ---------------------------------------------------*/ function forward$p(p) { var sinphi, cosphi; /* sin and cos value */ var dlon; /* delta longitude value */ var coslon; /* cos of longitude */ var ksp; /* scale factor */ var g, x, y; var lon = p.x; var lat = p.y; /* Forward equations -----------------*/ dlon = adjust_lon(lon - this.long0); sinphi = Math.sin(lat); cosphi = Math.cos(lat); coslon = Math.cos(dlon); g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; ksp = 1; if ((g > 0) || (Math.abs(g) <= EPSLN)) { x = this.a * ksp * cosphi * Math.sin(dlon); y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); } p.x = x; p.y = y; return p; } function inverse$p(p) { var rh; /* height above ellipsoid */ var z; /* angle */ var sinz, cosz; /* sin of z and cos of z */ var con; var lon, lat; /* Inverse equations -----------------*/ p.x -= this.x0; p.y -= this.y0; rh = Math.sqrt(p.x * p.x + p.y * p.y); z = asinz(rh / this.a); sinz = Math.sin(z); cosz = Math.cos(z); lon = this.long0; if (Math.abs(rh) <= EPSLN) { lat = this.lat0; p.x = lon; p.y = lat; return p; } lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh); con = Math.abs(this.lat0) - HALF_PI; if (Math.abs(con) <= EPSLN) { if (this.lat0 >= 0) { lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y)); } else { lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); } p.x = lon; p.y = lat; return p; } lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz)); p.x = lon; p.y = lat; return p; } var names$r = ["ortho"]; var ortho = { init: init$q, forward: forward$p, inverse: inverse$p, names: names$r }; // QSC projection rewritten from the original PROJ4 /* constants */ var FACE_ENUM = { FRONT: 1, RIGHT: 2, BACK: 3, LEFT: 4, TOP: 5, BOTTOM: 6 }; var AREA_ENUM = { AREA_0: 1, AREA_1: 2, AREA_2: 3, AREA_3: 4 }; function init$r() { this.x0 = this.x0 || 0; this.y0 = this.y0 || 0; this.lat0 = this.lat0 || 0; this.long0 = this.long0 || 0; this.lat_ts = this.lat_ts || 0; this.title = this.title || "Quadrilateralized Spherical Cube"; /* Determine the cube face from the center of projection. */ if (this.lat0 >= HALF_PI - FORTPI / 2.0) { this.face = FACE_ENUM.TOP; } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) { this.face = FACE_ENUM.BOTTOM; } else if (Math.abs(this.long0) <= FORTPI) { this.face = FACE_ENUM.FRONT; } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) { this.face = this.long0 > 0.0 ? FACE_ENUM.RIGHT : FACE_ENUM.LEFT; } else { this.face = FACE_ENUM.BACK; } /* Fill in useful values for the ellipsoid <-> sphere shift * described in [LK12]. */ if (this.es !== 0) { this.one_minus_f = 1 - (this.a - this.b) / this.a; this.one_minus_f_squared = this.one_minus_f * this.one_minus_f; } } // QSC forward equations--mapping lat,long to x,y // ----------------------------------------------------------------- function forward$q(p) { var xy = {x: 0, y: 0}; var lat, lon; var theta, phi; var t, mu; /* nu; */ var area = {value: 0}; // move lon according to projection's lon p.x -= this.long0; /* Convert the geodetic latitude to a geocentric latitude. * This corresponds to the shift from the ellipsoid to the sphere * described in [LK12]. */ if (this.es !== 0) {//if (P->es != 0) { lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y)); } else { lat = p.y; } /* Convert the input lat, lon into theta, phi as used by QSC. * This depends on the cube face and the area on it. * For the top and bottom face, we can compute theta and phi * directly from phi, lam. For the other faces, we must use * unit sphere cartesian coordinates as an intermediate step. */ lon = p.x; //lon = lp.lam; if (this.face === FACE_ENUM.TOP) { phi = HALF_PI - lat; if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { area.value = AREA_ENUM.AREA_0; theta = lon - HALF_PI; } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) { area.value = AREA_ENUM.AREA_1; theta = (lon > 0.0 ? lon - SPI : lon + SPI); } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) { area.value = AREA_ENUM.AREA_2; theta = lon + HALF_PI; } else { area.value = AREA_ENUM.AREA_3; theta = lon; } } else if (this.face === FACE_ENUM.BOTTOM) { phi = HALF_PI + lat; if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { area.value = AREA_ENUM.AREA_0; theta = -lon + HALF_PI; } else if (lon < FORTPI && lon >= -FORTPI) { area.value = AREA_ENUM.AREA_1; theta = -lon; } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) { area.value = AREA_ENUM.AREA_2; theta = -lon - HALF_PI; } else { area.value = AREA_ENUM.AREA_3; theta = (lon > 0.0 ? -lon + SPI : -lon - SPI); } } else { var q, r, s; var sinlat, coslat; var sinlon, coslon; if (this.face === FACE_ENUM.RIGHT) { lon = qsc_shift_lon_origin(lon, +HALF_PI); } else if (this.face === FACE_ENUM.BACK) { lon = qsc_shift_lon_origin(lon, +SPI); } else if (this.face === FACE_ENUM.LEFT) { lon = qsc_shift_lon_origin(lon, -HALF_PI); } sinlat = Math.sin(lat); coslat = Math.cos(lat); sinlon = Math.sin(lon); coslon = Math.cos(lon); q = coslat * coslon; r = coslat * sinlon; s = sinlat; if (this.face === FACE_ENUM.FRONT) { phi = Math.acos(q); theta = qsc_fwd_equat_face_theta(phi, s, r, area); } else if (this.face === FACE_ENUM.RIGHT) { phi = Math.acos(r); theta = qsc_fwd_equat_face_theta(phi, s, -q, area); } else if (this.face === FACE_ENUM.BACK) { phi = Math.acos(-q); theta = qsc_fwd_equat_face_theta(phi, s, -r, area); } else if (this.face === FACE_ENUM.LEFT) { phi = Math.acos(-r); theta = qsc_fwd_equat_face_theta(phi, s, q, area); } else { /* Impossible */ phi = theta = 0; area.value = AREA_ENUM.AREA_0; } } /* Compute mu and nu for the area of definition. * For mu, see Eq. (3-21) in [OL76], but note the typos: * compare with Eq. (3-14). For nu, see Eq. (3-38). */ mu = Math.atan((12 / SPI) * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI)); t = Math.sqrt((1 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1 - Math.cos(Math.atan(1 / Math.cos(theta))))); /* Apply the result to the real area. */ if (area.value === AREA_ENUM.AREA_1) { mu += HALF_PI; } else if (area.value === AREA_ENUM.AREA_2) { mu += SPI; } else if (area.value === AREA_ENUM.AREA_3) { mu += 1.5 * SPI; } /* Now compute x, y from mu and nu */ xy.x = t * Math.cos(mu); xy.y = t * Math.sin(mu); xy.x = xy.x * this.a + this.x0; xy.y = xy.y * this.a + this.y0; p.x = xy.x; p.y = xy.y; return p; } // QSC inverse equations--mapping x,y to lat/long // ----------------------------------------------------------------- function inverse$q(p) { var lp = {lam: 0, phi: 0}; var mu, nu, cosmu, tannu; var tantheta, theta, cosphi, phi; var t; var area = {value: 0}; /* de-offset */ p.x = (p.x - this.x0) / this.a; p.y = (p.y - this.y0) / this.a; /* Convert the input x, y to the mu and nu angles as used by QSC. * This depends on the area of the cube face. */ nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y)); mu = Math.atan2(p.y, p.x); if (p.x >= 0.0 && p.x >= Math.abs(p.y)) { area.value = AREA_ENUM.AREA_0; } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) { area.value = AREA_ENUM.AREA_1; mu -= HALF_PI; } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) { area.value = AREA_ENUM.AREA_2; mu = (mu < 0.0 ? mu + SPI : mu - SPI); } else { area.value = AREA_ENUM.AREA_3; mu += HALF_PI; } /* Compute phi and theta for the area of definition. * The inverse projection is not described in the original paper, but some * good hints can be found here (as of 2011-12-14): * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302 * (search for "Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>") */ t = (SPI / 12) * Math.tan(mu); tantheta = Math.sin(t) / (Math.cos(t) - (1 / Math.sqrt(2))); theta = Math.atan(tantheta); cosmu = Math.cos(mu); tannu = Math.tan(nu); cosphi = 1 - cosmu * cosmu * tannu * tannu * (1 - Math.cos(Math.atan(1 / Math.cos(theta)))); if (cosphi < -1) { cosphi = -1; } else if (cosphi > +1) { cosphi = +1; } /* Apply the result to the real area on the cube face. * For the top and bottom face, we can compute phi and lam directly. * For the other faces, we must use unit sphere cartesian coordinates * as an intermediate step. */ if (this.face === FACE_ENUM.TOP) { phi = Math.acos(cosphi); lp.phi = HALF_PI - phi; if (area.value === AREA_ENUM.AREA_0) { lp.lam = theta + HALF_PI; } else if (area.value === AREA_ENUM.AREA_1) { lp.lam = (theta < 0.0 ? theta + SPI : theta - SPI); } else if (area.value === AREA_ENUM.AREA_2) { lp.lam = theta - HALF_PI; } else /* area.value == AREA_ENUM.AREA_3 */ { lp.lam = theta; } } else if (this.face === FACE_ENUM.BOTTOM) { phi = Math.acos(cosphi); lp.phi = phi - HALF_PI; if (area.value === AREA_ENUM.AREA_0) { lp.lam = -theta + HALF_PI; } else if (area.value === AREA_ENUM.AREA_1) { lp.lam = -theta; } else if (area.value === AREA_ENUM.AREA_2) { lp.lam = -theta - HALF_PI; } else /* area.value == AREA_ENUM.AREA_3 */ { lp.lam = (theta < 0.0 ? -theta - SPI : -theta + SPI); } } else { /* Compute phi and lam via cartesian unit sphere coordinates. */ var q, r, s; q = cosphi; t = q * q; if (t >= 1) { s = 0; } else { s = Math.sqrt(1 - t) * Math.sin(theta); } t += s * s; if (t >= 1) { r = 0; } else { r = Math.sqrt(1 - t); } /* Rotate q,r,s into the correct area. */ if (area.value === AREA_ENUM.AREA_1) { t = r; r = -s; s = t; } else if (area.value === AREA_ENUM.AREA_2) { r = -r; s = -s; } else if (area.value === AREA_ENUM.AREA_3) { t = r; r = s; s = -t; } /* Rotate q,r,s into the correct cube face. */ if (this.face === FACE_ENUM.RIGHT) { t = q; q = -r; r = t; } else if (this.face === FACE_ENUM.BACK) { q = -q; r = -r; } else if (this.face === FACE_ENUM.LEFT) { t = q; q = r; r = -t; } /* Now compute phi and lam from the unit sphere coordinates. */ lp.phi = Math.acos(-s) - HALF_PI; lp.lam = Math.atan2(r, q); if (this.face === FACE_ENUM.RIGHT) { lp.lam = qsc_shift_lon_origin(lp.lam, -HALF_PI); } else if (this.face === FACE_ENUM.BACK) { lp.lam = qsc_shift_lon_origin(lp.lam, -SPI); } else if (this.face === FACE_ENUM.LEFT) { lp.lam = qsc_shift_lon_origin(lp.lam, +HALF_PI); } } /* Apply the shift from the sphere to the ellipsoid as described * in [LK12]. */ if (this.es !== 0) { var invert_sign; var tanphi, xa; invert_sign = (lp.phi < 0 ? 1 : 0); tanphi = Math.tan(lp.phi); xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared); lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa)); if (invert_sign) { lp.phi = -lp.phi; } } lp.lam += this.long0; p.x = lp.lam; p.y = lp.phi; return p; } /* Helper function for forward projection: compute the theta angle * and determine the area number. */ function qsc_fwd_equat_face_theta(phi, y, x, area) { var theta; if (phi < EPSLN) { area.value = AREA_ENUM.AREA_0; theta = 0.0; } else { theta = Math.atan2(y, x); if (Math.abs(theta) <= FORTPI) { area.value = AREA_ENUM.AREA_0; } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) { area.value = AREA_ENUM.AREA_1; theta -= HALF_PI; } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) { area.value = AREA_ENUM.AREA_2; theta = (theta >= 0.0 ? theta - SPI : theta + SPI); } else { area.value = AREA_ENUM.AREA_3; theta += HALF_PI; } } return theta; } /* Helper function: shift the longitude. */ function qsc_shift_lon_origin(lon, offset) { var slon = lon + offset; if (slon < -SPI) { slon += TWO_PI; } else if (slon > +SPI) { slon -= TWO_PI; } return slon; } var names$s = ["Quadrilateralized Spherical Cube", "Quadrilateralized_Spherical_Cube", "qsc"]; var qsc = { init: init$r, forward: forward$q, inverse: inverse$q, names: names$s }; // Robinson projection var COEFS_X = [ [1.0000, 2.2199e-17, -7.15515e-05, 3.1103e-06], [0.9986, -0.000482243, -2.4897e-05, -1.3309e-06], [0.9954, -0.00083103, -4.48605e-05, -9.86701e-07], [0.9900, -0.00135364, -5.9661e-05, 3.6777e-06], [0.9822, -0.00167442, -4.49547e-06, -5.72411e-06], [0.9730, -0.00214868, -9.03571e-05, 1.8736e-08], [0.9600, -0.00305085, -9.00761e-05, 1.64917e-06], [0.9427, -0.00382792, -6.53386e-05, -2.6154e-06], [0.9216, -0.00467746, -0.00010457, 4.81243e-06], [0.8962, -0.00536223, -3.23831e-05, -5.43432e-06], [0.8679, -0.00609363, -0.000113898, 3.32484e-06], [0.8350, -0.00698325, -6.40253e-05, 9.34959e-07], [0.7986, -0.00755338, -5.00009e-05, 9.35324e-07], [0.7597, -0.00798324, -3.5971e-05, -2.27626e-06], [0.7186, -0.00851367, -7.01149e-05, -8.6303e-06], [0.6732, -0.00986209, -0.000199569, 1.91974e-05], [0.6213, -0.010418, 8.83923e-05, 6.24051e-06], [0.5722, -0.00906601, 0.000182, 6.24051e-06], [0.5322, -0.00677797, 0.000275608, 6.24051e-06] ]; var COEFS_Y = [ [-5.20417e-18, 0.0124, 1.21431e-18, -8.45284e-11], [0.0620, 0.0124, -1.26793e-09, 4.22642e-10], [0.1240, 0.0124, 5.07171e-09, -1.60604e-09], [0.1860, 0.0123999, -1.90189e-08, 6.00152e-09], [0.2480, 0.0124002, 7.10039e-08, -2.24e-08], [0.3100, 0.0123992, -2.64997e-07, 8.35986e-08], [0.3720, 0.0124029, 9.88983e-07, -3.11994e-07], [0.4340, 0.0123893, -3.69093e-06, -4.35621e-07], [0.4958, 0.0123198, -1.02252e-05, -3.45523e-07], [0.5571, 0.0121916, -1.54081e-05, -5.82288e-07], [0.6176, 0.0119938, -2.41424e-05, -5.25327e-07], [0.6769, 0.011713, -3.20223e-05, -5.16405e-07], [0.7346, 0.0113541, -3.97684e-05, -6.09052e-07], [0.7903, 0.0109107, -4.89042e-05, -1.04739e-06], [0.8435, 0.0103431, -6.4615e-05, -1.40374e-09], [0.8936, 0.00969686, -6.4636e-05, -8.547e-06], [0.9394, 0.00840947, -0.000192841, -4.2106e-06], [0.9761, 0.00616527, -0.000256, -4.2106e-06], [1.0000, 0.00328947, -0.000319159, -4.2106e-06] ]; var FXC = 0.8487; var FYC = 1.3523; var C1 = R2D/5; // rad to 5-degree interval var RC1 = 1/C1; var NODES = 18; var poly3_val = function(coefs, x) { return coefs[0] + x * (coefs[1] + x * (coefs[2] + x * coefs[3])); }; var poly3_der = function(coefs, x) { return coefs[1] + x * (2 * coefs[2] + x * 3 * coefs[3]); }; function newton_rapshon(f_df, start, max_err, iters) { var x = start; for (; iters; --iters) { var upd = f_df(x); x -= upd; if (Math.abs(upd) < max_err) { break; } } return x; } function init$s() { this.x0 = this.x0 || 0; this.y0 = this.y0 || 0; this.long0 = this.long0 || 0; this.es = 0; this.title = this.title || "Robinson"; } function forward$r(ll) { var lon = adjust_lon(ll.x - this.long0); var dphi = Math.abs(ll.y); var i = Math.floor(dphi * C1); if (i < 0) { i = 0; } else if (i >= NODES) { i = NODES - 1; } dphi = R2D * (dphi - RC1 * i); var xy = { x: poly3_val(COEFS_X[i], dphi) * lon, y: poly3_val(COEFS_Y[i], dphi) }; if (ll.y < 0) { xy.y = -xy.y; } xy.x = xy.x * this.a * FXC + this.x0; xy.y = xy.y * this.a * FYC + this.y0; return xy; } function inverse$r(xy) { var ll = { x: (xy.x - this.x0) / (this.a * FXC), y: Math.abs(xy.y - this.y0) / (this.a * FYC) }; if (ll.y >= 1) { // pathologic case ll.x /= COEFS_X[NODES][0]; ll.y = xy.y < 0 ? -HALF_PI : HALF_PI; } else { // find table interval var i = Math.floor(ll.y * NODES); if (i < 0) { i = 0; } else if (i >= NODES) { i = NODES - 1; } for (;;) { if (COEFS_Y[i][0] > ll.y) { --i; } else if (COEFS_Y[i+1][0] <= ll.y) { ++i; } else { break; } } // linear interpolation in 5 degree interval var coefs = COEFS_Y[i]; var t = 5 * (ll.y - coefs[0]) / (COEFS_Y[i+1][0] - coefs[0]); // find t so that poly3_val(coefs, t) = ll.y t = newton_rapshon(function(x) { return (poly3_val(coefs, x) - ll.y) / poly3_der(coefs, x); }, t, EPSLN, 100); ll.x /= poly3_val(COEFS_X[i], t); ll.y = (5 * i + t) * D2R; if (xy.y < 0) { ll.y = -ll.y; } } ll.x = adjust_lon(ll.x + this.long0); return ll; } var names$t = ["Robinson", "robin"]; var robin = { init: init$s, forward: forward$r, inverse: inverse$r, names: names$t }; function init$t() { this.name = 'geocent'; } function forward$s(p) { var point = geodeticToGeocentric(p, this.es, this.a); return point; } function inverse$s(p) { var point = geocentricToGeodetic(p, this.es, this.a, this.b); return point; } var names$u = ["Geocentric", 'geocentric', "geocent", "Geocent"]; var geocent = { init: init$t, forward: forward$s, inverse: inverse$s, names: names$u }; var mode = { N_POLE: 0, S_POLE: 1, EQUIT: 2, OBLIQ: 3 }; var params = { h: { def: 100000, num: true }, // default is Karman line, no default in PROJ.7 azi: { def: 0, num: true, degrees: true }, // default is North tilt: { def: 0, num: true, degrees: true }, // default is Nadir long0: { def: 0, num: true }, // default is Greenwich, conversion to rad is automatic lat0: { def: 0, num: true } // default is Equator, conversion to rad is automatic }; function init$u() { Object.keys(params).forEach(function (p) { if (typeof this[p] === "undefined") { this[p] = params[p].def; } else if (params[p].num && isNaN(this[p])) { throw new Error("Invalid parameter value, must be numeric " + p + " = " + this[p]); } else if (params[p].num) { this[p] = parseFloat(this[p]); } if (params[p].degrees) { this[p] = this[p] * D2R; } }.bind(this)); if (Math.abs((Math.abs(this.lat0) - HALF_PI)) < EPSLN) { this.mode = this.lat0 < 0 ? mode.S_POLE : mode.N_POLE; } else if (Math.abs(this.lat0) < EPSLN) { this.mode = mode.EQUIT; } else { this.mode = mode.OBLIQ; this.sinph0 = Math.sin(this.lat0); this.cosph0 = Math.cos(this.lat0); } this.pn1 = this.h / this.a; // Normalize relative to the Earth's radius if (this.pn1 <= 0 || this.pn1 > 1e10) { throw new Error("Invalid height"); } this.p = 1 + this.pn1; this.rp = 1 / this.p; this.h1 = 1 / this.pn1; this.pfact = (this.p + 1) * this.h1; this.es = 0; var omega = this.tilt; var gamma = this.azi; this.cg = Math.cos(gamma); this.sg = Math.sin(gamma); this.cw = Math.cos(omega); this.sw = Math.sin(omega); } function forward$t(p) { p.x -= this.long0; var sinphi = Math.sin(p.y); var cosphi = Math.cos(p.y); var coslam = Math.cos(p.x); var x, y; switch (this.mode) { case mode.OBLIQ: y = this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; break; case mode.EQUIT: y = cosphi * coslam; break; case mode.S_POLE: y = -sinphi; break; case mode.N_POLE: y = sinphi; break; } y = this.pn1 / (this.p - y); x = y * cosphi * Math.sin(p.x); switch (this.mode) { case mode.OBLIQ: y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; break; case mode.EQUIT: y *= sinphi; break; case mode.N_POLE: y *= -(cosphi * coslam); break; case mode.S_POLE: y *= cosphi * coslam; break; } // Tilt var yt, ba; yt = y * this.cg + x * this.sg; ba = 1 / (yt * this.sw * this.h1 + this.cw); x = (x * this.cg - y * this.sg) * this.cw * ba; y = yt * ba; p.x = x * this.a; p.y = y * this.a; return p; } function inverse$t(p) { p.x /= this.a; p.y /= this.a; var r = { x: p.x, y: p.y }; // Un-Tilt var bm, bq, yt; yt = 1 / (this.pn1 - p.y * this.sw); bm = this.pn1 * p.x * yt; bq = this.pn1 * p.y * this.cw * yt; p.x = bm * this.cg + bq * this.sg; p.y = bq * this.cg - bm * this.sg; var rh = hypot(p.x, p.y); if (Math.abs(rh) < EPSLN) { r.x = 0; r.y = p.y; } else { var cosz, sinz; sinz = 1 - rh * rh * this.pfact; sinz = (this.p - Math.sqrt(sinz)) / (this.pn1 / rh + rh / this.pn1); cosz = Math.sqrt(1 - sinz * sinz); switch (this.mode) { case mode.OBLIQ: r.y = Math.asin(cosz * this.sinph0 + p.y * sinz * this.cosph0 / rh); p.y = (cosz - this.sinph0 * Math.sin(r.y)) * rh; p.x *= sinz * this.cosph0; break; case mode.EQUIT: r.y = Math.asin(p.y * sinz / rh); p.y = cosz * rh; p.x *= sinz; break; case mode.N_POLE: r.y = Math.asin(cosz); p.y = -p.y; break; case mode.S_POLE: r.y = -Math.asin(cosz); break; } r.x = Math.atan2(p.x, p.y); } p.x = r.x + this.long0; p.y = r.y; return p; } var names$v = ["Tilted_Perspective", "tpers"]; var tpers = { init: init$u, forward: forward$t, inverse: inverse$t, names: names$v }; function init$v() { this.flip_axis = (this.sweep === 'x' ? 1 : 0); this.h = Number(this.h); this.radius_g_1 = this.h / this.a; if (this.radius_g_1 <= 0 || this.radius_g_1 > 1e10) { throw new Error(); } this.radius_g = 1.0 + this.radius_g_1; this.C = this.radius_g * this.radius_g - 1.0; if (this.es !== 0.0) { var one_es = 1.0 - this.es; var rone_es = 1 / one_es; this.radius_p = Math.sqrt(one_es); this.radius_p2 = one_es; this.radius_p_inv2 = rone_es; this.shape = 'ellipse'; // Use as a condition in the forward and inverse functions. } else { this.radius_p = 1.0; this.radius_p2 = 1.0; this.radius_p_inv2 = 1.0; this.shape = 'sphere'; // Use as a condition in the forward and inverse functions. } if (!this.title) { this.title = "Geostationary Satellite View"; } } function forward$u(p) { var lon = p.x; var lat = p.y; var tmp, v_x, v_y, v_z; lon = lon - this.long0; if (this.shape === 'ellipse') { lat = Math.atan(this.radius_p2 * Math.tan(lat)); var r = this.radius_p / hypot(this.radius_p * Math.cos(lat), Math.sin(lat)); v_x = r * Math.cos(lon) * Math.cos(lat); v_y = r * Math.sin(lon) * Math.cos(lat); v_z = r * Math.sin(lat); if (((this.radius_g - v_x) * v_x - v_y * v_y - v_z * v_z * this.radius_p_inv2) < 0.0) { p.x = Number.NaN; p.y = Number.NaN; return p; } tmp = this.radius_g - v_x; if (this.flip_axis) { p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp)); p.y = this.radius_g_1 * Math.atan(v_z / tmp); } else { p.x = this.radius_g_1 * Math.atan(v_y / tmp); p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp)); } } else if (this.shape === 'sphere') { tmp = Math.cos(lat); v_x = Math.cos(lon) * tmp; v_y = Math.sin(lon) * tmp; v_z = Math.sin(lat); tmp = this.radius_g - v_x; if (this.flip_axis) { p.x = this.radius_g_1 * Math.atan(v_y / hypot(v_z, tmp)); p.y = this.radius_g_1 * Math.atan(v_z / tmp); } else { p.x = this.radius_g_1 * Math.atan(v_y / tmp); p.y = this.radius_g_1 * Math.atan(v_z / hypot(v_y, tmp)); } } p.x = p.x * this.a; p.y = p.y * this.a; return p; } function inverse$u(p) { var v_x = -1.0; var v_y = 0.0; var v_z = 0.0; var a, b, det, k; p.x = p.x / this.a; p.y = p.y / this.a; if (this.shape === 'ellipse') { if (this.flip_axis) { v_z = Math.tan(p.y / this.radius_g_1); v_y = Math.tan(p.x / this.radius_g_1) * hypot(1.0, v_z); } else { v_y = Math.tan(p.x / this.radius_g_1); v_z = Math.tan(p.y / this.radius_g_1) * hypot(1.0, v_y); } var v_zp = v_z / this.radius_p; a = v_y * v_y + v_zp * v_zp + v_x * v_x; b = 2 * this.radius_g * v_x; det = (b * b) - 4 * a * this.C; if (det < 0.0) { p.x = Number.NaN; p.y = Number.NaN; return p; } k = (-b - Math.sqrt(det)) / (2.0 * a); v_x = this.radius_g + k * v_x; v_y *= k; v_z *= k; p.x = Math.atan2(v_y, v_x); p.y = Math.atan(v_z * Math.cos(p.x) / v_x); p.y = Math.atan(this.radius_p_inv2 * Math.tan(p.y)); } else if (this.shape === 'sphere') { if (this.flip_axis) { v_z = Math.tan(p.y / this.radius_g_1); v_y = Math.tan(p.x / this.radius_g_1) * Math.sqrt(1.0 + v_z * v_z); } else { v_y = Math.tan(p.x / this.radius_g_1); v_z = Math.tan(p.y / this.radius_g_1) * Math.sqrt(1.0 + v_y * v_y); } a = v_y * v_y + v_z * v_z + v_x * v_x; b = 2 * this.radius_g * v_x; det = (b * b) - 4 * a * this.C; if (det < 0.0) { p.x = Number.NaN; p.y = Number.NaN; return p; } k = (-b - Math.sqrt(det)) / (2.0 * a); v_x = this.radius_g + k * v_x; v_y *= k; v_z *= k; p.x = Math.atan2(v_y, v_x); p.y = Math.atan(v_z * Math.cos(p.x) / v_x); } p.x = p.x + this.long0; return p; } var names$w = ["Geostationary Satellite View", "Geostationary_Satellite", "geos"]; var geos = { init: init$v, forward: forward$u, inverse: inverse$u, names: names$w, }; function includedProjections(proj4){ proj4.Proj.projections.add(tmerc); proj4.Proj.projections.add(etmerc); proj4.Proj.projections.add(utm); proj4.Proj.projections.add(sterea); proj4.Proj.projections.add(stere); proj4.Proj.projections.add(somerc); proj4.Proj.projections.add(omerc); proj4.Proj.projections.add(lcc); proj4.Proj.projections.add(krovak); proj4.Proj.projections.add(cass); proj4.Proj.projections.add(laea); proj4.Proj.projections.add(aea); proj4.Proj.projections.add(gnom); proj4.Proj.projections.add(cea); proj4.Proj.projections.add(eqc); proj4.Proj.projections.add(poly); proj4.Proj.projections.add(nzmg); proj4.Proj.projections.add(mill); proj4.Proj.projections.add(sinu); proj4.Proj.projections.add(moll); proj4.Proj.projections.add(eqdc); proj4.Proj.projections.add(vandg); proj4.Proj.projections.add(aeqd); proj4.Proj.projections.add(ortho); proj4.Proj.projections.add(qsc); proj4.Proj.projections.add(robin); proj4.Proj.projections.add(geocent); proj4.Proj.projections.add(tpers); proj4.Proj.projections.add(geos); } proj4.defaultDatum = 'WGS84'; //default datum proj4.Proj = Projection; proj4.WGS84 = new proj4.Proj('WGS84'); proj4.Point = Point$1; proj4.toPoint = common; proj4.defs = defs; proj4.nadgrid = nadgrid; proj4.transform = transform; proj4.mgrs = mgrs; proj4.version = '__VERSION__'; includedProjections(proj4); // var RequestManager = function RequestManager(transformRequestFn , customAccessToken ) { this._transformRequestFn = transformRequestFn; this._customAccessToken = customAccessToken; this._createSkuToken(); }; RequestManager.prototype._createSkuToken = function _createSkuToken () { var skuToken = createSkuToken(); this._skuToken = skuToken.token; this._skuTokenExpiresAt = skuToken.tokenExpiresAt; }; RequestManager.prototype._isSkuTokenExpired = function _isSkuTokenExpired () { return Date.now() > this._skuTokenExpiresAt; }; RequestManager.prototype.transformRequest = function transformRequest (url , type ) { if (this._transformRequestFn) { return this._transformRequestFn(url, type) || {url: url}; } return {url: url}; }; RequestManager.prototype.normalizeStyleURL = function normalizeStyleURL (url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/styles/v1" + (urlObject.path); return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeGlyphsURL = function normalizeGlyphsURL (url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/fonts/v1" + (urlObject.path); return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeSourceURL = function normalizeSourceURL (url , accessToken ) { if (!isMapboxURL(url)) { return url; } var urlObject = parseUrl(url); urlObject.path = "/v4/" + (urlObject.authority) + ".json"; // TileJSON requests need a secure flag appended to their URLs so // that the server knows to send SSL-ified resource references. urlObject.params.push('secure'); return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeSpriteURL = function normalizeSpriteURL (url , format , extension , accessToken ) { var urlObject = parseUrl(url); if (urlObject && !urlObject.protocol && urlObject.path) { urlObject.path += "" + format + extension; return urlObject.path; } if (!isMapboxURL(url)) { urlObject.path += "" + format + extension; return formatUrl(urlObject); } urlObject.path = "/styles/v1" + (urlObject.path) + "/sprite" + format + extension; return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); }; RequestManager.prototype.normalizeTileURL = function normalizeTileURL (tileURL , tileSize ) { if (this._isSkuTokenExpired()) { this._createSkuToken(); } if (tileURL && !isMapboxURL(tileURL)) { return tileURL; } var urlObject = parseUrl(tileURL); var imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; var tileURLAPIPrefixRe = /^.+\/v4\//; // The v4 mapbox tile API supports 512x512 image tiles only when @2x // is appended to the tile URL. If `tileSize: 512` is specified for // a Mapbox raster source force the @2x suffix even if a non hidpi device. var suffix = exported.devicePixelRatio >= 2 || tileSize === 512 ? '@2x' : ''; var extension = exported$1.supported ? '.webp' : '$1'; urlObject.path = urlObject.path.replace(imageExtensionRe, ("" + suffix + extension)); urlObject.path = urlObject.path.replace(tileURLAPIPrefixRe, '/'); urlObject.path = "/v4" + (urlObject.path); var accessToken = this._customAccessToken || getAccessToken(urlObject.params) || config.ACCESS_TOKEN; if (config.REQUIRE_ACCESS_TOKEN && accessToken && this._skuToken) { urlObject.params.push(("sku=" + (this._skuToken))); } return this._makeAPIURL(urlObject, accessToken); }; RequestManager.prototype.canonicalizeTileURL = function canonicalizeTileURL (url , removeAccessToken ) { var version = "/v4/"; // matches any file extension specified by a dot and one or more alphanumeric characters var extensionRe = /\.[\w]+$/; var urlObject = parseUrl(url); // Make sure that we are dealing with a valid Mapbox tile URL. // Has to begin with /v4/, with a valid filename + extension if (!urlObject.path.match(/(^\/v4\/)/) || !urlObject.path.match(extensionRe)) { // Not a proper Mapbox tile URL. return url; } // Reassemble the canonical URL from the parts we've parsed before. var result = "mapbox://tiles/"; result += urlObject.path.replace(version, ''); // Append the query string, minus the access token parameter. var params = urlObject.params; if (removeAccessToken) { params = params.filter(function (p) { return !p.match(/^access_token=/); }); } if (params.length) { result += "?" + (params.join('&')); } return result; }; RequestManager.prototype.canonicalizeTileset = function canonicalizeTileset (tileJSON , sourceURL ) { var removeAccessToken = sourceURL ? isMapboxURL(sourceURL) : false; var canonical = []; for (var i = 0, list = tileJSON.tiles || []; i < list.length; i += 1) { var url = list[i]; if (isMapboxHTTPURL(url)) { canonical.push(this.canonicalizeTileURL(url, removeAccessToken)); } else { canonical.push(url); } } return canonical; }; RequestManager.prototype._makeAPIURL = function _makeAPIURL (urlObject , accessToken ) { var help = 'See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; var apiUrlObject = parseUrl(config.API_URL); urlObject.protocol = apiUrlObject.protocol; urlObject.authority = apiUrlObject.authority; if (apiUrlObject.path !== '/') { urlObject.path = "" + (apiUrlObject.path) + (urlObject.path); } if (!config.REQUIRE_ACCESS_TOKEN) { return formatUrl(urlObject); } accessToken = accessToken || config.ACCESS_TOKEN; if (!accessToken) { throw new Error(("An API access token is required to use Mapbox GL. " + help)); } if (accessToken[0] === 's') { throw new Error(("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). " + help)); } urlObject.params = urlObject.params.filter(function (d) { return d.indexOf('access_token') === -1; }); urlObject.params.push(("access_token=" + accessToken)); return formatUrl(urlObject); }; function isMapboxURL(url ) { return url.indexOf('mapbox:') === 0; } var mapboxHTTPURLRe = /^((https?:)?\/\/)?([^\/]+\.)?mapbox\.c(n|om)(\/|\?|$)/i; function isMapboxHTTPURL(url ) { return mapboxHTTPURLRe.test(url); } function hasCacheDefeatingSku(url ) { return url.indexOf('sku=') > 0 && isMapboxHTTPURL(url); } function getAccessToken(params ) { for (var i = 0, list = params; i < list.length; i += 1) { var param = list[i]; var match = param.match(/^access_token=(.*)$/); if (match) { return match[1]; } } return null; } var urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/; function parseUrl(url ) { var parts = url.match(urlRe); if (!parts) { // throw new Error('Unable to parse URL object'); return { // protocol: parts[1], // authority: parts[2], path: url, params: [] }; } return { protocol: parts[1], authority: parts[2], path: parts[3] || '/', params: parts[4] ? parts[4].split('&') : [] }; } function formatUrl(obj ) { var params = obj.params.length ? ("?" + (obj.params.join('&'))) : ''; return ((obj.protocol) + "://" + (obj.authority) + (obj.path) + params); } var telemEventKey = 'mapbox.eventData'; function parseAccessToken(accessToken ) { if (!accessToken) { return null; } var parts = accessToken.split('.'); if (!parts || parts.length !== 3) { return null; } try { var jsonData = JSON.parse(b64DecodeUnicode(parts[1])); return jsonData; } catch (e) { return null; } } var TelemetryEvent = function TelemetryEvent(type ) { this.type = type; this.anonId = null; this.eventData = {}; this.queue = []; this.pendingRequest = null; }; TelemetryEvent.prototype.getStorageKey = function getStorageKey (domain ) { var tokenData = parseAccessToken(config.ACCESS_TOKEN); var u = ''; if (tokenData && tokenData['u']) { u = b64EncodeUnicode(tokenData['u']); } else { u = config.ACCESS_TOKEN || ''; } return domain ? (telemEventKey + "." + domain + ":" + u) : (telemEventKey + ":" + u); }; TelemetryEvent.prototype.fetchEventData = function fetchEventData () { var isLocalStorageAvailable = storageAvailable('localStorage'); var storageKey = this.getStorageKey(); var uuidKey = this.getStorageKey('uuid'); if (isLocalStorageAvailable) { //Retrieve cached data try { var data = window$1.localStorage.getItem(storageKey); if (data) { this.eventData = JSON.parse(data); } var uuid = window$1.localStorage.getItem(uuidKey); if (uuid) { this.anonId = uuid; } } catch (e) { warnOnce('Unable to read from LocalStorage'); } } }; TelemetryEvent.prototype.saveEventData = function saveEventData () { var isLocalStorageAvailable = storageAvailable('localStorage'); var storageKey = this.getStorageKey(); var uuidKey = this.getStorageKey('uuid'); if (isLocalStorageAvailable) { try { window$1.localStorage.setItem(uuidKey, this.anonId); if (Object.keys(this.eventData).length >= 1) { window$1.localStorage.setItem(storageKey, JSON.stringify(this.eventData)); } } catch (e) { warnOnce('Unable to write to LocalStorage'); } } }; TelemetryEvent.prototype.processRequests = function processRequests (_ ) {}; /* * If any event data should be persisted after the POST request, the callback should modify eventData` * to the values that should be saved. For this reason, the callback should be invoked prior to the call * to TelemetryEvent#saveData */ TelemetryEvent.prototype.postEvent = function postEvent (timestamp , additionalPayload , callback , customAccessToken ) { var this$1 = this; if (!config.EVENTS_URL) { return; } var eventsUrlObject = parseUrl(config.EVENTS_URL); eventsUrlObject.params.push(("access_token=" + (customAccessToken || config.ACCESS_TOKEN || ''))); var payload = { event: this.type, created: new Date(timestamp).toISOString(), sdkIdentifier: 'mapbox-gl-js', sdkVersion: version, skuId: SKU_ID, userId: this.anonId }; var finalPayload = additionalPayload ? extend(payload, additionalPayload) : payload; var request = { url: formatUrl(eventsUrlObject), headers: { 'Content-Type': 'text/plain' //Skip the pre-flight OPTIONS request }, body: JSON.stringify([finalPayload]) }; this.pendingRequest = postData(request, function (error) { this$1.pendingRequest = null; callback(error); this$1.saveEventData(); this$1.processRequests(customAccessToken); }); }; TelemetryEvent.prototype.queueRequest = function queueRequest (event , customAccessToken ) { this.queue.push(event); this.processRequests(customAccessToken); }; var MapLoadEvent = /*@__PURE__*/(function (TelemetryEvent) { function MapLoadEvent() { TelemetryEvent.call(this, 'map.load'); this.success = {}; this.skuToken = ''; } if ( TelemetryEvent ) MapLoadEvent.__proto__ = TelemetryEvent; MapLoadEvent.prototype = Object.create( TelemetryEvent && TelemetryEvent.prototype ); MapLoadEvent.prototype.constructor = MapLoadEvent; MapLoadEvent.prototype.postMapLoadEvent = function postMapLoadEvent (tileUrls , mapId , skuToken , customAccessToken ) { //Enabled only when Mapbox Access Token is set and a source uses // mapbox tiles. this.skuToken = skuToken; if (config.EVENTS_URL && customAccessToken || config.ACCESS_TOKEN && Array.isArray(tileUrls) && tileUrls.some(function (url) { return isMapboxURL(url) || isMapboxHTTPURL(url); })) { this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken); } }; MapLoadEvent.prototype.processRequests = function processRequests (customAccessToken ) { var this$1 = this; if (this.pendingRequest || this.queue.length === 0) { return; } var ref = this.queue.shift(); var id = ref.id; var timestamp = ref.timestamp; // Only one load event should fire per map if (id && this.success[id]) { return; } if (!this.anonId) { this.fetchEventData(); } if (!validateUuid(this.anonId)) { this.anonId = uuid(); } this.postEvent(timestamp, {skuToken: this.skuToken}, function (err) { if (!err) { if (id) { this$1.success[id] = true; } } }, customAccessToken); }; return MapLoadEvent; }(TelemetryEvent)); var TurnstileEvent = /*@__PURE__*/(function (TelemetryEvent) { function TurnstileEvent(customAccessToken ) { TelemetryEvent.call(this, 'appUserTurnstile'); this._customAccessToken = customAccessToken; } if ( TelemetryEvent ) TurnstileEvent.__proto__ = TelemetryEvent; TurnstileEvent.prototype = Object.create( TelemetryEvent && TelemetryEvent.prototype ); TurnstileEvent.prototype.constructor = TurnstileEvent; TurnstileEvent.prototype.postTurnstileEvent = function postTurnstileEvent (tileUrls , customAccessToken ) { //Enabled only when Mapbox Access Token is set and a source uses // mapbox tiles. if (config.EVENTS_URL && config.ACCESS_TOKEN && Array.isArray(tileUrls) && tileUrls.some(function (url) { return isMapboxURL(url) || isMapboxHTTPURL(url); })) { this.queueRequest(Date.now(), customAccessToken); } }; TurnstileEvent.prototype.processRequests = function processRequests (customAccessToken ) { var this$1 = this; if (this.pendingRequest || this.queue.length === 0) { return; } if (!this.anonId || !this.eventData.lastSuccess || !this.eventData.tokenU) { //Retrieve cached data this.fetchEventData(); } var tokenData = parseAccessToken(config.ACCESS_TOKEN); var tokenU = tokenData ? tokenData['u'] : config.ACCESS_TOKEN; //Reset event data cache if the access token owner changed. var dueForEvent = tokenU !== this.eventData.tokenU; if (!validateUuid(this.anonId)) { this.anonId = uuid(); dueForEvent = true; } var nextUpdate = this.queue.shift(); // Record turnstile event once per calendar day. if (this.eventData.lastSuccess) { var lastUpdate = new Date(this.eventData.lastSuccess); var nextDate = new Date(nextUpdate); var daysElapsed = (nextUpdate - this.eventData.lastSuccess) / (24 * 60 * 60 * 1000); dueForEvent = dueForEvent || daysElapsed >= 1 || daysElapsed < -1 || lastUpdate.getDate() !== nextDate.getDate(); } else { dueForEvent = true; } if (!dueForEvent) { return this.processRequests(); } this.postEvent(nextUpdate, {"enabled.telemetry": false}, function (err) { if (!err) { this$1.eventData.lastSuccess = nextUpdate; this$1.eventData.tokenU = tokenU; } }, customAccessToken); }; return TurnstileEvent; }(TelemetryEvent)); var turnstileEvent_ = new TurnstileEvent(); var postTurnstileEvent = turnstileEvent_.postTurnstileEvent.bind(turnstileEvent_); var mapLoadEvent_ = new MapLoadEvent(); var postMapLoadEvent = mapLoadEvent_.postMapLoadEvent.bind(mapLoadEvent_); /***** END WARNING - REMOVAL OR MODIFICATION OF THE PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ // var CACHE_NAME = 'mapbox-tiles'; var cacheLimit = 500; // 50MB / (100KB/tile) ~= 500 tiles var cacheCheckThreshold = 50; var MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; // 7 minutes. Skip caching tiles with a short enough max age. // We're using a global shared cache object. Normally, requesting ad-hoc Cache objects is fine, but // Safari has a memory leak in which it fails to release memory when requesting keys() from a Cache // object. See https://bugs.webkit.org/show_bug.cgi?id=203991 for more information. var sharedCache ; function cacheOpen() { if (window$1.caches && !sharedCache) { sharedCache = window$1.caches.open(CACHE_NAME); } } // We're never closing the cache, but our unit tests rely on changing out the global window.caches // object, so we have a function specifically for unit tests that allows resetting the shared cache. function cacheClose() { sharedCache = undefined; } var responseConstructorSupportsReadableStream; function prepareBody(response , callback) { if (responseConstructorSupportsReadableStream === undefined) { try { new Response(new ReadableStream()); // eslint-disable-line no-undef responseConstructorSupportsReadableStream = true; } catch (e) { // Edge responseConstructorSupportsReadableStream = false; } } if (responseConstructorSupportsReadableStream) { callback(response.body); } else { response.blob().then(callback); } } function cachePut(request , response , requestTime ) { cacheOpen(); if (!sharedCache) { return; } var options = { status: response.status, statusText: response.statusText, headers: new window$1.Headers() }; response.headers.forEach(function (v, k) { return options.headers.set(k, v); }); var cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); if (cacheControl['no-store']) { return; } if (cacheControl['max-age']) { options.headers.set('Expires', new Date(requestTime + cacheControl['max-age'] * 1000).toUTCString()); } var timeUntilExpiry = new Date(options.headers.get('Expires')).getTime() - requestTime; if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY) { return; } prepareBody(response, function (body) { var clonedResponse = new window$1.Response(body, options); cacheOpen(); if (!sharedCache) { return; } sharedCache .then(function (cache) { return cache.put(stripQueryParameters(request.url), clonedResponse); }) .catch(function (e) { return warnOnce(e.message); }); }); } function stripQueryParameters(url ) { var start = url.indexOf('?'); return start < 0 ? url : url.slice(0, start); } function cacheGet(request , callback ) { cacheOpen(); if (!sharedCache) { return callback(null); } var strippedURL = stripQueryParameters(request.url); sharedCache .then(function (cache) { // manually strip URL instead of `ignoreSearch: true` because of a known // performance issue in Chrome https://github.com/mapbox/mapbox-gl-js/issues/8431 cache.match(strippedURL) .then(function (response) { var fresh = isFresh(response); // Reinsert into cache so that order of keys in the cache is the order of access. // This line makes the cache a LRU instead of a FIFO cache. cache.delete(strippedURL); if (fresh) { cache.put(strippedURL, response.clone()); } callback(null, response, fresh); }) .catch(callback); }) .catch(callback); } function isFresh(response) { if (!response) { return false; } var expires = new Date(response.headers.get('Expires') || 0); var cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); return expires > Date.now() && !cacheControl['no-cache']; } // `Infinity` triggers a cache check after the first tile is loaded // so that a check is run at least once on each page load. var globalEntryCounter = Infinity; // The cache check gets run on a worker. The reason for this is that // profiling sometimes shows this as taking up significant time on the // thread it gets called from. And sometimes it doesn't. It *may* be // fine to run this on the main thread but out of caution this is being // dispatched on a worker. This can be investigated further in the future. function cacheEntryPossiblyAdded(dispatcher ) { globalEntryCounter++; if (globalEntryCounter > cacheCheckThreshold) { dispatcher.getActor().send('enforceCacheSizeLimit', cacheLimit); globalEntryCounter = 0; } } // runs on worker, see above comment function enforceCacheSizeLimit(limit ) { cacheOpen(); if (!sharedCache) { return; } sharedCache .then(function (cache) { cache.keys().then(function (keys) { for (var i = 0; i < keys.length - limit; i++) { cache.delete(keys[i]); } }); }); } function clearTileCache(callback ) { var promise = window$1.caches.delete(CACHE_NAME); if (callback) { promise.catch(callback).then(function () { return callback(); }); } } function setCacheLimits(limit , checkThreshold ) { cacheLimit = limit; cacheCheckThreshold = checkThreshold; } // var supportsOffscreenCanvas ; function offscreenCanvasSupported() { if (supportsOffscreenCanvas == null) { supportsOffscreenCanvas = window$1.OffscreenCanvas && new window$1.OffscreenCanvas(1, 1).getContext('2d') && typeof window$1.createImageBitmap === 'function'; } return supportsOffscreenCanvas; } // /** * The type of a resource. * @private * @readonly * @enum {string} */ var ResourceType = { Unknown: 'Unknown', Style: 'Style', Source: 'Source', Tile: 'Tile', Glyphs: 'Glyphs', SpriteImage: 'SpriteImage', SpriteJSON: 'SpriteJSON', Image: 'Image' }; if (typeof Object.freeze == 'function') { Object.freeze(ResourceType); } /** * A `RequestParameters` object to be returned from Map.options.transformRequest callbacks. * @typedef {Object} RequestParameters * @property {string} url The URL to be requested. * @property {Object} headers The headers to be sent with the request. * @property {string} method Request method `'GET' | 'POST' | 'PUT'`. * @property {string} body Request body. * @property {string} type Response body type to be returned `'string' | 'json' | 'arrayBuffer'`. * @property {string} credentials `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests. * @property {boolean} collectResourceTiming If true, Resource Timing API information will be collected for these transformed requests and returned in a resourceTiming property of relevant data events. * @example * // use transformRequest to modify requests that begin with `http://myHost` * transformRequest: function(url, resourceType) { * if (resourceType === 'Source' && url.indexOf('http://myHost') > -1) { * return { * url: url.replace('http', 'https'), * headers: { 'my-custom-header': true }, * credentials: 'include' // Include cookies for cross-origin requests * } * } * } * */ var AJAXError = /*@__PURE__*/(function (Error) { function AJAXError(message , status , url ) { if (status === 401 && isMapboxHTTPURL(url)) { message += ': you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; } Error.call(this, message); this.status = status; this.url = url; // work around for https://github.com/Rich-Harris/buble/issues/40 this.name = this.constructor.name; this.message = message; } if ( Error ) AJAXError.__proto__ = Error; AJAXError.prototype = Object.create( Error && Error.prototype ); AJAXError.prototype.constructor = AJAXError; AJAXError.prototype.toString = function toString () { return ((this.name) + ": " + (this.message) + " (" + (this.status) + "): " + (this.url)); }; return AJAXError; }(Error)); // Ensure that we're sending the correct referrer from blob URL worker bundles. // For files loaded from the local file system, `location.origin` will be set // to the string(!) "null" (Firefox), or "file://" (Chrome, Safari, Edge, IE), // and we will set an empty referrer. Otherwise, we're using the document's URL. /* global self */ var getReferrer = isWorker() ? function () { return self.worker && self.worker.referrer; } : function () { return (window$1.location.protocol === 'blob:' ? window$1.parent : window$1).location.href; }; // Determines whether a URL is a file:// URL. This is obviously the case if it begins // with file://. Relative URLs are also file:// URLs iff the original document was loaded // via a file:// URL. var isFileURL = function (url) { return /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\w+:/.test(url)); }; function makeFetchRequest(requestParameters , callback ) { var controller = new window$1.AbortController(); var request = new window$1.Request(requestParameters.url, { method: requestParameters.method || 'GET', body: requestParameters.body, credentials: requestParameters.credentials, headers: requestParameters.headers, referrer: getReferrer(), signal: controller.signal }); var complete = false; var aborted = false; var cacheIgnoringSearch = hasCacheDefeatingSku(request.url); if (requestParameters.type === 'json') { request.headers.set('Accept', 'application/json'); } var validateOrFetch = function (err, cachedResponse, responseIsFresh) { if (aborted) { return; } if (err) { // Do fetch in case of cache error. // HTTP pages in Edge trigger a security error that can be ignored. if (err.message !== 'SecurityError') { warnOnce(err); } } if (cachedResponse && responseIsFresh) { return finishRequest(cachedResponse); } if (cachedResponse) { // We can't do revalidation with 'If-None-Match' because then the // request doesn't have simple cors headers. } var requestTime = Date.now(); window$1.fetch(request).then(function (response) { if (response.ok) { var cacheableResponse = cacheIgnoringSearch ? response.clone() : null; return finishRequest(response, cacheableResponse, requestTime); } else { return callback(new AJAXError(response.statusText, response.status, requestParameters.url)); } }).catch(function (error) { if (error.code === 20) { // silence expected AbortError return; } callback(new Error(error.message)); }); }; var finishRequest = function (response, cacheableResponse, requestTime) { ( requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() : requestParameters.type === 'json' ? response.json() : response.text() ).then(function (result) { if (aborted) { return; } if (cacheableResponse && requestTime) { // The response needs to be inserted into the cache after it has completely loaded. // Until it is fully loaded there is a chance it will be aborted. Aborting while // reading the body can cause the cache insertion to error. We could catch this error // in most browsers but in Firefox it seems to sometimes crash the tab. Adding // it to the cache here avoids that error. cachePut(request, cacheableResponse, requestTime); } complete = true; callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires')); }).catch(function (err) { if (!aborted) { callback(new Error(err.message)); } }); }; if (cacheIgnoringSearch) { cacheGet(request, validateOrFetch); } else { validateOrFetch(null, null); } return {cancel: function () { aborted = true; if (!complete) { controller.abort(); } }}; } function makeXMLHttpRequest(requestParameters , callback ) { var xhr = new window$1.XMLHttpRequest(); xhr.open(requestParameters.method || 'GET', requestParameters.url, true); if (requestParameters.type === 'arrayBuffer') { xhr.responseType = 'arraybuffer'; } for (var k in requestParameters.headers) { xhr.setRequestHeader(k, requestParameters.headers[k]); } if (requestParameters.type === 'json') { xhr.responseType = 'text'; xhr.setRequestHeader('Accept', 'application/json'); } xhr.withCredentials = requestParameters.credentials === 'include'; xhr.onerror = function () { callback(new Error(xhr.statusText)); }; xhr.onload = function () { if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) { var data = xhr.response; if (requestParameters.type === 'json') { // We're manually parsing JSON here to get better error messages. try { data = JSON.parse(xhr.response); } catch (err) { return callback(err); } } callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires')); } else { callback(new AJAXError(xhr.statusText, xhr.status, requestParameters.url)); } }; xhr.send(requestParameters.body); return {cancel: function () { return xhr.abort(); }}; } var makeRequest = function(requestParameters , callback ) { // We're trying to use the Fetch API if possible. However, in some situations we can't use it: // - IE11 doesn't support it at all. In this case, we dispatch the request to the main thread so // that we can get an accruate referrer header. // - Safari exposes window.AbortController, but it doesn't work actually abort any requests in // some versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2) // - Requests for resources with the file:// URI scheme don't work with the Fetch API either. In // this case we unconditionally use XHR on the current thread since referrers don't matter. if (!isFileURL(requestParameters.url)) { if (window$1.fetch && window$1.Request && window$1.AbortController && window$1.Request.prototype.hasOwnProperty('signal')) { return makeFetchRequest(requestParameters, callback); } if (isWorker() && self.worker && self.worker.actor) { var queueOnMainThread = true; return self.worker.actor.send('getResource', requestParameters, callback, undefined, queueOnMainThread); } } return makeXMLHttpRequest(requestParameters, callback); }; var getJSON = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, {type: 'json'}), callback); }; var getArrayBuffer = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, {type: 'arrayBuffer'}), callback); }; var postData = function(requestParameters , callback ) { return makeRequest(extend(requestParameters, {method: 'POST'}), callback); }; function sameOrigin(url) { var a = window$1.document.createElement('a'); a.href = url; return a.protocol === window$1.document.location.protocol && a.host === window$1.document.location.host; } var transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; function arrayBufferToImage(data , callback , cacheControl , expires ) { var img = new window$1.Image(); var URL = window$1.URL; img.onload = function () { callback(null, img); URL.revokeObjectURL(img.src); }; img.onerror = function () { return callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.')); }; var blob = new window$1.Blob([new Uint8Array(data)], {type: 'image/png'}); (img ).cacheControl = cacheControl; (img ).expires = expires; img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; } function arrayBufferToImageBitmap(data , callback ) { var blob = new window$1.Blob([new Uint8Array(data)], {type: 'image/png'}); window$1.createImageBitmap(blob).then(function (imgBitmap) { callback(null, imgBitmap); }).catch(function (e) { callback(new Error(("Could not load image because of " + (e.message) + ". Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported."))); }); } var imageQueue, numImageRequests; var resetImageRequestQueue = function () { imageQueue = []; numImageRequests = 0; }; resetImageRequestQueue(); var getImage = function(requestParameters , callback ) { if (exported$1.supported) { if (!requestParameters.headers) { requestParameters.headers = {}; } requestParameters.headers.accept = 'image/webp,*/*'; } // limit concurrent image loads to help with raster sources performance on big screens if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) { var queued = { requestParameters: requestParameters, callback: callback, cancelled: false, cancel: function cancel() { this.cancelled = true; } }; imageQueue.push(queued); return queued; } numImageRequests++; var advanced = false; var advanceImageRequestQueue = function () { if (advanced) { return; } advanced = true; numImageRequests--; assert_1(numImageRequests >= 0); while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line var request = imageQueue.shift(); var requestParameters = request.requestParameters; var callback = request.callback; var cancelled = request.cancelled; if (!cancelled) { request.cancel = getImage(requestParameters, callback).cancel; } } }; // request the image with XHR to work around caching issues // see https://github.com/mapbox/mapbox-gl-js/issues/1470 var request = getArrayBuffer(requestParameters, function (err , data , cacheControl , expires ) { advanceImageRequestQueue(); if (err) { callback(err); } else if (data) { if (offscreenCanvasSupported()) { arrayBufferToImageBitmap(data, callback); } else { arrayBufferToImage(data, callback, cacheControl, expires); } } }); return { cancel: function () { request.cancel(); advanceImageRequestQueue(); } }; }; var getVideo = function(urls , callback ) { var video = window$1.document.createElement('video'); video.muted = true; video.onloadstart = function() { callback(null, video); }; for (var i = 0; i < urls.length; i++) { var s = window$1.document.createElement('source'); if (!sameOrigin(urls[i])) { video.crossOrigin = 'Anonymous'; } s.src = urls[i]; video.appendChild(s); } return {cancel: function () {}}; }; 'use strict'; var gridIndex = GridIndex; var NUM_PARAMS = 3; function GridIndex(extent, n, padding) { var cells = this.cells = []; if (extent instanceof ArrayBuffer) { this.arrayBuffer = extent; var array = new Int32Array(this.arrayBuffer); extent = array[0]; n = array[1]; padding = array[2]; this.d = n + 2 * padding; for (var k = 0; k < this.d * this.d; k++) { var start = array[NUM_PARAMS + k]; var end = array[NUM_PARAMS + k + 1]; cells.push(start === end ? null : array.subarray(start, end)); } var keysOffset = array[NUM_PARAMS + cells.length]; var bboxesOffset = array[NUM_PARAMS + cells.length + 1]; this.keys = array.subarray(keysOffset, bboxesOffset); this.bboxes = array.subarray(bboxesOffset); this.insert = this._insertReadonly; } else { this.d = n + 2 * padding; for (var i = 0; i < this.d * this.d; i++) { cells.push([]); } this.keys = []; this.bboxes = []; } this.n = n; this.extent = extent; this.padding = padding; this.scale = n / extent; this.uid = 0; var p = (padding / n) * extent; this.min = -p; this.max = extent + p; } GridIndex.prototype.insert = function(key, x1, y1, x2, y2) { this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++); this.keys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype._insertReadonly = function() { throw 'Cannot insert into a GridIndex created from an ArrayBuffer.'; }; GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) { this.cells[cellIndex].push(uid); }; GridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) { var min = this.min; var max = this.max; if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) { // We use `Array#slice` because `this.keys` may be a `Int32Array` and // some browsers (Safari and IE) do not support `TypedArray#slice` // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility return Array.prototype.slice.call(this.keys); } else { var result = []; var seenUids = {}; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest); return result; } }; GridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) { var cell = this.cells[cellIndex]; if (cell !== null) { var keys = this.keys; var bboxes = this.bboxes; for (var u = 0; u < cell.length; u++) { var uid = cell[u]; if (seenUids[uid] === undefined) { var offset = uid * 4; if (intersectionTest ? intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) : ((x1 <= bboxes[offset + 2]) && (y1 <= bboxes[offset + 3]) && (x2 >= bboxes[offset + 0]) && (y2 >= bboxes[offset + 1]))) { seenUids[uid] = true; result.push(keys[uid]); } else { seenUids[uid] = false; } } } } }; GridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) { var cx1 = this._convertToCellCoord(x1); var cy1 = this._convertToCellCoord(y1); var cx2 = this._convertToCellCoord(x2); var cy2 = this._convertToCellCoord(y2); for (var x = cx1; x <= cx2; x++) { for (var y = cy1; y <= cy2; y++) { var cellIndex = this.d * y + x; if (intersectionTest && !intersectionTest( this._convertFromCellCoord(x), this._convertFromCellCoord(y), this._convertFromCellCoord(x + 1), this._convertFromCellCoord(y + 1))) { continue; } if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) { return; } } } }; GridIndex.prototype._convertFromCellCoord = function(x) { return (x - this.padding) / this.scale; }; GridIndex.prototype._convertToCellCoord = function(x) { return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding)); }; GridIndex.prototype.toArrayBuffer = function() { if (this.arrayBuffer) { return this.arrayBuffer; } var cells = this.cells; var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1; var totalCellLength = 0; for (var i = 0; i < this.cells.length; i++) { totalCellLength += this.cells[i].length; } var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length); array[0] = this.extent; array[1] = this.n; array[2] = this.padding; var offset = metadataLength; for (var k = 0; k < cells.length; k++) { var cell = cells[k]; array[NUM_PARAMS + k] = offset; array.set(cell, offset); offset += cell.length; } array[NUM_PARAMS + cells.length] = offset; array.set(this.keys, offset); offset += this.keys.length; array[NUM_PARAMS + cells.length + 1] = offset; array.set(this.bboxes, offset); offset += this.bboxes.length; return array.buffer; }; var csscolorparser = createCommonjsModule(function (module, exports) { // (c) Dean McNamee , 2012. // // https://github.com/deanm/css-color-parser-js // // 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. // http://www.w3.org/TR/css3-color/ var kCSSColorTable = { "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], "aquamarine": [127,255,212,1], "azure": [240,255,255,1], "beige": [245,245,220,1], "bisque": [255,228,196,1], "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], "blue": [0,0,255,1], "blueviolet": [138,43,226,1], "brown": [165,42,42,1], "burlywood": [222,184,135,1], "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], "chocolate": [210,105,30,1], "coral": [255,127,80,1], "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], "crimson": [220,20,60,1], "cyan": [0,255,255,1], "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], "gold": [255,215,0,1], "goldenrod": [218,165,32,1], "gray": [128,128,128,1], "green": [0,128,0,1], "greenyellow": [173,255,47,1], "grey": [128,128,128,1], "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], "indianred": [205,92,92,1], "indigo": [75,0,130,1], "ivory": [255,255,240,1], "khaki": [240,230,140,1], "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], "lightyellow": [255,255,224,1], "lime": [0,255,0,1], "limegreen": [50,205,50,1], "linen": [250,240,230,1], "magenta": [255,0,255,1], "maroon": [128,0,0,1], "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], "navy": [0,0,128,1], "oldlace": [253,245,230,1], "olive": [128,128,0,1], "olivedrab": [107,142,35,1], "orange": [255,165,0,1], "orangered": [255,69,0,1], "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], "peachpuff": [255,218,185,1], "peru": [205,133,63,1], "pink": [255,192,203,1], "plum": [221,160,221,1], "powderblue": [176,224,230,1], "purple": [128,0,128,1], "rebeccapurple": [102,51,153,1], "red": [255,0,0,1], "rosybrown": [188,143,143,1], "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], "seagreen": [46,139,87,1], "seashell": [255,245,238,1], "sienna": [160,82,45,1], "silver": [192,192,192,1], "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], "slategray": [112,128,144,1], "slategrey": [112,128,144,1], "snow": [255,250,250,1], "springgreen": [0,255,127,1], "steelblue": [70,130,180,1], "tan": [210,180,140,1], "teal": [0,128,128,1], "thistle": [216,191,216,1], "tomato": [255,99,71,1], "turquoise": [64,224,208,1], "violet": [238,130,238,1], "wheat": [245,222,179,1], "white": [255,255,255,1], "whitesmoke": [245,245,245,1], "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]}; function clamp_css_byte(i) { // Clamp to integer 0 .. 255. i = Math.round(i); // Seems to be what Chrome does (vs truncation). return i < 0 ? 0 : i > 255 ? 255 : i; } function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. return f < 0 ? 0 : f > 1 ? 1 : f; } function parse_css_int(str) { // int or percentage. if (str[str.length - 1] === '%') { return clamp_css_byte(parseFloat(str) / 100 * 255); } return clamp_css_byte(parseInt(str)); } function parse_css_float(str) { // float or percentage. if (str[str.length - 1] === '%') { return clamp_css_float(parseFloat(str) / 100); } return clamp_css_float(parseFloat(str)); } function css_hue_to_rgb(m1, m2, h) { if (h < 0) { h += 1; } else if (h > 1) { h -= 1; } if (h * 6 < 1) { return m1 + (m2 - m1) * h * 6; } if (h * 2 < 1) { return m2; } if (h * 3 < 2) { return m1 + (m2 - m1) * (2/3 - h) * 6; } return m1; } function parseCSSColor(css_str) { // Remove all whitespace, not compliant, but should just be more accepting. var str = css_str.replace(/ /g, '').toLowerCase(); // Color keywords (and transparent) lookup. if (str in kCSSColorTable) { return kCSSColorTable[str].slice(); } // dup. // #abc and #abc123 syntax. if (str[0] === '#') { if (str.length === 4) { var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. if (!(iv >= 0 && iv <= 0xfff)) { return null; } // Covers NaN. return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), 1]; } else if (str.length === 7) { var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. if (!(iv >= 0 && iv <= 0xffffff)) { return null; } // Covers NaN. return [(iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, 1]; } return null; } var op = str.indexOf('('), ep = str.indexOf(')'); if (op !== -1 && ep + 1 === str.length) { var fname = str.substr(0, op); var params = str.substr(op+1, ep-(op+1)).split(','); var alpha = 1; // To allow case fallthrough. switch (fname) { case 'rgba': if (params.length !== 4) { return null; } alpha = parse_css_float(params.pop()); // Fall through. case 'rgb': if (params.length !== 3) { return null; } return [parse_css_int(params[0]), parse_css_int(params[1]), parse_css_int(params[2]), alpha]; case 'hsla': if (params.length !== 4) { return null; } alpha = parse_css_float(params.pop()); // Fall through. case 'hsl': if (params.length !== 3) { return null; } var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 // NOTE(deanm): According to the CSS spec s/l should only be // percentages, but we don't bother and let float or percentage. var s = parse_css_float(params[1]); var l = parse_css_float(params[2]); var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; var m1 = l * 2 - m2; return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), alpha]; default: return null; } } return null; } try { exports.parseCSSColor = parseCSSColor; } catch(e) { } }); var csscolorparser_1 = csscolorparser.parseCSSColor; // /** * An RGBA color value. Create instances from color strings using the static * method `Color.parse`. The constructor accepts RGB channel values in the range * `[0, 1]`, premultiplied by A. * * @param {number} r The red channel. * @param {number} g The green channel. * @param {number} b The blue channel. * @param {number} a The alpha channel. * @private */ var Color = function Color(r , g , b , a) { if ( a === void 0 ) a = 1; this.r = r; this.g = g; this.b = b; this.a = a; }; /** * Parses valid CSS color strings and returns a `Color` instance. * @returns A `Color` instance, or `undefined` if the input is not a valid color string. */ Color.parse = function parse (input ) { if (!input) { return undefined; } if (input instanceof Color) { return input; } if (typeof input !== 'string') { return undefined; } var rgba = csscolorparser_1(input); if (!rgba) { return undefined; } return new Color( rgba[0] / 255 * rgba[3], rgba[1] / 255 * rgba[3], rgba[2] / 255 * rgba[3], rgba[3] ); }; /** * Returns an RGBA string representing the color value. * * @returns An RGBA string. * @example * var purple = new Color.parse('purple'); * purple.toString; // = "rgba(128,0,128,1)" * var translucentGreen = new Color.parse('rgba(26, 207, 26, .73)'); * translucentGreen.toString(); // = "rgba(26,207,26,0.73)" */ Color.prototype.toString = function toString () { var ref = this.toArray(); var r = ref[0]; var g = ref[1]; var b = ref[2]; var a = ref[3]; return ("rgba(" + (Math.round(r)) + "," + (Math.round(g)) + "," + (Math.round(b)) + "," + a + ")"); }; Color.prototype.toArray = function toArray () { var ref = this; var r = ref.r; var g = ref.g; var b = ref.b; var a = ref.a; return a === 0 ? [0, 0, 0, 0] : [ r * 255 / a, g * 255 / a, b * 255 / a, a ]; }; Color.black = new Color(0, 0, 0, 1); Color.white = new Color(1, 1, 1, 1); Color.transparent = new Color(0, 0, 0, 0); Color.red = new Color(1, 0, 0, 1); // function extend$2 (output ) { var inputs = [], len = arguments.length - 1; while ( len-- > 0 ) inputs[ len ] = arguments[ len + 1 ]; for (var i = 0, list = inputs; i < list.length; i += 1) { var input = list[i]; for (var k in input) { output[k] = input[k]; } } return output; } // var ParsingError = /*@__PURE__*/(function (Error) { function ParsingError(key , message ) { Error.call(this, message); this.message = message; this.key = key; } if ( Error ) ParsingError.__proto__ = Error; ParsingError.prototype = Object.create( Error && Error.prototype ); ParsingError.prototype.constructor = ParsingError; return ParsingError; }(Error)); // /** * Tracks `let` bindings during expression parsing. * @private */ var Scope = function Scope(parent , bindings) { if ( bindings === void 0 ) bindings = []; this.parent = parent; this.bindings = {}; for (var i = 0, list = bindings; i < list.length; i += 1) { var ref = list[i]; var name = ref[0]; var expression = ref[1]; this.bindings[name] = expression; } }; Scope.prototype.concat = function concat (bindings ) { return new Scope(this, bindings); }; Scope.prototype.get = function get (name ) { if (this.bindings[name]) { return this.bindings[name]; } if (this.parent) { return this.parent.get(name); } throw new Error((name + " not found in scope.")); }; Scope.prototype.has = function has (name ) { if (this.bindings[name]) { return true; } return this.parent ? this.parent.has(name) : false; }; // var NullType = {kind: 'null'}; var NumberType = {kind: 'number'}; var StringType = {kind: 'string'}; var BooleanType = {kind: 'boolean'}; var ColorType = {kind: 'color'}; var ObjectType = {kind: 'object'}; var ValueType = {kind: 'value'}; var ErrorType = {kind: 'error'}; var CollatorType = {kind: 'collator'}; var FormattedType = {kind: 'formatted'}; var ResolvedImageType = {kind: 'resolvedImage'}; function array(itemType , N ) { return { kind: 'array', itemType: itemType, N: N }; } function toString(type ) { if (type.kind === 'array') { var itemType = toString(type.itemType); return typeof type.N === 'number' ? ("array<" + itemType + ", " + (type.N) + ">") : type.itemType.kind === 'value' ? 'array' : ("array<" + itemType + ">"); } else { return type.kind; } } var valueMemberTypes = [ NullType, NumberType, StringType, BooleanType, ColorType, FormattedType, ObjectType, array(ValueType), ResolvedImageType ]; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message. * @private */ function checkSubtype(expected , t ) { if (t.kind === 'error') { // Error is a subtype of every type return null; } else if (expected.kind === 'array') { if (t.kind === 'array' && ((t.N === 0 && t.itemType.kind === 'value') || !checkSubtype(expected.itemType, t.itemType)) && (typeof expected.N !== 'number' || expected.N === t.N)) { return null; } } else if (expected.kind === t.kind) { return null; } else if (expected.kind === 'value') { for (var i = 0, list = valueMemberTypes; i < list.length; i += 1) { var memberType = list[i]; if (!checkSubtype(memberType, t)) { return null; } } } return ("Expected " + (toString(expected)) + " but found " + (toString(t)) + " instead."); } function isValidType(provided , allowedTypes ) { return allowedTypes.some(function (t) { return t.kind === provided.kind; }); } function isValidNativeType(provided , allowedTypes ) { return allowedTypes.some(function (t) { if (t === 'null') { return provided === null; } else if (t === 'array') { return Array.isArray(provided); } else if (t === 'object') { return provided && !Array.isArray(provided) && typeof provided === 'object'; } else { return t === typeof provided; } }); } // // Flow type declarations for Intl cribbed from // https://github.com/facebook/flow/issues/1270 var Collator = function Collator(caseSensitive , diacriticSensitive , locale ) { if (caseSensitive) { this.sensitivity = diacriticSensitive ? 'variant' : 'case'; } else { this.sensitivity = diacriticSensitive ? 'accent' : 'base'; } this.locale = locale; this.collator = new Intl.Collator(this.locale ? this.locale : [], {sensitivity: this.sensitivity, usage: 'search'}); }; Collator.prototype.compare = function compare (lhs , rhs ) { return this.collator.compare(lhs, rhs); }; Collator.prototype.resolvedLocale = function resolvedLocale () { // We create a Collator without "usage: search" because we don't want // the search options encoded in our result (e.g. "en-u-co-search") return new Intl.Collator(this.locale ? this.locale : []) .resolvedOptions().locale; }; // var FormattedSection = function FormattedSection(text , image , scale , fontStack , textColor ) { this.text = text; this.image = image; this.scale = scale; this.fontStack = fontStack; this.textColor = textColor; }; var Formatted = function Formatted(sections ) { this.sections = sections; }; Formatted.fromString = function fromString (unformatted ) { return new Formatted([new FormattedSection(unformatted, null, null, null, null)]); }; Formatted.prototype.isEmpty = function isEmpty () { if (this.sections.length === 0) { return true; } return !this.sections.some(function (section) { return section.text.length !== 0 || (section.image && section.image.name.length !== 0); }); }; Formatted.factory = function factory (text ) { if (text instanceof Formatted) { return text; } else { return Formatted.fromString(text); } }; Formatted.prototype.toString = function toString () { if (this.sections.length === 0) { return ''; } return this.sections.map(function (section) { return section.text; }).join(''); }; Formatted.prototype.serialize = function serialize () { var serialized = ["format"]; for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; if (section.image) { serialized.push(["image", section.image.name]); continue; } serialized.push(section.text); var options = {}; if (section.fontStack) { options["text-font"] = ["literal", section.fontStack.split(',')]; } if (section.scale) { options["font-scale"] = section.scale; } if (section.textColor) { options["text-color"] = (["rgba"] ).concat(section.textColor.toArray()); } serialized.push(options); } return serialized; }; // var ResolvedImage = function ResolvedImage(options ) { this.name = options.name; this.available = options.available; }; ResolvedImage.prototype.toString = function toString () { return this.name; }; ResolvedImage.fromString = function fromString (name ) { if (!name) { return null; } // treat empty values as no image return new ResolvedImage({name: name, available: false}); }; ResolvedImage.prototype.serialize = function serialize () { return ["image", this.name]; }; // function validateRGBA(r , g , b , a ) { if (!( typeof r === 'number' && r >= 0 && r <= 255 && typeof g === 'number' && g >= 0 && g <= 255 && typeof b === 'number' && b >= 0 && b <= 255 )) { var value = typeof a === 'number' ? [r, g, b, a] : [r, g, b]; return ("Invalid rgba value [" + (value.join(', ')) + "]: 'r', 'g', and 'b' must be between 0 and 255."); } if (!( typeof a === 'undefined' || (typeof a === 'number' && a >= 0 && a <= 1) )) { return ("Invalid rgba value [" + ([r, g, b, a].join(', ')) + "]: 'a' must be between 0 and 1."); } return null; } function isValue(mixed ) { if (mixed === null) { return true; } else if (typeof mixed === 'string') { return true; } else if (typeof mixed === 'boolean') { return true; } else if (typeof mixed === 'number') { return true; } else if (mixed instanceof Color) { return true; } else if (mixed instanceof Collator) { return true; } else if (mixed instanceof Formatted) { return true; } else if (mixed instanceof ResolvedImage) { return true; } else if (Array.isArray(mixed)) { for (var i = 0, list = mixed; i < list.length; i += 1) { var item = list[i]; if (!isValue(item)) { return false; } } return true; } else if (typeof mixed === 'object') { for (var key in mixed) { if (!isValue(mixed[key])) { return false; } } return true; } else { return false; } } function typeOf(value ) { if (value === null) { return NullType; } else if (typeof value === 'string') { return StringType; } else if (typeof value === 'boolean') { return BooleanType; } else if (typeof value === 'number') { return NumberType; } else if (value instanceof Color) { return ColorType; } else if (value instanceof Collator) { return CollatorType; } else if (value instanceof Formatted) { return FormattedType; } else if (value instanceof ResolvedImage) { return ResolvedImageType; } else if (Array.isArray(value)) { var length = value.length; var itemType ; for (var i = 0, list = value; i < list.length; i += 1) { var item = list[i]; var t = typeOf(item); if (!itemType) { itemType = t; } else if (itemType === t) { continue; } else { itemType = ValueType; break; } } return array(itemType || ValueType, length); } else { assert_1(typeof value === 'object'); return ObjectType; } } function toString$1(value ) { var type = typeof value; if (value === null) { return ''; } else if (type === 'string' || type === 'number' || type === 'boolean') { return String(value); } else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) { return value.toString(); } else { return JSON.stringify(value); } } // var Literal = function Literal(type , value ) { this.type = type; this.value = value; }; Literal.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("'literal' expression requires exactly one argument, but found " + (args.length - 1) + " instead.")); } if (!isValue(args[1])) { return context.error("invalid value"); } var value = (args[1] ); var type = typeOf(value); // special case: infer the item type if possible for zero-length arrays var expected = context.expectedType; if ( type.kind === 'array' && type.N === 0 && expected && expected.kind === 'array' && (typeof expected.N !== 'number' || expected.N === 0) ) { type = expected; } return new Literal(type, value); }; Literal.prototype.evaluate = function evaluate () { return this.value; }; Literal.prototype.eachChild = function eachChild () {}; Literal.prototype.outputDefined = function outputDefined () { return true; }; Literal.prototype.serialize = function serialize () { if (this.type.kind === 'array' || this.type.kind === 'object') { return ["literal", this.value]; } else if (this.value instanceof Color) { // Constant-folding can generate Literal expressions that you // couldn't actually generate with a "literal" expression, // so we have to implement an equivalent serialization here return ["rgba"].concat(this.value.toArray()); } else if (this.value instanceof Formatted) { // Same as Color return this.value.serialize(); } else { assert_1(this.value === null || typeof this.value === 'string' || typeof this.value === 'number' || typeof this.value === 'boolean'); return (this.value ); } }; // var RuntimeError = function RuntimeError(message ) { this.name = 'ExpressionEvaluationError'; this.message = message; }; RuntimeError.prototype.toJSON = function toJSON () { return this.message; }; // var types = { string: StringType, number: NumberType, boolean: BooleanType, object: ObjectType }; var Assertion = function Assertion(type , args ) { this.type = type; this.args = args; }; Assertion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var i = 1; var type; var name = (args[0] ); if (name === 'array') { var itemType; if (args.length > 2) { var type$1 = args[1]; if (typeof type$1 !== 'string' || !(type$1 in types) || type$1 === 'object') { return context.error('The item type argument of "array" must be one of string, number, boolean', 1); } itemType = types[type$1]; i++; } else { itemType = ValueType; } var N; if (args.length > 3) { if (args[2] !== null && (typeof args[2] !== 'number' || args[2] < 0 || args[2] !== Math.floor(args[2])) ) { return context.error('The length argument to "array" must be a positive integer literal', 2); } N = args[2]; i++; } type = array(itemType, N); } else { assert_1(types[name], name); type = types[name]; } var parsed = []; for (; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Assertion(type, parsed); }; Assertion.prototype.evaluate = function evaluate (ctx ) { for (var i = 0; i < this.args.length; i++) { var value = this.args[i].evaluate(ctx); var error = checkSubtype(this.type, typeOf(value)); if (!error) { return value; } else if (i === this.args.length - 1) { throw new RuntimeError(("Expected value to be of type " + (toString(this.type)) + ", but found " + (toString(typeOf(value))) + " instead.")); } } assert_1(false); return null; }; Assertion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Assertion.prototype.outputDefined = function outputDefined () { return this.args.every(function (arg) { return arg.outputDefined(); }); }; Assertion.prototype.serialize = function serialize () { var type = this.type; var serialized = [type.kind]; if (type.kind === 'array') { var itemType = type.itemType; if (itemType.kind === 'string' || itemType.kind === 'number' || itemType.kind === 'boolean') { serialized.push(itemType.kind); var N = type.N; if (typeof N === 'number' || this.args.length > 1) { serialized.push(N); } } } return serialized.concat(this.args.map(function (arg) { return arg.serialize(); })); }; // var FormatExpression = function FormatExpression(sections ) { this.type = FormattedType; this.sections = sections; }; FormatExpression.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var firstArg = args[1]; if (!Array.isArray(firstArg) && typeof firstArg === 'object') { return context.error("First argument must be an image or text section."); } var sections = []; var nextTokenMayBeObject = false; for (var i = 1; i <= args.length - 1; ++i) { var arg = (args[i] ); if (nextTokenMayBeObject && typeof arg === "object" && !Array.isArray(arg)) { nextTokenMayBeObject = false; var scale = null; if (arg['font-scale']) { scale = context.parse(arg['font-scale'], 1, NumberType); if (!scale) { return null; } } var font = null; if (arg['text-font']) { font = context.parse(arg['text-font'], 1, array(StringType)); if (!font) { return null; } } var textColor = null; if (arg['text-color']) { textColor = context.parse(arg['text-color'], 1, ColorType); if (!textColor) { return null; } } var lastExpression = sections[sections.length - 1]; lastExpression.scale = scale; lastExpression.font = font; lastExpression.textColor = textColor; } else { var content = context.parse(args[i], 1, ValueType); if (!content) { return null; } var kind = content.type.kind; if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage') { return context.error("Formatted text type must be 'string', 'value', 'image' or 'null'."); } nextTokenMayBeObject = true; sections.push({content: content, scale: null, font: null, textColor: null}); } } return new FormatExpression(sections); }; FormatExpression.prototype.evaluate = function evaluate (ctx ) { var evaluateSection = function (section) { var evaluatedContent = section.content.evaluate(ctx); if (typeOf(evaluatedContent) === ResolvedImageType) { return new FormattedSection('', evaluatedContent, null, null, null); } return new FormattedSection( toString$1(evaluatedContent), null, section.scale ? section.scale.evaluate(ctx) : null, section.font ? section.font.evaluate(ctx).join(',') : null, section.textColor ? section.textColor.evaluate(ctx) : null ); }; return new Formatted(this.sections.map(evaluateSection)); }; FormatExpression.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; fn(section.content); if (section.scale) { fn(section.scale); } if (section.font) { fn(section.font); } if (section.textColor) { fn(section.textColor); } } }; FormatExpression.prototype.outputDefined = function outputDefined () { // Technically the combinatoric set of all children // Usually, this.text will be undefined anyway return false; }; FormatExpression.prototype.serialize = function serialize () { var serialized = ["format"]; for (var i = 0, list = this.sections; i < list.length; i += 1) { var section = list[i]; serialized.push(section.content.serialize()); var options = {}; if (section.scale) { options['font-scale'] = section.scale.serialize(); } if (section.font) { options['text-font'] = section.font.serialize(); } if (section.textColor) { options['text-color'] = section.textColor.serialize(); } serialized.push(options); } return serialized; }; // var ImageExpression = function ImageExpression(input ) { this.type = ResolvedImageType; this.input = input; }; ImageExpression.parse = function parse (args , context ) { if (args.length !== 2) { return context.error("Expected two arguments."); } var name = context.parse(args[1], 1, StringType); if (!name) { return context.error("No image name provided."); } return new ImageExpression(name); }; ImageExpression.prototype.evaluate = function evaluate (ctx ) { var evaluatedImageName = this.input.evaluate(ctx); var value = ResolvedImage.fromString(evaluatedImageName); if (value && ctx.availableImages) { value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1; } return value; }; ImageExpression.prototype.eachChild = function eachChild (fn ) { fn(this.input); }; ImageExpression.prototype.outputDefined = function outputDefined () { // The output of image is determined by the list of available images in the evaluation context return false; }; ImageExpression.prototype.serialize = function serialize () { return ["image", this.input.serialize()]; }; // var types$1 = { 'to-boolean': BooleanType, 'to-color': ColorType, 'to-number': NumberType, 'to-string': StringType }; /** * Special form for error-coalescing coercion expressions "to-number", * "to-color". Since these coercions can fail at runtime, they accept multiple * arguments, only evaluating one at a time until one succeeds. * * @private */ var Coercion = function Coercion(type , args ) { this.type = type; this.args = args; }; Coercion.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expected at least one argument."); } var name = (args[0] ); assert_1(types$1[name], name); if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) { return context.error("Expected one argument."); } var type = types$1[name]; var parsed = []; for (var i = 1; i < args.length; i++) { var input = context.parse(args[i], i, ValueType); if (!input) { return null; } parsed.push(input); } return new Coercion(type, parsed); }; Coercion.prototype.evaluate = function evaluate (ctx ) { if (this.type.kind === 'boolean') { return Boolean(this.args[0].evaluate(ctx)); } else if (this.type.kind === 'color') { var input; var error; for (var i = 0, list = this.args; i < list.length; i += 1) { var arg = list[i]; input = arg.evaluate(ctx); error = null; if (input instanceof Color) { return input; } else if (typeof input === 'string') { var c = ctx.parseColor(input); if (c) { return c; } } else if (Array.isArray(input)) { if (input.length < 3 || input.length > 4) { error = "Invalid rbga value " + (JSON.stringify(input)) + ": expected an array containing either three or four numeric values."; } else { error = validateRGBA(input[0], input[1], input[2], input[3]); } if (!error) { return new Color((input[0] ) / 255, (input[1] ) / 255, (input[2] ) / 255, (input[3] )); } } } throw new RuntimeError(error || ("Could not parse color from value '" + (typeof input === 'string' ? input : String(JSON.stringify(input))) + "'")); } else if (this.type.kind === 'number') { var value = null; for (var i$1 = 0, list$1 = this.args; i$1 < list$1.length; i$1 += 1) { var arg$1 = list$1[i$1]; value = arg$1.evaluate(ctx); if (value === null) { return 0; } var num = Number(value); if (isNaN(num)) { continue; } return num; } throw new RuntimeError(("Could not convert " + (JSON.stringify(value)) + " to number.")); } else if (this.type.kind === 'formatted') { // There is no explicit 'to-formatted' but this coercion can be implicitly // created by properties that expect the 'formatted' type. return Formatted.fromString(toString$1(this.args[0].evaluate(ctx))); } else if (this.type.kind === 'resolvedImage') { return ResolvedImage.fromString(toString$1(this.args[0].evaluate(ctx))); } else { return toString$1(this.args[0].evaluate(ctx)); } }; Coercion.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coercion.prototype.outputDefined = function outputDefined () { return this.args.every(function (arg) { return arg.outputDefined(); }); }; Coercion.prototype.serialize = function serialize () { if (this.type.kind === 'formatted') { return new FormatExpression([{content: this.args[0], scale: null, font: null, textColor: null}]).serialize(); } if (this.type.kind === 'resolvedImage') { return new ImageExpression(this.args[0]).serialize(); } var serialized = [("to-" + (this.type.kind))]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; var EvaluationContext = function EvaluationContext() { this.globals = (null ); this.feature = null; this.featureState = null; this.formattedSection = null; this._parseColorCache = {}; this.availableImages = null; this.canonical = null; }; EvaluationContext.prototype.id = function id () { return this.feature && 'id' in this.feature ? this.feature.id : null; }; EvaluationContext.prototype.geometryType = function geometryType () { return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null; }; EvaluationContext.prototype.geometry = function geometry () { return this.feature && 'geometry' in this.feature ? this.feature.geometry : null; }; EvaluationContext.prototype.canonicalID = function canonicalID () { return this.canonical; }; EvaluationContext.prototype.properties = function properties () { return this.feature && this.feature.properties || {}; }; EvaluationContext.prototype.parseColor = function parseColor (input ) { var cached = this._parseColorCache[input]; if (!cached) { cached = this._parseColorCache[input] = Color.parse(input); } return cached; }; // var CompoundExpression = function CompoundExpression(name , type , evaluate , args ) { this.name = name; this.type = type; this._evaluate = evaluate; this.args = args; }; CompoundExpression.prototype.evaluate = function evaluate (ctx ) { return this._evaluate(ctx, this.args); }; CompoundExpression.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; CompoundExpression.prototype.outputDefined = function outputDefined () { return false; }; CompoundExpression.prototype.serialize = function serialize () { return [this.name].concat(this.args.map(function (arg) { return arg.serialize(); })); }; CompoundExpression.parse = function parse (args , context ) { var ref$1; var op = (args[0] ); var definition = CompoundExpression.definitions[op]; if (!definition) { return context.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0); } // Now check argument types against each signature var type = Array.isArray(definition) ? definition[0] : definition.type; var availableOverloads = Array.isArray(definition) ? [[definition[1], definition[2]]] : definition.overloads; var overloads = availableOverloads.filter(function (ref) { var signature = ref[0]; return ( !Array.isArray(signature) || // varags signature.length === args.length - 1 // correct param count ); }); var signatureContext = (null ); for (var i$3 = 0, list = overloads; i$3 < list.length; i$3 += 1) { // Use a fresh context for each attempted signature so that, if // we eventually succeed, we haven't polluted `context.errors`. var ref = list[i$3]; var params = ref[0]; var evaluate = ref[1]; signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); // First parse all the args, potentially coercing to the // types expected by this overload. var parsedArgs = []; var argParseFailed = false; for (var i = 1; i < args.length; i++) { var arg = args[i]; var expectedType = Array.isArray(params) ? params[i - 1] : params.type; var parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType); if (!parsed) { argParseFailed = true; break; } parsedArgs.push(parsed); } if (argParseFailed) { // Couldn't coerce args of this overload to expected type, move // on to next one. continue; } if (Array.isArray(params)) { if (params.length !== parsedArgs.length) { signatureContext.error(("Expected " + (params.length) + " arguments, but found " + (parsedArgs.length) + " instead.")); continue; } } for (var i$1 = 0; i$1 < parsedArgs.length; i$1++) { var expected = Array.isArray(params) ? params[i$1] : params.type; var arg$1 = parsedArgs[i$1]; signatureContext.concat(i$1 + 1).checkSubtype(expected, arg$1.type); } if (signatureContext.errors.length === 0) { return new CompoundExpression(op, type, evaluate, parsedArgs); } } assert_1(!signatureContext || signatureContext.errors.length > 0); if (overloads.length === 1) { (ref$1 = context.errors).push.apply(ref$1, signatureContext.errors); } else { var expected$1 = overloads.length ? overloads : availableOverloads; var signatures = expected$1 .map(function (ref) { var params = ref[0]; return stringifySignature(params); }) .join(' | '); var actualTypes = []; // For error message, re-parse arguments without trying to // apply any coercions for (var i$2 = 1; i$2 < args.length; i$2++) { var parsed$1 = context.parse(args[i$2], 1 + actualTypes.length); if (!parsed$1) { return null; } actualTypes.push(toString(parsed$1.type)); } context.error(("Expected arguments of type " + signatures + ", but found (" + (actualTypes.join(', ')) + ") instead.")); } return null; }; CompoundExpression.register = function register ( registry , definitions ) { assert_1(!CompoundExpression.definitions); CompoundExpression.definitions = definitions; for (var name in definitions) { registry[name] = CompoundExpression; } }; function stringifySignature(signature ) { if (Array.isArray(signature)) { return ("(" + (signature.map(toString).join(', ')) + ")"); } else { return ("(" + (toString(signature.type)) + "...)"); } } // var CollatorExpression = function CollatorExpression(caseSensitive , diacriticSensitive , locale ) { this.type = CollatorType; this.locale = locale; this.caseSensitive = caseSensitive; this.diacriticSensitive = diacriticSensitive; }; CollatorExpression.parse = function parse (args , context ) { if (args.length !== 2) { return context.error("Expected one argument."); } var options = (args[1] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("Collator options argument must be an object."); } var caseSensitive = context.parse( options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType); if (!caseSensitive) { return null; } var diacriticSensitive = context.parse( options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType); if (!diacriticSensitive) { return null; } var locale = null; if (options['locale']) { locale = context.parse(options['locale'], 1, StringType); if (!locale) { return null; } } return new CollatorExpression(caseSensitive, diacriticSensitive, locale); }; CollatorExpression.prototype.evaluate = function evaluate (ctx ) { return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null); }; CollatorExpression.prototype.eachChild = function eachChild (fn ) { fn(this.caseSensitive); fn(this.diacriticSensitive); if (this.locale) { fn(this.locale); } }; CollatorExpression.prototype.outputDefined = function outputDefined () { // Technically the set of possible outputs is the combinatoric set of Collators produced // by all possible outputs of locale/caseSensitive/diacriticSensitive // But for the primary use of Collators in comparison operators, we ignore the Collator's // possible outputs anyway, so we can get away with leaving this false for now. return false; }; CollatorExpression.prototype.serialize = function serialize () { var options = {}; options['case-sensitive'] = this.caseSensitive.serialize(); options['diacritic-sensitive'] = this.diacriticSensitive.serialize(); if (this.locale) { options['locale'] = this.locale.serialize(); } return ["collator", options]; }; // // minX, minY, maxX, maxY var EXTENT = 8192; function updateBBox(bbox , coord ) { bbox[0] = Math.min(bbox[0], coord[0]); bbox[1] = Math.min(bbox[1], coord[1]); bbox[2] = Math.max(bbox[2], coord[0]); bbox[3] = Math.max(bbox[3], coord[1]); } function mercatorXfromLng(lng ) { return (180 + lng) / 360; } function mercatorYfromLat(lat ) { return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; } function boxWithinBox(bbox1 , bbox2 ) { if (bbox1[0] <= bbox2[0]) { return false; } if (bbox1[2] >= bbox2[2]) { return false; } if (bbox1[1] <= bbox2[1]) { return false; } if (bbox1[3] >= bbox2[3]) { return false; } return true; } function getTileCoordinates(p, canonical ) { var x = mercatorXfromLng(p[0]); var y = mercatorYfromLat(p[1]); var tilesAtZoom = Math.pow(2, canonical.z); return [Math.round(x * tilesAtZoom * EXTENT), Math.round(y * tilesAtZoom * EXTENT)]; } function onBoundary(p, p1, p2) { var x1 = p[0] - p1[0]; var y1 = p[1] - p1[1]; var x2 = p[0] - p2[0]; var y2 = p[1] - p2[1]; return (x1 * y2 - x2 * y1 === 0) && (x1 * x2 <= 0) && (y1 * y2 <= 0); } function rayIntersect(p, p1, p2) { return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]); } // ray casting algorithm for detecting if point is in polygon function pointWithinPolygon(point, rings) { var inside = false; for (var i = 0, len = rings.length; i < len; i++) { var ring = rings[i]; for (var j = 0, len2 = ring.length; j < len2 - 1; j++) { if (onBoundary(point, ring[j], ring[j + 1])) { return false; } if (rayIntersect(point, ring[j], ring[j + 1])) { inside = !inside; } } } return inside; } function pointWithinPolygons(point, polygons) { for (var i = 0; i < polygons.length; i++) { if (pointWithinPolygon(point, polygons[i])) { return true; } } return false; } function perp(v1, v2) { return (v1[0] * v2[1] - v1[1] * v2[0]); } // check if p1 and p2 are in different sides of line segment q1->q2 function twoSided(p1, p2, q1, q2) { // q1->p1 (x1, y1), q1->p2 (x2, y2), q1->q2 (x3, y3) var x1 = p1[0] - q1[0]; var y1 = p1[1] - q1[1]; var x2 = p2[0] - q1[0]; var y2 = p2[1] - q1[1]; var x3 = q2[0] - q1[0]; var y3 = q2[1] - q1[1]; var det1 = (x1 * y3 - x3 * y1); var det2 = (x2 * y3 - x3 * y2); if ((det1 > 0 && det2 < 0) || (det1 < 0 && det2 > 0)) { return true; } return false; } // a, b are end points for line segment1, c and d are end points for line segment2 function lineIntersectLine(a, b, c, d) { // check if two segments are parallel or not // precondition is end point a, b is inside polygon, if line a->b is // parallel to polygon edge c->d, then a->b won't intersect with c->d var vectorP = [b[0] - a[0], b[1] - a[1]]; var vectorQ = [d[0] - c[0], d[1] - c[1]]; if (perp(vectorQ, vectorP) === 0) { return false; } // If lines are intersecting with each other, the relative location should be: // a and b lie in different sides of segment c->d // c and d lie in different sides of segment a->b if (twoSided(a, b, c, d) && twoSided(c, d, a, b)) { return true; } return false; } function lineIntersectPolygon(p1, p2, polygon) { for (var i = 0, list = polygon; i < list.length; i += 1) { // loop through every edge of the ring var ring = list[i]; for (var j = 0; j < ring.length - 1; ++j) { if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) { return true; } } } return false; } function lineStringWithinPolygon(line, polygon) { // First, check if geometry points of line segments are all inside polygon for (var i = 0; i < line.length; ++i) { if (!pointWithinPolygon(line[i], polygon)) { return false; } } // Second, check if there is line segment intersecting polygon edge for (var i$1 = 0; i$1 < line.length - 1; ++i$1) { if (lineIntersectPolygon(line[i$1], line[i$1 + 1], polygon)) { return false; } } return true; } function lineStringWithinPolygons(line, polygons) { for (var i = 0; i < polygons.length; i++) { if (lineStringWithinPolygon(line, polygons[i])) { return true; } } return false; } function getTilePolygon(coordinates, bbox, canonical) { var polygon = []; for (var i = 0; i < coordinates.length; i++) { var ring = []; for (var j = 0; j < coordinates[i].length; j++) { var coord = getTileCoordinates(coordinates[i][j], canonical); updateBBox(bbox, coord); ring.push(coord); } polygon.push(ring); } return polygon; } function getTilePolygons(coordinates, bbox, canonical) { var polygons = []; for (var i = 0; i < coordinates.length; i++) { var polygon = getTilePolygon(coordinates[i], bbox, canonical); polygons.push(polygon); } return polygons; } function updatePoint(p, bbox, polyBBox, worldSize) { if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) { var halfWorldSize = worldSize * 0.5; var shift = (p[0] - polyBBox[0] > halfWorldSize) ? -worldSize : (polyBBox[0] - p[0] > halfWorldSize) ? worldSize : 0; if (shift === 0) { shift = (p[0] - polyBBox[2] > halfWorldSize) ? -worldSize : (polyBBox[2] - p[0] > halfWorldSize) ? worldSize : 0; } p[0] += shift; } updateBBox(bbox, p); } function resetBBox(bbox) { bbox[0] = bbox[1] = Infinity; bbox[2] = bbox[3] = -Infinity; } function getTilePoints(geometry, pointBBox, polyBBox, canonical) { var worldSize = Math.pow(2, canonical.z) * EXTENT; var shifts = [canonical.x * EXTENT, canonical.y * EXTENT]; var tilePoints = []; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var points = list$1[i$1]; for (var i = 0, list = points; i < list.length; i += 1) { var point = list[i]; var p = [point.x + shifts[0], point.y + shifts[1]]; updatePoint(p, pointBBox, polyBBox, worldSize); tilePoints.push(p); } } return tilePoints; } function getTileLines(geometry, lineBBox, polyBBox, canonical) { var worldSize = Math.pow(2, canonical.z) * EXTENT; var shifts = [canonical.x * EXTENT, canonical.y * EXTENT]; var tileLines = []; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var line = list$1[i$1]; var tileLine = []; for (var i = 0, list = line; i < list.length; i += 1) { var point = list[i]; var p = [point.x + shifts[0], point.y + shifts[1]]; updateBBox(lineBBox, p); tileLine.push(p); } tileLines.push(tileLine); } if (lineBBox[2] - lineBBox[0] <= worldSize / 2) { resetBBox(lineBBox); for (var i$3 = 0, list$3 = tileLines; i$3 < list$3.length; i$3 += 1) { var line$1 = list$3[i$3]; for (var i$2 = 0, list$2 = line$1; i$2 < list$2.length; i$2 += 1) { var p$1 = list$2[i$2]; updatePoint(p$1, lineBBox, polyBBox, worldSize); } } } return tileLines; } function pointsWithinPolygons(ctx , polygonGeometry ) { var pointBBox = [Infinity, Infinity, -Infinity, -Infinity]; var polyBBox = [Infinity, Infinity, -Infinity, -Infinity]; var canonical = ctx.canonicalID(); if (polygonGeometry.type === 'Polygon') { var tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); var tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); if (!boxWithinBox(pointBBox, polyBBox)) { return false; } for (var i = 0, list = tilePoints; i < list.length; i += 1) { var point = list[i]; if (!pointWithinPolygon(point, tilePolygon)) { return false; } } } if (polygonGeometry.type === 'MultiPolygon') { var tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); var tilePoints$1 = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); if (!boxWithinBox(pointBBox, polyBBox)) { return false; } for (var i$1 = 0, list$1 = tilePoints$1; i$1 < list$1.length; i$1 += 1) { var point$1 = list$1[i$1]; if (!pointWithinPolygons(point$1, tilePolygons)) { return false; } } } return true; } function linesWithinPolygons(ctx , polygonGeometry ) { var lineBBox = [Infinity, Infinity, -Infinity, -Infinity]; var polyBBox = [Infinity, Infinity, -Infinity, -Infinity]; var canonical = ctx.canonicalID(); if (polygonGeometry.type === 'Polygon') { var tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); var tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); if (!boxWithinBox(lineBBox, polyBBox)) { return false; } for (var i = 0, list = tileLines; i < list.length; i += 1) { var line = list[i]; if (!lineStringWithinPolygon(line, tilePolygon)) { return false; } } } if (polygonGeometry.type === 'MultiPolygon') { var tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); var tileLines$1 = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); if (!boxWithinBox(lineBBox, polyBBox)) { return false; } for (var i$1 = 0, list$1 = tileLines$1; i$1 < list$1.length; i$1 += 1) { var line$1 = list$1[i$1]; if (!lineStringWithinPolygons(line$1, tilePolygons)) { return false; } } } return true; } var Within = function Within(geojson , geometries ) { this.type = BooleanType; this.geojson = geojson; this.geometries = geometries; }; Within.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("'within' expression requires exactly one argument, but found " + (args.length - 1) + " instead.")); } if (isValue(args[1])) { var geojson = (args[1] ); if (geojson.type === 'FeatureCollection') { for (var i = 0; i < geojson.features.length; ++i) { var type = geojson.features[i].geometry.type; if (type === 'Polygon' || type === 'MultiPolygon') { return new Within(geojson, geojson.features[i].geometry); } } } else if (geojson.type === 'Feature') { var type$1 = geojson.geometry.type; if (type$1 === 'Polygon' || type$1 === 'MultiPolygon') { return new Within(geojson, geojson.geometry); } } else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') { return new Within(geojson, geojson); } } return context.error("'within' expression requires valid geojson object that contains polygon geometry type."); }; Within.prototype.evaluate = function evaluate (ctx ) { if (ctx.geometry() != null && ctx.canonicalID() != null) { if (ctx.geometryType() === 'Point') { return pointsWithinPolygons(ctx, this.geometries); } else if (ctx.geometryType() === 'LineString') { return linesWithinPolygons(ctx, this.geometries); } } return false; }; Within.prototype.eachChild = function eachChild () {}; Within.prototype.outputDefined = function outputDefined () { return true; }; Within.prototype.serialize = function serialize () { return ["within", this.geojson]; }; // function isFeatureConstant(e ) { if (e instanceof CompoundExpression) { if (e.name === 'get' && e.args.length === 1) { return false; } else if (e.name === 'feature-state') { return false; } else if (e.name === 'has' && e.args.length === 1) { return false; } else if ( e.name === 'properties' || e.name === 'geometry-type' || e.name === 'id' ) { return false; } else if (/^filter-/.test(e.name)) { return false; } } if (e instanceof Within) { return false; } var result = true; e.eachChild(function (arg) { if (result && !isFeatureConstant(arg)) { result = false; } }); return result; } function isStateConstant(e ) { if (e instanceof CompoundExpression) { if (e.name === 'feature-state') { return false; } } var result = true; e.eachChild(function (arg) { if (result && !isStateConstant(arg)) { result = false; } }); return result; } function isGlobalPropertyConstant(e , properties ) { if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; } var result = true; e.eachChild(function (arg) { if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; } }); return result; } // var Var = function Var(name , boundExpression ) { this.type = boundExpression.type; this.name = name; this.boundExpression = boundExpression; }; Var.parse = function parse (args , context ) { if (args.length !== 2 || typeof args[1] !== 'string') { return context.error("'var' expression requires exactly one string literal argument."); } var name = args[1]; if (!context.scope.has(name)) { return context.error(("Unknown variable \"" + name + "\". Make sure \"" + name + "\" has been bound in an enclosing \"let\" expression before using it."), 1); } return new Var(name, context.scope.get(name)); }; Var.prototype.evaluate = function evaluate (ctx ) { return this.boundExpression.evaluate(ctx); }; Var.prototype.eachChild = function eachChild () {}; Var.prototype.outputDefined = function outputDefined () { return false; }; Var.prototype.serialize = function serialize () { return ["var", this.name]; }; // /** * State associated parsing at a given point in an expression tree. * @private */ var ParsingContext = function ParsingContext( registry , path, expectedType , scope, errors ) { if ( path === void 0 ) path = []; if ( scope === void 0 ) scope = new Scope(); if ( errors === void 0 ) errors = []; this.registry = registry; this.path = path; this.key = path.map(function (part) { return ("[" + part + "]"); }).join(''); this.scope = scope; this.errors = errors; this.expectedType = expectedType; }; /** * @param expr the JSON expression to parse * @param index the optional argument index if this expression is an argument of a parent expression that's being parsed * @param options * @param options.omitTypeAnnotations set true to omit inferred type annotations. Caller beware: with this option set, the parsed expression's type will NOT satisfy `expectedType` if it would normally be wrapped in an inferred annotation. * @private */ ParsingContext.prototype.parse = function parse ( expr , index , expectedType , bindings , options ) { if ( options === void 0 ) options = {}; if (index) { return this.concat(index, expectedType, bindings)._parse(expr, options); } return this._parse(expr, options); }; ParsingContext.prototype._parse = function _parse (expr , options ) { if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') { expr = ['literal', expr]; } function annotate(parsed, type, typeAnnotation ) { if (typeAnnotation === 'assert') { return new Assertion(type, [parsed]); } else if (typeAnnotation === 'coerce') { return new Coercion(type, [parsed]); } else { return parsed; } } if (Array.isArray(expr)) { if (expr.length === 0) { return this.error("Expected an array with at least one element. If you wanted a literal array, use [\"literal\", []]."); } var op = expr[0]; if (typeof op !== 'string') { this.error(("Expression name must be a string, but found " + (typeof op) + " instead. If you wanted a literal array, use [\"literal\", [...]]."), 0); return null; } var Expr = this.registry[op]; if (Expr) { var parsed = Expr.parse(expr, this); if (!parsed) { return null; } if (this.expectedType) { var expected = this.expectedType; var actual = parsed.type; // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion. // When we expect a color or formatted string, but have a string or value, wrap it in a coercion. // Otherwise, we do static type-checking. // // These behaviors are overridable for: // * The "coalesce" operator, which needs to omit type annotations. // * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion. // if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') { parsed = annotate(parsed, expected, options.typeAnnotation || 'assert'); } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) { parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce'); } else if (this.checkSubtype(expected, actual)) { return null; } } // If an expression's arguments are all literals, we can evaluate // it immediately and replace it with a literal value in the // parsed/compiled result. Expressions that expect an image should // not be resolved here so we can later get the available images. if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant(parsed)) { var ec = new EvaluationContext(); try { parsed = new Literal(parsed.type, parsed.evaluate(ec)); } catch (e) { this.error(e.message); return null; } } return parsed; } return this.error(("Unknown expression \"" + op + "\". If you wanted a literal array, use [\"literal\", [...]]."), 0); } else if (typeof expr === 'undefined') { return this.error("'undefined' value invalid. Use null instead."); } else if (typeof expr === 'object') { return this.error("Bare objects invalid. Use [\"literal\", {...}] instead."); } else { return this.error(("Expected an array, but found " + (typeof expr) + " instead.")); } }; /** * Returns a copy of this context suitable for parsing the subexpression at * index `index`, optionally appending to 'let' binding map. * * Note that `errors` property, intended for collecting errors while * parsing, is copied by reference rather than cloned. * @private */ ParsingContext.prototype.concat = function concat (index , expectedType , bindings ) { var path = typeof index === 'number' ? this.path.concat(index) : this.path; var scope = bindings ? this.scope.concat(bindings) : this.scope; return new ParsingContext( this.registry, path, expectedType || null, scope, this.errors ); }; /** * Push a parsing (or type checking) error into the `this.errors` * @param error The message * @param keys Optionally specify the source of the error at a child * of the current expression at `this.key`. * @private */ ParsingContext.prototype.error = function error (error$1 ) { var keys = [], len = arguments.length - 1; while ( len-- > 0 ) keys[ len ] = arguments[ len + 1 ]; var key = "" + (this.key) + (keys.map(function (k) { return ("[" + k + "]"); }).join('')); this.errors.push(new ParsingError(key, error$1)); }; /** * Returns null if `t` is a subtype of `expected`; otherwise returns an * error message and also pushes it to `this.errors`. */ ParsingContext.prototype.checkSubtype = function checkSubtype$1 (expected , t ) { var error = checkSubtype(expected, t); if (error) { this.error(error); } return error; }; function isConstant(expression ) { if (expression instanceof Var) { return isConstant(expression.boundExpression); } else if (expression instanceof CompoundExpression && expression.name === 'error') { return false; } else if (expression instanceof CollatorExpression) { // Although the results of a Collator expression with fixed arguments // generally shouldn't change between executions, we can't serialize them // as constant expressions because results change based on environment. return false; } else if (expression instanceof Within) { return false; } var isTypeAnnotation = expression instanceof Coercion || expression instanceof Assertion; var childrenConstant = true; expression.eachChild(function (child) { // We can _almost_ assume that if `expressions` children are constant, // they would already have been evaluated to Literal values when they // were parsed. Type annotations are the exception, because they might // have been inferred and added after a child was parsed. // So we recurse into isConstant() for the children of type annotations, // but otherwise simply check whether they are Literals. if (isTypeAnnotation) { childrenConstant = childrenConstant && isConstant(child); } else { childrenConstant = childrenConstant && child instanceof Literal; } }); if (!childrenConstant) { return false; } return isFeatureConstant(expression) && isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'accumulated', 'is-supported-script']); } // /** * Returns the index of the last stop <= input, or 0 if it doesn't exist. * @private */ function findStopLessThanOrEqualTo(stops , input ) { var lastIndex = stops.length - 1; var lowerIndex = 0; var upperIndex = lastIndex; var currentIndex = 0; var currentValue, nextValue; while (lowerIndex <= upperIndex) { currentIndex = Math.floor((lowerIndex + upperIndex) / 2); currentValue = stops[currentIndex]; nextValue = stops[currentIndex + 1]; if (currentValue <= input) { if (currentIndex === lastIndex || input < nextValue) { // Search complete return currentIndex; } lowerIndex = currentIndex + 1; } else if (currentValue > input) { upperIndex = currentIndex - 1; } else { throw new RuntimeError('Input is not a number.'); } } return 0; } // var Step = function Step(type , input , stops ) { this.type = type; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this.labels.push(label); this.outputs.push(expression); } }; Step.parse = function parse (args , context ) { if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } var input = context.parse(args[1], 1, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } for (var i = 1; i < args.length; i += 2) { var label = i === 1 ? -Infinity : args[i]; var value = args[i + 1]; var labelKey = i; var valueKey = i + 1; if (typeof label !== 'number') { return context.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } return new Step(outputType, input, stops); }; Step.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); return outputs[index].evaluate(ctx); }; Step.prototype.eachChild = function eachChild (fn ) { fn(this.input); for (var i = 0, list = this.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Step.prototype.outputDefined = function outputDefined () { return this.outputs.every(function (out) { return out.outputDefined(); }); }; Step.prototype.serialize = function serialize () { var serialized = ["step", this.input.serialize()]; for (var i = 0; i < this.labels.length; i++) { if (i > 0) { serialized.push(this.labels[i]); } serialized.push(this.outputs[i].serialize()); } return serialized; }; // function number(a , b , t ) { return (a * (1 - t)) + (b * t); } function color(from , to , t ) { return new Color( number(from.r, to.r, t), number(from.g, to.g, t), number(from.b, to.b, t), number(from.a, to.a, t) ); } function array$1(from , to , t ) { return from.map(function (d, i) { return number(d, to[i], t); }); } var interpolate = /*#__PURE__*/Object.freeze({ __proto__: null, number: number, color: color, array: array$1 }); // // Constants var Xn = 0.950470, // D65 standard referent Yn = 1, Zn = 1.088830, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1, deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI; // Utilities function xyz2lab(t ) { return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; } function lab2xyz(t ) { return t > t1 ? t * t * t : t2 * (t - t0); } function xyz2rgb(x ) { return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); } function rgb2xyz(x ) { x /= 255; return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); } // LAB function rgbToLab(rgbColor ) { var b = rgb2xyz(rgbColor.r), a = rgb2xyz(rgbColor.g), l = rgb2xyz(rgbColor.b), x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); return { l: 116 * y - 16, a: 500 * (x - y), b: 200 * (y - z), alpha: rgbColor.a }; } function labToRgb(labColor ) { var y = (labColor.l + 16) / 116, x = isNaN(labColor.a) ? y : y + labColor.a / 500, z = isNaN(labColor.b) ? y : y - labColor.b / 200; y = Yn * lab2xyz(y); x = Xn * lab2xyz(x); z = Zn * lab2xyz(z); return new Color( xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), labColor.alpha ); } function interpolateLab(from , to , t ) { return { l: number(from.l, to.l, t), a: number(from.a, to.a, t), b: number(from.b, to.b, t), alpha: number(from.alpha, to.alpha, t) }; } // HCL function rgbToHcl(rgbColor ) { var ref = rgbToLab(rgbColor); var l = ref.l; var a = ref.a; var b = ref.b; var h = Math.atan2(b, a) * rad2deg; return { h: h < 0 ? h + 360 : h, c: Math.sqrt(a * a + b * b), l: l, alpha: rgbColor.a }; } function hclToRgb(hclColor ) { var h = hclColor.h * deg2rad, c = hclColor.c, l = hclColor.l; return labToRgb({ l: l, a: Math.cos(h) * c, b: Math.sin(h) * c, alpha: hclColor.alpha }); } function interpolateHue(a , b , t ) { var d = b - a; return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d); } function interpolateHcl(from , to , t ) { return { h: interpolateHue(from.h, to.h, t), c: number(from.c, to.c, t), l: number(from.l, to.l, t), alpha: number(from.alpha, to.alpha, t) }; } var lab = { forward: rgbToLab, reverse: labToRgb, interpolate: interpolateLab }; var hcl = { forward: rgbToHcl, reverse: hclToRgb, interpolate: interpolateHcl }; var colorSpaces = /*#__PURE__*/Object.freeze({ __proto__: null, lab: lab, hcl: hcl }); // var Interpolate = function Interpolate(type , operator , interpolation , input , stops ) { this.type = type; this.operator = operator; this.interpolation = interpolation; this.input = input; this.labels = []; this.outputs = []; for (var i = 0, list = stops; i < list.length; i += 1) { var ref = list[i]; var label = ref[0]; var expression = ref[1]; this.labels.push(label); this.outputs.push(expression); } }; Interpolate.interpolationFactor = function interpolationFactor (interpolation , input , lower , upper ) { var t = 0; if (interpolation.name === 'exponential') { t = exponentialInterpolation(input, interpolation.base, lower, upper); } else if (interpolation.name === 'linear') { t = exponentialInterpolation(input, 1, lower, upper); } else if (interpolation.name === 'cubic-bezier') { var c = interpolation.controlPoints; var ub = new unitbezier(c[0], c[1], c[2], c[3]); t = ub.solve(exponentialInterpolation(input, 1, lower, upper)); } return t; }; Interpolate.parse = function parse (args , context ) { var operator = args[0]; var interpolation = args[1]; var input = args[2]; var rest = args.slice(3); if (!Array.isArray(interpolation) || interpolation.length === 0) { return context.error("Expected an interpolation type expression.", 1); } if (interpolation[0] === 'linear') { interpolation = {name: 'linear'}; } else if (interpolation[0] === 'exponential') { var base = interpolation[1]; if (typeof base !== 'number') { return context.error("Exponential interpolation requires a numeric base.", 1, 1); } interpolation = { name: 'exponential', base: base }; } else if (interpolation[0] === 'cubic-bezier') { var controlPoints = interpolation.slice(1); if ( controlPoints.length !== 4 || controlPoints.some(function (t) { return typeof t !== 'number' || t < 0 || t > 1; }) ) { return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1); } interpolation = { name: 'cubic-bezier', controlPoints: (controlPoints ) }; } else { return context.error(("Unknown interpolation type " + (String(interpolation[0]))), 1, 0); } if (args.length - 1 < 4) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if ((args.length - 1) % 2 !== 0) { return context.error("Expected an even number of arguments."); } input = context.parse(input, 2, NumberType); if (!input) { return null; } var stops = []; var outputType = (null ); if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') { outputType = ColorType; } else if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } for (var i = 0; i < rest.length; i += 2) { var label = rest[i]; var value = rest[i + 1]; var labelKey = i + 3; var valueKey = i + 4; if (typeof label !== 'number') { return context.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.', labelKey); } if (stops.length && stops[stops.length - 1][0] >= label) { return context.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.', labelKey); } var parsed = context.parse(value, valueKey, outputType); if (!parsed) { return null; } outputType = outputType || parsed.type; stops.push([label, parsed]); } if (outputType.kind !== 'number' && outputType.kind !== 'color' && !( outputType.kind === 'array' && outputType.itemType.kind === 'number' && typeof outputType.N === 'number' ) ) { return context.error(("Type " + (toString(outputType)) + " is not interpolatable.")); } return new Interpolate(outputType, (operator ), interpolation, input, stops); }; Interpolate.prototype.evaluate = function evaluate (ctx ) { var labels = this.labels; var outputs = this.outputs; if (labels.length === 1) { return outputs[0].evaluate(ctx); } var value = ((this.input.evaluate(ctx) ) ); if (value <= labels[0]) { return outputs[0].evaluate(ctx); } var stopCount = labels.length; if (value >= labels[stopCount - 1]) { return outputs[stopCount - 1].evaluate(ctx); } var index = findStopLessThanOrEqualTo(labels, value); var lower = labels[index]; var upper = labels[index + 1]; var t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper); var outputLower = outputs[index].evaluate(ctx); var outputUpper = outputs[index + 1].evaluate(ctx); if (this.operator === 'interpolate') { return (interpolate[this.type.kind.toLowerCase()] )(outputLower, outputUpper, t); // eslint-disable-line import/namespace } else if (this.operator === 'interpolate-hcl') { return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t)); } else { return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t)); } }; Interpolate.prototype.eachChild = function eachChild (fn ) { fn(this.input); for (var i = 0, list = this.outputs; i < list.length; i += 1) { var expression = list[i]; fn(expression); } }; Interpolate.prototype.outputDefined = function outputDefined () { return this.outputs.every(function (out) { return out.outputDefined(); }); }; Interpolate.prototype.serialize = function serialize () { var interpolation; if (this.interpolation.name === 'linear') { interpolation = ["linear"]; } else if (this.interpolation.name === 'exponential') { if (this.interpolation.base === 1) { interpolation = ["linear"]; } else { interpolation = ["exponential", this.interpolation.base]; } } else { interpolation = ["cubic-bezier" ].concat(this.interpolation.controlPoints); } var serialized = [this.operator, interpolation, this.input.serialize()]; for (var i = 0; i < this.labels.length; i++) { serialized.push( this.labels[i], this.outputs[i].serialize() ); } return serialized; }; /** * Returns a ratio that can be used to interpolate between exponential function * stops. * How it works: Two consecutive stop values define a (scaled and shifted) exponential function `f(x) = a * base^x + b`, where `base` is the user-specified base, * and `a` and `b` are constants affording sufficient degrees of freedom to fit * the function to the given stops. * * Here's a bit of algebra that lets us compute `f(x)` directly from the stop * values without explicitly solving for `a` and `b`: * * First stop value: `f(x0) = y0 = a * base^x0 + b` * Second stop value: `f(x1) = y1 = a * base^x1 + b` * => `y1 - y0 = a(base^x1 - base^x0)` * => `a = (y1 - y0)/(base^x1 - base^x0)` * * Desired value: `f(x) = y = a * base^x + b` * => `f(x) = y0 + a * (base^x - base^x0)` * * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a * little algebra: * ``` * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0) * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0) * ``` * * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as * an interpolation factor between the two stops' output values. * * (Note: a slightly different form for `ratio`, * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer * expensive `Math.pow()` operations.) * * @private */ function exponentialInterpolation(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } // var Coalesce = function Coalesce(type , args ) { this.type = type; this.args = args; }; Coalesce.parse = function parse (args , context ) { if (args.length < 2) { return context.error("Expectected at least one argument."); } var outputType = (null ); var expectedType = context.expectedType; if (expectedType && expectedType.kind !== 'value') { outputType = expectedType; } var parsedArgs = []; for (var i = 0, list = args.slice(1); i < list.length; i += 1) { var arg = list[i]; var parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {typeAnnotation: 'omit'}); if (!parsed) { return null; } outputType = outputType || parsed.type; parsedArgs.push(parsed); } assert_1(outputType); // Above, we parse arguments without inferred type annotation so that // they don't produce a runtime error for `null` input, which would // preempt the desired null-coalescing behavior. // Thus, if any of our arguments would have needed an annotation, we // need to wrap the enclosing coalesce expression with it instead. var needsAnnotation = expectedType && parsedArgs.some(function (arg) { return checkSubtype(expectedType, arg.type); }); return needsAnnotation ? new Coalesce(ValueType, parsedArgs) : new Coalesce((outputType ), parsedArgs); }; Coalesce.prototype.evaluate = function evaluate (ctx ) { var result = null; var argCount = 0; var requestedImageName; for (var i = 0, list = this.args; i < list.length; i += 1) { var arg = list[i]; argCount++; result = arg.evaluate(ctx); // we need to keep track of the first requested image in a coalesce statement // if coalesce can't find a valid image, we return the first image name so styleimagemissing can fire if (result && result instanceof ResolvedImage && !result.available) { if (!requestedImageName) { requestedImageName = result.name; } result = null; if (argCount === this.args.length) { result = requestedImageName; } } if (result !== null) { break; } } return result; }; Coalesce.prototype.eachChild = function eachChild (fn ) { this.args.forEach(fn); }; Coalesce.prototype.outputDefined = function outputDefined () { return this.args.every(function (arg) { return arg.outputDefined(); }); }; Coalesce.prototype.serialize = function serialize () { var serialized = ["coalesce"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var Let = function Let(bindings , result ) { this.type = result.type; this.bindings = [].concat(bindings); this.result = result; }; Let.prototype.evaluate = function evaluate (ctx ) { return this.result.evaluate(ctx); }; Let.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.bindings; i < list.length; i += 1) { var binding = list[i]; fn(binding[1]); } fn(this.result); }; Let.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found " + (args.length - 1) + " instead.")); } var bindings = []; for (var i = 1; i < args.length - 1; i += 2) { var name = args[i]; if (typeof name !== 'string') { return context.error(("Expected string, but found " + (typeof name) + " instead."), i); } if (/[^a-zA-Z0-9_]/.test(name)) { return context.error("Variable names must contain only alphanumeric characters or '_'.", i); } var value = context.parse(args[i + 1], i + 1); if (!value) { return null; } bindings.push([name, value]); } var result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings); if (!result) { return null; } return new Let(bindings, result); }; Let.prototype.outputDefined = function outputDefined () { return this.result.outputDefined(); }; Let.prototype.serialize = function serialize () { var serialized = ["let"]; for (var i = 0, list = this.bindings; i < list.length; i += 1) { var ref = list[i]; var name = ref[0]; var expr = ref[1]; serialized.push(name, expr.serialize()); } serialized.push(this.result.serialize()); return serialized; }; // var At = function At(type , index , input ) { this.type = type; this.index = index; this.input = input; }; At.parse = function parse (args , context ) { if (args.length !== 3) { return context.error(("Expected 2 arguments, but found " + (args.length - 1) + " instead.")); } var index = context.parse(args[1], 1, NumberType); var input = context.parse(args[2], 2, array(context.expectedType || ValueType)); if (!index || !input) { return null; } var t = (input.type ); return new At(t.itemType, index, input); }; At.prototype.evaluate = function evaluate (ctx ) { var index = ((this.index.evaluate(ctx) ) ); var array = ((this.input.evaluate(ctx) ) ); if (index < 0) { throw new RuntimeError(("Array index out of bounds: " + index + " < 0.")); } if (index >= array.length) { throw new RuntimeError(("Array index out of bounds: " + index + " > " + (array.length - 1) + ".")); } if (index !== Math.floor(index)) { throw new RuntimeError(("Array index must be an integer, but found " + index + " instead.")); } return array[index]; }; At.prototype.eachChild = function eachChild (fn ) { fn(this.index); fn(this.input); }; At.prototype.outputDefined = function outputDefined () { return false; }; At.prototype.serialize = function serialize () { return ["at", this.index.serialize(), this.input.serialize()]; }; // var In = function In(needle , haystack ) { this.type = BooleanType; this.needle = needle; this.haystack = haystack; }; In.parse = function parse (args , context ) { if (args.length !== 3) { return context.error(("Expected 2 arguments, but found " + (args.length - 1) + " instead.")); } var needle = context.parse(args[1], 1, ValueType); var haystack = context.parse(args[2], 2, ValueType); if (!needle || !haystack) { return null; } if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) { return context.error(("Expected first argument to be of type boolean, string, number or null, but found " + (toString(needle.type)) + " instead")); } return new In(needle, haystack); }; In.prototype.evaluate = function evaluate (ctx ) { var needle = (this.needle.evaluate(ctx) ); var haystack = (this.haystack.evaluate(ctx) ); if (!haystack) { return false; } if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) { throw new RuntimeError(("Expected first argument to be of type boolean, string, number or null, but found " + (toString(typeOf(needle))) + " instead.")); } if (!isValidNativeType(haystack, ['string', 'array'])) { throw new RuntimeError(("Expected second argument to be of type array or string, but found " + (toString(typeOf(haystack))) + " instead.")); } return haystack.indexOf(needle) >= 0; }; In.prototype.eachChild = function eachChild (fn ) { fn(this.needle); fn(this.haystack); }; In.prototype.outputDefined = function outputDefined () { return true; }; In.prototype.serialize = function serialize () { return ["in", this.needle.serialize(), this.haystack.serialize()]; }; // var IndexOf = function IndexOf(needle , haystack , fromIndex ) { this.type = NumberType; this.needle = needle; this.haystack = haystack; this.fromIndex = fromIndex; }; IndexOf.parse = function parse (args , context ) { if (args.length <= 2 || args.length >= 5) { return context.error(("Expected 3 or 4 arguments, but found " + (args.length - 1) + " instead.")); } var needle = context.parse(args[1], 1, ValueType); var haystack = context.parse(args[2], 2, ValueType); if (!needle || !haystack) { return null; } if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) { return context.error(("Expected first argument to be of type boolean, string, number or null, but found " + (toString(needle.type)) + " instead")); } if (args.length === 4) { var fromIndex = context.parse(args[3], 3, NumberType); if (!fromIndex) { return null; } return new IndexOf(needle, haystack, fromIndex); } else { return new IndexOf(needle, haystack); } }; IndexOf.prototype.evaluate = function evaluate (ctx ) { var needle = (this.needle.evaluate(ctx) ); var haystack = (this.haystack.evaluate(ctx) ); if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) { throw new RuntimeError(("Expected first argument to be of type boolean, string, number or null, but found " + (toString(typeOf(needle))) + " instead.")); } if (!isValidNativeType(haystack, ['string', 'array'])) { throw new RuntimeError(("Expected second argument to be of type array or string, but found " + (toString(typeOf(haystack))) + " instead.")); } if (this.fromIndex) { var fromIndex = (this.fromIndex.evaluate(ctx) ); return haystack.indexOf(needle, fromIndex); } return haystack.indexOf(needle); }; IndexOf.prototype.eachChild = function eachChild (fn ) { fn(this.needle); fn(this.haystack); if (this.fromIndex) { fn(this.fromIndex); } }; IndexOf.prototype.outputDefined = function outputDefined () { return false; }; IndexOf.prototype.serialize = function serialize () { if (this.fromIndex != null && this.fromIndex !== undefined) { var fromIndex = this.fromIndex.serialize(); return ["index-of", this.needle.serialize(), this.haystack.serialize(), fromIndex]; } return ["index-of", this.needle.serialize(), this.haystack.serialize()]; }; // // Map input label values to output expression index var Match = function Match(inputType , outputType , input , cases , outputs , otherwise ) { this.inputType = inputType; this.type = outputType; this.input = input; this.cases = cases; this.outputs = outputs; this.otherwise = otherwise; }; Match.parse = function parse (args , context ) { if (args.length < 5) { return context.error(("Expected at least 4 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 1) { return context.error("Expected an even number of arguments."); } var inputType; var outputType; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var cases = {}; var outputs = []; for (var i = 2; i < args.length - 1; i += 2) { var labels = args[i]; var value = args[i + 1]; if (!Array.isArray(labels)) { labels = [labels]; } var labelContext = context.concat(i); if (labels.length === 0) { return labelContext.error('Expected at least one branch label.'); } for (var i$1 = 0, list = labels; i$1 < list.length; i$1 += 1) { var label = list[i$1]; if (typeof label !== 'number' && typeof label !== 'string') { return labelContext.error("Branch labels must be numbers or strings."); } else if (typeof label === 'number' && Math.abs(label) > Number.MAX_SAFE_INTEGER) { return labelContext.error(("Branch labels must be integers no larger than " + (Number.MAX_SAFE_INTEGER) + ".")); } else if (typeof label === 'number' && Math.floor(label) !== label) { return labelContext.error("Numeric branch labels must be integer values."); } else if (!inputType) { inputType = typeOf(label); } else if (labelContext.checkSubtype(inputType, typeOf(label))) { return null; } if (typeof cases[String(label)] !== 'undefined') { return labelContext.error('Branch labels must be unique.'); } cases[String(label)] = outputs.length; } var result = context.parse(value, i, outputType); if (!result) { return null; } outputType = outputType || result.type; outputs.push(result); } var input = context.parse(args[1], 1, ValueType); if (!input) { return null; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert_1(inputType && outputType); if (input.type.kind !== 'value' && context.concat(1).checkSubtype((inputType ), input.type)) { return null; } return new Match((inputType ), (outputType ), input, cases, outputs, otherwise); }; Match.prototype.evaluate = function evaluate (ctx ) { var input = (this.input.evaluate(ctx) ); var output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise; return output.evaluate(ctx); }; Match.prototype.eachChild = function eachChild (fn ) { fn(this.input); this.outputs.forEach(fn); fn(this.otherwise); }; Match.prototype.outputDefined = function outputDefined () { return this.outputs.every(function (out) { return out.outputDefined(); }) && this.otherwise.outputDefined(); }; Match.prototype.serialize = function serialize () { var this$1 = this; var serialized = ["match", this.input.serialize()]; // Sort so serialization has an arbitrary defined order, even though // branch order doesn't affect evaluation var sortedLabels = Object.keys(this.cases).sort(); // Group branches by unique match expression to support condensed // serializations of the form [case1, case2, ...] -> matchExpression var groupedByOutput = []; var outputLookup = {}; // lookup index into groupedByOutput for a given output expression for (var i = 0, list = sortedLabels; i < list.length; i += 1) { var label = list[i]; var outputIndex = outputLookup[this.cases[label]]; if (outputIndex === undefined) { // First time seeing this output, add it to the end of the grouped list outputLookup[this.cases[label]] = groupedByOutput.length; groupedByOutput.push([this.cases[label], [label]]); } else { // We've seen this expression before, add the label to that output's group groupedByOutput[outputIndex][1].push(label); } } var coerceLabel = function (label) { return this$1.inputType.kind === 'number' ? Number(label) : label; }; for (var i$1 = 0, list$1 = groupedByOutput; i$1 < list$1.length; i$1 += 1) { var ref = list$1[i$1]; var outputIndex = ref[0]; var labels = ref[1]; if (labels.length === 1) { // Only a single label matches this output expression serialized.push(coerceLabel(labels[0])); } else { // Array of literal labels pointing to this output expression serialized.push(labels.map(coerceLabel)); } serialized.push(this.outputs[outputIndex$1].serialize()); } serialized.push(this.otherwise.serialize()); return serialized; }; // var Case = function Case(type , branches , otherwise ) { this.type = type; this.branches = branches; this.otherwise = otherwise; }; Case.parse = function parse (args , context ) { if (args.length < 4) { return context.error(("Expected at least 3 arguments, but found only " + (args.length - 1) + ".")); } if (args.length % 2 !== 0) { return context.error("Expected an odd number of arguments."); } var outputType ; if (context.expectedType && context.expectedType.kind !== 'value') { outputType = context.expectedType; } var branches = []; for (var i = 1; i < args.length - 1; i += 2) { var test = context.parse(args[i], i, BooleanType); if (!test) { return null; } var result = context.parse(args[i + 1], i + 1, outputType); if (!result) { return null; } branches.push([test, result]); outputType = outputType || result.type; } var otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); if (!otherwise) { return null; } assert_1(outputType); return new Case((outputType ), branches, otherwise); }; Case.prototype.evaluate = function evaluate (ctx ) { for (var i = 0, list = this.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; if (test.evaluate(ctx)) { return expression.evaluate(ctx); } } return this.otherwise.evaluate(ctx); }; Case.prototype.eachChild = function eachChild (fn ) { for (var i = 0, list = this.branches; i < list.length; i += 1) { var ref = list[i]; var test = ref[0]; var expression = ref[1]; fn(test); fn(expression); } fn(this.otherwise); }; Case.prototype.outputDefined = function outputDefined () { return this.branches.every(function (ref) { var _ = ref[0]; var out = ref[1]; return out.outputDefined(); }) && this.otherwise.outputDefined(); }; Case.prototype.serialize = function serialize () { var serialized = ["case"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var Slice = function Slice(type , input , beginIndex , endIndex ) { this.type = type; this.input = input; this.beginIndex = beginIndex; this.endIndex = endIndex; }; Slice.parse = function parse (args , context ) { if (args.length <= 2 || args.length >= 5) { return context.error(("Expected 3 or 4 arguments, but found " + (args.length - 1) + " instead.")); } var input = context.parse(args[1], 1, ValueType); var beginIndex = context.parse(args[2], 2, NumberType); if (!input || !beginIndex) { return null; } if (!isValidType(input.type, [array(ValueType), StringType, ValueType])) { return context.error(("Expected first argument to be of type array or string, but found " + (toString(input.type)) + " instead")); } if (args.length === 4) { var endIndex = context.parse(args[3], 3, NumberType); if (!endIndex) { return null; } return new Slice(input.type, input, beginIndex, endIndex); } else { return new Slice(input.type, input, beginIndex); } }; Slice.prototype.evaluate = function evaluate (ctx ) { var input = (this.input.evaluate(ctx) ); var beginIndex = (this.beginIndex.evaluate(ctx) ); if (!isValidNativeType(input, ['string', 'array'])) { throw new RuntimeError(("Expected first argument to be of type array or string, but found " + (toString(typeOf(input))) + " instead.")); } if (this.endIndex) { var endIndex = (this.endIndex.evaluate(ctx) ); return input.slice(beginIndex, endIndex); } return input.slice(beginIndex); }; Slice.prototype.eachChild = function eachChild (fn ) { fn(this.input); fn(this.beginIndex); if (this.endIndex) { fn(this.endIndex); } }; Slice.prototype.outputDefined = function outputDefined () { return false; }; Slice.prototype.serialize = function serialize () { if (this.endIndex != null && this.endIndex !== undefined) { var endIndex = this.endIndex.serialize(); return ["slice", this.input.serialize(), this.beginIndex.serialize(), endIndex]; } return ["slice", this.input.serialize(), this.beginIndex.serialize()]; }; // function isComparableType(op , type ) { if (op === '==' || op === '!=') { // equality operator return type.kind === 'boolean' || type.kind === 'string' || type.kind === 'number' || type.kind === 'null' || type.kind === 'value'; } else { // ordering operator return type.kind === 'string' || type.kind === 'number' || type.kind === 'value'; } } function eq(ctx, a, b) { return a === b; } function neq(ctx, a, b) { return a !== b; } function lt(ctx, a, b) { return a < b; } function gt(ctx, a, b) { return a > b; } function lteq(ctx, a, b) { return a <= b; } function gteq(ctx, a, b) { return a >= b; } function eqCollate(ctx, a, b, c) { return c.compare(a, b) === 0; } function neqCollate(ctx, a, b, c) { return !eqCollate(ctx, a, b, c); } function ltCollate(ctx, a, b, c) { return c.compare(a, b) < 0; } function gtCollate(ctx, a, b, c) { return c.compare(a, b) > 0; } function lteqCollate(ctx, a, b, c) { return c.compare(a, b) <= 0; } function gteqCollate(ctx, a, b, c) { return c.compare(a, b) >= 0; } /** * Special form for comparison operators, implementing the signatures: * - (T, T, ?Collator) => boolean * - (T, value, ?Collator) => boolean * - (value, T, ?Collator) => boolean * * For inequalities, T must be either value, string, or number. For ==/!=, it * can also be boolean or null. * * Equality semantics are equivalent to Javascript's strict equality (===/!==) * -- i.e., when the arguments' types don't match, == evaluates to false, != to * true. * * When types don't match in an ordering comparison, a runtime error is thrown. * * @private */ function makeComparison(op , compareBasic, compareWithCollator) { var isOrderComparison = op !== '==' && op !== '!='; return /*@__PURE__*/(function () { function Comparison(lhs , rhs , collator ) { this.type = BooleanType; this.lhs = lhs; this.rhs = rhs; this.collator = collator; this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value'; } Comparison.parse = function parse (args , context ) { if (args.length !== 3 && args.length !== 4) { return context.error("Expected two or three arguments."); } var op = (args[0] ); var lhs = context.parse(args[1], 1, ValueType); if (!lhs) { return null; } if (!isComparableType(op, lhs.type)) { return context.concat(1).error(("\"" + op + "\" comparisons are not supported for type '" + (toString(lhs.type)) + "'.")); } var rhs = context.parse(args[2], 2, ValueType); if (!rhs) { return null; } if (!isComparableType(op, rhs.type)) { return context.concat(2).error(("\"" + op + "\" comparisons are not supported for type '" + (toString(rhs.type)) + "'.")); } if ( lhs.type.kind !== rhs.type.kind && lhs.type.kind !== 'value' && rhs.type.kind !== 'value' ) { return context.error(("Cannot compare types '" + (toString(lhs.type)) + "' and '" + (toString(rhs.type)) + "'.")); } if (isOrderComparison) { // typing rules specific to less/greater than operators if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') { // (value, T) lhs = new Assertion(rhs.type, [lhs]); } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') { // (T, value) rhs = new Assertion(lhs.type, [rhs]); } } var collator = null; if (args.length === 4) { if ( lhs.type.kind !== 'string' && rhs.type.kind !== 'string' && lhs.type.kind !== 'value' && rhs.type.kind !== 'value' ) { return context.error("Cannot use collator to compare non-string types."); } collator = context.parse(args[3], 3, CollatorType); if (!collator) { return null; } } return new Comparison(lhs, rhs, collator); }; Comparison.prototype.evaluate = function evaluate (ctx ) { var lhs = this.lhs.evaluate(ctx); var rhs = this.rhs.evaluate(ctx); if (isOrderComparison && this.hasUntypedArgument) { var lt = typeOf(lhs); var rt = typeOf(rhs); // check that type is string or number, and equal if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) { throw new RuntimeError(("Expected arguments for \"" + op + "\" to be (string, string) or (number, number), but found (" + (lt.kind) + ", " + (rt.kind) + ") instead.")); } } if (this.collator && !isOrderComparison && this.hasUntypedArgument) { var lt$1 = typeOf(lhs); var rt$1 = typeOf(rhs); if (lt$1.kind !== 'string' || rt$1.kind !== 'string') { return compareBasic(ctx, lhs, rhs); } } return this.collator ? compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : compareBasic(ctx, lhs, rhs); }; Comparison.prototype.eachChild = function eachChild (fn ) { fn(this.lhs); fn(this.rhs); if (this.collator) { fn(this.collator); } }; Comparison.prototype.outputDefined = function outputDefined () { return true; }; Comparison.prototype.serialize = function serialize () { var serialized = [op]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; return Comparison; }()); } var Equals = makeComparison('==', eq, eqCollate); var NotEquals = makeComparison('!=', neq, neqCollate); var LessThan = makeComparison('<', lt, ltCollate); var GreaterThan = makeComparison('>', gt, gtCollate); var LessThanOrEqual = makeComparison('<=', lteq, lteqCollate); var GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate); // var NumberFormat = function NumberFormat(number , locale , currency , minFractionDigits , maxFractionDigits ) { this.type = StringType; this.number = number; this.locale = locale; this.currency = currency; this.minFractionDigits = minFractionDigits; this.maxFractionDigits = maxFractionDigits; }; NumberFormat.parse = function parse (args , context ) { if (args.length !== 3) { return context.error("Expected two arguments."); } var number = context.parse(args[1], 1, NumberType); if (!number) { return null; } var options = (args[2] ); if (typeof options !== "object" || Array.isArray(options)) { return context.error("NumberFormat options argument must be an object."); } var locale = null; if (options['locale']) { locale = context.parse(options['locale'], 1, StringType); if (!locale) { return null; } } var currency = null; if (options['currency']) { currency = context.parse(options['currency'], 1, StringType); if (!currency) { return null; } } var minFractionDigits = null; if (options['min-fraction-digits']) { minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType); if (!minFractionDigits) { return null; } } var maxFractionDigits = null; if (options['max-fraction-digits']) { maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType); if (!maxFractionDigits) { return null; } } return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits); }; NumberFormat.prototype.evaluate = function evaluate (ctx ) { return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], { style: this.currency ? "currency" : "decimal", currency: this.currency ? this.currency.evaluate(ctx) : undefined, minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined, maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined, }).format(this.number.evaluate(ctx)); }; NumberFormat.prototype.eachChild = function eachChild (fn ) { fn(this.number); if (this.locale) { fn(this.locale); } if (this.currency) { fn(this.currency); } if (this.minFractionDigits) { fn(this.minFractionDigits); } if (this.maxFractionDigits) { fn(this.maxFractionDigits); } }; NumberFormat.prototype.outputDefined = function outputDefined () { return false; }; NumberFormat.prototype.serialize = function serialize () { var options = {}; if (this.locale) { options['locale'] = this.locale.serialize(); } if (this.currency) { options['currency'] = this.currency.serialize(); } if (this.minFractionDigits) { options['min-fraction-digits'] = this.minFractionDigits.serialize(); } if (this.maxFractionDigits) { options['max-fraction-digits'] = this.maxFractionDigits.serialize(); } return ["number-format", this.number.serialize(), options]; }; // var Length = function Length(input ) { this.type = NumberType; this.input = input; }; Length.parse = function parse (args , context ) { if (args.length !== 2) { return context.error(("Expected 1 argument, but found " + (args.length - 1) + " instead.")); } var input = context.parse(args[1], 1); if (!input) { return null; } if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') { return context.error(("Expected argument of type string or array, but found " + (toString(input.type)) + " instead.")); } return new Length(input); }; Length.prototype.evaluate = function evaluate (ctx ) { var input = this.input.evaluate(ctx); if (typeof input === 'string') { return input.length; } else if (Array.isArray(input)) { return input.length; } else { throw new RuntimeError(("Expected value to be of type string or array, but found " + (toString(typeOf(input))) + " instead.")); } }; Length.prototype.eachChild = function eachChild (fn ) { fn(this.input); }; Length.prototype.outputDefined = function outputDefined () { return false; }; Length.prototype.serialize = function serialize () { var serialized = ["length"]; this.eachChild(function (child) { serialized.push(child.serialize()); }); return serialized; }; // var expressions = { // special forms '==': Equals, '!=': NotEquals, '>': GreaterThan, '<': LessThan, '>=': GreaterThanOrEqual, '<=': LessThanOrEqual, 'array': Assertion, 'at': At, 'boolean': Assertion, 'case': Case, 'coalesce': Coalesce, 'collator': CollatorExpression, 'format': FormatExpression, 'image': ImageExpression, 'in': In, 'index-of': IndexOf, 'interpolate': Interpolate, 'interpolate-hcl': Interpolate, 'interpolate-lab': Interpolate, 'length': Length, 'let': Let, 'literal': Literal, 'match': Match, 'number': Assertion, 'number-format': NumberFormat, 'object': Assertion, 'slice': Slice, 'step': Step, 'string': Assertion, 'to-boolean': Coercion, 'to-color': Coercion, 'to-number': Coercion, 'to-string': Coercion, 'var': Var, 'within': Within }; function rgba(ctx, ref) { var r = ref[0]; var g = ref[1]; var b = ref[2]; var a = ref[3]; r = r.evaluate(ctx); g = g.evaluate(ctx); b = b.evaluate(ctx); var alpha = a ? a.evaluate(ctx) : 1; var error = validateRGBA(r, g, b, alpha); if (error) { throw new RuntimeError(error); } return new Color(r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha); } function has(key, obj) { return key in obj; } function get$1(key, obj) { var v = obj[key]; return typeof v === 'undefined' ? null : v; } function binarySearch(v, a, i, j) { while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) { return true; } if (a[m] > v) { j = m - 1; } else { i = m + 1; } } return false; } function varargs(type ) { return {type: type}; } CompoundExpression.register(expressions, { 'error': [ ErrorType, [StringType], function (ctx, ref) { var v = ref[0]; throw new RuntimeError(v.evaluate(ctx)); } ], 'typeof': [ StringType, [ValueType], function (ctx, ref) { var v = ref[0]; return toString(typeOf(v.evaluate(ctx))); } ], 'to-rgba': [ array(NumberType, 4), [ColorType], function (ctx, ref) { var v = ref[0]; return v.evaluate(ctx).toArray(); } ], 'rgb': [ ColorType, [NumberType, NumberType, NumberType], rgba ], 'rgba': [ ColorType, [NumberType, NumberType, NumberType, NumberType], rgba ], 'has': { type: BooleanType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return has(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return has(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'get': { type: ValueType, overloads: [ [ [StringType], function (ctx, ref) { var key = ref[0]; return get$1(key.evaluate(ctx), ctx.properties()); } ], [ [StringType, ObjectType], function (ctx, ref) { var key = ref[0]; var obj = ref[1]; return get$1(key.evaluate(ctx), obj.evaluate(ctx)); } ] ] }, 'feature-state': [ ValueType, [StringType], function (ctx, ref) { var key = ref[0]; return get$1(key.evaluate(ctx), ctx.featureState || {}); } ], 'properties': [ ObjectType, [], function (ctx) { return ctx.properties(); } ], 'geometry-type': [ StringType, [], function (ctx) { return ctx.geometryType(); } ], 'id': [ ValueType, [], function (ctx) { return ctx.id(); } ], 'zoom': [ NumberType, [], function (ctx) { return ctx.globals.zoom; } ], 'heatmap-density': [ NumberType, [], function (ctx) { return ctx.globals.heatmapDensity || 0; } ], 'line-progress': [ NumberType, [], function (ctx) { return ctx.globals.lineProgress || 0; } ], 'accumulated': [ ValueType, [], function (ctx) { return ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated; } ], '+': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 0; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result += arg.evaluate(ctx); } return result; } ], '*': [ NumberType, varargs(NumberType), function (ctx, args) { var result = 1; for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; result *= arg.evaluate(ctx); } return result; } ], '-': { type: NumberType, overloads: [ [ [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) - b.evaluate(ctx); } ], [ [NumberType], function (ctx, ref) { var a = ref[0]; return -a.evaluate(ctx); } ] ] }, '/': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) / b.evaluate(ctx); } ], '%': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) % b.evaluate(ctx); } ], 'ln2': [ NumberType, [], function () { return Math.LN2; } ], 'pi': [ NumberType, [], function () { return Math.PI; } ], 'e': [ NumberType, [], function () { return Math.E; } ], '^': [ NumberType, [NumberType, NumberType], function (ctx, ref) { var b = ref[0]; var e = ref[1]; return Math.pow(b.evaluate(ctx), e.evaluate(ctx)); } ], 'sqrt': [ NumberType, [NumberType], function (ctx, ref) { var x = ref[0]; return Math.sqrt(x.evaluate(ctx)); } ], 'log10': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)) / Math.LN10; } ], 'ln': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)); } ], 'log2': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.log(n.evaluate(ctx)) / Math.LN2; } ], 'sin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.sin(n.evaluate(ctx)); } ], 'cos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.cos(n.evaluate(ctx)); } ], 'tan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.tan(n.evaluate(ctx)); } ], 'asin': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.asin(n.evaluate(ctx)); } ], 'acos': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.acos(n.evaluate(ctx)); } ], 'atan': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.atan(n.evaluate(ctx)); } ], 'min': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.min.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'max': [ NumberType, varargs(NumberType), function (ctx, args) { return Math.max.apply(Math, args.map(function (arg) { return arg.evaluate(ctx); })); } ], 'abs': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.abs(n.evaluate(ctx)); } ], 'round': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; var v = n.evaluate(ctx); // Javascript's Math.round() rounds towards +Infinity for halfway // values, even when they're negative. It's more common to round // away from 0 (e.g., this is what python and C++ do) return v < 0 ? -Math.round(-v) : Math.round(v); } ], 'floor': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.floor(n.evaluate(ctx)); } ], 'ceil': [ NumberType, [NumberType], function (ctx, ref) { var n = ref[0]; return Math.ceil(n.evaluate(ctx)); } ], 'filter-==': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; return ctx.properties()[(k ).value] === (v ).value; } ], 'filter-id-==': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; return ctx.id() === (v ).value; } ], 'filter-type-==': [ BooleanType, [StringType], function (ctx, ref) { var v = ref[0]; return ctx.geometryType() === (v ).value; } ], 'filter-<': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter-id-<': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a < b; } ], 'filter->': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-id->': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a > b; } ], 'filter-<=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter-id-<=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a <= b; } ], 'filter->=': [ BooleanType, [StringType, ValueType], function (ctx, ref) { var k = ref[0]; var v = ref[1]; var a = ctx.properties()[(k ).value]; var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-id->=': [ BooleanType, [ValueType], function (ctx, ref) { var v = ref[0]; var a = ctx.id(); var b = (v ).value; return typeof a === typeof b && a >= b; } ], 'filter-has': [ BooleanType, [ValueType], function (ctx, ref) { var k = ref[0]; return (k ).value in ctx.properties(); } ], 'filter-has-id': [ BooleanType, [], function (ctx) { return (ctx.id() !== null && ctx.id() !== undefined); } ], 'filter-type-in': [ BooleanType, [array(StringType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.geometryType()) >= 0; } ], 'filter-id-in': [ BooleanType, [array(ValueType)], function (ctx, ref) { var v = ref[0]; return (v ).value.indexOf(ctx.id()) >= 0; } ], 'filter-in-small': [ BooleanType, [StringType, array(ValueType)], // assumes v is an array literal function (ctx, ref) { var k = ref[0]; var v = ref[1]; return (v ).value.indexOf(ctx.properties()[(k ).value]) >= 0; } ], 'filter-in-large': [ BooleanType, [StringType, array(ValueType)], // assumes v is a array literal with values sorted in ascending order and of a single type function (ctx, ref) { var k = ref[0]; var v = ref[1]; return binarySearch(ctx.properties()[(k ).value], (v ).value, 0, (v ).value.length - 1); } ], 'all': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) && b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (!arg.evaluate(ctx)) { return false; } } return true; } ] ] }, 'any': { type: BooleanType, overloads: [ [ [BooleanType, BooleanType], function (ctx, ref) { var a = ref[0]; var b = ref[1]; return a.evaluate(ctx) || b.evaluate(ctx); } ], [ varargs(BooleanType), function (ctx, args) { for (var i = 0, list = args; i < list.length; i += 1) { var arg = list[i]; if (arg.evaluate(ctx)) { return true; } } return false; } ] ] }, '!': [ BooleanType, [BooleanType], function (ctx, ref) { var b = ref[0]; return !b.evaluate(ctx); } ], 'is-supported-script': [ BooleanType, [StringType], // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant function (ctx, ref) { var s = ref[0]; var isSupportedScript = ctx.globals && ctx.globals.isSupportedScript; if (isSupportedScript) { return isSupportedScript(s.evaluate(ctx)); } return true; } ], 'upcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toUpperCase(); } ], 'downcase': [ StringType, [StringType], function (ctx, ref) { var s = ref[0]; return s.evaluate(ctx).toLowerCase(); } ], 'concat': [ StringType, varargs(ValueType), function (ctx, args) { return args.map(function (arg) { return toString$1(arg.evaluate(ctx)); }).join(''); } ], 'resolved-locale': [ StringType, [CollatorType], function (ctx, ref) { var collator = ref[0]; return collator.evaluate(ctx).resolvedLocale(); } ] }); // /** * A type used for returning and propagating errors. The first element of the union * represents success and contains a value, and the second represents an error and * contains an error value. * @private */ function success (value ) { return {result: 'success', value: value}; } function error (value ) { return {result: 'error', value: value}; } // function supportsPropertyExpression(spec ) { return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven'; } function supportsZoomExpression(spec ) { return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1; } function supportsInterpolation(spec ) { return !!spec.expression && spec.expression.interpolated; } // function getType(val ) { if (val instanceof Number) { return 'number'; } else if (val instanceof String) { return 'string'; } else if (val instanceof Boolean) { return 'boolean'; } else if (Array.isArray(val)) { return 'array'; } else if (val === null) { return 'null'; } else { return typeof val; } } function isFunction(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); } function identityFunction(x) { return x; } function createFunction(parameters, propertySpec) { var isColor = propertySpec.type === 'color'; var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; var zoomDependent = zoomAndFeatureDependent || !featureDependent; var type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval'); if (isColor) { parameters = extend$2({}, parameters); if (parameters.stops) { parameters.stops = parameters.stops.map(function (stop) { return [stop[0], Color.parse(stop[1])]; }); } if (parameters.default) { parameters.default = Color.parse(parameters.default); } else { parameters.default = Color.parse(propertySpec.default); } } if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace throw new Error(("Unknown color space: " + (parameters.colorSpace))); } var innerFun; var hashedStops; var categoricalKeyType; if (type === 'exponential') { innerFun = evaluateExponentialFunction; } else if (type === 'interval') { innerFun = evaluateIntervalFunction; } else if (type === 'categorical') { innerFun = evaluateCategoricalFunction; // For categorical functions, generate an Object as a hashmap of the stops for fast searching hashedStops = Object.create(null); for (var i = 0, list = parameters.stops; i < list.length; i += 1) { var stop = list[i]; hashedStops[stop[0]] = stop[1]; } // Infer key type based on first stop key-- used to encforce strict type checking later categoricalKeyType = typeof parameters.stops[0][0]; } else if (type === 'identity') { innerFun = evaluateIdentityFunction; } else { throw new Error(("Unknown function type \"" + type + "\"")); } if (zoomAndFeatureDependent) { var featureFunctions = {}; var zoomStops = []; for (var s = 0; s < parameters.stops.length; s++) { var stop$1 = parameters.stops[s]; var zoom = stop$1[0].zoom; if (featureFunctions[zoom] === undefined) { featureFunctions[zoom] = { zoom: zoom, type: parameters.type, property: parameters.property, default: parameters.default, stops: [] }; zoomStops.push(zoom); } featureFunctions[zoom].stops.push([stop$1[0].value, stop$1[1]]); } var featureFunctionStops = []; for (var i$1 = 0, list$1 = zoomStops; i$1 < list$1.length; i$1 += 1) { var z = list$1[i$1]; featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]); } var interpolationType = {name: 'linear'}; return { kind: 'composite', interpolationType: interpolationType, interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), zoomStops: featureFunctionStops.map(function (s) { return s[0]; }), evaluate: function evaluate(ref, properties) { var zoom = ref.zoom; return evaluateExponentialFunction({ stops: featureFunctionStops, base: parameters.base }, propertySpec, zoom).evaluate(zoom, properties); } }; } else if (zoomDependent) { var interpolationType$1 = type === 'exponential' ? {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1} : null; return { kind: 'camera', interpolationType: interpolationType$1, interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType$1), zoomStops: parameters.stops.map(function (s) { return s[0]; }), evaluate: function (ref) { var zoom = ref.zoom; return innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType); } }; } else { return { kind: 'source', evaluate: function evaluate(_, feature) { var value = feature && feature.properties ? feature.properties[parameters.property] : undefined; if (value === undefined) { return coalesce(parameters.default, propertySpec.default); } return innerFun(parameters, propertySpec, value, hashedStops, categoricalKeyType); } }; } } function coalesce(a, b, c) { if (a !== undefined) { return a; } if (b !== undefined) { return b; } if (c !== undefined) { return c; } } function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) { var evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input return coalesce(evaluated, parameters.default, propertySpec.default); } function evaluateIntervalFunction(parameters, propertySpec, input) { // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) { return stop[0]; }), input); return parameters.stops[index][1]; } function evaluateExponentialFunction(parameters, propertySpec, input) { var base = parameters.base !== undefined ? parameters.base : 1; // Edge cases if (getType(input) !== 'number') { return coalesce(parameters.default, propertySpec.default); } var n = parameters.stops.length; if (n === 1) { return parameters.stops[0][1]; } if (input <= parameters.stops[0][0]) { return parameters.stops[0][1]; } if (input >= parameters.stops[n - 1][0]) { return parameters.stops[n - 1][1]; } var index = findStopLessThanOrEqualTo(parameters.stops.map(function (stop) { return stop[0]; }), input); var t = interpolationFactor( input, base, parameters.stops[index][0], parameters.stops[index + 1][0]); var outputLower = parameters.stops[index][1]; var outputUpper = parameters.stops[index + 1][1]; var interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { var colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace interp = function (a, b) { return colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t)); }; } if (typeof outputLower.evaluate === 'function') { return { evaluate: function evaluate() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var evaluatedLower = outputLower.evaluate.apply(undefined, args); var evaluatedUpper = outputUpper.evaluate.apply(undefined, args); // Special case for fill-outline-color, which has no spec default. if (evaluatedLower === undefined || evaluatedUpper === undefined) { return undefined; } return interp(evaluatedLower, evaluatedUpper, t); } }; } return interp(outputLower, outputUpper, t); } function evaluateIdentityFunction(parameters, propertySpec, input) { if (propertySpec.type === 'color') { input = Color.parse(input); } else if (propertySpec.type === 'formatted') { input = Formatted.fromString(input.toString()); } else if (propertySpec.type === 'resolvedImage') { input = ResolvedImage.fromString(input.toString()); } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) { input = undefined; } return coalesce(input, parameters.default, propertySpec.default); } /** * Returns a ratio that can be used to interpolate between exponential function * stops. * * How it works: * Two consecutive stop values define a (scaled and shifted) exponential * function `f(x) = a * base^x + b`, where `base` is the user-specified base, * and `a` and `b` are constants affording sufficient degrees of freedom to fit * the function to the given stops. * * Here's a bit of algebra that lets us compute `f(x)` directly from the stop * values without explicitly solving for `a` and `b`: * * First stop value: `f(x0) = y0 = a * base^x0 + b` * Second stop value: `f(x1) = y1 = a * base^x1 + b` * => `y1 - y0 = a(base^x1 - base^x0)` * => `a = (y1 - y0)/(base^x1 - base^x0)` * * Desired value: `f(x) = y = a * base^x + b` * => `f(x) = y0 + a * (base^x - base^x0)` * * From the above, we can replace the `a` in `a * (base^x - base^x0)` and do a * little algebra: * ``` * a * (base^x - base^x0) = (y1 - y0)/(base^x1 - base^x0) * (base^x - base^x0) * = (y1 - y0) * (base^x - base^x0) / (base^x1 - base^x0) * ``` * * If we let `(base^x - base^x0) / (base^x1 base^x0)`, then we have * `f(x) = y0 + (y1 - y0) * ratio`. In other words, `ratio` may be treated as * an interpolation factor between the two stops' output values. * * (Note: a slightly different form for `ratio`, * `(base^(x-x0) - 1) / (base^(x1-x0) - 1) `, is equivalent, but requires fewer * expensive `Math.pow()` operations.) * * @private */ function interpolationFactor(input, base, lowerValue, upperValue) { var difference = upperValue - lowerValue; var progress = input - lowerValue; if (difference === 0) { return 0; } else if (base === 1) { return progress / difference; } else { return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } // var StyleExpression = function StyleExpression(expression , propertySpec ) { this.expression = expression; this._warningHistory = {}; this._evaluator = new EvaluationContext(); this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null; this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null; }; StyleExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState , canonical , availableImages , formattedSection ) { this._evaluator.globals = globals; this._evaluator.feature = feature; this._evaluator.featureState = featureState; this._evaluator.canonical = canonical; this._evaluator.availableImages = availableImages || null; this._evaluator.formattedSection = formattedSection; return this.expression.evaluate(this._evaluator); }; StyleExpression.prototype.evaluate = function evaluate (globals , feature , featureState , canonical , availableImages , formattedSection ) { this._evaluator.globals = globals; this._evaluator.feature = feature || null; this._evaluator.featureState = featureState || null; this._evaluator.canonical = canonical; this._evaluator.availableImages = availableImages || null; this._evaluator.formattedSection = formattedSection || null; try { var val = this.expression.evaluate(this._evaluator); // eslint-disable-next-line no-self-compare if (val === null || val === undefined || (typeof val === 'number' && val !== val)) { return this._defaultValue; } if (this._enumValues && !(val in this._enumValues)) { throw new RuntimeError(("Expected value to be one of " + (Object.keys(this._enumValues).map(function (v) { return JSON.stringify(v); }).join(', ')) + ", but found " + (JSON.stringify(val)) + " instead.")); } return val; } catch (e) { if (!this._warningHistory[e.message]) { this._warningHistory[e.message] = true; if (typeof console !== 'undefined') { console.warn(e.message); } } return this._defaultValue; } }; function isExpression(expression ) { return Array.isArray(expression) && expression.length > 0 && typeof expression[0] === 'string' && expression[0] in expressions; } /** * Parse and typecheck the given style spec JSON expression. If * options.defaultValue is provided, then the resulting StyleExpression's * `evaluate()` method will handle errors by logging a warning (once per * message) and returning the default value. Otherwise, it will throw * evaluation errors. * * @private */ function createExpression(expression , propertySpec ) { var parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined); // For string-valued properties, coerce to string at the top level rather than asserting. var parsed = parser.parse(expression, undefined, undefined, undefined, propertySpec && propertySpec.type === 'string' ? {typeAnnotation: 'coerce'} : undefined); if (!parsed) { assert_1(parser.errors.length > 0); return error(parser.errors); } return success(new StyleExpression(parsed, propertySpec)); } var ZoomConstantExpression = function ZoomConstantExpression(kind , expression ) { this.kind = kind; this._styleExpression = expression; this.isStateDependent = kind !== ('constant' ) && !isStateConstant(expression.expression); }; ZoomConstantExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState , canonical , availableImages , formattedSection ) { return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); }; ZoomConstantExpression.prototype.evaluate = function evaluate (globals , feature , featureState , canonical , availableImages , formattedSection ) { return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); }; var ZoomDependentExpression = function ZoomDependentExpression(kind , expression , zoomStops , interpolationType ) { this.kind = kind; this.zoomStops = zoomStops; this._styleExpression = expression; this.isStateDependent = kind !== ('camera' ) && !isStateConstant(expression.expression); this.interpolationType = interpolationType; }; ZoomDependentExpression.prototype.evaluateWithoutErrorHandling = function evaluateWithoutErrorHandling (globals , feature , featureState , canonical , availableImages , formattedSection ) { return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); }; ZoomDependentExpression.prototype.evaluate = function evaluate (globals , feature , featureState , canonical , availableImages , formattedSection ) { return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); }; ZoomDependentExpression.prototype.interpolationFactor = function interpolationFactor (input , lower , upper ) { if (this.interpolationType) { return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper); } else { return 0; } }; function createPropertyExpression(expression , propertySpec ) { expression = createExpression(expression, propertySpec); if (expression.result === 'error') { return expression; } var parsed = expression.value.expression; var isFeatureConstant$1 = isFeatureConstant(parsed); if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) { return error([new ParsingError('', 'data expressions not supported')]); } var isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom']); if (!isZoomConstant && !supportsZoomExpression(propertySpec)) { return error([new ParsingError('', 'zoom expressions not supported')]); } var zoomCurve = findZoomCurve(parsed); if (!zoomCurve && !isZoomConstant) { return error([new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]); } else if (zoomCurve instanceof ParsingError) { return error([zoomCurve]); } else if (zoomCurve instanceof Interpolate && !supportsInterpolation(propertySpec)) { return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]); } if (!zoomCurve) { return success(isFeatureConstant$1 ? (new ZoomConstantExpression('constant', expression.value) ) : (new ZoomConstantExpression('source', expression.value) )); } var interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined; return success(isFeatureConstant$1 ? (new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) ) : (new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType) )); } // serialization wrapper for old-style stop functions normalized to the // expression interface var StylePropertyFunction = function StylePropertyFunction(parameters , specification ) { this._parameters = parameters; this._specification = specification; extend$2(this, createFunction(this._parameters, this._specification)); }; StylePropertyFunction.deserialize = function deserialize (serialized ) { return ((new StylePropertyFunction(serialized._parameters, serialized._specification)) ); }; StylePropertyFunction.serialize = function serialize (input ) { return { _parameters: input._parameters, _specification: input._specification }; }; function normalizePropertyExpression (value , specification ) { if (isFunction(value)) { return (new StylePropertyFunction(value, specification) ); } else if (isExpression(value)) { var expression = createPropertyExpression(value, specification); if (expression.result === 'error') { // this should have been caught in validation throw new Error(expression.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } return expression.value; } else { var constant = value; if (typeof value === 'string' && specification.type === 'color') { constant = Color.parse(value); } return { kind: 'constant', evaluate: function () { return constant; } }; } } // Zoom-dependent expressions may only use ["zoom"] as the input to a top-level "step" or "interpolate" // expression (collectively referred to as a "curve"). The curve may be wrapped in one or more "let" or // "coalesce" expressions. function findZoomCurve(expression ) { var result = null; if (expression instanceof Let) { result = findZoomCurve(expression.result); } else if (expression instanceof Coalesce) { for (var i = 0, list = expression.args; i < list.length; i += 1) { var arg = list[i]; result = findZoomCurve(arg); if (result) { break; } } } else if ((expression instanceof Step || expression instanceof Interpolate) && expression.input instanceof CompoundExpression && expression.input.name === 'zoom') { result = expression; } if (result instanceof ParsingError) { return result; } expression.eachChild(function (child) { var childResult = findZoomCurve(child); if (childResult instanceof ParsingError) { result = childResult; } else if (!result && childResult) { result = new ParsingError('', '"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'); } else if (result && childResult && result !== childResult) { result = new ParsingError('', 'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'); } }); return result; } function getExpectedType(spec ) { var types = { color: ColorType, string: StringType, number: NumberType, enum: StringType, boolean: BooleanType, formatted: FormattedType, resolvedImage: ResolvedImageType }; if (spec.type === 'array') { return array(types[spec.value] || ValueType, spec.length); } return types[spec.type]; } function getDefaultValue(spec ) { if (spec.type === 'color' && isFunction(spec.default)) { // Special case for heatmap-color: it uses the 'default:' to define a // default color ramp, but createExpression expects a simple value to fall // back to in case of runtime errors return new Color(0, 0, 0, 0); } else if (spec.type === 'color') { return Color.parse(spec.default) || null; } else if (spec.default === undefined) { return null; } else { return spec.default; } } // var ImageData = window$1.ImageData; var ImageBitmap = window$1.ImageBitmap; // eslint-disable-line var registry = {}; /** * Register the given class as serializable. * * @param options * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties) * @param options.shallow List of properties that should be serialized by a simple shallow copy, rather than by a recursive call to serialize(). * * @private */ function register (name , klass , options) { if ( options === void 0 ) options = {}; assert_1(!registry[name], (name + " is already registered.")); (Object.defineProperty )(klass, '_classRegistryKey', { value: name, writeable: false }); registry[name] = { klass: klass, omit: options.omit || [], shallow: options.shallow || [] }; } register('Object', Object); gridIndex.serialize = function serialize(grid , transferables ) { var buffer = grid.toArrayBuffer(); if (transferables) { transferables.push(buffer); } return {buffer: buffer}; }; gridIndex.deserialize = function deserialize(serialized ) { return new gridIndex(serialized.buffer); }; register('Grid', gridIndex); register('Color', Color); register('Error', Error); register('ResolvedImage', ResolvedImage); register('StylePropertyFunction', StylePropertyFunction); register('StyleExpression', StyleExpression, {omit: ['_evaluator']}); register('ZoomDependentExpression', ZoomDependentExpression); register('ZoomConstantExpression', ZoomConstantExpression); register('CompoundExpression', CompoundExpression, {omit: ['_evaluate']}); for (var name$1 in expressions) { if ((expressions[name$1] )._classRegistryKey) { continue; } register(("Expression_" + name$1), expressions[name$1]); } function isArrayBuffer(val ) { return val && typeof ArrayBuffer !== 'undefined' && (val instanceof ArrayBuffer || (val.constructor && val.constructor.name === 'ArrayBuffer')); } function isImageBitmap(val ) { return ImageBitmap && val instanceof ImageBitmap; } /** * Serialize the given object for transfer to or from a web worker. * * For non-builtin types, recursively serialize each property (possibly * omitting certain properties - see register()), and package the result along * with the constructor's `name` so that the appropriate constructor can be * looked up in `deserialize()`. * * If a `transferables` array is provided, add any transferable objects (i.e., * any ArrayBuffers or ArrayBuffer views) to the list. (If a copy is needed, * this should happen in the client code, before using serialize().) * * @private */ function serialize(input , transferables ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp) { return input; } if (isArrayBuffer(input) || isImageBitmap(input)) { if (transferables) { transferables.push(((input ) )); } return input; } if (ArrayBuffer.isView(input)) { var view = (input ); if (transferables) { transferables.push(view.buffer); } return view; } if (input instanceof ImageData) { if (transferables) { transferables.push(input.data.buffer); } return input; } if (Array.isArray(input)) { var serialized = []; for (var i = 0, list = input; i < list.length; i += 1) { var item = list[i]; serialized.push(serialize(item, transferables)); } return serialized; } if (typeof input === 'object') { var klass = (input.constructor ); var name = klass._classRegistryKey; if (!name) { throw new Error("can't serialize object of unregistered class"); } assert_1(registry[name]); var properties = klass.serialize ? // (Temporary workaround) allow a class to provide static // `serialize()` and `deserialize()` methods to bypass the generic // approach. // This temporary workaround lets us use the generic serialization // approach for objects whose members include instances of dynamic // StructArray types. Once we refactor StructArray to be static, // we can remove this complexity. (klass.serialize(input, transferables) ) : {}; if (!klass.serialize) { for (var key in input) { // any cast due to https://github.com/facebook/flow/issues/5393 if (!(input ).hasOwnProperty(key)) { continue; } if (registry[name].omit.indexOf(key) >= 0) { continue; } var property = (input )[key]; properties[key] = registry[name].shallow.indexOf(key) >= 0 ? property : serialize(property, transferables); } if (input instanceof Error) { properties.message = input.message; } } else { // make sure statically serialized object survives transfer of $name property assert_1(!transferables || properties !== transferables[transferables.length - 1]); } if (properties.$name) { throw new Error('$name property is reserved for worker serialization logic.'); } if (name !== 'Object') { properties.$name = name; } return properties; } throw new Error(("can't serialize object of type " + (typeof input))); } function deserialize(input ) { if (input === null || input === undefined || typeof input === 'boolean' || typeof input === 'number' || typeof input === 'string' || input instanceof Boolean || input instanceof Number || input instanceof String || input instanceof Date || input instanceof RegExp || isArrayBuffer(input) || isImageBitmap(input) || ArrayBuffer.isView(input) || input instanceof ImageData) { return input; } if (Array.isArray(input)) { return input.map(deserialize); } if (typeof input === 'object') { var name = (input ).$name || 'Object'; var ref = registry[name]; var klass = ref.klass; if (!klass) { throw new Error(("can't deserialize unregistered class " + name)); } if (klass.deserialize) { return (klass.deserialize )(input); } var result = Object.create(klass.prototype); for (var i = 0, list = Object.keys(input); i < list.length; i += 1) { var key = list[i]; if (key === '$name') { continue; } var value = (input )[key]; result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : deserialize(value); } return result; } throw new Error(("can't deserialize object of type " + (typeof input))); } // function createImage(image , ref , channels , data ) { var width = ref.width; var height = ref.height; if (!data) { data = new Uint8Array(width * height * channels); } else if (data instanceof Uint8ClampedArray) { data = new Uint8Array(data.buffer); } else if (data.length !== width * height * channels) { throw new RangeError('mismatched image size'); } image.width = width; image.height = height; image.data = data; return image; } function resizeImage(image , ref , channels ) { var width = ref.width; var height = ref.height; if (width === image.width && height === image.height) { return; } var newImage = createImage({}, {width: width, height: height}, channels); copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, { width: Math.min(image.width, width), height: Math.min(image.height, height) }, channels); image.width = width; image.height = height; image.data = newImage.data; } function copyImage(srcImg , dstImg , srcPt , dstPt , size , channels ) { if (size.width === 0 || size.height === 0) { return dstImg; } if (size.width > srcImg.width || size.height > srcImg.height || srcPt.x > srcImg.width - size.width || srcPt.y > srcImg.height - size.height) { throw new RangeError('out of range source coordinates for image copy'); } if (size.width > dstImg.width || size.height > dstImg.height || dstPt.x > dstImg.width - size.width || dstPt.y > dstImg.height - size.height) { throw new RangeError('out of range destination coordinates for image copy'); } var srcData = srcImg.data; var dstData = dstImg.data; assert_1(srcData !== dstData); for (var y = 0; y < size.height; y++) { var srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels; var dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels; for (var i = 0; i < size.width * channels; i++) { dstData[dstOffset + i] = srcData[srcOffset + i]; } } return dstImg; } var AlphaImage = function AlphaImage(size , data ) { createImage(this, size, 1, data); }; AlphaImage.prototype.resize = function resize (size ) { resizeImage(this, size, 1); }; AlphaImage.prototype.clone = function clone () { return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; AlphaImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 1); }; // Not premultiplied, because ImageData is not premultiplied. // UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture. var RGBAImage = function RGBAImage(size , data ) { createImage(this, size, 4, data); }; RGBAImage.prototype.resize = function resize (size ) { resizeImage(this, size, 4); }; RGBAImage.prototype.replace = function replace (data , copy ) { if (copy) { this.data.set(data); } else if (data instanceof Uint8ClampedArray) { this.data = new Uint8Array(data.buffer); } else { this.data = data; } }; RGBAImage.prototype.clone = function clone () { return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data)); }; RGBAImage.copy = function copy (srcImg , dstImg , srcPt , dstPt , size ) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 4); }; register('AlphaImage', AlphaImage); register('RGBAImage', RGBAImage); // function _addEventListener(type , listener , listenerList ) { var listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1; if (!listenerExists) { listenerList[type] = listenerList[type] || []; listenerList[type].push(listener); } } function _removeEventListener(type , listener , listenerList ) { if (listenerList && listenerList[type]) { var index = listenerList[type].indexOf(listener); if (index !== -1) { listenerList[type].splice(index, 1); } } } var Event = function Event(type , data) { if ( data === void 0 ) data = {}; extend(this, data); this.type = type; }; var ErrorEvent = /*@__PURE__*/(function (Event) { function ErrorEvent(error , data) { if ( data === void 0 ) data = {}; Event.call(this, 'error', extend({error: error}, data)); } if ( Event ) ErrorEvent.__proto__ = Event; ErrorEvent.prototype = Object.create( Event && Event.prototype ); ErrorEvent.prototype.constructor = ErrorEvent; return ErrorEvent; }(Event)); /** * Methods mixed in to other classes for event capabilities. * * @mixin Evented */ var Evented = function Evented () {}; Evented.prototype.on = function on (type , listener ) { this._listeners = this._listeners || {}; _addEventListener(type, listener, this._listeners); return this; }; /** * Removes a previously registered event listener. * * @param {string} type The event type to remove listeners for. * @param {Function} listener The listener function to remove. * @returns {Object} `this` */ Evented.prototype.off = function off (type , listener ) { _removeEventListener(type, listener, this._listeners); _removeEventListener(type, listener, this._oneTimeListeners); return this; }; /** * Adds a listener that will be called only once to a specified event type. * * The listener will be called first time the event fires after the listener is registered. * * @param {string} type The event type to listen for. * @param {Function} listener The function to be called when the event is fired the first time. * @returns {Object} `this` */ Evented.prototype.once = function once (type , listener ) { this._oneTimeListeners = this._oneTimeListeners || {}; _addEventListener(type, listener, this._oneTimeListeners); return this; }; Evented.prototype.fire = function fire (event , properties ) { // Compatibility with (type: string, properties: Object) signature from previous versions. // See https://github.com/mapbox/mapbox-gl-js/issues/6522, // https://github.com/mapbox/mapbox-gl-draw/issues/766 if (typeof event === 'string') { event = new Event(event, properties || {}); } var type = event.type; if (this.listens(type)) { (event ).target = this; // make sure adding or removing listeners inside other listeners won't cause an infinite loop var listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; for (var i = 0, list = listeners; i < list.length; i += 1) { var listener = list[i]; listener.call(this, event); } var oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : []; for (var i$1 = 0, list$1 = oneTimeListeners; i$1 < list$1.length; i$1 += 1) { var listener$1 = list$1[i$1]; _removeEventListener(type, listener$1, this._oneTimeListeners); listener$1.call(this, event); } var parent = this._eventedParent; if (parent) { extend( event, typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData ); parent.fire(event); } // To ensure that no error events are dropped, print them to the // console if they have no listeners. } else if (event instanceof ErrorEvent) { console.error(event.error); } return this; }; /** * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type. * * @param {string} type The event type * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise * @private */ Evented.prototype.listens = function listens (type ) { return ( (this._listeners && this._listeners[type] && this._listeners[type].length > 0) || (this._oneTimeListeners && this._oneTimeListeners[type] && this._oneTimeListeners[type].length > 0) || (this._eventedParent && this._eventedParent.listens(type)) ); }; /** * Bubble all events fired by this instance of Evented to this parent instance of Evented. * * @private * @returns {Object} `this` * @private */ Evented.prototype.setEventedParent = function setEventedParent (parent , data ) { this._eventedParent = parent; this._eventedParentData = data; return this; }; var $version = 8; var $root = { version: { required: true, type: "enum", values: [ 8 ] }, name: { type: "string" }, metadata: { type: "*" }, center: { type: "array", value: "number" }, zoom: { type: "number" }, bearing: { type: "number", "default": 0, period: 360, units: "degrees" }, pitch: { type: "number", "default": 0, units: "degrees" }, light: { type: "light" }, sources: { required: true, type: "sources" }, sprite: { type: "stringobject" }, glyphs: { type: "stringobject" }, transition: { type: "transition" }, layers: { required: true, type: "array", value: "layer" } }; var sources = { "*": { type: "source" } }; var source = [ "source_vector", "source_raster", "source_raster_dem", "source_geojson", "source_video", "source_image" ]; var source_vector = { type: { required: true, type: "enum", values: { vector: { } } }, url: { type: "string" }, tiles: { type: "array", value: "string" }, bounds: { type: "array", value: "number", length: 4, "default": [ -180, -85.051129, 180, 85.051129 ] }, scheme: { type: "enum", values: { xyz: { }, tms: { } }, "default": "xyz" }, minzoom: { type: "number", "default": 0 }, maxzoom: { type: "number", "default": 22 }, attribution: { type: "string" }, promoteId: { type: "promoteId" }, volatile: { type: "boolean", "default": false }, "*": { type: "*" } }; var source_raster = { type: { required: true, type: "enum", values: { raster: { } } }, url: { type: "string" }, tiles: { type: "array", value: "string" }, bounds: { type: "array", value: "number", length: 4, "default": [ -180, -85.051129, 180, 85.051129 ] }, minzoom: { type: "number", "default": 0 }, maxzoom: { type: "number", "default": 22 }, tileSize: { type: "number", "default": 512, units: "pixels" }, scheme: { type: "enum", values: { xyz: { }, tms: { } }, "default": "xyz" }, attribution: { type: "string" }, volatile: { type: "boolean", "default": false }, "*": { type: "*" } }; var source_raster_dem = { type: { required: true, type: "enum", values: { "raster-dem": { } } }, url: { type: "string" }, tiles: { type: "array", value: "string" }, bounds: { type: "array", value: "number", length: 4, "default": [ -180, -85.051129, 180, 85.051129 ] }, minzoom: { type: "number", "default": 0 }, maxzoom: { type: "number", "default": 22 }, tileSize: { type: "number", "default": 512, units: "pixels" }, attribution: { type: "string" }, encoding: { type: "enum", values: { terrarium: { }, mapbox: { } }, "default": "mapbox" }, volatile: { type: "boolean", "default": false }, "*": { type: "*" } }; var source_geojson = { type: { required: true, type: "enum", values: { geojson: { } } }, data: { type: "*" }, maxzoom: { type: "number", "default": 18 }, attribution: { type: "string" }, customprj: { type: "*" }, buffer: { type: "number", "default": 128, maximum: 512, minimum: 0 }, filter: { type: "*" }, tolerance: { type: "number", "default": 0.375 }, cluster: { type: "boolean", "default": false }, clusterRadius: { type: "number", "default": 50, minimum: 0 }, clusterMaxZoom: { type: "number" }, clusterMinPoints: { type: "number" }, clusterProperties: { type: "*" }, lineMetrics: { type: "boolean", "default": false }, generateId: { type: "boolean", "default": false }, promoteId: { type: "promoteId" } }; var source_video = { type: { required: true, type: "enum", values: { video: { } } }, urls: { required: true, type: "array", value: "string" }, coordinates: { required: true, type: "array", length: 4, value: { type: "array", length: 2, value: "number" } } }; var source_image = { type: { required: true, type: "enum", values: { image: { } } }, url: { required: true, type: "string" }, coordinates: { required: true, type: "array", length: 4, value: { type: "array", length: 2, value: "number" } } }; var layer = { id: { type: "string", required: true }, type: { type: "enum", values: { fill: { }, line: { }, symbol: { }, circle: { }, heatmap: { }, "fill-extrusion": { }, raster: { }, hillshade: { }, background: { } }, required: true }, metadata: { type: "*" }, source: { type: "string" }, "source-layer": { type: "string" }, minzoom: { type: "number", minimum: 0, maximum: 24 }, maxzoom: { type: "number", minimum: 0, maximum: 24 }, filter: { type: "filter" }, layout: { type: "layout" }, paint: { type: "paint" } }; var layout = [ "layout_fill", "layout_line", "layout_circle", "layout_heatmap", "layout_fill-extrusion", "layout_symbol", "layout_raster", "layout_hillshade", "layout_background" ]; var layout_background = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_fill = { "fill-sort-key": { type: "number", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_circle = { "circle-sort-key": { type: "number", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_heatmap = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_line = { "line-cap": { type: "enum", values: { butt: { }, round: { }, square: { } }, "default": "butt", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-join": { type: "enum", values: { bevel: { }, round: { }, miter: { } }, "default": "miter", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "line-miter-limit": { type: "number", "default": 2, requires: [ { "line-join": "miter" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-round-limit": { type: "number", "default": 1.05, requires: [ { "line-join": "round" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-sort-key": { type: "number", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_symbol = { "symbol-placement": { type: "enum", values: { point: { }, line: { }, "line-center": { } }, "default": "point", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "symbol-spacing": { type: "number", "default": 250, minimum: 1, units: "pixels", requires: [ { "symbol-placement": "line" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "symbol-avoid-edges": { type: "boolean", "default": false, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "symbol-sort-key": { type: "number", expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "symbol-z-order": { type: "enum", values: { auto: { }, "viewport-y": { }, source: { } }, "default": "auto", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-allow-overlap": { type: "boolean", "default": false, requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-ignore-placement": { type: "boolean", "default": false, requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-optional": { type: "boolean", "default": false, requires: [ "icon-image", "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-rotation-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-size": { type: "number", "default": 1, minimum: 0, units: "factor of the original icon size", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-text-fit": { type: "enum", values: { none: { }, width: { }, height: { }, both: { } }, "default": "none", requires: [ "icon-image", "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-text-fit-padding": { type: "array", value: "number", length: 4, "default": [ 0, 0, 0, 0 ], units: "pixels", requires: [ "icon-image", "text-field", { "icon-text-fit": [ "both", "width", "height" ] } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-image": { type: "resolvedImage", tokens: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-rotate": { type: "number", "default": 0, period: 360, units: "degrees", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-padding": { type: "number", "default": 2, minimum: 0, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-keep-upright": { type: "boolean", "default": false, requires: [ "icon-image", { "icon-rotation-alignment": "map" }, { "symbol-placement": [ "line", "line-center" ] } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-offset": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-anchor": { type: "enum", values: { center: { }, left: { }, right: { }, top: { }, bottom: { }, "top-left": { }, "top-right": { }, "bottom-left": { }, "bottom-right": { } }, "default": "center", requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "icon-pitch-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-pitch-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-rotation-alignment": { type: "enum", values: { map: { }, viewport: { }, auto: { } }, "default": "auto", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-field": { type: "formatted", "default": "", tokens: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-font": { type: "array", value: "string", "default": [ "Open Sans Regular", "Arial Unicode MS Regular" ], requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-size": { type: "number", "default": 16, minimum: 0, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-max-width": { type: "number", "default": 10, minimum: 0, units: "ems", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-line-height": { type: "number", "default": 1.2, units: "ems", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-letter-spacing": { type: "number", "default": 0, units: "ems", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-justify": { type: "enum", values: { auto: { }, left: { }, center: { }, right: { } }, "default": "center", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-radial-offset": { type: "number", units: "ems", "default": 0, requires: [ "text-field" ], "property-type": "data-driven", expression: { interpolated: true, parameters: [ "zoom", "feature" ] } }, "text-variable-anchor": { type: "array", value: "enum", values: { center: { }, left: { }, right: { }, top: { }, bottom: { }, "top-left": { }, "top-right": { }, "bottom-left": { }, "bottom-right": { } }, requires: [ "text-field", { "symbol-placement": [ "point" ] } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-anchor": { type: "enum", values: { center: { }, left: { }, right: { }, top: { }, bottom: { }, "top-left": { }, "top-right": { }, "bottom-left": { }, "bottom-right": { } }, "default": "center", requires: [ "text-field", { "!": "text-variable-anchor" } ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-max-angle": { type: "number", "default": 45, units: "degrees", requires: [ "text-field", { "symbol-placement": [ "line", "line-center" ] } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-writing-mode": { type: "array", value: "enum", values: { horizontal: { }, vertical: { } }, requires: [ "text-field", { "symbol-placement": [ "point" ] } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-rotate": { type: "number", "default": 0, period: 360, units: "degrees", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-padding": { type: "number", "default": 2, minimum: 0, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-keep-upright": { type: "boolean", "default": true, requires: [ "text-field", { "text-rotation-alignment": "map" }, { "symbol-placement": [ "line", "line-center" ] } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-transform": { type: "enum", values: { none: { }, uppercase: { }, lowercase: { } }, "default": "none", requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-offset": { type: "array", value: "number", units: "ems", length: 2, "default": [ 0, 0 ], requires: [ "text-field", { "!": "text-radial-offset" } ], expression: { interpolated: true, parameters: [ "zoom", "feature" ] }, "property-type": "data-driven" }, "text-allow-overlap": { type: "boolean", "default": false, requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-ignore-placement": { type: "boolean", "default": false, requires: [ "text-field" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-optional": { type: "boolean", "default": false, requires: [ "text-field", "icon-image" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_raster = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var layout_hillshade = { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }; var filter = { type: "array", value: "*" }; var filter_operator = { type: "enum", values: { "==": { }, "!=": { }, ">": { }, ">=": { }, "<": { }, "<=": { }, "in": { }, "!in": { }, all: { }, any: { }, none: { }, has: { }, "!has": { }, within: { } } }; var geometry_type = { type: "enum", values: { Point: { }, LineString: { }, Polygon: { } } }; var function_stop = { type: "array", minimum: 0, maximum: 24, value: [ "number", "color" ], length: 2 }; var expression = { type: "array", value: "*", minimum: 1 }; var light = { anchor: { type: "enum", "default": "viewport", values: { map: { }, viewport: { } }, "property-type": "data-constant", transition: false, expression: { interpolated: false, parameters: [ "zoom" ] } }, position: { type: "array", "default": [ 1.15, 210, 30 ], length: 3, value: "number", "property-type": "data-constant", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] } }, color: { type: "color", "property-type": "data-constant", "default": "#ffffff", expression: { interpolated: true, parameters: [ "zoom" ] }, transition: true }, intensity: { type: "number", "property-type": "data-constant", "default": 0.5, minimum: 0, maximum: 1, expression: { interpolated: true, parameters: [ "zoom" ] }, transition: true } }; var paint = [ "paint_fill", "paint_line", "paint_circle", "paint_heatmap", "paint_fill-extrusion", "paint_symbol", "paint_raster", "paint_hillshade", "paint_background" ]; var paint_fill = { "fill-antialias": { type: "boolean", "default": true, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "fill-pattern" } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-outline-color": { type: "color", transition: true, requires: [ { "!": "fill-pattern" }, { "fill-antialias": true } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "fill-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-pattern": { type: "resolvedImage", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" } }; var paint_line = { "line-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "line-pattern" } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "line-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "line-width": { type: "number", "default": 1, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-gap-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-offset": { type: "number", "default": 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-blur": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "line-dasharray": { type: "array", value: "number", minimum: 0, transition: true, units: "line widths", requires: [ { "!": "line-pattern" } ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "cross-faded" }, "line-pattern": { type: "resolvedImage", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" }, "line-gradient": { type: "color", transition: false, requires: [ { "!": "line-dasharray" }, { "!": "line-pattern" }, { source: "geojson", has: { lineMetrics: true } } ], expression: { interpolated: true, parameters: [ "line-progress" ] }, "property-type": "color-ramp" } }; var paint_circle = { "circle-radius": { type: "number", "default": 5, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-blur": { type: "number", "default": 0, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "circle-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-pitch-scale": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-pitch-alignment": { type: "enum", values: { map: { }, viewport: { } }, "default": "viewport", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "circle-stroke-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-stroke-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "circle-stroke-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" } }; var paint_heatmap = { "heatmap-radius": { type: "number", "default": 30, minimum: 1, transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "heatmap-weight": { type: "number", "default": 1, minimum: 0, transition: false, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "heatmap-intensity": { type: "number", "default": 1, minimum: 0, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "heatmap-color": { type: "color", "default": [ "interpolate", [ "linear" ], [ "heatmap-density" ], 0, "rgba(0, 0, 255, 0)", 0.1, "royalblue", 0.3, "cyan", 0.5, "lime", 0.7, "yellow", 1, "red" ], transition: false, expression: { interpolated: true, parameters: [ "heatmap-density" ] }, "property-type": "color-ramp" }, "heatmap-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_symbol = { "icon-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-color": { type: "color", "default": "#000000", transition: true, requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-halo-color": { type: "color", "default": "rgba(0, 0, 0, 0)", transition: true, requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-halo-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-halo-blur": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "icon-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", requires: [ "icon-image" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "icon-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "icon-image", "icon-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-color": { type: "color", "default": "#000000", transition: true, overridable: true, requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-halo-color": { type: "color", "default": "rgba(0, 0, 0, 0)", transition: true, requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-halo-width": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-halo-blur": { type: "number", "default": 0, minimum: 0, transition: true, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "text-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", requires: [ "text-field" ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "text-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "text-field", "text-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_raster = { "raster-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-hue-rotate": { type: "number", "default": 0, period: 360, transition: true, units: "degrees", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-brightness-min": { type: "number", "default": 0, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-brightness-max": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-saturation": { type: "number", "default": 0, minimum: -1, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-contrast": { type: "number", "default": 0, minimum: -1, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-resampling": { type: "enum", values: { linear: { }, nearest: { } }, "default": "linear", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "raster-fade-duration": { type: "number", "default": 300, minimum: 0, transition: false, units: "milliseconds", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_hillshade = { "hillshade-illumination-direction": { type: "number", "default": 335, minimum: 0, maximum: 359, transition: false, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-illumination-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "viewport", expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-exaggeration": { type: "number", "default": 0.5, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-shadow-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-highlight-color": { type: "color", "default": "#FFFFFF", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "hillshade-accent-color": { type: "color", "default": "#000000", transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var paint_background = { "background-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "background-pattern" } ], expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "background-pattern": { type: "resolvedImage", transition: true, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "cross-faded" }, "background-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" } }; var transition = { duration: { type: "number", "default": 300, minimum: 0, units: "milliseconds" }, delay: { type: "number", "default": 0, minimum: 0, units: "milliseconds" } }; var promoteId = { "*": { type: "string" } }; var spec = { $version: $version, $root: $root, sources: sources, source: source, source_vector: source_vector, source_raster: source_raster, source_raster_dem: source_raster_dem, source_geojson: source_geojson, source_video: source_video, source_image: source_image, layer: layer, layout: layout, layout_background: layout_background, layout_fill: layout_fill, layout_circle: layout_circle, layout_heatmap: layout_heatmap, "layout_fill-extrusion": { visibility: { type: "enum", values: { visible: { }, none: { } }, "default": "visible", "property-type": "constant" } }, layout_line: layout_line, layout_symbol: layout_symbol, layout_raster: layout_raster, layout_hillshade: layout_hillshade, filter: filter, filter_operator: filter_operator, geometry_type: geometry_type, "function": { expression: { type: "expression" }, stops: { type: "array", value: "function_stop" }, base: { type: "number", "default": 1, minimum: 0 }, property: { type: "string", "default": "$zoom" }, type: { type: "enum", values: { identity: { }, exponential: { }, interval: { }, categorical: { } }, "default": "exponential" }, colorSpace: { type: "enum", values: { rgb: { }, lab: { }, hcl: { } }, "default": "rgb" }, "default": { type: "*", required: false } }, function_stop: function_stop, expression: expression, light: light, paint: paint, paint_fill: paint_fill, "paint_fill-extrusion": { "fill-extrusion-opacity": { type: "number", "default": 1, minimum: 0, maximum: 1, transition: true, expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-extrusion-color": { type: "color", "default": "#000000", transition: true, requires: [ { "!": "fill-extrusion-pattern" } ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-extrusion-translate": { type: "array", value: "number", length: 2, "default": [ 0, 0 ], transition: true, units: "pixels", expression: { interpolated: true, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-extrusion-translate-anchor": { type: "enum", values: { map: { }, viewport: { } }, "default": "map", requires: [ "fill-extrusion-translate" ], expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" }, "fill-extrusion-pattern": { type: "resolvedImage", transition: true, expression: { interpolated: false, parameters: [ "zoom", "feature" ] }, "property-type": "cross-faded-data-driven" }, "fill-extrusion-height": { type: "number", "default": 0, minimum: 0, units: "meters", transition: true, expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-extrusion-base": { type: "number", "default": 0, minimum: 0, units: "meters", transition: true, requires: [ "fill-extrusion-height" ], expression: { interpolated: true, parameters: [ "zoom", "feature", "feature-state" ] }, "property-type": "data-driven" }, "fill-extrusion-vertical-gradient": { type: "boolean", "default": true, transition: false, expression: { interpolated: false, parameters: [ "zoom" ] }, "property-type": "data-constant" } }, paint_line: paint_line, paint_circle: paint_circle, paint_heatmap: paint_heatmap, paint_symbol: paint_symbol, paint_raster: paint_raster, paint_hillshade: paint_hillshade, paint_background: paint_background, transition: transition, "property-type": { "data-driven": { type: "property-type" }, "cross-faded": { type: "property-type" }, "cross-faded-data-driven": { type: "property-type" }, "color-ramp": { type: "property-type" }, "data-constant": { type: "property-type" }, constant: { type: "property-type" } }, promoteId: promoteId }; // // Note: Do not inherit from Error. It breaks when transpiling to ES5. var ValidationError = function ValidationError(key , value , message , identifier ) { this.message = (key ? (key + ": ") : '') + message; if (identifier) { this.identifier = identifier; } if (value !== null && value !== undefined && value.__line__) { this.line = value.__line__; } }; function validateConstants(options) { var key = options.key; var constants = options.value; if (constants) { return [new ValidationError(key, constants, 'constants have been deprecated as of v8')]; } else { return []; } } // // Turn jsonlint-lines-primitives objects into primitive objects function unbundle(value ) { if (value instanceof Number || value instanceof String || value instanceof Boolean) { return value.valueOf(); } else { return value; } } function deepUnbundle(value ) { if (Array.isArray(value)) { return value.map(deepUnbundle); } else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) { var unbundledValue = {}; for (var key in value) { unbundledValue[key] = deepUnbundle(value[key]); } return unbundledValue; } return unbundle(value); } function validateObject(options) { var key = options.key; var object = options.value; var elementSpecs = options.valueSpec || {}; var elementValidators = options.objectElementValidators || {}; var style = options.style; var styleSpec = options.styleSpec; var errors = []; var type = getType(object); if (type !== 'object') { return [new ValidationError(key, object, ("object expected, " + type + " found"))]; } for (var objectKey in object) { var elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint' var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; var validateElement = (void 0); if (elementValidators[elementSpecKey]) { validateElement = elementValidators[elementSpecKey]; } else if (elementSpecs[elementSpecKey]) { validateElement = validate; } else if (elementValidators['*']) { validateElement = elementValidators['*']; } else if (elementSpecs['*']) { validateElement = validate; } else { errors.push(new ValidationError(key, object[objectKey], ("unknown property \"" + objectKey + "\""))); continue; } errors = errors.concat(validateElement({ key: (key ? (key + ".") : key) + objectKey, value: object[objectKey], valueSpec: elementSpec, style: style, styleSpec: styleSpec, object: object, objectKey: objectKey }, object)); } for (var elementSpecKey$1 in elementSpecs) { // Don't check `required` when there's a custom validator for that property. if (elementValidators[elementSpecKey$1]) { continue; } if (elementSpecs[elementSpecKey$1].required && elementSpecs[elementSpecKey$1]['default'] === undefined && object[elementSpecKey$1] === undefined) { errors.push(new ValidationError(key, object, ("missing required property \"" + elementSpecKey$1 + "\""))); } } return errors; } function validateArray(options) { var array = options.value; var arraySpec = options.valueSpec; var style = options.style; var styleSpec = options.styleSpec; var key = options.key; var validateArrayElement = options.arrayElementValidator || validate; if (getType(array) !== 'array') { return [new ValidationError(key, array, ("array expected, " + (getType(array)) + " found"))]; } if (arraySpec.length && array.length !== arraySpec.length) { return [new ValidationError(key, array, ("array length " + (arraySpec.length) + " expected, length " + (array.length) + " found"))]; } if (arraySpec['min-length'] && array.length < arraySpec['min-length']) { return [new ValidationError(key, array, ("array length at least " + (arraySpec['min-length']) + " expected, length " + (array.length) + " found"))]; } var arrayElementSpec = { "type": arraySpec.value, "values": arraySpec.values }; if (styleSpec.$version < 7) { arrayElementSpec.function = arraySpec.function; } if (getType(arraySpec.value) === 'object') { arrayElementSpec = arraySpec.value; } var errors = []; for (var i = 0; i < array.length; i++) { errors = errors.concat(validateArrayElement({ array: array, arrayIndex: i, value: array[i], valueSpec: arrayElementSpec, style: style, styleSpec: styleSpec, key: (key + "[" + i + "]") })); } return errors; } function validateNumber(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var type = getType(value); // eslint-disable-next-line no-self-compare if (type === 'number' && value !== value) { type = 'NaN'; } if (type !== 'number') { return [new ValidationError(key, value, ("number expected, " + type + " found"))]; } if ('minimum' in valueSpec && value < valueSpec.minimum) { return [new ValidationError(key, value, (value + " is less than the minimum value " + (valueSpec.minimum)))]; } if ('maximum' in valueSpec && value > valueSpec.maximum) { return [new ValidationError(key, value, (value + " is greater than the maximum value " + (valueSpec.maximum)))]; } return []; } function validateFunction(options) { var functionValueSpec = options.valueSpec; var functionType = unbundle(options.value.type); var stopKeyType; var stopDomainValues = {}; var previousStopDomainValue; var previousStopDomainZoom; var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; var isPropertyFunction = !isZoomFunction; var isZoomAndPropertyFunction = getType(options.value.stops) === 'array' && getType(options.value.stops[0]) === 'array' && getType(options.value.stops[0][0]) === 'object'; var errors = validateObject({ key: options.key, value: options.value, valueSpec: options.styleSpec.function, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { stops: validateFunctionStops, default: validateFunctionDefault } }); if (functionType === 'identity' && isZoomFunction) { errors.push(new ValidationError(options.key, options.value, 'missing required property "property"')); } if (functionType !== 'identity' && !options.value.stops) { errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); } if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) { errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); } if (options.styleSpec.$version >= 8) { if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) { errors.push(new ValidationError(options.key, options.value, 'property functions not supported')); } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) { errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported')); } } if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { errors.push(new ValidationError(options.key, options.value, '"property" property is required')); } return errors; function validateFunctionStops(options) { if (functionType === 'identity') { return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; } var errors = []; var value = options.value; errors = errors.concat(validateArray({ key: options.key, value: value, valueSpec: options.valueSpec, style: options.style, styleSpec: options.styleSpec, arrayElementValidator: validateFunctionStop })); if (getType(value) === 'array' && value.length === 0) { errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); } return errors; } function validateFunctionStop(options) { var errors = []; var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } if (value.length !== 2) { return [new ValidationError(key, value, ("array length 2 expected, length " + (value.length) + " found"))]; } if (isZoomAndPropertyFunction) { if (getType(value[0]) !== 'object') { return [new ValidationError(key, value, ("object expected, " + (getType(value[0])) + " found"))]; } if (value[0].zoom === undefined) { return [new ValidationError(key, value, 'object stop key must have zoom')]; } if (value[0].value === undefined) { return [new ValidationError(key, value, 'object stop key must have value')]; } if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) { return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')]; } if (unbundle(value[0].zoom) !== previousStopDomainZoom) { previousStopDomainZoom = unbundle(value[0].zoom); previousStopDomainValue = undefined; stopDomainValues = {}; } errors = errors.concat(validateObject({ key: (key + "[0]"), value: value[0], valueSpec: {zoom: {}}, style: options.style, styleSpec: options.styleSpec, objectElementValidators: {zoom: validateNumber, value: validateStopDomainValue} })); } else { errors = errors.concat(validateStopDomainValue({ key: (key + "[0]"), value: value[0], valueSpec: {}, style: options.style, styleSpec: options.styleSpec }, value)); } if (isExpression(deepUnbundle(value[1]))) { return errors.concat([new ValidationError((key + "[1]"), value[1], 'expressions are not allowed in function stops.')]); } return errors.concat(validate({ key: (key + "[1]"), value: value[1], valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec })); } function validateStopDomainValue(options, stop) { var type = getType(options.value); var value = unbundle(options.value); var reportValue = options.value !== null ? options.value : stop; if (!stopKeyType) { stopKeyType = type; } else if (type !== stopKeyType) { return [new ValidationError(options.key, reportValue, (type + " stop domain type must match previous stop domain type " + stopKeyType))]; } if (type !== 'number' && type !== 'string' && type !== 'boolean') { return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')]; } if (type !== 'number' && functionType !== 'categorical') { var message = "number expected, " + type + " found"; if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) { message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.'; } return [new ValidationError(options.key, reportValue, message)]; } if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) { return [new ValidationError(options.key, reportValue, ("integer expected, found " + value))]; } if (functionType !== 'categorical' && type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) { return [new ValidationError(options.key, reportValue, 'stop domain values must appear in ascending order')]; } else { previousStopDomainValue = value; } if (functionType === 'categorical' && value in stopDomainValues) { return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')]; } else { stopDomainValues[value] = true; } return []; } function validateFunctionDefault(options) { return validate({ key: options.key, value: options.value, valueSpec: functionValueSpec, style: options.style, styleSpec: options.styleSpec }); } } // function validateExpression(options ) { var expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec); if (expression.result === 'error') { return expression.value.map(function (error) { return new ValidationError(("" + (options.key) + (error.key)), options.value, error.message); }); } var expressionObj = (expression.value ).expression || (expression.value )._styleExpression.expression; if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') && !expressionObj.outputDefined()) { return [new ValidationError(options.key, options.value, ("Invalid data expression for \"" + (options.propertyKey) + "\". Output values must be contained as literals within the expression."))]; } if (options.expressionContext === 'property' && options.propertyType === 'layout' && (!isStateConstant(expressionObj))) { return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with layout properties.')]; } if (options.expressionContext === 'filter' && !isStateConstant(expressionObj)) { return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with filters.')]; } if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) { if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) { return [new ValidationError(options.key, options.value, '"zoom" and "feature-state" expressions are not supported with cluster properties.')]; } if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) { return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')]; } } return []; } function validateBoolean(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'boolean') { return [new ValidationError(key, value, ("boolean expected, " + type + " found"))]; } return []; } function validateColor(options) { var key = options.key; var value = options.value; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("color expected, " + type + " found"))]; } if (csscolorparser_1(value) === null) { return [new ValidationError(key, value, ("color expected, \"" + value + "\" found"))]; } return []; } function validateEnum(options) { var key = options.key; var value = options.value; var valueSpec = options.valueSpec; var errors = []; if (Array.isArray(valueSpec.values)) { // <=v7 if (valueSpec.values.indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (valueSpec.values.join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } else { // >=v8 if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) { errors.push(new ValidationError(key, value, ("expected one of [" + (Object.keys(valueSpec.values).join(', ')) + "], " + (JSON.stringify(value)) + " found"))); } } return errors; } // function isExpressionFilter(filter ) { if (filter === true || filter === false) { return true; } if (!Array.isArray(filter) || filter.length === 0) { return false; } switch (filter[0]) { case 'has': return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type'; case 'in': return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2])); case '!in': case '!has': case 'none': return false; case '==': case '!=': case '>': case '>=': case '<': case '<=': return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2])); case 'any': case 'all': for (var i = 0, list = filter.slice(1); i < list.length; i += 1) { var f = list[i]; if (!isExpressionFilter(f) && typeof f !== 'boolean') { return false; } } return true; default: return true; } } var filterSpec = { 'type': 'boolean', 'default': false, 'transition': false, 'property-type': 'data-driven', 'expression': { 'interpolated': false, 'parameters': ['zoom', 'feature'] } }; /** * Given a filter expressed as nested arrays, return a new function * that evaluates whether a given feature (with a .properties or .tags property) * passes its test. * * @private * @param {Array} filter mapbox gl filter * @returns {Function} filter-evaluating function */ function createFilter(filter ) { if (filter === null || filter === undefined) { return {filter: function () { return true; }, needGeometry: false}; } if (!isExpressionFilter(filter)) { filter = convertFilter(filter); } var compiled = createExpression(filter, filterSpec); if (compiled.result === 'error') { throw new Error(compiled.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } else { var needGeometry = geometryNeeded(filter); return {filter: function (globalProperties , feature , canonical ) { return compiled.value.evaluate(globalProperties, feature, {}, canonical); }, needGeometry: needGeometry}; } } // Comparison function to sort numbers and strings function compare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } function geometryNeeded(filter) { if (!Array.isArray(filter)) { return false; } if (filter[0] === 'within') { return true; } for (var index = 1; index < filter.length; index++) { if (geometryNeeded(filter[index])) { return true; } } return false; } function convertFilter(filter ) { if (!filter) { return true; } var op = filter[0]; if (filter.length <= 1) { return (op !== 'any'); } var converted = op === '==' ? convertComparisonOp(filter[1], filter[2], '==') : op === '!=' ? convertNegation(convertComparisonOp(filter[1], filter[2], '==')) : op === '<' || op === '>' || op === '<=' || op === '>=' ? convertComparisonOp(filter[1], filter[2], op) : op === 'any' ? convertDisjunctionOp(filter.slice(1)) : op === 'all' ? ['all'].concat(filter.slice(1).map(convertFilter)) : op === 'none' ? ['all'].concat(filter.slice(1).map(convertFilter).map(convertNegation)) : op === 'in' ? convertInOp(filter[1], filter.slice(2)) : op === '!in' ? convertNegation(convertInOp(filter[1], filter.slice(2))) : op === 'has' ? convertHasOp(filter[1]) : op === '!has' ? convertNegation(convertHasOp(filter[1])) : op === 'within' ? filter : true; return converted; } function convertComparisonOp(property , value , op ) { switch (property) { case '$type': return [("filter-type-" + op), value]; case '$id': return [("filter-id-" + op), value]; default: return [("filter-" + op), property, value]; } } function convertDisjunctionOp(filters ) { return ['any'].concat(filters.map(convertFilter)); } function convertInOp(property , values ) { if (values.length === 0) { return false; } switch (property) { case '$type': return ["filter-type-in", ['literal', values]]; case '$id': return ["filter-id-in", ['literal', values]]; default: if (values.length > 200 && !values.some(function (v) { return typeof v !== typeof values[0]; })) { return ['filter-in-large', property, ['literal', values.sort(compare)]]; } else { return ['filter-in-small', property, ['literal', values]]; } } } function convertHasOp(property ) { switch (property) { case '$type': return true; case '$id': return ["filter-has-id"]; default: return ["filter-has", property]; } } function convertNegation(filter ) { return ['!', filter]; } function validateFilter(options) { if (isExpressionFilter(deepUnbundle(options.value))) { return validateExpression(extend$2({}, options, { expressionContext: 'filter', valueSpec: {value: 'boolean'} })); } else { return validateNonExpressionFilter(options); } } function validateNonExpressionFilter(options) { var value = options.value; var key = options.key; if (getType(value) !== 'array') { return [new ValidationError(key, value, ("array expected, " + (getType(value)) + " found"))]; } var styleSpec = options.styleSpec; var type; var errors = []; if (value.length < 1) { return [new ValidationError(key, value, 'filter array must have at least 1 element')]; } errors = errors.concat(validateEnum({ key: (key + "[0]"), value: value[0], valueSpec: styleSpec.filter_operator, style: options.style, styleSpec: options.styleSpec })); switch (unbundle(value[0])) { case '<': case '<=': case '>': case '>=': if (value.length >= 2 && unbundle(value[1]) === '$type') { errors.push(new ValidationError(key, value, ("\"$type\" cannot be use with operator \"" + (value[0]) + "\""))); } /* falls through */ case '==': case '!=': if (value.length !== 3) { errors.push(new ValidationError(key, value, ("filter array for operator \"" + (value[0]) + "\" must have 3 elements"))); } /* falls through */ case 'in': case '!in': if (value.length >= 2) { type = getType(value[1]); if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } } for (var i = 2; i < value.length; i++) { type = getType(value[i]); if (unbundle(value[1]) === '$type') { errors = errors.concat(validateEnum({ key: (key + "[" + i + "]"), value: value[i], valueSpec: styleSpec.geometry_type, style: options.style, styleSpec: options.styleSpec })); } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { errors.push(new ValidationError((key + "[" + i + "]"), value[i], ("string, number, or boolean expected, " + type + " found"))); } } break; case 'any': case 'all': case 'none': for (var i$1 = 1; i$1 < value.length; i$1++) { errors = errors.concat(validateNonExpressionFilter({ key: (key + "[" + i$1 + "]"), value: value[i$1], style: options.style, styleSpec: options.styleSpec })); } break; case 'has': case '!has': type = getType(value[1]); if (value.length !== 2) { errors.push(new ValidationError(key, value, ("filter array for \"" + (value[0]) + "\" operator must have 2 elements"))); } else if (type !== 'string') { errors.push(new ValidationError((key + "[1]"), value[1], ("string expected, " + type + " found"))); } break; case 'within': type = getType(value[1]); if (value.length !== 2) { errors.push(new ValidationError(key, value, ("filter array for \"" + (value[0]) + "\" operator must have 2 elements"))); } else if (type !== 'object') { errors.push(new ValidationError((key + "[1]"), value[1], ("object expected, " + type + " found"))); } break; } return errors; } function validateProperty(options, propertyType) { var key = options.key; var style = options.style; var styleSpec = options.styleSpec; var value = options.value; var propertyKey = options.objectKey; var layerSpec = styleSpec[(propertyType + "_" + (options.layerType))]; if (!layerSpec) { return []; } var transitionMatch = propertyKey.match(/^(.*)-transition$/); if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { return validate({ key: key, value: value, valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec }); } var valueSpec = options.valueSpec || layerSpec[propertyKey]; if (!valueSpec) { return [new ValidationError(key, value, ("unknown property \"" + propertyKey + "\""))]; } var tokenMatch; if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !valueSpec.tokens && (tokenMatch = /^{([^}]+)}$/.exec(value))) { return [new ValidationError( key, value, "\"" + propertyKey + "\" does not support interpolation syntax\n" + "Use an identity property function instead: `{ \"type\": \"identity\", \"property\": " + (JSON.stringify(tokenMatch[1])) + " }`.")]; } var errors = []; // if (options.layerType === 'symbol') { // if (propertyKey === 'text-field' && style && !style.glyphs) { // errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property')); // } // if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') { // errors.push(new ValidationError(key, value, '"text-font" does not support identity functions')); // } // } return errors.concat(validate({ key: options.key, value: value, valueSpec: valueSpec, style: style, styleSpec: styleSpec, expressionContext: 'property', propertyType: propertyType, propertyKey: propertyKey })); } function validatePaintProperty(options) { return validateProperty(options, 'paint'); } function validateLayoutProperty(options) { return validateProperty(options, 'layout'); } function validateLayer(options) { var errors = []; var layer = options.value; var key = options.key; var style = options.style; var styleSpec = options.styleSpec; if (!layer.type && !layer.ref) { errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); } var type = unbundle(layer.type); var ref = unbundle(layer.ref); if (layer.id) { var layerId = unbundle(layer.id); for (var i = 0; i < options.arrayIndex; i++) { var otherLayer = style.layers[i]; if (unbundle(otherLayer.id) === layerId) { errors.push(new ValidationError(key, layer.id, ("duplicate layer id \"" + (layer.id) + "\", previously used at line " + (otherLayer.id.__line__)))); } } } if ('ref' in layer) { ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) { if (p in layer) { errors.push(new ValidationError(key, layer[p], ("\"" + p + "\" is prohibited for ref layers"))); } }); var parent; style.layers.forEach(function (layer) { if (unbundle(layer.id) === ref) { parent = layer; } }); if (!parent) { errors.push(new ValidationError(key, layer.ref, ("ref layer \"" + ref + "\" not found"))); } else if (parent.ref) { errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer')); } else { type = unbundle(parent.type); } } else if (type !== 'background') { if (!layer.source) { errors.push(new ValidationError(key, layer, 'missing required property "source"')); } else { var source = style.sources && style.sources[layer.source]; var sourceType = source && unbundle(source.type); if (!source) { errors.push(new ValidationError(key, layer.source, ("source \"" + (layer.source) + "\" not found"))); } else if (sourceType === 'vector' && type === 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a raster source"))); } else if (sourceType === 'raster' && type !== 'raster') { errors.push(new ValidationError(key, layer.source, ("layer \"" + (layer.id) + "\" requires a vector source"))); } else if (sourceType === 'vector' && !layer['source-layer']) { errors.push(new ValidationError(key, layer, ("layer \"" + (layer.id) + "\" must specify a \"source-layer\""))); } else if (sourceType === 'raster-dem' && type !== 'hillshade') { errors.push(new ValidationError(key, layer.source, 'raster-dem source can only be used with layer type \'hillshade\'.')); } else if (type === 'line' && layer.paint && layer.paint['line-gradient'] && (sourceType !== 'geojson' || !source.lineMetrics)) { errors.push(new ValidationError(key, layer, ("layer \"" + (layer.id) + "\" specifies a line-gradient, which requires a GeoJSON source with `lineMetrics` enabled."))); } } } errors = errors.concat(validateObject({ key: key, value: layer, valueSpec: styleSpec.layer, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _() { return []; }, // We don't want to enforce the spec's `"requires": true` for backward compatibility with refs; // the actual requirement is validated above. See https://github.com/mapbox/mapbox-gl-js/issues/5772. type: function type() { return validate({ key: (key + ".type"), value: layer.type, valueSpec: styleSpec.layer.type, style: options.style, styleSpec: options.styleSpec, object: layer, objectKey: 'type' }); }, filter: validateFilter, layout: function layout(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _(options) { return validateLayoutProperty(extend$2({layerType: type}, options)); } } }); }, paint: function paint(options) { return validateObject({ layer: layer, key: options.key, value: options.value, style: options.style, styleSpec: options.styleSpec, objectElementValidators: { '*': function _(options) { return validatePaintProperty(extend$2({layerType: type}, options)); } } }); } } })); return errors; } function validateString(options) { var value = options.value; var key = options.key; var type = getType(value); if (type !== 'string') { return [new ValidationError(key, value, ("string expected, " + type + " found"))]; } return []; } var objectElementValidators = { promoteId: validatePromoteId }; function validateSource(options) { var value = options.value; var key = options.key; var styleSpec = options.styleSpec; var style = options.style; if (!value.type) { return [new ValidationError(key, value, '"type" is required')]; } var type = unbundle(value.type); var errors; switch (type) { case 'vector': case 'raster': case 'raster-dem': errors = validateObject({ key: key, value: value, valueSpec: styleSpec[("source_" + (type.replace('-', '_')))], style: options.style, styleSpec: styleSpec, objectElementValidators: objectElementValidators }); return errors; case 'geojson': errors = validateObject({ key: key, value: value, valueSpec: styleSpec.source_geojson, style: style, styleSpec: styleSpec, objectElementValidators: objectElementValidators }); if (value.cluster) { for (var prop in value.clusterProperties) { var ref = value.clusterProperties[prop]; var operator = ref[0]; var mapExpr = ref[1]; var reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator; errors.push.apply(errors, validateExpression({ key: (key + "." + prop + ".map"), value: mapExpr, expressionContext: 'cluster-map' })); errors.push.apply(errors, validateExpression({ key: (key + "." + prop + ".reduce"), value: reduceExpr, expressionContext: 'cluster-reduce' })); } } return errors; case 'video': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_video, style: style, styleSpec: styleSpec }); case 'image': return validateObject({ key: key, value: value, valueSpec: styleSpec.source_image, style: style, styleSpec: styleSpec }); case 'canvas': return [new ValidationError(key, null, "Please use runtime APIs to add canvas sources, rather than including them in stylesheets.", 'source.canvas')]; default: return validateEnum({ key: (key + ".type"), value: value.type, valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']}, style: style, styleSpec: styleSpec }); } } function validatePromoteId(ref) { var key = ref.key; var value = ref.value; if (getType(value) === 'string') { return validateString({key: key, value: value}); } else { var errors = []; for (var prop in value) { errors.push.apply(errors, validateString({key: (key + "." + prop), value: value[prop]})); } return errors; } } function validateLight(options) { var light = options.value; var styleSpec = options.styleSpec; var lightSpec = styleSpec.light; var style = options.style; var errors = []; var rootType = getType(light); if (light === undefined) { return errors; } else if (rootType !== 'object') { errors = errors.concat([new ValidationError('light', light, ("object expected, " + rootType + " found"))]); return errors; } for (var key in light) { var transitionMatch = key.match(/^(.*)-transition$/); if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: styleSpec.transition, style: style, styleSpec: styleSpec })); } else if (lightSpec[key]) { errors = errors.concat(validate({ key: key, value: light[key], valueSpec: lightSpec[key], style: style, styleSpec: styleSpec })); } else { errors = errors.concat([new ValidationError(key, light[key], ("unknown property \"" + key + "\""))]); } } return errors; } // function validateFormatted(options ) { if (validateString(options).length === 0) { return []; } return validateExpression(options); } // function validateImage(options ) { if (validateString(options).length === 0) { return []; } return validateExpression(options); } function validateStringObject(options) { var value = options.value; var key = options.key; var type = getType(value); if (type == 'string') { return []; } if (type == 'object') { var errors = []; for (var key$1 in value) { var t = getType(value[key$1]); if (t !== 'string') { errors.push(new ValidationError(key$1, value[key$1], ("string expected, " + t + " found"))); } } return errors; } return [new ValidationError(key, value, ("string expected, " + type + " found"))]; } var VALIDATORS = { '*': function _() { return []; }, 'array': validateArray, 'boolean': validateBoolean, 'number': validateNumber, 'color': validateColor, 'constants': validateConstants, 'enum': validateEnum, 'filter': validateFilter, 'function': validateFunction, 'layer': validateLayer, 'object': validateObject, 'source': validateSource, 'light': validateLight, 'string': validateString, 'formatted': validateFormatted, 'resolvedImage': validateImage, 'stringobject':validateStringObject }; // Main recursive validation function. Tracks: // // - key: string representing location of validation in style tree. Used only // for more informative error reporting. // - value: current value from style being evaluated. May be anything from a // high level object that needs to be descended into deeper or a simple // scalar value. // - valueSpec: current spec being evaluated. Tracks value. // - styleSpec: current full spec being evaluated. function validate(options) { var value = options.value; var valueSpec = options.valueSpec; var styleSpec = options.styleSpec; if (valueSpec.expression && isFunction(unbundle(value))) { return validateFunction(options); } else if (valueSpec.expression && isExpression(deepUnbundle(value))) { return validateExpression(options); } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { return VALIDATORS[valueSpec.type](options); } else { var valid = validateObject(extend$2({}, options, { valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec })); return valid; } } function validate_glyphs_url(options) { var value = options.value; var key = options.key; var errors = validateString(options); if (errors.length) { return errors; } if (value.indexOf('{fontstack}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token')); } if (value.indexOf('{range}') === -1) { errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); } return errors; } /** * Validate a Mapbox GL style against the style specification. This entrypoint, * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as * small a browserify bundle as possible by omitting unnecessary functionality * and legacy style specifications. * * @private * @param {Object} style The style to be validated. * @param {Object} [styleSpec] The style specification to validate against. * If omitted, the latest style spec is used. * @returns {Array} * @example * var validate = require('mapbox-gl-style-spec/lib/validate_style.min'); * var errors = validate(style); */ function validateStyleMin(style, styleSpec) { if ( styleSpec === void 0 ) styleSpec = spec; var errors = []; errors = errors.concat(validate({ key: '', value: style, valueSpec: styleSpec.$root, styleSpec: styleSpec, style: style, objectElementValidators: { // glyphs: validateGlyphsURL, '*': function _() { return []; } } })); if (style.constants) { errors = errors.concat(validateConstants({ key: 'constants', value: style.constants, style: style, styleSpec: styleSpec })); } return sortErrors(errors); } validateStyleMin.source = wrapCleanErrors(validateSource); validateStyleMin.light = wrapCleanErrors(validateLight); validateStyleMin.layer = wrapCleanErrors(validateLayer); validateStyleMin.filter = wrapCleanErrors(validateFilter); validateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty); validateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty); function sortErrors(errors) { return [].concat(errors).sort(function (a, b) { return a.line - b.line; }); } function wrapCleanErrors(inner) { return function() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return sortErrors(inner.apply(this, args)); }; } // var validateStyle = (validateStyleMin ); var validateSource$1 = validateStyle.source; var validateLight$1 = validateStyle.light; var validateFilter$1 = validateStyle.filter; var validatePaintProperty$1 = validateStyle.paintProperty; var validateLayoutProperty$1 = validateStyle.layoutProperty; function emitValidationErrors(emitter , errors ) { var hasErrors = false; if (errors && errors.length) { for (var i = 0, list = errors; i < list.length; i += 1) { var error = list[i]; emitter.fire(new ErrorEvent(new Error(error.message))); hasErrors = true; } } return hasErrors; } // var ZoomHistory = function ZoomHistory() { this.first = true; }; ZoomHistory.prototype.update = function update (z , now ) { var floorZ = Math.floor(z); if (this.first) { this.first = false; this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = 0; this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } if (this.lastFloorZoom > floorZ) { this.lastIntegerZoom = floorZ + 1; this.lastIntegerZoomTime = now; } else if (this.lastFloorZoom < floorZ) { this.lastIntegerZoom = floorZ; this.lastIntegerZoomTime = now; } if (z !== this.lastZoom) { this.lastZoom = z; this.lastFloorZoom = floorZ; return true; } return false; }; // // The following table comes from . // Keep it synchronized with . var unicodeBlockLookup = { // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F, 'Latin-1 Supplement': function (char) { return char >= 0x0080 && char <= 0x00FF; }, // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F, // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F, // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF, // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF, // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F, // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF, // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF, // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F, // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F, //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF, 'Arabic': function (char) { return char >= 0x0600 && char <= 0x06FF; }, //'Syriac': (char) => char >= 0x0700 && char <= 0x074F, 'Arabic Supplement': function (char) { return char >= 0x0750 && char <= 0x077F; }, // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF, // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF, // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F, // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F, // 'Syriac Supplement': (char) => char >= 0x0860 && char <= 0x086F, 'Arabic Extended-A': function (char) { return char >= 0x08A0 && char <= 0x08FF; }, // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F, // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF, // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F, // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF, // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F, // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF, // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F, // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF, // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F, // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF, // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F, // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF, // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF, // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F, // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF, 'Hangul Jamo': function (char) { return char >= 0x1100 && char <= 0x11FF; }, // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F, // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F, // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF, 'Unified Canadian Aboriginal Syllabics': function (char) { return char >= 0x1400 && char <= 0x167F; }, // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F, // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF, // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F, // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F, // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F, // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F, 'Khmer': function (char) { return char >= 0x1780 && char <= 0x17FF; }, // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF, 'Unified Canadian Aboriginal Syllabics Extended': function (char) { return char >= 0x18B0 && char <= 0x18FF; }, // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F, // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F, // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF, // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF, // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F, // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF, // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF, // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F, // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF, // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF, // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F, // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F, // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F, // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF, // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF, // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF, // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F, // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF, // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF, // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF, // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF, 'General Punctuation': function (char) { return char >= 0x2000 && char <= 0x206F; }, // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F, // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF, // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF, 'Letterlike Symbols': function (char) { return char >= 0x2100 && char <= 0x214F; }, 'Number Forms': function (char) { return char >= 0x2150 && char <= 0x218F; }, // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF, // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF, 'Miscellaneous Technical': function (char) { return char >= 0x2300 && char <= 0x23FF; }, 'Control Pictures': function (char) { return char >= 0x2400 && char <= 0x243F; }, 'Optical Character Recognition': function (char) { return char >= 0x2440 && char <= 0x245F; }, 'Enclosed Alphanumerics': function (char) { return char >= 0x2460 && char <= 0x24FF; }, // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F, // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F, 'Geometric Shapes': function (char) { return char >= 0x25A0 && char <= 0x25FF; }, 'Miscellaneous Symbols': function (char) { return char >= 0x2600 && char <= 0x26FF; }, // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF, // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF, // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF, // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF, // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F, // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF, // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF, 'Miscellaneous Symbols and Arrows': function (char) { return char >= 0x2B00 && char <= 0x2BFF; }, // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F, // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F, // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF, // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F, // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F, // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF, // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF, // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F, 'CJK Radicals Supplement': function (char) { return char >= 0x2E80 && char <= 0x2EFF; }, 'Kangxi Radicals': function (char) { return char >= 0x2F00 && char <= 0x2FDF; }, 'Ideographic Description Characters': function (char) { return char >= 0x2FF0 && char <= 0x2FFF; }, 'CJK Symbols and Punctuation': function (char) { return char >= 0x3000 && char <= 0x303F; }, 'Hiragana': function (char) { return char >= 0x3040 && char <= 0x309F; }, 'Katakana': function (char) { return char >= 0x30A0 && char <= 0x30FF; }, 'Bopomofo': function (char) { return char >= 0x3100 && char <= 0x312F; }, 'Hangul Compatibility Jamo': function (char) { return char >= 0x3130 && char <= 0x318F; }, 'Kanbun': function (char) { return char >= 0x3190 && char <= 0x319F; }, 'Bopomofo Extended': function (char) { return char >= 0x31A0 && char <= 0x31BF; }, 'CJK Strokes': function (char) { return char >= 0x31C0 && char <= 0x31EF; }, 'Katakana Phonetic Extensions': function (char) { return char >= 0x31F0 && char <= 0x31FF; }, 'Enclosed CJK Letters and Months': function (char) { return char >= 0x3200 && char <= 0x32FF; }, 'CJK Compatibility': function (char) { return char >= 0x3300 && char <= 0x33FF; }, 'CJK Unified Ideographs Extension A': function (char) { return char >= 0x3400 && char <= 0x4DBF; }, 'Yijing Hexagram Symbols': function (char) { return char >= 0x4DC0 && char <= 0x4DFF; }, 'CJK Unified Ideographs': function (char) { return char >= 0x4E00 && char <= 0x9FFF; }, 'Yi Syllables': function (char) { return char >= 0xA000 && char <= 0xA48F; }, 'Yi Radicals': function (char) { return char >= 0xA490 && char <= 0xA4CF; }, // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF, // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F, // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F, // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF, // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F, // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF, // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F, // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F, // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F, // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF, // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF, // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F, // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F, 'Hangul Jamo Extended-A': function (char) { return char >= 0xA960 && char <= 0xA97F; }, // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF, // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF, // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F, // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F, // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF, // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF, // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F, // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F, // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF, // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF, 'Hangul Syllables': function (char) { return char >= 0xAC00 && char <= 0xD7AF; }, 'Hangul Jamo Extended-B': function (char) { return char >= 0xD7B0 && char <= 0xD7FF; }, // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F, // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF, // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF, 'Private Use Area': function (char) { return char >= 0xE000 && char <= 0xF8FF; }, 'CJK Compatibility Ideographs': function (char) { return char >= 0xF900 && char <= 0xFAFF; }, // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, 'Arabic Presentation Forms-A': function (char) { return char >= 0xFB50 && char <= 0xFDFF; }, // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, 'Vertical Forms': function (char) { return char >= 0xFE10 && char <= 0xFE1F; }, // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, 'CJK Compatibility Forms': function (char) { return char >= 0xFE30 && char <= 0xFE4F; }, 'Small Form Variants': function (char) { return char >= 0xFE50 && char <= 0xFE6F; }, 'Arabic Presentation Forms-B': function (char) { return char >= 0xFE70 && char <= 0xFEFF; }, 'Halfwidth and Fullwidth Forms': function (char) { return char >= 0xFF00 && char <= 0xFFEF; } // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF, // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F, // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF, // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F, // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F, // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF, // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF, // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F, // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF, // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF, // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F, // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F, // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F, // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F, // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF, // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F, // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F, // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF, // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF, // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F, // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F, // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F, // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F, // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F, // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F, // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF, // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF, // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F, // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F, // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F, // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF, // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F, // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F, // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F, // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF, // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F, // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F, // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F, // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF, // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F, // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF, // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F, // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F, // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F, // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F, // 'Elymaic': (char) => char >= 0x10FE0 && char <= 0x10FFF, // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F, // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF, // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF, // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F, // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F, // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF, // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF, // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F, // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF, // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF, // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F, // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F, // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF, // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF, // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F, // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F, // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF, // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F, // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F, // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF, // 'Nandinagari': (char) => char >= 0x119A0 && char <= 0x119FF, // 'Zanabazar Square': (char) => char >= 0x11A00 && char <= 0x11A4F, // 'Soyombo': (char) => char >= 0x11A50 && char <= 0x11AAF, // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF, // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F, // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF, // 'Masaram Gondi': (char) => char >= 0x11D00 && char <= 0x11D5F, // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF, // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF, // 'Tamil Supplement': (char) => char >= 0x11FC0 && char <= 0x11FFF, // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF, // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F, // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F, // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F, // 'Egyptian Hieroglyph Format Controls': (char) => char >= 0x13430 && char <= 0x1343F, // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F, // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F, // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F, // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF, // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F, // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F, // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F, // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF, // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF, // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF, // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF, // 'Kana Extended-A': (char) => char >= 0x1B100 && char <= 0x1B12F, // 'Small Kana Extension': (char) => char >= 0x1B130 && char <= 0x1B16F, // 'Nushu': (char) => char >= 0x1B170 && char <= 0x1B2FF, // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F, // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF, // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF, // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF, // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F, // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF, // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F, // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F, // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF, // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF, // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F, // 'Nyiakeng Puachue Hmong': (char) => char >= 0x1E100 && char <= 0x1E14F, // 'Wancho': (char) => char >= 0x1E2C0 && char <= 0x1E2FF, // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF, // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F, // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF, // 'Ottoman Siyaq Numbers': (char) => char >= 0x1ED00 && char <= 0x1ED4F, // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF, // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F, // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F, // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF, // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF, // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF, // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF, // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F, // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F, // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF, // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F, // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF, // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF, // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF, // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F, // 'Symbols and Pictographs Extended-A': (char) => char >= 0x1FA70 && char <= 0x1FAFF, // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF, // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F, // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F, // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF, // 'CJK Unified Ideographs Extension F': (char) => char >= 0x2CEB0 && char <= 0x2EBEF, // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F, // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F, // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF, // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF, // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF, }; // function allowsIdeographicBreaking(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charAllowsIdeographicBreaking(char.charCodeAt(0))) { return false; } } return true; } function allowsVerticalWritingMode(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (charHasUprightVerticalOrientation(char.charCodeAt(0))) { return true; } } return false; } function allowsLetterSpacing(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charAllowsLetterSpacing(char.charCodeAt(0))) { return false; } } return true; } function charAllowsLetterSpacing(char ) { if (unicodeBlockLookup['Arabic'](char)) { return false; } if (unicodeBlockLookup['Arabic Supplement'](char)) { return false; } if (unicodeBlockLookup['Arabic Extended-A'](char)) { return false; } if (unicodeBlockLookup['Arabic Presentation Forms-A'](char)) { return false; } if (unicodeBlockLookup['Arabic Presentation Forms-B'](char)) { return false; } return true; } function charAllowsIdeographicBreaking(char ) { // Return early for characters outside all ideographic ranges. if (char < 0x2E80) { return false; } if (unicodeBlockLookup['Bopomofo Extended'](char)) { return true; } if (unicodeBlockLookup['Bopomofo'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility'](char)) { return true; } if (unicodeBlockLookup['CJK Radicals Supplement'](char)) { return true; } if (unicodeBlockLookup['CJK Strokes'](char)) { return true; } if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) { return true; } if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) { return true; } if (unicodeBlockLookup['CJK Unified Ideographs'](char)) { return true; } if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) { return true; } if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) { return true; } if (unicodeBlockLookup['Hiragana'](char)) { return true; } if (unicodeBlockLookup['Ideographic Description Characters'](char)) { return true; } if (unicodeBlockLookup['Kangxi Radicals'](char)) { return true; } if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) { return true; } if (unicodeBlockLookup['Katakana'](char)) { return true; } if (unicodeBlockLookup['Vertical Forms'](char)) { return true; } if (unicodeBlockLookup['Yi Radicals'](char)) { return true; } if (unicodeBlockLookup['Yi Syllables'](char)) { return true; } return false; } // The following logic comes from // . // Keep it synchronized with // . // The data file denotes with “U” or “Tu” any codepoint that may be drawn // upright in vertical text but does not distinguish between upright and // “neutral” characters. // Blocks in the Unicode supplementary planes are excluded from this module due // to . /** * Returns true if the given Unicode codepoint identifies a character with * upright orientation. * * A character has upright orientation if it is drawn upright (unrotated) * whether the line is oriented horizontally or vertically, even if both * adjacent characters can be rotated. For example, a Chinese character is * always drawn upright. An uprightly oriented character causes an adjacent * “neutral” character to be drawn upright as well. * @private */ function charHasUprightVerticalOrientation(char ) { if (char === 0x02EA /* modifier letter yin departing tone mark */ || char === 0x02EB /* modifier letter yang departing tone mark */) { return true; } // Return early for characters outside all ranges whose characters remain // upright in vertical writing mode. if (char < 0x1100) { return false; } if (unicodeBlockLookup['Bopomofo Extended'](char)) { return true; } if (unicodeBlockLookup['Bopomofo'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) { return true; } } if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility'](char)) { return true; } if (unicodeBlockLookup['CJK Radicals Supplement'](char)) { return true; } if (unicodeBlockLookup['CJK Strokes'](char)) { return true; } if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) { if (!((char >= 0x3008 /* left angle bracket */ && char <= 0x3011) /* right black lenticular bracket */) && !((char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F) /* low double prime quotation mark */) && char !== 0x3030 /* wavy dash */) { return true; } } if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) { return true; } if (unicodeBlockLookup['CJK Unified Ideographs'](char)) { return true; } if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) { return true; } if (unicodeBlockLookup['Hangul Compatibility Jamo'](char)) { return true; } if (unicodeBlockLookup['Hangul Jamo Extended-A'](char)) { return true; } if (unicodeBlockLookup['Hangul Jamo Extended-B'](char)) { return true; } if (unicodeBlockLookup['Hangul Jamo'](char)) { return true; } if (unicodeBlockLookup['Hangul Syllables'](char)) { return true; } if (unicodeBlockLookup['Hiragana'](char)) { return true; } if (unicodeBlockLookup['Ideographic Description Characters'](char)) { return true; } if (unicodeBlockLookup['Kanbun'](char)) { return true; } if (unicodeBlockLookup['Kangxi Radicals'](char)) { return true; } if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) { return true; } if (unicodeBlockLookup['Katakana'](char)) { if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) { return true; } } if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) { if (char !== 0xFF08 /* fullwidth left parenthesis */ && char !== 0xFF09 /* fullwidth right parenthesis */ && char !== 0xFF0D /* fullwidth hyphen-minus */ && !((char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E) /* fullwidth greater-than sign */) && char !== 0xFF3B /* fullwidth left square bracket */ && char !== 0xFF3D /* fullwidth right square bracket */ && char !== 0xFF3F /* fullwidth low line */ && !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) && char !== 0xFFE3 /* fullwidth macron */ && !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) { return true; } } if (unicodeBlockLookup['Small Form Variants'](char)) { if (!((char >= 0xFE58 /* small em dash */ && char <= 0xFE5E) /* small right tortoise shell bracket */) && !((char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66) /* small equals sign */)) { return true; } } if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char)) { return true; } if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char)) { return true; } if (unicodeBlockLookup['Vertical Forms'](char)) { return true; } if (unicodeBlockLookup['Yijing Hexagram Symbols'](char)) { return true; } if (unicodeBlockLookup['Yi Syllables'](char)) { return true; } if (unicodeBlockLookup['Yi Radicals'](char)) { return true; } return false; } /** * Returns true if the given Unicode codepoint identifies a character with * neutral orientation. * * A character has neutral orientation if it may be drawn rotated or unrotated * when the line is oriented vertically, depending on the orientation of the * adjacent characters. For example, along a verticlly oriented line, the vulgar * fraction ½ is drawn upright among Chinese characters but rotated among Latin * letters. A neutrally oriented character does not influence whether an * adjacent character is drawn upright or rotated. * @private */ function charHasNeutralVerticalOrientation(char ) { if (unicodeBlockLookup['Latin-1 Supplement'](char)) { if (char === 0x00A7 /* section sign */ || char === 0x00A9 /* copyright sign */ || char === 0x00AE /* registered sign */ || char === 0x00B1 /* plus-minus sign */ || char === 0x00BC /* vulgar fraction one quarter */ || char === 0x00BD /* vulgar fraction one half */ || char === 0x00BE /* vulgar fraction three quarters */ || char === 0x00D7 /* multiplication sign */ || char === 0x00F7 /* division sign */) { return true; } } if (unicodeBlockLookup['General Punctuation'](char)) { if (char === 0x2016 /* double vertical line */ || char === 0x2020 /* dagger */ || char === 0x2021 /* double dagger */ || char === 0x2030 /* per mille sign */ || char === 0x2031 /* per ten thousand sign */ || char === 0x203B /* reference mark */ || char === 0x203C /* double exclamation mark */ || char === 0x2042 /* asterism */ || char === 0x2047 /* double question mark */ || char === 0x2048 /* question exclamation mark */ || char === 0x2049 /* exclamation question mark */ || char === 0x2051 /* two asterisks aligned vertically */) { return true; } } if (unicodeBlockLookup['Letterlike Symbols'](char)) { return true; } if (unicodeBlockLookup['Number Forms'](char)) { return true; } if (unicodeBlockLookup['Miscellaneous Technical'](char)) { if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) || (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) || (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) || char === 0x232B /* erase to the left */ || (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) || (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) || char === 0x23CF /* eject symbol */ || (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) || (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) { return true; } } if (unicodeBlockLookup['Control Pictures'](char) && char !== 0x2423 /* open box */) { return true; } if (unicodeBlockLookup['Optical Character Recognition'](char)) { return true; } if (unicodeBlockLookup['Enclosed Alphanumerics'](char)) { return true; } if (unicodeBlockLookup['Geometric Shapes'](char)) { return true; } if (unicodeBlockLookup['Miscellaneous Symbols'](char)) { if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) { return true; } } if (unicodeBlockLookup['Miscellaneous Symbols and Arrows'](char)) { if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) || (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) || (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) { return true; } } if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) { return true; } if (unicodeBlockLookup['Katakana'](char)) { return true; } if (unicodeBlockLookup['Private Use Area'](char)) { return true; } if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { return true; } if (unicodeBlockLookup['Small Form Variants'](char)) { return true; } if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) { return true; } if (char === 0x221E /* infinity */ || char === 0x2234 /* therefore */ || char === 0x2235 /* because */ || (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) || (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) || char === 0xFFFC /* object replacement character */ || char === 0xFFFD /* replacement character */) { return true; } return false; } /** * Returns true if the given Unicode codepoint identifies a character with * rotated orientation. * * A character has rotated orientation if it is drawn rotated when the line is * oriented vertically, even if both adjacent characters are upright. For * example, a Latin letter is drawn rotated along a vertical line. A rotated * character causes an adjacent “neutral” character to be drawn rotated as well. * @private */ function charHasRotatedVerticalOrientation(char ) { return !(charHasUprightVerticalOrientation(char) || charHasNeutralVerticalOrientation(char)); } function charInComplexShapingScript(char ) { return unicodeBlockLookup['Arabic'](char) || unicodeBlockLookup['Arabic Supplement'](char) || unicodeBlockLookup['Arabic Extended-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-B'](char); } function charInRTLScript(char ) { // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts return (char >= 0x0590 && char <= 0x08FF) || unicodeBlockLookup['Arabic Presentation Forms-A'](char) || unicodeBlockLookup['Arabic Presentation Forms-B'](char); } function charInSupportedScript(char , canRenderRTL ) { // This is a rough heuristic: whether we "can render" a script // actually depends on the properties of the font being used // and whether differences from the ideal rendering are considered // semantically significant. // Even in Latin script, we "can't render" combinations such as the fi // ligature, but we don't consider that semantically significant. if (!canRenderRTL && charInRTLScript(char)) { return false; } if ((char >= 0x0900 && char <= 0x0DFF) || // Main blocks for Indic scripts and Sinhala (char >= 0x0F00 && char <= 0x109F) || // Main blocks for Tibetan and Myanmar unicodeBlockLookup['Khmer'](char)) { // These blocks cover common scripts that require // complex text shaping, based on unicode script metadata: // http://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt // where "Web Rank <= 32" "Shaping Required = YES" return false; } return true; } function stringContainsRTLText(chars ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (charInRTLScript(char.charCodeAt(0))) { return true; } } return false; } function isStringInSupportedScript(chars , canRenderRTL ) { for (var i = 0, list = chars; i < list.length; i += 1) { var char = list[i]; if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) { return false; } } return true; } // var status = { unavailable: 'unavailable', // Not loaded deferred: 'deferred', // The plugin URL has been specified, but loading has been deferred loading: 'loading', // request in-flight loaded: 'loaded', error: 'error' }; var _completionCallback = null; //Variables defining the current state of the plugin var pluginStatus = status.unavailable; var pluginURL = null; var triggerPluginCompletionEvent = function(error ) { // NetworkError's are not correctly reflected by the plugin status which prevents reloading plugin if (error && typeof error === 'string' && error.indexOf('NetworkError') > -1) { pluginStatus = status.error; } if (_completionCallback) { _completionCallback(error); } }; function sendPluginStateToWorker() { evented.fire(new Event('pluginStateChange', {pluginStatus: pluginStatus, pluginURL: pluginURL})); } var evented = new Evented(); var getRTLTextPluginStatus = function () { return pluginStatus; }; var registerForPluginStateChange = function(callback ) { // Do an initial sync of the state callback({pluginStatus: pluginStatus, pluginURL: pluginURL}); // Listen for all future state changes evented.on('pluginStateChange', callback); return callback; }; var clearRTLTextPlugin = function() { pluginStatus = status.unavailable; pluginURL = null; }; var setRTLTextPlugin = function(url , callback , deferred) { if ( deferred === void 0 ) deferred = false; if (pluginStatus === status.deferred || pluginStatus === status.loading || pluginStatus === status.loaded) { throw new Error('setRTLTextPlugin cannot be called multiple times.'); } pluginURL = exported.resolveURL(url); pluginStatus = status.deferred; _completionCallback = callback; sendPluginStateToWorker(); //Start downloading the plugin immediately if not intending to lazy-load if (!deferred) { downloadRTLTextPlugin(); } }; var downloadRTLTextPlugin = function() { if (pluginStatus !== status.deferred || !pluginURL) { throw new Error('rtl-text-plugin cannot be downloaded unless a pluginURL is specified'); } pluginStatus = status.loading; sendPluginStateToWorker(); if (pluginURL) { getArrayBuffer({url: pluginURL}, function (error) { if (error) { triggerPluginCompletionEvent(error); } else { pluginStatus = status.loaded; sendPluginStateToWorker(); } }); } }; var plugin = { applyArabicShaping: null, processBidirectionalText: null, processStyledBidirectionalText: null, isLoaded: function isLoaded() { return pluginStatus === status.loaded || // Main Thread: loaded if the completion callback returned successfully plugin.applyArabicShaping != null; // Web-worker: loaded if the plugin functions have been compiled }, isLoading: function isLoading() { // Main Thread Only: query the loading status, this function does not return the correct value in the worker context. return pluginStatus === status.loading; }, setState: function setState(state ) { // Worker thread only: this tells the worker threads that the plugin is available on the Main thread assert_1(isWorker(), 'Cannot set the state of the rtl-text-plugin when not in the web-worker context'); pluginStatus = state.pluginStatus; pluginURL = state.pluginURL; }, isParsed: function isParsed() { assert_1(isWorker(), 'rtl-text-plugin is only parsed on the worker-threads'); return plugin.applyArabicShaping != null && plugin.processBidirectionalText != null && plugin.processStyledBidirectionalText != null; }, getPluginURL: function getPluginURL() { assert_1(isWorker(), 'rtl-text-plugin url can only be queried from the worker threads'); return pluginURL; } }; var lazyLoadRTLTextPlugin = function() { if (!plugin.isLoading() && !plugin.isLoaded() && getRTLTextPluginStatus() === 'deferred' ) { downloadRTLTextPlugin(); } }; // var EvaluationParameters = function EvaluationParameters(zoom , options ) { this.zoom = zoom; if (options) { this.now = options.now; this.fadeDuration = options.fadeDuration; this.zoomHistory = options.zoomHistory; this.transition = options.transition; } else { this.now = 0; this.fadeDuration = 0; this.zoomHistory = new ZoomHistory(); this.transition = {}; } }; EvaluationParameters.prototype.isSupportedScript = function isSupportedScript (str ) { return isStringInSupportedScript(str, plugin.isLoaded()); }; EvaluationParameters.prototype.crossFadingFactor = function crossFadingFactor () { if (this.fadeDuration === 0) { return 1; } else { return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); } }; EvaluationParameters.prototype.getCrossfadeParameters = function getCrossfadeParameters () { var z = this.zoom; var fraction = z - Math.floor(z); var t = this.crossFadingFactor(); return z > this.zoomHistory.lastIntegerZoom ? {fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t} : {fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction}; }; // /** * Implements a number of classes that define state and behavior for paint and layout properties, most * importantly their respective evaluation chains: * * Transitionable paint property value * → Transitioning paint property value * → Possibly evaluated paint property value * → Fully evaluated paint property value * * Layout property value * → Possibly evaluated layout property value * → Fully evaluated layout property value * * @module * @private */ /** * Implementations of the `Property` interface: * * * Hold metadata about a property that's independent of any specific value: stuff like the type of the value, * the default value, etc. This comes from the style specification JSON. * * Define behavior that needs to be polymorphic across different properties: "possibly evaluating" * an input value (see below), and interpolating between two possibly-evaluted values. * * The type `T` is the fully-evaluated value type (e.g. `number`, `string`, `Color`). * The type `R` is the intermediate "possibly evaluated" value type. See below. * * There are two main implementations of the interface -- one for properties that allow data-driven values, * and one for properties that don't. There are a few "special case" implementations as well: one for properties * which cross-fade between two values rather than interpolating, one for `heatmap-color` and `line-gradient`, * and one for `light-position`. * * @private */ /** * `PropertyValue` represents the value part of a property key-value unit. It's used to represent both * paint and layout property values, and regardless of whether or not their property supports data-driven * expressions. * * `PropertyValue` stores the raw input value as seen in a style or a runtime styling API call, i.e. one of the * following: * * * A constant value of the type appropriate for the property * * A function which produces a value of that type (but functions are quasi-deprecated in favor of expressions) * * An expression which produces a value of that type * * "undefined"/"not present", in which case the property is assumed to take on its default value. * * In addition to storing the original input value, `PropertyValue` also stores a normalized representation, * effectively treating functions as if they are expressions, and constant or default values as if they are * (constant) expressions. * * @private */ var PropertyValue = function PropertyValue(property , value ) { this.property = property; this.value = value; this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification); }; PropertyValue.prototype.isDataDriven = function isDataDriven () { return this.expression.kind === 'source' || this.expression.kind === 'composite'; }; PropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters , canonical , availableImages ) { return this.property.possiblyEvaluate(this, parameters, canonical, availableImages); }; // ------- Transitionable ------- /** * Paint properties are _transitionable_: they can change in a fluid manner, interpolating or cross-fading between * old and new value. The duration of the transition, and the delay before it begins, is configurable. * * `TransitionablePropertyValue` is a compositional class that stores both the property value and that transition * configuration. * * A `TransitionablePropertyValue` can calculate the next step in the evaluation chain for paint property values: * `TransitioningPropertyValue`. * * @private */ var TransitionablePropertyValue = function TransitionablePropertyValue(property ) { this.property = property; this.value = new PropertyValue(property, undefined); }; TransitionablePropertyValue.prototype.transitioned = function transitioned (parameters , prior ) { return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define extend({}, parameters.transition, this.transition), parameters.now); }; TransitionablePropertyValue.prototype.untransitioned = function untransitioned () { return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitionablePropertyValue`. * * @private */ /** * `Transitionable` stores a map of all (property name, `TransitionablePropertyValue`) pairs for paint properties of a * given layer type. It can calculate the `TransitioningPropertyValue`s for all of them at once, producing a * `Transitioning` instance for the same set of properties. * * @private */ var Transitionable = function Transitionable(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitionablePropertyValues) ); }; Transitionable.prototype.getValue = function getValue (name ) { return clone(this._values[name].value.value); }; Transitionable.prototype.setValue = function setValue (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } // Note that we do not _remove_ an own property in the case where a value is being reset // to the default: the transition might still be non-default. this._values[name].value = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Transitionable.prototype.getTransition = function getTransition (name ) { return clone(this._values[name].transition); }; Transitionable.prototype.setTransition = function setTransition (name , value ) { if (!this._values.hasOwnProperty(name)) { this._values[name] = new TransitionablePropertyValue(this._values[name].property); } this._values[name].transition = clone(value) || undefined; }; Transitionable.prototype.serialize = function serialize () { var result = {}; for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; var value = this.getValue(property); if (value !== undefined) { result[property] = value; } var transition = this.getTransition(property); if (transition !== undefined) { result[(property + "-transition")] = transition; } } return result; }; Transitionable.prototype.transitioned = function transitioned (parameters , prior ) { var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].transitioned(parameters, prior._values[property]); } return result; }; Transitionable.prototype.untransitioned = function untransitioned () { var result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].untransitioned(); } return result; }; // ------- Transitioning ------- /** * `TransitioningPropertyValue` implements the first of two intermediate steps in the evaluation chain of a paint * property value. In this step, transitions between old and new values are handled: as long as the transition is in * progress, `TransitioningPropertyValue` maintains a reference to the prior value, and interpolates between it and * the new value based on the current time and the configured transition duration and delay. The product is the next * step in the evaluation chain: the "possibly evaluated" result type `R`. See below for more on this concept. * * @private */ var TransitioningPropertyValue = function TransitioningPropertyValue(property , value , prior , transition , now ) { this.property = property; this.value = value; this.begin = now + transition.delay || 0; this.end = this.begin + transition.duration || 0; if (property.specification.transition && (transition.delay || transition.duration)) { this.prior = prior; } }; TransitioningPropertyValue.prototype.possiblyEvaluate = function possiblyEvaluate (parameters , canonical , availableImages ) { var now = parameters.now || 0; var finalValue = this.value.possiblyEvaluate(parameters, canonical, availableImages); var prior = this.prior; if (!prior) { // No prior value. return finalValue; } else if (now > this.end) { // Transition from prior value is now complete. this.prior = null; return finalValue; } else if (this.value.isDataDriven()) { // Transitions to data-driven properties are not supported. // We snap immediately to the data-driven value so that, when we perform layout, // we see the data-driven function and can use it to populate vertex buffers. this.prior = null; return finalValue; } else if (now < this.begin) { // Transition hasn't started yet. return prior.possiblyEvaluate(parameters, canonical, availableImages); } else { // Interpolate between recursively-calculated prior value and final. var t = (now - this.begin) / (this.end - this.begin); return this.property.interpolate(prior.possiblyEvaluate(parameters, canonical, availableImages), finalValue, easeCubicInOut(t)); } }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `TransitioningPropertyValue`. * * @private */ /** * `Transitioning` stores a map of all (property name, `TransitioningPropertyValue`) pairs for paint properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Transitioning = function Transitioning(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultTransitioningPropertyValues) ); }; Transitioning.prototype.possiblyEvaluate = function possiblyEvaluate (parameters , canonical , availableImages ) { var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); } return result; }; Transitioning.prototype.hasTransition = function hasTransition () { for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; if (this._values[property].prior) { return true; } } return false; }; // ------- Layout ------- /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys and values of type `PropertyValue`. * * @private */ /** * Because layout properties are not transitionable, they have a simpler representation and evaluation chain than * paint properties: `PropertyValue`s are possibly evaluated, producing possibly evaluated values, which are then * fully evaluated. * * `Layout` stores a map of all (property name, `PropertyValue`) pairs for layout properties of a * given layer type. It can calculate the possibly-evaluated values for all of them at once, producing a * `PossiblyEvaluated` instance for the same set of properties. * * @private */ var Layout = function Layout(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPropertyValues) ); }; Layout.prototype.getValue = function getValue (name ) { return clone(this._values[name].value); }; Layout.prototype.setValue = function setValue (name , value ) { this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone(value)); }; Layout.prototype.serialize = function serialize () { var result = {}; for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; var value = this.getValue(property); if (value !== undefined) { result[property] = value; } } return result; }; Layout.prototype.possiblyEvaluate = function possiblyEvaluate (parameters , canonical , availableImages ) { var result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define for (var i = 0, list = Object.keys(this._values); i < list.length; i += 1) { var property = list[i]; result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); } return result; }; // ------- PossiblyEvaluated ------- /** * "Possibly evaluated value" is an intermediate stage in the evaluation chain for both paint and layout property * values. The purpose of this stage is to optimize away unnecessary recalculations for data-driven properties. Code * which uses data-driven property values must assume that the value is dependent on feature data, and request that it * be evaluated for each feature. But when that property value is in fact a constant or camera function, the calculation * will not actually depend on the feature, and we can benefit from returning the prior result of having done the * evaluation once, ahead of time, in an intermediate step whose inputs are just the value and "global" parameters * such as current zoom level. * * `PossiblyEvaluatedValue` represents the three possible outcomes of this step: if the input value was a constant or * camera expression, then the "possibly evaluated" result is a constant value. Otherwise, the input value was either * a source or composite expression, and we must defer final evaluation until supplied a feature. We separate * the source and composite cases because they are handled differently when generating GL attributes, buffers, and * uniforms. * * Note that `PossiblyEvaluatedValue` (and `PossiblyEvaluatedPropertyValue`, below) are _not_ used for properties that * do not allow data-driven values. For such properties, we know that the "possibly evaluated" result is always a constant * scalar value. See below. * * @private */ /** * `PossiblyEvaluatedPropertyValue` is used for data-driven paint and layout property values. It holds a * `PossiblyEvaluatedValue` and the `GlobalProperties` that were used to generate it. You're not allowed to supply * a different set of `GlobalProperties` when performing the final evaluation because they would be ignored in the * case where the input value was a constant or camera function. * * @private */ var PossiblyEvaluatedPropertyValue = function PossiblyEvaluatedPropertyValue(property , value , parameters ) { this.property = property; this.value = value; this.parameters = parameters; }; PossiblyEvaluatedPropertyValue.prototype.isConstant = function isConstant () { return this.value.kind === 'constant'; }; PossiblyEvaluatedPropertyValue.prototype.constantOr = function constantOr (value ) { if (this.value.kind === 'constant') { return this.value.value; } else { return value; } }; PossiblyEvaluatedPropertyValue.prototype.evaluate = function evaluate (feature , featureState , canonical , availableImages ) { return this.property.evaluate(this.value, this.parameters, feature, featureState, canonical, availableImages); }; /** * A helper type: given an object type `Properties` whose values are each of type `Property`, it calculates * an object type with the same keys, and values of type `R`. * * For properties that don't allow data-driven values, `R` is a scalar type such as `number`, `string`, or `Color`. * For data-driven properties, it is `PossiblyEvaluatedPropertyValue`. Critically, the type definitions are set up * in a way that allows flow to know which of these two cases applies for any given property name, and if you attempt * to use a `PossiblyEvaluatedPropertyValue` as if it was a scalar, or vice versa, you will get a type error. (However, * there's at least one case in which flow fails to produce a type error that you should be aware of: in a context such * as `layer.paint.get('foo-opacity') === 0`, if `foo-opacity` is data-driven, than the left-hand side is of type * `PossiblyEvaluatedPropertyValue`, but flow will not complain about comparing this to a number using `===`. * See https://github.com/facebook/flow/issues/2359.) * * There's also a third, special case possiblity for `R`: for cross-faded properties, it's `?CrossFaded`. * * @private */ /** * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a * given layer type. * @private */ var PossiblyEvaluated = function PossiblyEvaluated(properties ) { this._properties = properties; this._values = (Object.create(properties.defaultPossiblyEvaluatedValues) ); }; PossiblyEvaluated.prototype.get = function get (name ) { return this._values[name]; }; /** * An implementation of `Property` for properties that do not permit data-driven (source or composite) expressions. * This restriction allows us to declare statically that the result of possibly evaluating this kind of property * is in fact always the scalar type `T`, and can be used without further evaluating the value on a per-feature basis. * * @private */ var DataConstantProperty = function DataConstantProperty(specification ) { this.specification = specification; }; DataConstantProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { assert_1(!value.isDataDriven()); return value.expression.evaluate(parameters); }; DataConstantProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { var interp = (interpolate )[this.specification.type]; if (interp) { return interp(a, b, t); } else { return a; } }; /** * An implementation of `Property` for properties that permit data-driven (source or composite) expressions. * The result of possibly evaluating this kind of property is `PossiblyEvaluatedPropertyValue`; obtaining * a scalar value `T` requires further evaluation on a per-feature basis. * * @private */ var DataDrivenProperty = function DataDrivenProperty(specification , overrides ) { this.specification = specification; this.overrides = overrides; }; DataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters , canonical , availableImages ) { if (value.expression.kind === 'constant' || value.expression.kind === 'camera') { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: value.expression.evaluate(parameters, (null ), {}, canonical, availableImages)}, parameters); } else { return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } }; DataDrivenProperty.prototype.interpolate = function interpolate$2 (a , b , t ) { // If either possibly-evaluated value is non-constant, give up: we aren't able to interpolate data-driven values. if (a.value.kind !== 'constant' || b.value.kind !== 'constant') { return a; } // Special case hack solely for fill-outline-color. The undefined value is subsequently handled in // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant // undefined value is the "default value" for fill-outline-color held in // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of // `PossiblyEvaluated#_values`. if (a.value.value === undefined || b.value.value === undefined) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: (undefined )}, a.parameters); } var interp = (interpolate )[this.specification.type]; if (interp) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: interp(a.value.value, b.value.value, t)}, a.parameters); } else { return a; } }; DataDrivenProperty.prototype.evaluate = function evaluate (value , parameters , feature , featureState , canonical , availableImages ) { if (value.kind === 'constant') { return value.value; } else { return value.evaluate(parameters, feature, featureState, canonical, availableImages); } }; /** * An implementation of `Property` for data driven `line-pattern` which are transitioned by cross-fading * rather than interpolation. * * @private */ var CrossFadedDataDrivenProperty = /*@__PURE__*/(function (DataDrivenProperty) { function CrossFadedDataDrivenProperty () { DataDrivenProperty.apply(this, arguments); } if ( DataDrivenProperty ) CrossFadedDataDrivenProperty.__proto__ = DataDrivenProperty; CrossFadedDataDrivenProperty.prototype = Object.create( DataDrivenProperty && DataDrivenProperty.prototype ); CrossFadedDataDrivenProperty.prototype.constructor = CrossFadedDataDrivenProperty; CrossFadedDataDrivenProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters , canonical , availableImages ) { if (value.value === undefined) { return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: undefined}, parameters); } else if (value.expression.kind === 'constant') { var evaluatedValue = value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); var isImageExpression = value.property.specification.type === 'resolvedImage'; var constantValue = isImageExpression && typeof evaluatedValue !== 'string' ? evaluatedValue.name : evaluatedValue; var constant = this._calculate(constantValue, constantValue, constantValue, parameters); return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: constant}, parameters); } else if (value.expression.kind === 'camera') { var cameraVal = this._calculate( value.expression.evaluate({zoom: parameters.zoom - 1.0}), value.expression.evaluate({zoom: parameters.zoom}), value.expression.evaluate({zoom: parameters.zoom + 1.0}), parameters); return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: cameraVal}, parameters); } else { // source or composite expression return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } }; CrossFadedDataDrivenProperty.prototype.evaluate = function evaluate (value , globals , feature , featureState , canonical , availableImages ) { if (value.kind === 'source') { var constant = value.evaluate(globals, feature, featureState, canonical, availableImages); return this._calculate(constant, constant, constant, globals); } else if (value.kind === 'composite') { return this._calculate( value.evaluate({zoom: Math.floor(globals.zoom) - 1.0}, feature, featureState), value.evaluate({zoom: Math.floor(globals.zoom)}, feature, featureState), value.evaluate({zoom: Math.floor(globals.zoom) + 1.0}, feature, featureState), globals); } else { return value.value; } }; CrossFadedDataDrivenProperty.prototype._calculate = function _calculate (min , mid , max , parameters ) { var z = parameters.zoom; return z > parameters.zoomHistory.lastIntegerZoom ? {from: min, to: mid} : {from: max, to: mid}; }; CrossFadedDataDrivenProperty.prototype.interpolate = function interpolate (a ) { return a; }; return CrossFadedDataDrivenProperty; }(DataDrivenProperty)); /** * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading * rather than interpolation. * * @private */ var CrossFadedProperty = function CrossFadedProperty(specification ) { this.specification = specification; }; CrossFadedProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters , canonical , availableImages ) { if (value.value === undefined) { return undefined; } else if (value.expression.kind === 'constant') { var constant = value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); return this._calculate(constant, constant, constant, parameters); } else { assert_1(!value.isDataDriven()); return this._calculate( value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1.0), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)), value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1.0), parameters)), parameters); } }; CrossFadedProperty.prototype._calculate = function _calculate (min , mid , max , parameters ) { var z = parameters.zoom; return z > parameters.zoomHistory.lastIntegerZoom ? {from: min, to: mid} : {from: max, to: mid}; }; CrossFadedProperty.prototype.interpolate = function interpolate (a ) { return a; }; /** * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and * evaluation returns a boolean value in order to indicate its presence, but the real * evaluation happens in StyleLayer classes. * * @private */ var ColorRampProperty = function ColorRampProperty(specification ) { this.specification = specification; }; ColorRampProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters , canonical , availableImages ) { return !!value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); }; ColorRampProperty.prototype.interpolate = function interpolate () { return false; }; /** * `Properties` holds objects containing default values for the layout or paint property set of a given * layer type. These objects are immutable, and they are used as the prototypes for the `_values` members of * `Transitionable`, `Transitioning`, `Layout`, and `PossiblyEvaluated`. This allows these classes to avoid * doing work in the common case where a property has no explicit value set and should be considered to take * on the default value: using `for (const property of Object.keys(this._values))`, they can iterate over * only the _own_ properties of `_values`, skipping repeated calculation of transitions and possible/final * evaluations for defaults, the result of which will always be the same. * * @private */ var Properties = function Properties(properties ) { this.properties = properties; this.defaultPropertyValues = ({} ); this.defaultTransitionablePropertyValues = ({} ); this.defaultTransitioningPropertyValues = ({} ); this.defaultPossiblyEvaluatedValues = ({} ); this.overridableProperties = ([] ); for (var property in properties) { var prop = properties[property]; if (prop.specification.overridable) { this.overridableProperties.push(property); } var defaultPropertyValue = this.defaultPropertyValues[property] = new PropertyValue(prop, undefined); var defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] = new TransitionablePropertyValue(prop); this.defaultTransitioningPropertyValues[property] = defaultTransitionablePropertyValue.untransitioned(); this.defaultPossiblyEvaluatedValues[property] = defaultPropertyValue.possiblyEvaluate(({} )); } }; register('DataDrivenProperty', DataDrivenProperty); register('DataConstantProperty', DataConstantProperty); register('CrossFadedDataDrivenProperty', CrossFadedDataDrivenProperty); register('CrossFadedProperty', CrossFadedProperty); register('ColorRampProperty', ColorRampProperty); // var TRANSITION_SUFFIX = '-transition'; var StyleLayer = /*@__PURE__*/(function (Evented) { function StyleLayer(layer , properties ) { Evented.call(this); this.id = layer.id; this.type = layer.type; this._featureFilter = {filter: function () { return true; }, needGeometry: false}; if (layer.type === 'custom') { return; } layer = ((layer ) ); this.metadata = layer.metadata; this.minzoom = layer.minzoom; this.maxzoom = layer.maxzoom; if (layer.type !== 'background') { this.source = layer.source; this.sourceLayer = layer['source-layer']; this.filter = layer.filter; } if (properties.layout) { this._unevaluatedLayout = new Layout(properties.layout); } if (properties.paint) { this._transitionablePaint = new Transitionable(properties.paint); for (var property in layer.paint) { this.setPaintProperty(property, layer.paint[property], {validate: false}); } for (var property$1 in layer.layout) { this.setLayoutProperty(property$1, layer.layout[property$1], {validate: false}); } this._transitioningPaint = this._transitionablePaint.untransitioned(); //$FlowFixMe this.paint = new PossiblyEvaluated(properties.paint); } } if ( Evented ) StyleLayer.__proto__ = Evented; StyleLayer.prototype = Object.create( Evented && Evented.prototype ); StyleLayer.prototype.constructor = StyleLayer; StyleLayer.prototype.getCrossfadeParameters = function getCrossfadeParameters () { return this._crossfadeParameters; }; StyleLayer.prototype.getLayoutProperty = function getLayoutProperty (name ) { if (name === 'visibility') { return this.visibility; } return this._unevaluatedLayout.getValue(name); }; StyleLayer.prototype.setLayoutProperty = function setLayoutProperty (name , value , options) { if ( options === void 0 ) options = {}; if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".layout." + name; if (this._validate(validateLayoutProperty$1, key, name, value, options)) { return; } } if (name === 'visibility') { this.visibility = value; return; } this._unevaluatedLayout.setValue(name, value); }; StyleLayer.prototype.getPaintProperty = function getPaintProperty (name ) { if (endsWith(name, TRANSITION_SUFFIX)) { return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length)); } else { return this._transitionablePaint.getValue(name); } }; StyleLayer.prototype.setPaintProperty = function setPaintProperty (name , value , options) { if ( options === void 0 ) options = {}; if (value !== null && value !== undefined) { var key = "layers." + (this.id) + ".paint." + name; if (this._validate(validatePaintProperty$1, key, name, value, options)) { return false; } } if (endsWith(name, TRANSITION_SUFFIX)) { this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), (value ) || undefined); return false; } else { var transitionable = this._transitionablePaint._values[name]; var isCrossFadedProperty = transitionable.property.specification["property-type"] === 'cross-faded-data-driven'; var wasDataDriven = transitionable.value.isDataDriven(); var oldValue = transitionable.value; this._transitionablePaint.setValue(name, value); this._handleSpecialPaintPropertyUpdate(name); var newValue = this._transitionablePaint._values[name].value; var isDataDriven = newValue.isDataDriven(); // if a cross-faded value is changed, we need to make sure the new icons get added to each tile's iconAtlas // so a call to _updateLayer is necessary, and we return true from this function so it gets called in // Style#setPaintProperty return isDataDriven || wasDataDriven || isCrossFadedProperty || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue); } }; StyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (_ ) { // No-op; can be overridden by derived classes. }; // eslint-disable-next-line no-unused-vars StyleLayer.prototype._handleOverridablePaintPropertyUpdate = function _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { // No-op; can be overridden by derived classes. return false; }; StyleLayer.prototype.isHidden = function isHidden (zoom ) { if (this.minzoom && zoom < this.minzoom) { return true; } if (this.maxzoom && zoom >= this.maxzoom) { return true; } return this.visibility === 'none'; }; StyleLayer.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint); }; StyleLayer.prototype.hasTransition = function hasTransition () { return this._transitioningPaint.hasTransition(); }; StyleLayer.prototype.recalculate = function recalculate (parameters , availableImages ) { if (parameters.getCrossfadeParameters) { this._crossfadeParameters = parameters.getCrossfadeParameters(); } if (this._unevaluatedLayout) { (this ).layout = this._unevaluatedLayout.possiblyEvaluate(parameters, undefined, availableImages); } (this ).paint = this._transitioningPaint.possiblyEvaluate(parameters, undefined, availableImages); }; StyleLayer.prototype.serialize = function serialize () { var output = { 'id': this.id, 'type': this.type, 'source': this.source, 'source-layer': this.sourceLayer, 'metadata': this.metadata, 'minzoom': this.minzoom, 'maxzoom': this.maxzoom, 'filter': this.filter, 'layout': this._unevaluatedLayout && this._unevaluatedLayout.serialize(), 'paint': this._transitionablePaint && this._transitionablePaint.serialize() }; if (this.visibility) { output.layout = output.layout || {}; output.layout.visibility = this.visibility; } return filterObject(output, function (value, key) { return value !== undefined && !(key === 'layout' && !Object.keys(value).length) && !(key === 'paint' && !Object.keys(value).length); }); }; StyleLayer.prototype._validate = function _validate (validate , key , name , value , options) { if ( options === void 0 ) options = {}; if (options && options.validate === false) { return false; } return emitValidationErrors(this, validate.call(validateStyle, { key: key, layerType: this.type, objectKey: name, value: value, styleSpec: spec, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true} })); }; StyleLayer.prototype.is3D = function is3D () { return false; }; StyleLayer.prototype.isTileClipped = function isTileClipped () { return false; }; StyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return false; }; StyleLayer.prototype.resize = function resize () { // noop }; StyleLayer.prototype.isStateDependent = function isStateDependent () { for (var property in (this ).paint._values) { var value = (this ).paint.get(property); if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { continue; } if ((value.value.kind === 'source' || value.value.kind === 'composite') && value.value.isStateDependent) { return true; } } return false; }; return StyleLayer; }(Evented)); // var viewTypes = { 'Int8': Int8Array, 'Uint8': Uint8Array, 'Int16': Int16Array, 'Uint16': Uint16Array, 'Int32': Int32Array, 'Uint32': Uint32Array, 'Float32': Float32Array }; /** * @private */ var Struct = function Struct(structArray , index ) { (this )._structArray = structArray; this._pos1 = index * this.size; this._pos2 = this._pos1 / 2; this._pos4 = this._pos1 / 4; this._pos8 = this._pos1 / 8; }; var DEFAULT_CAPACITY = 128; var RESIZE_MULTIPLIER = 5; /** * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` * making it behave like an array of typed structs. * * Conceptually, a StructArray is comprised of elements, i.e., instances of its * associated struct type. Each particular struct type, together with an * alignment size, determines the memory layout of a StructArray whose elements * are of that type. Thus, for each such layout that we need, we have * a corrseponding StructArrayLayout class, inheriting from StructArray and * implementing `emplaceBack()` and `_refreshViews()`. * * In some cases, where we need to access particular elements of a StructArray, * we implement a more specific subclass that inherits from one of the * StructArrayLayouts and adds a `get(i): T` accessor that returns a structured * object whose properties are proxies into the underlying memory space for the * i-th element. This affords the convience of working with (seemingly) plain * Javascript objects without the overhead of serializing/deserializing them * into ArrayBuffers for efficient web worker transfer. * * @private */ var StructArray = function StructArray() { this.isTransferred = false; this.capacity = -1; this.resize(0); }; /** * Serialize a StructArray instance.Serializes both the raw data and the * metadata needed to reconstruct the StructArray base class during * deserialization. * @private */ StructArray.serialize = function serialize (array , transferables ) { assert_1(!array.isTransferred); array._trim(); if (transferables) { array.isTransferred = true; transferables.push(array.arrayBuffer); } return { length: array.length, arrayBuffer: array.arrayBuffer, }; }; StructArray.deserialize = function deserialize (input ) { var structArray = Object.create(this.prototype); structArray.arrayBuffer = input.arrayBuffer; structArray.length = input.length; structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement; structArray._refreshViews(); return structArray; }; /** * Resize the array to discard unused capacity. */ StructArray.prototype._trim = function _trim () { if (this.length !== this.capacity) { this.capacity = this.length; this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); this._refreshViews(); } }; /** * Resets the the length of the array to 0 without de-allocating capcacity. */ StructArray.prototype.clear = function clear () { this.length = 0; }; /** * Resize the array. * If `n` is greater than the current length then additional elements with undefined values are added. * If `n` is less than the current length then the array will be reduced to the first `n` elements. * @param {number} n The new size of the array. */ StructArray.prototype.resize = function resize (n ) { assert_1(!this.isTransferred); this.reserve(n); this.length = n; }; /** * Indicate a planned increase in size, so that any necessary allocation may * be done once, ahead of time. * @param {number} n The expected size of the array. */ StructArray.prototype.reserve = function reserve (n ) { if (n > this.capacity) { this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY); this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement); var oldUint8Array = this.uint8; this._refreshViews(); if (oldUint8Array) { this.uint8.set(oldUint8Array); } } }; /** * Create TypedArray views for the current ArrayBuffer. */ StructArray.prototype._refreshViews = function _refreshViews () { throw new Error('_refreshViews() must be implemented by each concrete StructArray layout'); }; /** * Given a list of member fields, create a full StructArrayLayout, in * particular calculating the correct byte offset for each field. This data * is used at build time to generate StructArrayLayout_*#emplaceBack() and * other accessors, and at runtime for binding vertex buffer attributes. * * @private */ function createLayout( members , alignment ) { if ( alignment === void 0 ) alignment = 1; var offset = 0; var maxSize = 0; var layoutMembers = members.map(function (member) { assert_1(member.name.length); var typeSize = sizeOf(member.type); var memberOffset = offset = align(offset, Math.max(alignment, typeSize)); var components = member.components || 1; maxSize = Math.max(maxSize, typeSize); offset += typeSize * components; return { name: member.name, type: member.type, components: components, offset: memberOffset, }; }); var size = align(offset, Math.max(maxSize, alignment)); return { members: layoutMembers, size: size, alignment: alignment }; } function sizeOf(type ) { return viewTypes[type].BYTES_PER_ELEMENT; } function align(offset , size ) { return Math.ceil(offset / size) * size; } // This file is generated. Edit build/generate-struct-arrays.js, then run `yarn run codegen`. /** * Implementation of the StructArray layout: * [0]: Int16[2] * * @private */ var StructArrayLayout2i4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4.__proto__ = StructArray; StructArrayLayout2i4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4.prototype.constructor = StructArrayLayout2i4; StructArrayLayout2i4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2i4.prototype.emplace = function emplace (i , v0 , v1 ) { var o2 = i * 2; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; return i; }; return StructArrayLayout2i4; }(StructArray)); StructArrayLayout2i4.prototype.bytesPerElement = 4; register('StructArrayLayout2i4', StructArrayLayout2i4); /** * Implementation of the StructArray layout: * [0]: Int16[4] * * @private */ var StructArrayLayout4i8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4i8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i8.__proto__ = StructArray; StructArrayLayout4i8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i8.prototype.constructor = StructArrayLayout4i8; StructArrayLayout4i8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout4i8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout4i8.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o2 = i * 4; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; return i; }; return StructArrayLayout4i8; }(StructArray)); StructArrayLayout4i8.prototype.bytesPerElement = 8; register('StructArrayLayout4i8', StructArrayLayout4i8); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[4] * * @private */ var StructArrayLayout2i4i12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4i12.__proto__ = StructArray; StructArrayLayout2i4i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4i12.prototype.constructor = StructArrayLayout2i4i12; StructArrayLayout2i4i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i4i12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i4i12; }(StructArray)); StructArrayLayout2i4i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i4i12', StructArrayLayout2i4i12); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Uint8[4] * * @private */ var StructArrayLayout2i4ub8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i4ub8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i4ub8.__proto__ = StructArray; StructArrayLayout2i4ub8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i4ub8.prototype.constructor = StructArrayLayout2i4ub8; StructArrayLayout2i4ub8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i4ub8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i4ub8.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 4; var o1 = i * 8; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.uint8[o1 + 4] = v2; this.uint8[o1 + 5] = v3; this.uint8[o1 + 6] = v4; this.uint8[o1 + 7] = v5; return i; }; return StructArrayLayout2i4ub8; }(StructArray)); StructArrayLayout2i4ub8.prototype.bytesPerElement = 8; register('StructArrayLayout2i4ub8', StructArrayLayout2i4ub8); /** * Implementation of the StructArray layout: * [0]: Float32[2] * * @private */ var StructArrayLayout2f8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2f8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2f8.__proto__ = StructArray; StructArrayLayout2f8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2f8.prototype.constructor = StructArrayLayout2f8; StructArrayLayout2f8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2f8.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2f8.prototype.emplace = function emplace (i , v0 , v1 ) { var o4 = i * 2; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; return i; }; return StructArrayLayout2f8; }(StructArray)); StructArrayLayout2f8.prototype.bytesPerElement = 8; register('StructArrayLayout2f8', StructArrayLayout2f8); /** * Implementation of the StructArray layout: * [0]: Uint16[10] * * @private */ var StructArrayLayout10ui20 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout10ui20 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout10ui20.__proto__ = StructArray; StructArrayLayout10ui20.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout10ui20.prototype.constructor = StructArrayLayout10ui20; StructArrayLayout10ui20.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout10ui20.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9); }; StructArrayLayout10ui20.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 ) { var o2 = i * 10; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; this.uint16[o2 + 3] = v3; this.uint16[o2 + 4] = v4; this.uint16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; this.uint16[o2 + 8] = v8; this.uint16[o2 + 9] = v9; return i; }; return StructArrayLayout10ui20; }(StructArray)); StructArrayLayout10ui20.prototype.bytesPerElement = 20; register('StructArrayLayout10ui20', StructArrayLayout10ui20); /** * Implementation of the StructArray layout: * [0]: Int16[4] * [8]: Uint16[4] * [16]: Int16[4] * * @private */ var StructArrayLayout4i4ui4i24 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4i4ui4i24 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4i4ui4i24.__proto__ = StructArray; StructArrayLayout4i4ui4i24.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4i4ui4i24.prototype.constructor = StructArrayLayout4i4ui4i24; StructArrayLayout4i4ui4i24.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout4i4ui4i24.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); }; StructArrayLayout4i4ui4i24.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 ) { var o2 = i * 12; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.uint16[o2 + 4] = v4; this.uint16[o2 + 5] = v5; this.uint16[o2 + 6] = v6; this.uint16[o2 + 7] = v7; this.int16[o2 + 8] = v8; this.int16[o2 + 9] = v9; this.int16[o2 + 10] = v10; this.int16[o2 + 11] = v11; return i; }; return StructArrayLayout4i4ui4i24; }(StructArray)); StructArrayLayout4i4ui4i24.prototype.bytesPerElement = 24; register('StructArrayLayout4i4ui4i24', StructArrayLayout4i4ui4i24); /** * Implementation of the StructArray layout: * [0]: Float32[3] * * @private */ var StructArrayLayout3f12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3f12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3f12.__proto__ = StructArray; StructArrayLayout3f12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3f12.prototype.constructor = StructArrayLayout3f12; StructArrayLayout3f12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout3f12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3f12.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o4 = i * 3; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; return i; }; return StructArrayLayout3f12; }(StructArray)); StructArrayLayout3f12.prototype.bytesPerElement = 12; register('StructArrayLayout3f12', StructArrayLayout3f12); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * * @private */ var StructArrayLayout1ul4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ul4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul4.__proto__ = StructArray; StructArrayLayout1ul4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul4.prototype.constructor = StructArrayLayout1ul4; StructArrayLayout1ul4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); }; StructArrayLayout1ul4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1ul4.prototype.emplace = function emplace (i , v0 ) { var o4 = i * 1; this.uint32[o4 + 0] = v0; return i; }; return StructArrayLayout1ul4; }(StructArray)); StructArrayLayout1ul4.prototype.bytesPerElement = 4; register('StructArrayLayout1ul4', StructArrayLayout1ul4); /** * Implementation of the StructArray layout: * [0]: Int16[6] * [12]: Uint32[1] * [16]: Uint16[2] * * @private */ var StructArrayLayout6i1ul2ui20 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout6i1ul2ui20 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout6i1ul2ui20.__proto__ = StructArray; StructArrayLayout6i1ul2ui20.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout6i1ul2ui20.prototype.constructor = StructArrayLayout6i1ul2ui20; StructArrayLayout6i1ul2ui20.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout6i1ul2ui20.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8); }; StructArrayLayout6i1ul2ui20.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 ) { var o2 = i * 10; var o4 = i * 5; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; this.uint32[o4 + 3] = v6; this.uint16[o2 + 8] = v7; this.uint16[o2 + 9] = v8; return i; }; return StructArrayLayout6i1ul2ui20; }(StructArray)); StructArrayLayout6i1ul2ui20.prototype.bytesPerElement = 20; register('StructArrayLayout6i1ul2ui20', StructArrayLayout6i1ul2ui20); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Int16[2] * [8]: Int16[2] * * @private */ var StructArrayLayout2i2i2i12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i2i2i12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2i2i12.__proto__ = StructArray; StructArrayLayout2i2i2i12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2i2i12.prototype.constructor = StructArrayLayout2i2i2i12; StructArrayLayout2i2i2i12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2i2i2i12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5); }; StructArrayLayout2i2i2i12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 ) { var o2 = i * 6; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; return i; }; return StructArrayLayout2i2i2i12; }(StructArray)); StructArrayLayout2i2i2i12.prototype.bytesPerElement = 12; register('StructArrayLayout2i2i2i12', StructArrayLayout2i2i2i12); /** * Implementation of the StructArray layout: * [0]: Float32[2] * [8]: Float32[1] * [12]: Int16[2] * * @private */ var StructArrayLayout2f1f2i16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2f1f2i16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2f1f2i16.__proto__ = StructArray; StructArrayLayout2f1f2i16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2f1f2i16.prototype.constructor = StructArrayLayout2f1f2i16; StructArrayLayout2f1f2i16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout2f1f2i16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4); }; StructArrayLayout2f1f2i16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 ) { var o4 = i * 4; var o2 = i * 8; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; this.int16[o2 + 6] = v3; this.int16[o2 + 7] = v4; return i; }; return StructArrayLayout2f1f2i16; }(StructArray)); StructArrayLayout2f1f2i16.prototype.bytesPerElement = 16; register('StructArrayLayout2f1f2i16', StructArrayLayout2f1f2i16); /** * Implementation of the StructArray layout: * [0]: Uint8[2] * [4]: Float32[2] * * @private */ var StructArrayLayout2ub2f12 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2ub2f12 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ub2f12.__proto__ = StructArray; StructArrayLayout2ub2f12.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ub2f12.prototype.constructor = StructArrayLayout2ub2f12; StructArrayLayout2ub2f12.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2ub2f12.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout2ub2f12.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o1 = i * 12; var o4 = i * 3; this.uint8[o1 + 0] = v0; this.uint8[o1 + 1] = v1; this.float32[o4 + 1] = v2; this.float32[o4 + 2] = v3; return i; }; return StructArrayLayout2ub2f12; }(StructArray)); StructArrayLayout2ub2f12.prototype.bytesPerElement = 12; register('StructArrayLayout2ub2f12', StructArrayLayout2ub2f12); /** * Implementation of the StructArray layout: * [0]: Uint16[3] * * @private */ var StructArrayLayout3ui6 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3ui6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3ui6.__proto__ = StructArray; StructArrayLayout3ui6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3ui6.prototype.constructor = StructArrayLayout3ui6; StructArrayLayout3ui6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout3ui6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3ui6.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o2 = i * 3; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; return i; }; return StructArrayLayout3ui6; }(StructArray)); StructArrayLayout3ui6.prototype.bytesPerElement = 6; register('StructArrayLayout3ui6', StructArrayLayout3ui6); /** * Implementation of the StructArray layout: * [0]: Int16[2] * [4]: Uint16[2] * [8]: Uint32[3] * [20]: Uint16[3] * [28]: Float32[2] * [36]: Uint8[3] * [40]: Uint32[1] * [44]: Int16[1] * * @private */ var StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.__proto__ = StructArray; StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype.constructor = StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48; StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16); }; StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 ) { var o2 = i * 24; var o4 = i * 12; var o1 = i * 48; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.uint16[o2 + 2] = v2; this.uint16[o2 + 3] = v3; this.uint32[o4 + 2] = v4; this.uint32[o4 + 3] = v5; this.uint32[o4 + 4] = v6; this.uint16[o2 + 10] = v7; this.uint16[o2 + 11] = v8; this.uint16[o2 + 12] = v9; this.float32[o4 + 7] = v10; this.float32[o4 + 8] = v11; this.uint8[o1 + 36] = v12; this.uint8[o1 + 37] = v13; this.uint8[o1 + 38] = v14; this.uint32[o4 + 10] = v15; this.int16[o2 + 22] = v16; return i; }; return StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48; }(StructArray)); StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype.bytesPerElement = 48; register('StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48', StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48); /** * Implementation of the StructArray layout: * [0]: Int16[8] * [16]: Uint16[15] * [48]: Uint32[1] * [52]: Float32[4] * * @private */ var StructArrayLayout8i15ui1ul4f68 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout8i15ui1ul4f68 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout8i15ui1ul4f68.__proto__ = StructArray; StructArrayLayout8i15ui1ul4f68.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout8i15ui1ul4f68.prototype.constructor = StructArrayLayout8i15ui1ul4f68; StructArrayLayout8i15ui1ul4f68.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout8i15ui1ul4f68.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 , v21 , v22 , v23 , v24 , v25 , v26 , v27 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27); }; StructArrayLayout8i15ui1ul4f68.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 , v21 , v22 , v23 , v24 , v25 , v26 , v27 ) { var o2 = i * 34; var o4 = i * 17; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; this.int16[o2 + 3] = v3; this.int16[o2 + 4] = v4; this.int16[o2 + 5] = v5; this.int16[o2 + 6] = v6; this.int16[o2 + 7] = v7; this.uint16[o2 + 8] = v8; this.uint16[o2 + 9] = v9; this.uint16[o2 + 10] = v10; this.uint16[o2 + 11] = v11; this.uint16[o2 + 12] = v12; this.uint16[o2 + 13] = v13; this.uint16[o2 + 14] = v14; this.uint16[o2 + 15] = v15; this.uint16[o2 + 16] = v16; this.uint16[o2 + 17] = v17; this.uint16[o2 + 18] = v18; this.uint16[o2 + 19] = v19; this.uint16[o2 + 20] = v20; this.uint16[o2 + 21] = v21; this.uint16[o2 + 22] = v22; this.uint32[o4 + 12] = v23; this.float32[o4 + 13] = v24; this.float32[o4 + 14] = v25; this.float32[o4 + 15] = v26; this.float32[o4 + 16] = v27; return i; }; return StructArrayLayout8i15ui1ul4f68; }(StructArray)); StructArrayLayout8i15ui1ul4f68.prototype.bytesPerElement = 68; register('StructArrayLayout8i15ui1ul4f68', StructArrayLayout8i15ui1ul4f68); /** * Implementation of the StructArray layout: * [0]: Float32[1] * * @private */ var StructArrayLayout1f4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1f4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1f4.__proto__ = StructArray; StructArrayLayout1f4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1f4.prototype.constructor = StructArrayLayout1f4; StructArrayLayout1f4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout1f4.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1f4.prototype.emplace = function emplace (i , v0 ) { var o4 = i * 1; this.float32[o4 + 0] = v0; return i; }; return StructArrayLayout1f4; }(StructArray)); StructArrayLayout1f4.prototype.bytesPerElement = 4; register('StructArrayLayout1f4', StructArrayLayout1f4); /** * Implementation of the StructArray layout: * [0]: Int16[3] * * @private */ var StructArrayLayout3i6 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout3i6 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout3i6.__proto__ = StructArray; StructArrayLayout3i6.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout3i6.prototype.constructor = StructArrayLayout3i6; StructArrayLayout3i6.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.int16 = new Int16Array(this.arrayBuffer); }; StructArrayLayout3i6.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout3i6.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o2 = i * 3; this.int16[o2 + 0] = v0; this.int16[o2 + 1] = v1; this.int16[o2 + 2] = v2; return i; }; return StructArrayLayout3i6; }(StructArray)); StructArrayLayout3i6.prototype.bytesPerElement = 6; register('StructArrayLayout3i6', StructArrayLayout3i6); /** * Implementation of the StructArray layout: * [0]: Uint32[1] * [4]: Uint16[2] * * @private */ var StructArrayLayout1ul2ui8 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ul2ui8 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ul2ui8.__proto__ = StructArray; StructArrayLayout1ul2ui8.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ul2ui8.prototype.constructor = StructArrayLayout1ul2ui8; StructArrayLayout1ul2ui8.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint32 = new Uint32Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout1ul2ui8.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2); }; StructArrayLayout1ul2ui8.prototype.emplace = function emplace (i , v0 , v1 , v2 ) { var o4 = i * 2; var o2 = i * 4; this.uint32[o4 + 0] = v0; this.uint16[o2 + 2] = v1; this.uint16[o2 + 3] = v2; return i; }; return StructArrayLayout1ul2ui8; }(StructArray)); StructArrayLayout1ul2ui8.prototype.bytesPerElement = 8; register('StructArrayLayout1ul2ui8', StructArrayLayout1ul2ui8); /** * Implementation of the StructArray layout: * [0]: Uint16[2] * * @private */ var StructArrayLayout2ui4 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout2ui4 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout2ui4.__proto__ = StructArray; StructArrayLayout2ui4.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout2ui4.prototype.constructor = StructArrayLayout2ui4; StructArrayLayout2ui4.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout2ui4.prototype.emplaceBack = function emplaceBack (v0 , v1 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1); }; StructArrayLayout2ui4.prototype.emplace = function emplace (i , v0 , v1 ) { var o2 = i * 2; this.uint16[o2 + 0] = v0; this.uint16[o2 + 1] = v1; return i; }; return StructArrayLayout2ui4; }(StructArray)); StructArrayLayout2ui4.prototype.bytesPerElement = 4; register('StructArrayLayout2ui4', StructArrayLayout2ui4); /** * Implementation of the StructArray layout: * [0]: Uint16[1] * * @private */ var StructArrayLayout1ui2 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout1ui2 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout1ui2.__proto__ = StructArray; StructArrayLayout1ui2.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout1ui2.prototype.constructor = StructArrayLayout1ui2; StructArrayLayout1ui2.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.uint16 = new Uint16Array(this.arrayBuffer); }; StructArrayLayout1ui2.prototype.emplaceBack = function emplaceBack (v0 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0); }; StructArrayLayout1ui2.prototype.emplace = function emplace (i , v0 ) { var o2 = i * 1; this.uint16[o2 + 0] = v0; return i; }; return StructArrayLayout1ui2; }(StructArray)); StructArrayLayout1ui2.prototype.bytesPerElement = 2; register('StructArrayLayout1ui2', StructArrayLayout1ui2); /** * Implementation of the StructArray layout: * [0]: Float32[4] * * @private */ var StructArrayLayout4f16 = /*@__PURE__*/(function (StructArray) { function StructArrayLayout4f16 () { StructArray.apply(this, arguments); } if ( StructArray ) StructArrayLayout4f16.__proto__ = StructArray; StructArrayLayout4f16.prototype = Object.create( StructArray && StructArray.prototype ); StructArrayLayout4f16.prototype.constructor = StructArrayLayout4f16; StructArrayLayout4f16.prototype._refreshViews = function _refreshViews () { this.uint8 = new Uint8Array(this.arrayBuffer); this.float32 = new Float32Array(this.arrayBuffer); }; StructArrayLayout4f16.prototype.emplaceBack = function emplaceBack (v0 , v1 , v2 , v3 ) { var i = this.length; this.resize(i + 1); return this.emplace(i, v0, v1, v2, v3); }; StructArrayLayout4f16.prototype.emplace = function emplace (i , v0 , v1 , v2 , v3 ) { var o4 = i * 4; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; this.float32[o4 + 2] = v2; this.float32[o4 + 3] = v3; return i; }; return StructArrayLayout4f16; }(StructArray)); StructArrayLayout4f16.prototype.bytesPerElement = 16; register('StructArrayLayout4f16', StructArrayLayout4f16); var CollisionBoxStruct = /*@__PURE__*/(function (Struct) { function CollisionBoxStruct () { Struct.apply(this, arguments); } if ( Struct ) CollisionBoxStruct.__proto__ = Struct; CollisionBoxStruct.prototype = Object.create( Struct && Struct.prototype ); CollisionBoxStruct.prototype.constructor = CollisionBoxStruct; var prototypeAccessors = { anchorPointX: { configurable: true },anchorPointY: { configurable: true },x1: { configurable: true },y1: { configurable: true },x2: { configurable: true },y2: { configurable: true },featureIndex: { configurable: true },sourceLayerIndex: { configurable: true },bucketIndex: { configurable: true },anchorPoint: { configurable: true } }; prototypeAccessors.anchorPointX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors.anchorPointY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors.x1.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors.y1.get = function () { return this._structArray.int16[this._pos2 + 3]; }; prototypeAccessors.x2.get = function () { return this._structArray.int16[this._pos2 + 4]; }; prototypeAccessors.y2.get = function () { return this._structArray.int16[this._pos2 + 5]; }; prototypeAccessors.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 8]; }; prototypeAccessors.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 9]; }; prototypeAccessors.anchorPoint.get = function () { return new pointGeometry(this.anchorPointX, this.anchorPointY); }; Object.defineProperties( CollisionBoxStruct.prototype, prototypeAccessors ); return CollisionBoxStruct; }(Struct)); CollisionBoxStruct.prototype.size = 20; /** * @private */ var CollisionBoxArray = /*@__PURE__*/(function (StructArrayLayout6i1ul2ui20) { function CollisionBoxArray () { StructArrayLayout6i1ul2ui20.apply(this, arguments); } if ( StructArrayLayout6i1ul2ui20 ) CollisionBoxArray.__proto__ = StructArrayLayout6i1ul2ui20; CollisionBoxArray.prototype = Object.create( StructArrayLayout6i1ul2ui20 && StructArrayLayout6i1ul2ui20.prototype ); CollisionBoxArray.prototype.constructor = CollisionBoxArray; CollisionBoxArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new CollisionBoxStruct(this, index); }; return CollisionBoxArray; }(StructArrayLayout6i1ul2ui20)); register('CollisionBoxArray', CollisionBoxArray); var PlacedSymbolStruct = /*@__PURE__*/(function (Struct) { function PlacedSymbolStruct () { Struct.apply(this, arguments); } if ( Struct ) PlacedSymbolStruct.__proto__ = Struct; PlacedSymbolStruct.prototype = Object.create( Struct && Struct.prototype ); PlacedSymbolStruct.prototype.constructor = PlacedSymbolStruct; var prototypeAccessors$1 = { anchorX: { configurable: true },anchorY: { configurable: true },glyphStartIndex: { configurable: true },numGlyphs: { configurable: true },vertexStartIndex: { configurable: true },lineStartIndex: { configurable: true },lineLength: { configurable: true },segment: { configurable: true },lowerSize: { configurable: true },upperSize: { configurable: true },lineOffsetX: { configurable: true },lineOffsetY: { configurable: true },writingMode: { configurable: true },placedOrientation: { configurable: true },hidden: { configurable: true },crossTileID: { configurable: true },associatedIconIndex: { configurable: true } }; prototypeAccessors$1.anchorX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$1.anchorY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$1.glyphStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$1.numGlyphs.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; prototypeAccessors$1.vertexStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 2]; }; prototypeAccessors$1.lineStartIndex.get = function () { return this._structArray.uint32[this._pos4 + 3]; }; prototypeAccessors$1.lineLength.get = function () { return this._structArray.uint32[this._pos4 + 4]; }; prototypeAccessors$1.segment.get = function () { return this._structArray.uint16[this._pos2 + 10]; }; prototypeAccessors$1.lowerSize.get = function () { return this._structArray.uint16[this._pos2 + 11]; }; prototypeAccessors$1.upperSize.get = function () { return this._structArray.uint16[this._pos2 + 12]; }; prototypeAccessors$1.lineOffsetX.get = function () { return this._structArray.float32[this._pos4 + 7]; }; prototypeAccessors$1.lineOffsetY.get = function () { return this._structArray.float32[this._pos4 + 8]; }; prototypeAccessors$1.writingMode.get = function () { return this._structArray.uint8[this._pos1 + 36]; }; prototypeAccessors$1.placedOrientation.get = function () { return this._structArray.uint8[this._pos1 + 37]; }; prototypeAccessors$1.placedOrientation.set = function (x ) { this._structArray.uint8[this._pos1 + 37] = x; }; prototypeAccessors$1.hidden.get = function () { return this._structArray.uint8[this._pos1 + 38]; }; prototypeAccessors$1.hidden.set = function (x ) { this._structArray.uint8[this._pos1 + 38] = x; }; prototypeAccessors$1.crossTileID.get = function () { return this._structArray.uint32[this._pos4 + 10]; }; prototypeAccessors$1.crossTileID.set = function (x ) { this._structArray.uint32[this._pos4 + 10] = x; }; prototypeAccessors$1.associatedIconIndex.get = function () { return this._structArray.int16[this._pos2 + 22]; }; Object.defineProperties( PlacedSymbolStruct.prototype, prototypeAccessors$1 ); return PlacedSymbolStruct; }(Struct)); PlacedSymbolStruct.prototype.size = 48; /** * @private */ var PlacedSymbolArray = /*@__PURE__*/(function (StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48) { function PlacedSymbolArray () { StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.apply(this, arguments); } if ( StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 ) PlacedSymbolArray.__proto__ = StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48; PlacedSymbolArray.prototype = Object.create( StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48 && StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48.prototype ); PlacedSymbolArray.prototype.constructor = PlacedSymbolArray; PlacedSymbolArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new PlacedSymbolStruct(this, index); }; return PlacedSymbolArray; }(StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48)); register('PlacedSymbolArray', PlacedSymbolArray); var SymbolInstanceStruct = /*@__PURE__*/(function (Struct) { function SymbolInstanceStruct () { Struct.apply(this, arguments); } if ( Struct ) SymbolInstanceStruct.__proto__ = Struct; SymbolInstanceStruct.prototype = Object.create( Struct && Struct.prototype ); SymbolInstanceStruct.prototype.constructor = SymbolInstanceStruct; var prototypeAccessors$2 = { anchorX: { configurable: true },anchorY: { configurable: true },rightJustifiedTextSymbolIndex: { configurable: true },centerJustifiedTextSymbolIndex: { configurable: true },leftJustifiedTextSymbolIndex: { configurable: true },verticalPlacedTextSymbolIndex: { configurable: true },placedIconSymbolIndex: { configurable: true },verticalPlacedIconSymbolIndex: { configurable: true },key: { configurable: true },textBoxStartIndex: { configurable: true },textBoxEndIndex: { configurable: true },verticalTextBoxStartIndex: { configurable: true },verticalTextBoxEndIndex: { configurable: true },iconBoxStartIndex: { configurable: true },iconBoxEndIndex: { configurable: true },verticalIconBoxStartIndex: { configurable: true },verticalIconBoxEndIndex: { configurable: true },featureIndex: { configurable: true },numHorizontalGlyphVertices: { configurable: true },numVerticalGlyphVertices: { configurable: true },numIconVertices: { configurable: true },numVerticalIconVertices: { configurable: true },useRuntimeCollisionCircles: { configurable: true },crossTileID: { configurable: true },textBoxScale: { configurable: true },textOffset0: { configurable: true },textOffset1: { configurable: true },collisionCircleDiameter: { configurable: true } }; prototypeAccessors$2.anchorX.get = function () { return this._structArray.int16[this._pos2 + 0]; }; prototypeAccessors$2.anchorY.get = function () { return this._structArray.int16[this._pos2 + 1]; }; prototypeAccessors$2.rightJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 2]; }; prototypeAccessors$2.centerJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 3]; }; prototypeAccessors$2.leftJustifiedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 4]; }; prototypeAccessors$2.verticalPlacedTextSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 5]; }; prototypeAccessors$2.placedIconSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 6]; }; prototypeAccessors$2.verticalPlacedIconSymbolIndex.get = function () { return this._structArray.int16[this._pos2 + 7]; }; prototypeAccessors$2.key.get = function () { return this._structArray.uint16[this._pos2 + 8]; }; prototypeAccessors$2.textBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 9]; }; prototypeAccessors$2.textBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 10]; }; prototypeAccessors$2.verticalTextBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 11]; }; prototypeAccessors$2.verticalTextBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 12]; }; prototypeAccessors$2.iconBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 13]; }; prototypeAccessors$2.iconBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 14]; }; prototypeAccessors$2.verticalIconBoxStartIndex.get = function () { return this._structArray.uint16[this._pos2 + 15]; }; prototypeAccessors$2.verticalIconBoxEndIndex.get = function () { return this._structArray.uint16[this._pos2 + 16]; }; prototypeAccessors$2.featureIndex.get = function () { return this._structArray.uint16[this._pos2 + 17]; }; prototypeAccessors$2.numHorizontalGlyphVertices.get = function () { return this._structArray.uint16[this._pos2 + 18]; }; prototypeAccessors$2.numVerticalGlyphVertices.get = function () { return this._structArray.uint16[this._pos2 + 19]; }; prototypeAccessors$2.numIconVertices.get = function () { return this._structArray.uint16[this._pos2 + 20]; }; prototypeAccessors$2.numVerticalIconVertices.get = function () { return this._structArray.uint16[this._pos2 + 21]; }; prototypeAccessors$2.useRuntimeCollisionCircles.get = function () { return this._structArray.uint16[this._pos2 + 22]; }; prototypeAccessors$2.crossTileID.get = function () { return this._structArray.uint32[this._pos4 + 12]; }; prototypeAccessors$2.crossTileID.set = function (x ) { this._structArray.uint32[this._pos4 + 12] = x; }; prototypeAccessors$2.textBoxScale.get = function () { return this._structArray.float32[this._pos4 + 13]; }; prototypeAccessors$2.textOffset0.get = function () { return this._structArray.float32[this._pos4 + 14]; }; prototypeAccessors$2.textOffset1.get = function () { return this._structArray.float32[this._pos4 + 15]; }; prototypeAccessors$2.collisionCircleDiameter.get = function () { return this._structArray.float32[this._pos4 + 16]; }; Object.defineProperties( SymbolInstanceStruct.prototype, prototypeAccessors$2 ); return SymbolInstanceStruct; }(Struct)); SymbolInstanceStruct.prototype.size = 68; /** * @private */ var SymbolInstanceArray = /*@__PURE__*/(function (StructArrayLayout8i15ui1ul4f68) { function SymbolInstanceArray () { StructArrayLayout8i15ui1ul4f68.apply(this, arguments); } if ( StructArrayLayout8i15ui1ul4f68 ) SymbolInstanceArray.__proto__ = StructArrayLayout8i15ui1ul4f68; SymbolInstanceArray.prototype = Object.create( StructArrayLayout8i15ui1ul4f68 && StructArrayLayout8i15ui1ul4f68.prototype ); SymbolInstanceArray.prototype.constructor = SymbolInstanceArray; SymbolInstanceArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new SymbolInstanceStruct(this, index); }; return SymbolInstanceArray; }(StructArrayLayout8i15ui1ul4f68)); register('SymbolInstanceArray', SymbolInstanceArray); /** * @private */ var GlyphOffsetArray = /*@__PURE__*/(function (StructArrayLayout1f4) { function GlyphOffsetArray () { StructArrayLayout1f4.apply(this, arguments); } if ( StructArrayLayout1f4 ) GlyphOffsetArray.__proto__ = StructArrayLayout1f4; GlyphOffsetArray.prototype = Object.create( StructArrayLayout1f4 && StructArrayLayout1f4.prototype ); GlyphOffsetArray.prototype.constructor = GlyphOffsetArray; GlyphOffsetArray.prototype.getoffsetX = function getoffsetX (index ) { return this.float32[index * 1 + 0]; }; return GlyphOffsetArray; }(StructArrayLayout1f4)); register('GlyphOffsetArray', GlyphOffsetArray); /** * @private */ var SymbolLineVertexArray = /*@__PURE__*/(function (StructArrayLayout3i6) { function SymbolLineVertexArray () { StructArrayLayout3i6.apply(this, arguments); } if ( StructArrayLayout3i6 ) SymbolLineVertexArray.__proto__ = StructArrayLayout3i6; SymbolLineVertexArray.prototype = Object.create( StructArrayLayout3i6 && StructArrayLayout3i6.prototype ); SymbolLineVertexArray.prototype.constructor = SymbolLineVertexArray; SymbolLineVertexArray.prototype.getx = function getx (index ) { return this.int16[index * 3 + 0]; }; SymbolLineVertexArray.prototype.gety = function gety (index ) { return this.int16[index * 3 + 1]; }; SymbolLineVertexArray.prototype.gettileUnitDistanceFromAnchor = function gettileUnitDistanceFromAnchor (index ) { return this.int16[index * 3 + 2]; }; return SymbolLineVertexArray; }(StructArrayLayout3i6)); register('SymbolLineVertexArray', SymbolLineVertexArray); var FeatureIndexStruct = /*@__PURE__*/(function (Struct) { function FeatureIndexStruct () { Struct.apply(this, arguments); } if ( Struct ) FeatureIndexStruct.__proto__ = Struct; FeatureIndexStruct.prototype = Object.create( Struct && Struct.prototype ); FeatureIndexStruct.prototype.constructor = FeatureIndexStruct; var prototypeAccessors$3 = { featureIndex: { configurable: true },sourceLayerIndex: { configurable: true },bucketIndex: { configurable: true } }; prototypeAccessors$3.featureIndex.get = function () { return this._structArray.uint32[this._pos4 + 0]; }; prototypeAccessors$3.sourceLayerIndex.get = function () { return this._structArray.uint16[this._pos2 + 2]; }; prototypeAccessors$3.bucketIndex.get = function () { return this._structArray.uint16[this._pos2 + 3]; }; Object.defineProperties( FeatureIndexStruct.prototype, prototypeAccessors$3 ); return FeatureIndexStruct; }(Struct)); FeatureIndexStruct.prototype.size = 8; /** * @private */ var FeatureIndexArray = /*@__PURE__*/(function (StructArrayLayout1ul2ui8) { function FeatureIndexArray () { StructArrayLayout1ul2ui8.apply(this, arguments); } if ( StructArrayLayout1ul2ui8 ) FeatureIndexArray.__proto__ = StructArrayLayout1ul2ui8; FeatureIndexArray.prototype = Object.create( StructArrayLayout1ul2ui8 && StructArrayLayout1ul2ui8.prototype ); FeatureIndexArray.prototype.constructor = FeatureIndexArray; FeatureIndexArray.prototype.get = function get (index ) { assert_1(!this.isTransferred); return new FeatureIndexStruct(this, index); }; return FeatureIndexArray; }(StructArrayLayout1ul2ui8)); register('FeatureIndexArray', FeatureIndexArray); // var layout$1 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); var members = layout$1.members; var size = layout$1.size; var alignment = layout$1.alignment; // var SegmentVector = function SegmentVector(segments) { if ( segments === void 0 ) segments = []; this.segments = segments; }; SegmentVector.prototype.prepareSegment = function prepareSegment (numVertices , layoutVertexArray , indexArray , sortKey ) { var segment = this.segments[this.segments.length - 1]; if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { warnOnce(("Max vertices per segment is " + (SegmentVector.MAX_VERTEX_ARRAY_LENGTH) + ": bucket requested " + numVertices)); } if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) { segment = ({ vertexOffset: layoutVertexArray.length, primitiveOffset: indexArray.length, vertexLength: 0, primitiveLength: 0 } ); if (sortKey !== undefined) { segment.sortKey = sortKey; } this.segments.push(segment); } return segment; }; SegmentVector.prototype.get = function get () { return this.segments; }; SegmentVector.prototype.destroy = function destroy () { for (var i = 0, list = this.segments; i < list.length; i += 1) { var segment = list[i]; for (var k in segment.vaos) { segment.vaos[k].destroy(); } } }; SegmentVector.simpleSegment = function simpleSegment (vertexOffset , primitiveOffset , vertexLength , primitiveLength ) { return new SegmentVector([{ vertexOffset: vertexOffset, primitiveOffset: primitiveOffset, vertexLength: vertexLength, primitiveLength: primitiveLength, vaos: {}, sortKey: 0 }]); }; /* * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit * addressing of vertex buffers. * @private * @readonly */ SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1; register('SegmentVector', SegmentVector); // /** * Packs two numbers, interpreted as 8-bit unsigned integers, into a single * float. Unpack them in the shader using the `unpack_float()` function, * defined in _prelude.vertex.glsl * * @private */ function packUint8ToFloat(a , b ) { // coerce a and b to 8-bit ints a = clamp(Math.floor(a), 0, 255); b = clamp(Math.floor(b), 0, 255); return 256 * a + b; } // var patternAttributes = createLayout([ // [tl.x, tl.y, br.x, br.y] {name: 'a_pattern_from', components: 4, type: 'Uint16'}, {name: 'a_pattern_to', components: 4, type: 'Uint16'}, {name: 'a_pixel_ratio_from', components: 1, type: 'Uint16'}, {name: 'a_pixel_ratio_to', components: 1, type: 'Uint16'} ]); var murmurhash3_gc = createCommonjsModule(function (module) { /** * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011) * * @author Gary Court * @see http://github.com/garycourt/murmurhash-js * @author Austin Appleby * @see http://sites.google.com/site/murmurhash/ * * @param {string} key ASCII only * @param {number} seed Positive integer only * @return {number} 32-bit positive integer hash */ function murmurhash3_32_gc(key, seed) { var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i; remainder = key.length & 3; // key.length % 4 bytes = key.length - remainder; h1 = seed; c1 = 0xcc9e2d51; c2 = 0x1b873593; i = 0; while (i < bytes) { k1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24); ++i; k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); } k1 = 0; switch (remainder) { case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; case 1: k1 ^= (key.charCodeAt(i) & 0xff); k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; } h1 ^= key.length; h1 ^= h1 >>> 16; h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 13; h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; h1 ^= h1 >>> 16; return h1 >>> 0; } if('object' !== "undefined") { module.exports = murmurhash3_32_gc; } }); var murmurhash2_gc = createCommonjsModule(function (module) { /** * JS Implementation of MurmurHash2 * * @author Gary Court * @see http://github.com/garycourt/murmurhash-js * @author Austin Appleby * @see http://sites.google.com/site/murmurhash/ * * @param {string} str ASCII only * @param {number} seed Positive integer only * @return {number} 32-bit positive integer hash */ function murmurhash2_32_gc(str, seed) { var l = str.length, h = seed ^ l, i = 0, k; while (l >= 4) { k = ((str.charCodeAt(i) & 0xff)) | ((str.charCodeAt(++i) & 0xff) << 8) | ((str.charCodeAt(++i) & 0xff) << 16) | ((str.charCodeAt(++i) & 0xff) << 24); k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); k ^= k >>> 24; k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k; l -= 4; ++i; } switch (l) { case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16; case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8; case 1: h ^= (str.charCodeAt(i) & 0xff); h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); } h ^= h >>> 13; h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); h ^= h >>> 15; return h >>> 0; } if('object' !== undefined) { module.exports = murmurhash2_32_gc; } }); var murmurhashJs = murmurhash3_gc; var murmur3_1 = murmurhash3_gc; var murmur2_1 = murmurhash2_gc; murmurhashJs.murmur3 = murmur3_1; murmurhashJs.murmur2 = murmur2_1; // // A transferable data structure that maps feature ids to their indices and buffer offsets var FeaturePositionMap = function FeaturePositionMap() { this.ids = []; this.positions = []; this.indexed = false; }; FeaturePositionMap.prototype.add = function add (id , index , start , end ) { this.ids.push(getNumericId(id)); this.positions.push(index, start, end); }; FeaturePositionMap.prototype.getPositions = function getPositions (id ) { assert_1(this.indexed); var intId = getNumericId(id); // binary search for the first occurrence of id in this.ids; // relies on ids/positions being sorted by id, which happens in serialization var i = 0; var j = this.ids.length - 1; while (i < j) { var m = (i + j) >> 1; if (this.ids[m] >= intId) { j = m; } else { i = m + 1; } } var positions = []; while (this.ids[i] === intId) { var index = this.positions[3 * i]; var start = this.positions[3 * i + 1]; var end = this.positions[3 * i + 2]; positions.push({index: index, start: start, end: end}); i++; } return positions; }; FeaturePositionMap.serialize = function serialize (map , transferables ) { var ids = new Float64Array(map.ids); var positions = new Uint32Array(map.positions); sort(ids, positions, 0, ids.length - 1); if (transferables) { transferables.push(ids.buffer, positions.buffer); } return {ids: ids, positions: positions}; }; FeaturePositionMap.deserialize = function deserialize (obj ) { var map = new FeaturePositionMap(); // after transferring, we only use these arrays statically (no pushes), // so TypedArray vs Array distinction that flow points out doesn't matter map.ids = (obj.ids ); map.positions = (obj.positions ); map.indexed = true; return map; }; var MAX_SAFE_INTEGER$1 = Math.pow(2, 53) - 1; function getNumericId(value ) { var numValue = +value; if (!isNaN(numValue) && numValue <= MAX_SAFE_INTEGER$1) { return numValue; } return murmurhashJs(String(value)); } // custom quicksort that sorts ids, indices and offsets together (by ids) // uses Hoare partitioning & manual tail call optimization to avoid worst case scenarios function sort(ids, positions, left, right) { while (left < right) { var pivot = ids[(left + right) >> 1]; var i = left - 1; var j = right + 1; while (true) { do { i++; } while (ids[i] < pivot); do { j--; } while (ids[j] > pivot); if (i >= j) { break; } swap(ids, i, j); swap(positions, 3 * i, 3 * j); swap(positions, 3 * i + 1, 3 * j + 1); swap(positions, 3 * i + 2, 3 * j + 2); } if (j - left < right - j) { sort(ids, positions, left, j); left = j + 1; } else { sort(ids, positions, j + 1, right); right = j; } } } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } register('FeaturePositionMap', FeaturePositionMap); // var Uniform = function Uniform(context , location ) { this.gl = context.gl; this.location = location; }; var Uniform1i = /*@__PURE__*/(function (Uniform) { function Uniform1i(context , location ) { Uniform.call(this, context, location); this.current = 0; } if ( Uniform ) Uniform1i.__proto__ = Uniform; Uniform1i.prototype = Object.create( Uniform && Uniform.prototype ); Uniform1i.prototype.constructor = Uniform1i; Uniform1i.prototype.set = function set (v ) { if (this.current !== v) { this.current = v; this.gl.uniform1i(this.location, v); } }; return Uniform1i; }(Uniform)); var Uniform1f = /*@__PURE__*/(function (Uniform) { function Uniform1f(context , location ) { Uniform.call(this, context, location); this.current = 0; } if ( Uniform ) Uniform1f.__proto__ = Uniform; Uniform1f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform1f.prototype.constructor = Uniform1f; Uniform1f.prototype.set = function set (v ) { if (this.current !== v) { this.current = v; this.gl.uniform1f(this.location, v); } }; return Uniform1f; }(Uniform)); var Uniform2f = /*@__PURE__*/(function (Uniform) { function Uniform2f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0]; } if ( Uniform ) Uniform2f.__proto__ = Uniform; Uniform2f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform2f.prototype.constructor = Uniform2f; Uniform2f.prototype.set = function set (v ) { if (v[0] !== this.current[0] || v[1] !== this.current[1]) { this.current = v; this.gl.uniform2f(this.location, v[0], v[1]); } }; return Uniform2f; }(Uniform)); var Uniform3f = /*@__PURE__*/(function (Uniform) { function Uniform3f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0, 0]; } if ( Uniform ) Uniform3f.__proto__ = Uniform; Uniform3f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform3f.prototype.constructor = Uniform3f; Uniform3f.prototype.set = function set (v ) { if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) { this.current = v; this.gl.uniform3f(this.location, v[0], v[1], v[2]); } }; return Uniform3f; }(Uniform)); var Uniform4f = /*@__PURE__*/(function (Uniform) { function Uniform4f(context , location ) { Uniform.call(this, context, location); this.current = [0, 0, 0, 0]; } if ( Uniform ) Uniform4f.__proto__ = Uniform; Uniform4f.prototype = Object.create( Uniform && Uniform.prototype ); Uniform4f.prototype.constructor = Uniform4f; Uniform4f.prototype.set = function set (v ) { if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2] || v[3] !== this.current[3]) { this.current = v; this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]); } }; return Uniform4f; }(Uniform)); var UniformColor = /*@__PURE__*/(function (Uniform) { function UniformColor(context , location ) { Uniform.call(this, context, location); this.current = Color.transparent; } if ( Uniform ) UniformColor.__proto__ = Uniform; UniformColor.prototype = Object.create( Uniform && Uniform.prototype ); UniformColor.prototype.constructor = UniformColor; UniformColor.prototype.set = function set (v ) { if (v.r !== this.current.r || v.g !== this.current.g || v.b !== this.current.b || v.a !== this.current.a) { this.current = v; this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a); } }; return UniformColor; }(Uniform)); var emptyMat4 = new Float32Array(16); var UniformMatrix4f = /*@__PURE__*/(function (Uniform) { function UniformMatrix4f(context , location ) { Uniform.call(this, context, location); this.current = emptyMat4; } if ( Uniform ) UniformMatrix4f.__proto__ = Uniform; UniformMatrix4f.prototype = Object.create( Uniform && Uniform.prototype ); UniformMatrix4f.prototype.constructor = UniformMatrix4f; UniformMatrix4f.prototype.set = function set (v ) { // The vast majority of matrix comparisons that will trip this set // happen at i=12 or i=0, so we check those first to avoid lots of // unnecessary iteration: if (v[12] !== this.current[12] || v[0] !== this.current[0]) { this.current = v; this.gl.uniformMatrix4fv(this.location, false, v); return; } for (var i = 1; i < 16; i++) { if (v[i] !== this.current[i]) { this.current = v; this.gl.uniformMatrix4fv(this.location, false, v); break; } } }; return UniformMatrix4f; }(Uniform)); // function packColor(color ) { return [ packUint8ToFloat(255 * color.r, 255 * color.g), packUint8ToFloat(255 * color.b, 255 * color.a) ]; } /** * `Binder` is the interface definition for the strategies for constructing, * uploading, and binding paint property data as GLSL attributes. Most style- * spec properties have a 1:1 relationship to shader attribute/uniforms, but * some require multliple values per feature to be passed to the GPU, and in * those cases we bind multiple attributes/uniforms. * * It has three implementations, one for each of the three strategies we use: * * * For _constant_ properties -- those whose value is a constant, or the constant * result of evaluating a camera expression at a particular camera position -- we * don't need a vertex attribute buffer, and instead use a uniform. * * For data expressions, we use a vertex buffer with a single attribute value, * the evaluated result of the source function for the given feature. * * For composite expressions, we use a vertex buffer with two attributes: min and * max values covering the range of zooms at which we expect the tile to be * displayed. These values are calculated by evaluating the composite expression for * the given feature at strategically chosen zoom levels. In addition to this * attribute data, we also use a uniform value which the shader uses to interpolate * between the min and max value at the final displayed zoom level. The use of a * uniform allows us to cheaply update the value on every frame. * * Note that the shader source varies depending on whether we're using a uniform or * attribute. We dynamically compile shaders at runtime to accomodate this. * * @private */ var ConstantBinder = function ConstantBinder(value , names , type ) { this.value = value; this.uniformNames = names.map(function (name) { return ("u_" + name); }); this.type = type; }; ConstantBinder.prototype.setUniform = function setUniform (uniform , globals , currentValue ) { uniform.set(currentValue.constantOr(this.value)); }; ConstantBinder.prototype.getBinding = function getBinding (context , location , _ ) { return (this.type === 'color') ? new UniformColor(context, location) : new Uniform1f(context, location); }; var CrossFadedConstantBinder = function CrossFadedConstantBinder(value , names ) { this.uniformNames = names.map(function (name) { return ("u_" + name); }); this.patternFrom = null; this.patternTo = null; this.pixelRatioFrom = 1.0; this.pixelRatioTo = 1.0; }; CrossFadedConstantBinder.prototype.setConstantPatternPositions = function setConstantPatternPositions (posTo , posFrom ) { this.pixelRatioFrom = posFrom.pixelRatio; this.pixelRatioTo = posTo.pixelRatio; this.patternFrom = posFrom.tlbr; this.patternTo = posTo.tlbr; }; CrossFadedConstantBinder.prototype.setUniform = function setUniform (uniform , globals , currentValue , uniformName ) { var pos = uniformName === 'u_pattern_to' ? this.patternTo : uniformName === 'u_pattern_from' ? this.patternFrom : uniformName === 'u_pixel_ratio_to' ? this.pixelRatioTo : uniformName === 'u_pixel_ratio_from' ? this.pixelRatioFrom : null; if (pos) { uniform.set(pos); } }; CrossFadedConstantBinder.prototype.getBinding = function getBinding (context , location , name ) { return name.substr(0, 9) === 'u_pattern' ? new Uniform4f(context, location) : new Uniform1f(context, location); }; var SourceExpressionBinder = function SourceExpressionBinder(expression , names , type , PaintVertexArray ) { this.expression = expression; this.type = type; this.maxValue = 0; this.paintVertexAttributes = names.map(function (name) { return ({ name: ("a_" + name), type: 'Float32', components: type === 'color' ? 2 : 1, offset: 0 }); }); this.paintVertexArray = new PaintVertexArray(); }; SourceExpressionBinder.prototype.populatePaintArray = function populatePaintArray (newLength , feature , imagePositions , canonical , formattedSection ) { var start = this.paintVertexArray.length; var value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, canonical, [], formattedSection); this.paintVertexArray.resize(newLength); this._setPaintValue(start, newLength, value); }; SourceExpressionBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState ) { var value = this.expression.evaluate({zoom: 0}, feature, featureState); this._setPaintValue(start, end, value); }; SourceExpressionBinder.prototype._setPaintValue = function _setPaintValue (start, end, value) { if (this.type === 'color') { var color = packColor(value); for (var i = start; i < end; i++) { this.paintVertexArray.emplace(i, color[0], color[1]); } } else { for (var i$1 = start; i$1 < end; i$1++) { this.paintVertexArray.emplace(i$1, value); } this.maxValue = Math.max(this.maxValue, Math.abs(value)); } }; SourceExpressionBinder.prototype.upload = function upload (context ) { if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { this.paintVertexBuffer.updateData(this.paintVertexArray); } else { this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); } } }; SourceExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; var CompositeExpressionBinder = function CompositeExpressionBinder(expression , names , type , useIntegerZoom , zoom , PaintVertexArray ) { this.expression = expression; this.uniformNames = names.map(function (name) { return ("u_" + name + "_t"); }); this.type = type; this.useIntegerZoom = useIntegerZoom; this.zoom = zoom; this.maxValue = 0; this.paintVertexAttributes = names.map(function (name) { return ({ name: ("a_" + name), type: 'Float32', components: type === 'color' ? 4 : 2, offset: 0 }); }); this.paintVertexArray = new PaintVertexArray(); }; CompositeExpressionBinder.prototype.populatePaintArray = function populatePaintArray (newLength , feature , imagePositions , canonical , formattedSection ) { var min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, canonical, [], formattedSection); var max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, canonical, [], formattedSection); var start = this.paintVertexArray.length; this.paintVertexArray.resize(newLength); this._setPaintValue(start, newLength, min, max); }; CompositeExpressionBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState ) { var min = this.expression.evaluate({zoom: this.zoom}, feature, featureState); var max = this.expression.evaluate({zoom: this.zoom + 1}, feature, featureState); this._setPaintValue(start, end, min, max); }; CompositeExpressionBinder.prototype._setPaintValue = function _setPaintValue (start, end, min, max) { if (this.type === 'color') { var minColor = packColor(min); var maxColor = packColor(max); for (var i = start; i < end; i++) { this.paintVertexArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]); } } else { for (var i$1 = start; i$1 < end; i$1++) { this.paintVertexArray.emplace(i$1, min, max); } this.maxValue = Math.max(this.maxValue, Math.abs(min), Math.abs(max)); } }; CompositeExpressionBinder.prototype.upload = function upload (context ) { if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { this.paintVertexBuffer.updateData(this.paintVertexArray); } else { this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); } } }; CompositeExpressionBinder.prototype.destroy = function destroy () { if (this.paintVertexBuffer) { this.paintVertexBuffer.destroy(); } }; CompositeExpressionBinder.prototype.setUniform = function setUniform (uniform , globals ) { var currentZoom = this.useIntegerZoom ? Math.floor(globals.zoom) : globals.zoom; var factor = clamp(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1); uniform.set(factor); }; CompositeExpressionBinder.prototype.getBinding = function getBinding (context , location , _ ) { return new Uniform1f(context, location); }; var CrossFadedCompositeBinder = function CrossFadedCompositeBinder(expression , type , useIntegerZoom , zoom , PaintVertexArray , layerId ) { this.expression = expression; this.type = type; this.useIntegerZoom = useIntegerZoom; this.zoom = zoom; this.layerId = layerId; this.zoomInPaintVertexArray = new PaintVertexArray(); this.zoomOutPaintVertexArray = new PaintVertexArray(); }; CrossFadedCompositeBinder.prototype.populatePaintArray = function populatePaintArray (length , feature , imagePositions ) { var start = this.zoomInPaintVertexArray.length; this.zoomInPaintVertexArray.resize(length); this.zoomOutPaintVertexArray.resize(length); this._setPaintValues(start, length, feature.patterns && feature.patterns[this.layerId], imagePositions); }; CrossFadedCompositeBinder.prototype.updatePaintArray = function updatePaintArray (start , end , feature , featureState , imagePositions ) { this._setPaintValues(start, end, feature.patterns && feature.patterns[this.layerId], imagePositions); }; CrossFadedCompositeBinder.prototype._setPaintValues = function _setPaintValues (start, end, patterns, positions) { if (!positions || !patterns) { return; } var min = patterns.min; var mid = patterns.mid; var max = patterns.max; var imageMin = positions[min]; var imageMid = positions[mid]; var imageMax = positions[max]; if (!imageMin || !imageMid || !imageMax) { return; } // We populate two paint arrays because, for cross-faded properties, we don't know which direction // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass // unnecessary vertex data to the shaders, we determine which to upload at draw time. for (var i = start; i < end; i++) { this.zoomInPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMin.tl[0], imageMin.tl[1], imageMin.br[0], imageMin.br[1], imageMid.pixelRatio, imageMin.pixelRatio ); this.zoomOutPaintVertexArray.emplace(i, imageMid.tl[0], imageMid.tl[1], imageMid.br[0], imageMid.br[1], imageMax.tl[0], imageMax.tl[1], imageMax.br[0], imageMax.br[1], imageMid.pixelRatio, imageMax.pixelRatio ); } }; CrossFadedCompositeBinder.prototype.upload = function upload (context ) { if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) { this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, patternAttributes.members, this.expression.isStateDependent); this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, patternAttributes.members, this.expression.isStateDependent); } }; CrossFadedCompositeBinder.prototype.destroy = function destroy () { if (this.zoomOutPaintVertexBuffer) { this.zoomOutPaintVertexBuffer.destroy(); } if (this.zoomInPaintVertexBuffer) { this.zoomInPaintVertexBuffer.destroy(); } }; /** * ProgramConfiguration contains the logic for binding style layer properties and tile * layer feature data into GL program uniforms and vertex attributes. * * Non-data-driven property values are bound to shader uniforms. Data-driven property * values are bound to vertex attributes. In order to support a uniform GLSL syntax over * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma` * abstraction, which ProgramConfiguration is responsible for implementing. At runtime, * it examines the attributes of a particular layer, combines this with fixed knowledge * about how layers of the particular type are implemented, and determines which uniforms * and vertex attributes will be required. It can then substitute the appropriate text * into the shader source code, create and link a program, and bind the uniforms and * vertex attributes in preparation for drawing. * * When a vector tile is parsed, this same configuration information is used to * populate the attribute buffers needed for data-driven styling using the zoom * level and feature property data. * * @private */ var ProgramConfiguration = function ProgramConfiguration(layer , zoom , filterProperties ) { this.binders = {}; this._buffers = []; var keys = []; for (var property in layer.paint._values) { if (!filterProperties(property)) { continue; } var value = layer.paint.get(property); if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { continue; } var names = paintAttributeNames(property, layer.type); var expression = value.value; var type = value.property.specification.type; var useIntegerZoom = value.property.useIntegerZoom; var propType = value.property.specification['property-type']; var isCrossFaded = propType === 'cross-faded' || propType === 'cross-faded-data-driven'; if (expression.kind === 'constant') { this.binders[property] = isCrossFaded ? new CrossFadedConstantBinder(expression.value, names) : new ConstantBinder(expression.value, names, type); keys.push(("/u_" + property)); } else if (expression.kind === 'source' || isCrossFaded) { var StructArrayLayout = layoutType(property, type, 'source'); this.binders[property] = isCrossFaded ? new CrossFadedCompositeBinder(expression, type, useIntegerZoom, zoom, StructArrayLayout, layer.id) : new SourceExpressionBinder(expression, names, type, StructArrayLayout); keys.push(("/a_" + property)); } else { var StructArrayLayout$1 = layoutType(property, type, 'composite'); this.binders[property] = new CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout$1); keys.push(("/z_" + property)); } } this.cacheKey = keys.sort().join(''); }; ProgramConfiguration.prototype.getMaxValue = function getMaxValue (property ) { var binder = this.binders[property]; return binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ? binder.maxValue : 0; }; ProgramConfiguration.prototype.populatePaintArrays = function populatePaintArrays (newLength , feature , imagePositions , canonical , formattedSection ) { for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) { (binder ).populatePaintArray(newLength, feature, imagePositions, canonical, formattedSection); } } }; ProgramConfiguration.prototype.setConstantPatternPositions = function setConstantPatternPositions (posTo , posFrom ) { for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof CrossFadedConstantBinder) { binder.setConstantPatternPositions(posTo, posFrom); } } }; ProgramConfiguration.prototype.updatePaintArrays = function updatePaintArrays (featureStates , featureMap , vtLayer , layer , imagePositions ) { var dirty = false; for (var id in featureStates) { var positions = featureMap.getPositions(id); for (var i = 0, list = positions; i < list.length; i += 1) { var pos = list[i]; var feature = vtLayer.feature(pos.index); for (var property in this.binders) { var binder = this.binders[property]; if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) && (binder ).expression.isStateDependent === true) { //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255 var value = layer.paint.get(property); (binder ).expression = value.value; (binder ).updatePaintArray(pos.start, pos.end, feature, featureStates[id], imagePositions); dirty = true; } } } } return dirty; }; ProgramConfiguration.prototype.defines = function defines () { var result = []; for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) { result.push.apply(result, binder.uniformNames.map(function (name) { return ("#define HAS_UNIFORM_" + name); })); } } return result; }; ProgramConfiguration.prototype.getBinderAttributes = function getBinderAttributes () { var result = []; for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) { for (var i = 0; i < binder.paintVertexAttributes.length; i++) { result.push(binder.paintVertexAttributes[i].name); } } else if (binder instanceof CrossFadedCompositeBinder) { for (var i$1 = 0; i$1 < patternAttributes.members.length; i$1++) { result.push(patternAttributes.members[i$1].name); } } } return result; }; ProgramConfiguration.prototype.getBinderUniforms = function getBinderUniforms () { var uniforms = []; for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { for (var i = 0, list = binder.uniformNames; i < list.length; i += 1) { var uniformName = list[i]; uniforms.push(uniformName); } } } return uniforms; }; ProgramConfiguration.prototype.getPaintVertexBuffers = function getPaintVertexBuffers () { return this._buffers; }; ProgramConfiguration.prototype.getUniforms = function getUniforms (context , locations ) { var uniforms = []; for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { for (var i = 0, list = binder.uniformNames; i < list.length; i += 1) { var name = list[i]; if (locations[name]) { var binding = binder.getBinding(context, locations[name], name); uniforms.push({name: name, property: property, binding: binding}); } } } } return uniforms; }; ProgramConfiguration.prototype.setUniforms = function setUniforms (context , binderUniforms , properties , globals ) { // Uniform state bindings are owned by the Program, but we set them // from within the ProgramConfiguraton's binder members. for (var i = 0, list = binderUniforms; i < list.length; i += 1) { var ref = list[i]; var name = ref.name; var property = ref.property; var binding = ref.binding; (this.binders[property] ).setUniform(binding, globals, properties.get(property), name); } }; ProgramConfiguration.prototype.updatePaintBuffers = function updatePaintBuffers (crossfade ) { this._buffers = []; for (var property in this.binders) { var binder = this.binders[property]; if (crossfade && binder instanceof CrossFadedCompositeBinder) { var patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer; if (patternVertexBuffer) { this._buffers.push(patternVertexBuffer); } } else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer) { this._buffers.push(binder.paintVertexBuffer); } } }; ProgramConfiguration.prototype.upload = function upload (context ) { for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) { binder.upload(context); } } this.updatePaintBuffers(); }; ProgramConfiguration.prototype.destroy = function destroy () { for (var property in this.binders) { var binder = this.binders[property]; if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) { binder.destroy(); } } }; var ProgramConfigurationSet = function ProgramConfigurationSet(layers , zoom , filterProperties) { if ( filterProperties === void 0 ) filterProperties = function () { return true; }; this.programConfigurations = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; this.programConfigurations[layer.id] = new ProgramConfiguration(layer, zoom, filterProperties); } this.needsUpload = false; this._featureMap = new FeaturePositionMap(); this._bufferOffset = 0; }; ProgramConfigurationSet.prototype.populatePaintArrays = function populatePaintArrays (length , feature , index , imagePositions , canonical , formattedSection ) { for (var key in this.programConfigurations) { this.programConfigurations[key].populatePaintArrays(length, feature, imagePositions, canonical, formattedSection); } if (feature.id !== undefined) { this._featureMap.add(feature.id, index, this._bufferOffset, length); } this._bufferOffset = length; this.needsUpload = true; }; ProgramConfigurationSet.prototype.updatePaintArrays = function updatePaintArrays (featureStates , vtLayer , layers , imagePositions ) { for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, vtLayer, layer, imagePositions) || this.needsUpload; } }; ProgramConfigurationSet.prototype.get = function get (layerId ) { return this.programConfigurations[layerId]; }; ProgramConfigurationSet.prototype.upload = function upload (context ) { if (!this.needsUpload) { return; } for (var layerId in this.programConfigurations) { this.programConfigurations[layerId].upload(context); } this.needsUpload = false; }; ProgramConfigurationSet.prototype.destroy = function destroy () { for (var layerId in this.programConfigurations) { this.programConfigurations[layerId].destroy(); } }; function paintAttributeNames(property, type) { var attributeNameExceptions = { 'text-opacity': ['opacity'], 'icon-opacity': ['opacity'], 'text-color': ['fill_color'], 'icon-color': ['fill_color'], 'text-halo-color': ['halo_color'], 'icon-halo-color': ['halo_color'], 'text-halo-blur': ['halo_blur'], 'icon-halo-blur': ['halo_blur'], 'text-halo-width': ['halo_width'], 'icon-halo-width': ['halo_width'], 'line-gap-width': ['gapwidth'], 'line-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], 'fill-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], 'fill-extrusion-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], }; return attributeNameExceptions[property] || [property.replace((type + "-"), '').replace(/-/g, '_')]; } function getLayoutException(property) { var propertyExceptions = { 'line-pattern':{ 'source': StructArrayLayout10ui20, 'composite': StructArrayLayout10ui20 }, 'fill-pattern': { 'source': StructArrayLayout10ui20, 'composite': StructArrayLayout10ui20 }, 'fill-extrusion-pattern':{ 'source': StructArrayLayout10ui20, 'composite': StructArrayLayout10ui20 } }; return propertyExceptions[property]; } function layoutType(property, type, binderType) { var defaultLayouts = { 'color': { 'source': StructArrayLayout2f8, 'composite': StructArrayLayout4f16 }, 'number': { 'source': StructArrayLayout1f4, 'composite': StructArrayLayout2f8 } }; var layoutException = getLayoutException(property); return layoutException && layoutException[binderType] || defaultLayouts[type][binderType]; } register('ConstantBinder', ConstantBinder); register('CrossFadedConstantBinder', CrossFadedConstantBinder); register('SourceExpressionBinder', SourceExpressionBinder); register('CrossFadedCompositeBinder', CrossFadedCompositeBinder); register('CompositeExpressionBinder', CompositeExpressionBinder); register('ProgramConfiguration', ProgramConfiguration, {omit: ['_buffers']}); register('ProgramConfigurationSet', ProgramConfigurationSet); // // /** * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of * all source features normalized to this extent upon load. * * The value is a consequence of the following: * * * Vertex buffer store positions as signed 16 bit integers. * * One bit is lost for signedness to support tile buffers. * * One bit is lost because the line vertex buffer used to pack 1 bit of other data into the int. * * One bit is lost to support features extending past the extent on the right edge of the tile. * * This leaves us with 2^13 = 8192 * * @private * @readonly */ var EXTENT$1 = 8192; // // These bounds define the minimum and maximum supported coordinate values. // While visible coordinates are within [0, EXTENT], tiles may theoretically // contain cordinates within [-Infinity, Infinity]. Our range is limited by the // number of bits used to represent the coordinate. var BITS = 15; var MAX = Math.pow(2, BITS - 1) - 1; var MIN = -MAX - 1; /** * Loads a geometry from a VectorTileFeature and scales it to the common extent * used internally. * @param {VectorTileFeature} feature * @private */ function loadGeometry(feature ) { var scale = EXTENT$1 / feature.extent; var geometry = feature.loadGeometry(); for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; for (var p = 0; p < ring.length; p++) { var point = ring[p]; // round here because mapbox-gl-native uses integers to represent // points and we need to do the same to avoid renering differences. var x = Math.round(point.x * scale); var y = Math.round(point.y * scale); point.x = clamp(x, MIN, MAX); point.y = clamp(y, MIN, MAX); if (x < point.x || x > point.x + 1 || y < point.y || y > point.y + 1) { // warn when exceeding allowed extent except for the 1-px-off case // https://github.com/mapbox/mapbox-gl-js/issues/8992 warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); } } } return geometry; } // function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { layoutVertexArray.emplaceBack( (x * 2) + ((extrudeX + 1) / 2), (y * 2) + ((extrudeY + 1) / 2)); } /** * Circles are represented by two triangles. * * Each corner has a pos that is the center of the circle and an extrusion * vector that is where it points. * @private */ var CircleBucket = function CircleBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout2i4(); this.indexArray = new StructArrayLayout3ui6(); this.segments = new SegmentVector(); this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; CircleBucket.prototype.populate = function populate (features , options , canonical ) { var styleLayer = this.layers[0]; var bucketFeatures = []; var circleSortKey = null; // Heatmap layers are handled in this bucket and have no evaluated properties, so we check our access if (styleLayer.type === 'circle') { circleSortKey = ((styleLayer ) ).layout.get('circle-sort-key'); } for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var id = ref.id; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; var needGeometry = this.layers[0]._featureFilter.needGeometry; var evaluationFeature = {type: feature.type, id: id, properties: feature.properties, geometry: needGeometry ? loadGeometry(feature) : []}; if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) { continue; } if (!needGeometry) { evaluationFeature.geometry = loadGeometry(feature); } var sortKey = circleSortKey ? circleSortKey.evaluate(evaluationFeature, {}, canonical) : undefined; var bucketFeature = { id: id, properties: feature.properties, type: feature.type, sourceLayerIndex: sourceLayerIndex, index: index, geometry : evaluationFeature.geometry, patterns: {}, sortKey: sortKey }; bucketFeatures.push(bucketFeature); } if (circleSortKey) { bucketFeatures.sort(function (a, b) { // a.sortKey is always a number when in use return ((a.sortKey ) ) - ((b.sortKey ) ); }); } for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) { var bucketFeature$1 = list$1[i$1]; var ref$1 = bucketFeature$1; var geometry = ref$1.geometry; var index$1 = ref$1.index; var sourceLayerIndex$1 = ref$1.sourceLayerIndex; var feature$1 = features[index$1].feature; this.addFeature(bucketFeature$1, geometry, index$1, canonical); options.featureIndex.insert(feature$1, geometry, index$1, sourceLayerIndex$1, this.index); } }; CircleBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; CircleBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; CircleBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; CircleBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; CircleBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; CircleBucket.prototype.addFeature = function addFeature (feature , geometry , index , canonical ) { for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var ring = list$1[i$1]; for (var i = 0, list = ring; i < list.length; i += 1) { var point = list[i]; var x = point.x; var y = point.y; // Do not include points that are outside the tile boundaries. if (x < 0 || x >= EXTENT$1 || y < 0 || y >= EXTENT$1) { continue; } // this geometry will be of the Point type, and we'll derive // two triangles from it. // // ┌─────────┐ // │ 3 2 │ // │ │ // │ 0 1 │ // └─────────┘ var segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey); var index$1 = segment.vertexLength; addCircleVertex(this.layoutVertexArray, x, y, -1, -1); addCircleVertex(this.layoutVertexArray, x, y, 1, -1); addCircleVertex(this.layoutVertexArray, x, y, 1, 1); addCircleVertex(this.layoutVertexArray, x, y, -1, 1); this.indexArray.emplaceBack(index$1, index$1 + 1, index$1 + 2); this.indexArray.emplaceBack(index$1, index$1 + 3, index$1 + 2); segment.vertexLength += 4; segment.primitiveLength += 2; } } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}, canonical); }; register('CircleBucket', CircleBucket, {omit: ['layers']}); // function polygonIntersectsPolygon(polygonA , polygonB ) { for (var i = 0; i < polygonA.length; i++) { if (polygonContainsPoint(polygonB, polygonA[i])) { return true; } } for (var i$1 = 0; i$1 < polygonB.length; i$1++) { if (polygonContainsPoint(polygonA, polygonB[i$1])) { return true; } } if (lineIntersectsLine(polygonA, polygonB)) { return true; } return false; } function polygonIntersectsBufferedPoint(polygon , point , radius ) { if (polygonContainsPoint(polygon, point)) { return true; } if (pointIntersectsBufferedLine(point, polygon, radius)) { return true; } return false; } function polygonIntersectsMultiPolygon(polygon , multiPolygon ) { if (polygon.length === 1) { return multiPolygonContainsPoint(multiPolygon, polygon[0]); } for (var m = 0; m < multiPolygon.length; m++) { var ring = multiPolygon[m]; for (var n = 0; n < ring.length; n++) { if (polygonContainsPoint(polygon, ring[n])) { return true; } } } for (var i = 0; i < polygon.length; i++) { if (multiPolygonContainsPoint(multiPolygon, polygon[i])) { return true; } } for (var k = 0; k < multiPolygon.length; k++) { if (lineIntersectsLine(polygon, multiPolygon[k])) { return true; } } return false; } function polygonIntersectsBufferedMultiLine(polygon , multiLine , radius ) { for (var i = 0; i < multiLine.length; i++) { var line = multiLine[i]; if (polygon.length >= 3) { for (var k = 0; k < line.length; k++) { if (polygonContainsPoint(polygon, line[k])) { return true; } } } if (lineIntersectsBufferedLine(polygon, line, radius)) { return true; } } return false; } function lineIntersectsBufferedLine(lineA , lineB , radius ) { if (lineA.length > 1) { if (lineIntersectsLine(lineA, lineB)) { return true; } // Check whether any point in either line is within radius of the other line for (var j = 0; j < lineB.length; j++) { if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) { return true; } } } for (var k = 0; k < lineA.length; k++) { if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) { return true; } } return false; } function lineIntersectsLine(lineA , lineB ) { if (lineA.length === 0 || lineB.length === 0) { return false; } for (var i = 0; i < lineA.length - 1; i++) { var a0 = lineA[i]; var a1 = lineA[i + 1]; for (var j = 0; j < lineB.length - 1; j++) { var b0 = lineB[j]; var b1 = lineB[j + 1]; if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) { return true; } } } return false; } function lineSegmentIntersectsLineSegment(a0 , a1 , b0 , b1 ) { return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) && isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1); } function pointIntersectsBufferedLine(p , line , radius ) { var radiusSquared = radius * radius; if (line.length === 1) { return p.distSqr(line[0]) < radiusSquared; } for (var i = 1; i < line.length; i++) { // Find line segments that have a distance <= radius^2 to p // In that case, we treat the line as "containing point p". var v = line[i - 1], w = line[i]; if (distToSegmentSquared(p, v, w) < radiusSquared) { return true; } } return false; } // Code from http://stackoverflow.com/a/1501725/331379. function distToSegmentSquared(p , v , w ) { var l2 = v.distSqr(w); if (l2 === 0) { return p.distSqr(v); } var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; if (t < 0) { return p.distSqr(v); } if (t > 1) { return p.distSqr(w); } return p.distSqr(w.sub(v)._mult(t)._add(v)); } // point in polygon ray casting algorithm function multiPolygonContainsPoint(rings , p ) { var c = false, ring, p1, p2; for (var k = 0; k < rings.length; k++) { ring = rings[k]; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { p1 = ring[i]; p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } } return c; } function polygonContainsPoint(ring , p ) { var c = false; for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { var p1 = ring[i]; var p2 = ring[j]; if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { c = !c; } } return c; } function polygonIntersectsBox(ring , boxX1 , boxY1 , boxX2 , boxY2 ) { for (var i$1 = 0, list = ring; i$1 < list.length; i$1 += 1) { var p = list[i$1]; if (boxX1 <= p.x && boxY1 <= p.y && boxX2 >= p.x && boxY2 >= p.y) { return true; } } var corners = [ new pointGeometry(boxX1, boxY1), new pointGeometry(boxX1, boxY2), new pointGeometry(boxX2, boxY2), new pointGeometry(boxX2, boxY1)]; if (ring.length > 2) { for (var i$2 = 0, list$1 = corners; i$2 < list$1.length; i$2 += 1) { var corner = list$1[i$2]; if (polygonContainsPoint(ring, corner)) { return true; } } } for (var i = 0; i < ring.length - 1; i++) { var p1 = ring[i]; var p2 = ring[i + 1]; if (edgeIntersectsBox(p1, p2, corners)) { return true; } } return false; } function edgeIntersectsBox(e1 , e2 , corners ) { var tl = corners[0]; var br = corners[2]; // the edge and box do not intersect in either the x or y dimensions if (((e1.x < tl.x) && (e2.x < tl.x)) || ((e1.x > br.x) && (e2.x > br.x)) || ((e1.y < tl.y) && (e2.y < tl.y)) || ((e1.y > br.y) && (e2.y > br.y))) { return false; } // check if all corners of the box are on the same side of the edge var dir = isCounterClockwise(e1, e2, corners[0]); return dir !== isCounterClockwise(e1, e2, corners[1]) || dir !== isCounterClockwise(e1, e2, corners[2]) || dir !== isCounterClockwise(e1, e2, corners[3]); } // function getMaximumPaintValue(property , layer , bucket ) { var value = ((layer.paint ).get(property) ).value; if (value.kind === 'constant') { return value.value; } else { return bucket.programConfigurations.get(layer.id).getMaxValue(property); } } function translateDistance(translate ) { return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); } function translate(queryGeometry , translate , translateAnchor , bearing , pixelsToTileUnits ) { if (!translate[0] && !translate[1]) { return queryGeometry; } var pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); if (translateAnchor === "viewport") { pt._rotate(-bearing); } var translated = []; for (var i = 0; i < queryGeometry.length; i++) { var point = queryGeometry[i]; translated.push(point.sub(pt)); } return translated; } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$2 = new Properties({ "circle-sort-key": new DataDrivenProperty(spec["layout_circle"]["circle-sort-key"]), }); var paint$1 = new Properties({ "circle-radius": new DataDrivenProperty(spec["paint_circle"]["circle-radius"]), "circle-color": new DataDrivenProperty(spec["paint_circle"]["circle-color"]), "circle-blur": new DataDrivenProperty(spec["paint_circle"]["circle-blur"]), "circle-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-opacity"]), "circle-translate": new DataConstantProperty(spec["paint_circle"]["circle-translate"]), "circle-translate-anchor": new DataConstantProperty(spec["paint_circle"]["circle-translate-anchor"]), "circle-pitch-scale": new DataConstantProperty(spec["paint_circle"]["circle-pitch-scale"]), "circle-pitch-alignment": new DataConstantProperty(spec["paint_circle"]["circle-pitch-alignment"]), "circle-stroke-width": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-width"]), "circle-stroke-color": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-color"]), "circle-stroke-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-opacity"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties = ({ paint: paint$1, layout: layout$2 } ); /** * Common utilities * @module glMatrix */ // Configuration Constants var EPSILON = 0.000001; var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; var RANDOM = Math.random; /** * Sets the type of array used when creating new vectors and matrices * * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array */ function setMatrixArrayType(type) { ARRAY_TYPE = type; } var degree = Math.PI / 180; /** * Convert Degree To Radian * * @param {Number} a Angle in Degrees */ function toRadian(a) { return a * degree; } /** * Tests whether or not the arguments have approximately the same value, within an absolute * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less * than or equal to 1.0, and a relative tolerance is used for larger values) * * @param {Number} a The first number to test. * @param {Number} b The second number to test. * @returns {Boolean} True if the numbers are approximately equal, false otherwise. */ function equals(a, b) { return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); } if (!Math.hypot) { Math.hypot = function () { var arguments$1 = arguments; var y = 0, i = arguments.length; while (i--) { y += arguments$1[i] * arguments$1[i]; } return Math.sqrt(y); }; } /** * 2x2 Matrix * @module mat2 */ /** * Creates a new identity mat2 * * @returns {mat2} a new 2x2 matrix */ function create() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; } out[0] = 1; out[3] = 1; return out; } /** * Creates a new mat2 initialized with values from an existing matrix * * @param {ReadonlyMat2} a matrix to clone * @returns {mat2} a new 2x2 matrix */ function clone$1(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Copy the values from one mat2 to another * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Set a mat2 to the identity matrix * * @param {mat2} out the receiving matrix * @returns {mat2} out */ function identity$1(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; return out; } /** * Create a new mat2 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m10 Component in column 1, row 0 position (index 2) * @param {Number} m11 Component in column 1, row 1 position (index 3) * @returns {mat2} out A new 2x2 matrix */ function fromValues(m00, m01, m10, m11) { var out = new ARRAY_TYPE(4); out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out; } /** * Set the components of a mat2 to the given values * * @param {mat2} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m10 Component in column 1, row 0 position (index 2) * @param {Number} m11 Component in column 1, row 1 position (index 3) * @returns {mat2} out */ function set(out, m00, m01, m10, m11) { out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out; } /** * Transpose the values of a mat2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2} out */ function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache // some values if (out === a) { var a1 = a[1]; out[1] = a[2]; out[2] = a1; } else { out[0] = a[0]; out[1] = a[2]; out[2] = a[1]; out[3] = a[3]; } return out; } /** * Inverts a mat2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2} out */ function invert(out, a) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; // Calculate the determinant var det = a0 * a3 - a2 * a1; if (!det) { return null; } det = 1.0 / det; out[0] = a3 * det; out[1] = -a1 * det; out[2] = -a2 * det; out[3] = a0 * det; return out; } /** * Calculates the adjugate of a mat2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2} out */ function adjoint(out, a) { // Caching this value is nessecary if out == a var a0 = a[0]; out[0] = a[3]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a0; return out; } /** * Calculates the determinant of a mat2 * * @param {ReadonlyMat2} a the source matrix * @returns {Number} determinant of a */ function determinant(a) { return a[0] * a[3] - a[2] * a[1]; } /** * Multiplies two mat2's * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @returns {mat2} out */ function multiply(out, a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = a0 * b0 + a2 * b1; out[1] = a1 * b0 + a3 * b1; out[2] = a0 * b2 + a2 * b3; out[3] = a1 * b2 + a3 * b3; return out; } /** * Rotates a mat2 by the given angle * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ function rotate(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; return out; } /** * Scales the mat2 by the dimensions in the given vec2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the matrix to rotate * @param {ReadonlyVec2} v the vec2 to scale the matrix by * @returns {mat2} out **/ function scale(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var v0 = v[0], v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat2.identity(dest); * mat2.rotate(dest, dest, rad); * * @param {mat2} out mat2 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ function fromRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat2.identity(dest); * mat2.scale(dest, dest, vec); * * @param {mat2} out mat2 receiving operation result * @param {ReadonlyVec2} v Scaling vector * @returns {mat2} out */ function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = v[1]; return out; } /** * Returns a string representation of a mat2 * * @param {ReadonlyMat2} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str(a) { return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; } /** * Returns Frobenius norm of a mat2 * * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob(a) { return Math.hypot(a[0], a[1], a[2], a[3]); } /** * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix * @param {ReadonlyMat2} L the lower triangular matrix * @param {ReadonlyMat2} D the diagonal matrix * @param {ReadonlyMat2} U the upper triangular matrix * @param {ReadonlyMat2} a the input matrix to factorize */ function LDU(L, D, U, a) { L[2] = a[2] / a[0]; U[0] = a[0]; U[1] = a[1]; U[3] = a[3] - L[2] * U[1]; return [L, D, U]; } /** * Adds two mat2's * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @returns {mat2} out */ function add$1(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @returns {mat2} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyMat2} a The first matrix. * @param {ReadonlyMat2} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {ReadonlyMat2} a The first matrix. * @param {ReadonlyMat2} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$1(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); } /** * Multiply each element of the matrix by a scalar. * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat2} out */ function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out; } /** * Adds two mat2's after multiplying each element of the second operand by a scalar value. * * @param {mat2} out the receiving vector * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat2} out */ function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; return out; } /** * Alias for {@link mat2.multiply} * @function */ var mul = multiply; /** * Alias for {@link mat2.subtract} * @function */ var sub = subtract; /** * 2x3 Matrix * @module mat2d * @description * A mat2d contains six elements defined as: *
 * [a, b,
 *  c, d,
 *  tx, ty]
 * 
* This is a short form for the 3x3 matrix: *
 * [a, b, 0,
 *  c, d, 0,
 *  tx, ty, 1]
 * 
* The last column is ignored so the array is shorter and operations are faster. */ /** * Creates a new identity mat2d * * @returns {mat2d} a new 2x3 matrix */ function create$1() { var out = new ARRAY_TYPE(6); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[4] = 0; out[5] = 0; } out[0] = 1; out[3] = 1; return out; } /** * Creates a new mat2d initialized with values from an existing matrix * * @param {ReadonlyMat2d} a matrix to clone * @returns {mat2d} a new 2x3 matrix */ function clone$2(a) { var out = new ARRAY_TYPE(6); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; return out; } /** * Copy the values from one mat2d to another * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the source matrix * @returns {mat2d} out */ function copy$1(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; return out; } /** * Set a mat2d to the identity matrix * * @param {mat2d} out the receiving matrix * @returns {mat2d} out */ function identity$2(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; return out; } /** * Create a new mat2d with the given values * * @param {Number} a Component A (index 0) * @param {Number} b Component B (index 1) * @param {Number} c Component C (index 2) * @param {Number} d Component D (index 3) * @param {Number} tx Component TX (index 4) * @param {Number} ty Component TY (index 5) * @returns {mat2d} A new mat2d */ function fromValues$1(a, b, c, d, tx, ty) { var out = new ARRAY_TYPE(6); out[0] = a; out[1] = b; out[2] = c; out[3] = d; out[4] = tx; out[5] = ty; return out; } /** * Set the components of a mat2d to the given values * * @param {mat2d} out the receiving matrix * @param {Number} a Component A (index 0) * @param {Number} b Component B (index 1) * @param {Number} c Component C (index 2) * @param {Number} d Component D (index 3) * @param {Number} tx Component TX (index 4) * @param {Number} ty Component TY (index 5) * @returns {mat2d} out */ function set$1(out, a, b, c, d, tx, ty) { out[0] = a; out[1] = b; out[2] = c; out[3] = d; out[4] = tx; out[5] = ty; return out; } /** * Inverts a mat2d * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the source matrix * @returns {mat2d} out */ function invert$1(out, a) { var aa = a[0], ab = a[1], ac = a[2], ad = a[3]; var atx = a[4], aty = a[5]; var det = aa * ad - ab * ac; if (!det) { return null; } det = 1.0 / det; out[0] = ad * det; out[1] = -ab * det; out[2] = -ac * det; out[3] = aa * det; out[4] = (ac * aty - ad * atx) * det; out[5] = (ab * atx - aa * aty) * det; return out; } /** * Calculates the determinant of a mat2d * * @param {ReadonlyMat2d} a the source matrix * @returns {Number} determinant of a */ function determinant$1(a) { return a[0] * a[3] - a[1] * a[2]; } /** * Multiplies two mat2d's * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the first operand * @param {ReadonlyMat2d} b the second operand * @returns {mat2d} out */ function multiply$1(out, a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5]; out[0] = a0 * b0 + a2 * b1; out[1] = a1 * b0 + a3 * b1; out[2] = a0 * b2 + a2 * b3; out[3] = a1 * b2 + a3 * b3; out[4] = a0 * b4 + a2 * b5 + a4; out[5] = a1 * b4 + a3 * b5 + a5; return out; } /** * Rotates a mat2d by the given angle * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat2d} out */ function rotate$1(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; out[4] = a4; out[5] = a5; return out; } /** * Scales the mat2d by the dimensions in the given vec2 * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the matrix to translate * @param {ReadonlyVec2} v the vec2 to scale the matrix by * @returns {mat2d} out **/ function scale$1(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var v0 = v[0], v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; out[4] = a4; out[5] = a5; return out; } /** * Translates the mat2d by the dimensions in the given vec2 * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the matrix to translate * @param {ReadonlyVec2} v the vec2 to translate the matrix by * @returns {mat2d} out **/ function translate$1(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var v0 = v[0], v1 = v[1]; out[0] = a0; out[1] = a1; out[2] = a2; out[3] = a3; out[4] = a0 * v0 + a2 * v1 + a4; out[5] = a1 * v0 + a3 * v1 + a5; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat2d.identity(dest); * mat2d.rotate(dest, dest, rad); * * @param {mat2d} out mat2d receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat2d} out */ function fromRotation$1(out, rad) { var s = Math.sin(rad), c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; out[4] = 0; out[5] = 0; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat2d.identity(dest); * mat2d.scale(dest, dest, vec); * * @param {mat2d} out mat2d receiving operation result * @param {ReadonlyVec2} v Scaling vector * @returns {mat2d} out */ function fromScaling$1(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = v[1]; out[4] = 0; out[5] = 0; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat2d.identity(dest); * mat2d.translate(dest, dest, vec); * * @param {mat2d} out mat2d receiving operation result * @param {ReadonlyVec2} v Translation vector * @returns {mat2d} out */ function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = v[0]; out[5] = v[1]; return out; } /** * Returns a string representation of a mat2d * * @param {ReadonlyMat2d} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str$1(a) { return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")"; } /** * Returns Frobenius norm of a mat2d * * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob$1(a) { return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1); } /** * Adds two mat2d's * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the first operand * @param {ReadonlyMat2d} b the second operand * @returns {mat2d} out */ function add$2(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the first operand * @param {ReadonlyMat2d} b the second operand * @returns {mat2d} out */ function subtract$1(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat2d} out the receiving matrix * @param {ReadonlyMat2d} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat2d} out */ function multiplyScalar$1(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; return out; } /** * Adds two mat2d's after multiplying each element of the second operand by a scalar value. * * @param {mat2d} out the receiving vector * @param {ReadonlyMat2d} a the first operand * @param {ReadonlyMat2d} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat2d} out */ function multiplyScalarAndAdd$1(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyMat2d} a The first matrix. * @param {ReadonlyMat2d} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals$1(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {ReadonlyMat2d} a The first matrix. * @param {ReadonlyMat2d} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$2(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); } /** * Alias for {@link mat2d.multiply} * @function */ var mul$1 = multiply$1; /** * Alias for {@link mat2d.subtract} * @function */ var sub$1 = subtract$1; /** * 3x3 Matrix * @module mat3 */ /** * Creates a new identity mat3 * * @returns {mat3} a new 3x3 matrix */ function create$2() { var out = new ARRAY_TYPE(9); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[5] = 0; out[6] = 0; out[7] = 0; } out[0] = 1; out[4] = 1; out[8] = 1; return out; } /** * Copies the upper-left 3x3 values into the given mat3. * * @param {mat3} out the receiving 3x3 matrix * @param {ReadonlyMat4} a the source 4x4 matrix * @returns {mat3} out */ function fromMat4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[4]; out[4] = a[5]; out[5] = a[6]; out[6] = a[8]; out[7] = a[9]; out[8] = a[10]; return out; } /** * Creates a new mat3 initialized with values from an existing matrix * * @param {ReadonlyMat3} a matrix to clone * @returns {mat3} a new 3x3 matrix */ function clone$3(a) { var out = new ARRAY_TYPE(9); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Copy the values from one mat3 to another * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the source matrix * @returns {mat3} out */ function copy$2(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Create a new mat3 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} A new mat3 */ function fromValues$2(m00, m01, m02, m10, m11, m12, m20, m21, m22) { var out = new ARRAY_TYPE(9); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set the components of a mat3 to the given values * * @param {mat3} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m10 Component in column 1, row 0 position (index 3) * @param {Number} m11 Component in column 1, row 1 position (index 4) * @param {Number} m12 Component in column 1, row 2 position (index 5) * @param {Number} m20 Component in column 2, row 0 position (index 6) * @param {Number} m21 Component in column 2, row 1 position (index 7) * @param {Number} m22 Component in column 2, row 2 position (index 8) * @returns {mat3} out */ function set$2(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out; } /** * Set a mat3 to the identity matrix * * @param {mat3} out the receiving matrix * @returns {mat3} out */ function identity$3(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Transpose the values of a mat3 * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the source matrix * @returns {mat3} out */ function transpose$1(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { var a01 = a[1], a02 = a[2], a12 = a[5]; out[1] = a[3]; out[2] = a[6]; out[3] = a01; out[5] = a[7]; out[6] = a02; out[7] = a12; } else { out[0] = a[0]; out[1] = a[3]; out[2] = a[6]; out[3] = a[1]; out[4] = a[4]; out[5] = a[7]; out[6] = a[2]; out[7] = a[5]; out[8] = a[8]; } return out; } /** * Inverts a mat3 * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the source matrix * @returns {mat3} out */ function invert$2(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b01 = a22 * a11 - a12 * a21; var b11 = -a22 * a10 + a12 * a20; var b21 = a21 * a10 - a11 * a20; // Calculate the determinant var det = a00 * b01 + a01 * b11 + a02 * b21; if (!det) { return null; } det = 1.0 / det; out[0] = b01 * det; out[1] = (-a22 * a01 + a02 * a21) * det; out[2] = (a12 * a01 - a02 * a11) * det; out[3] = b11 * det; out[4] = (a22 * a00 - a02 * a20) * det; out[5] = (-a12 * a00 + a02 * a10) * det; out[6] = b21 * det; out[7] = (-a21 * a00 + a01 * a20) * det; out[8] = (a11 * a00 - a01 * a10) * det; return out; } /** * Calculates the adjugate of a mat3 * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the source matrix * @returns {mat3} out */ function adjoint$1(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; out[0] = a11 * a22 - a12 * a21; out[1] = a02 * a21 - a01 * a22; out[2] = a01 * a12 - a02 * a11; out[3] = a12 * a20 - a10 * a22; out[4] = a00 * a22 - a02 * a20; out[5] = a02 * a10 - a00 * a12; out[6] = a10 * a21 - a11 * a20; out[7] = a01 * a20 - a00 * a21; out[8] = a00 * a11 - a01 * a10; return out; } /** * Calculates the determinant of a mat3 * * @param {ReadonlyMat3} a the source matrix * @returns {Number} determinant of a */ function determinant$2(a) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); } /** * Multiplies two mat3's * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the first operand * @param {ReadonlyMat3} b the second operand * @returns {mat3} out */ function multiply$2(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2]; var a10 = a[3], a11 = a[4], a12 = a[5]; var a20 = a[6], a21 = a[7], a22 = a[8]; var b00 = b[0], b01 = b[1], b02 = b[2]; var b10 = b[3], b11 = b[4], b12 = b[5]; var b20 = b[6], b21 = b[7], b22 = b[8]; out[0] = b00 * a00 + b01 * a10 + b02 * a20; out[1] = b00 * a01 + b01 * a11 + b02 * a21; out[2] = b00 * a02 + b01 * a12 + b02 * a22; out[3] = b10 * a00 + b11 * a10 + b12 * a20; out[4] = b10 * a01 + b11 * a11 + b12 * a21; out[5] = b10 * a02 + b11 * a12 + b12 * a22; out[6] = b20 * a00 + b21 * a10 + b22 * a20; out[7] = b20 * a01 + b21 * a11 + b22 * a21; out[8] = b20 * a02 + b21 * a12 + b22 * a22; return out; } /** * Translate a mat3 by the given vector * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the matrix to translate * @param {ReadonlyVec2} v vector to translate by * @returns {mat3} out */ function translate$2(out, a, v) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], x = v[0], y = v[1]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a10; out[4] = a11; out[5] = a12; out[6] = x * a00 + y * a10 + a20; out[7] = x * a01 + y * a11 + a21; out[8] = x * a02 + y * a12 + a22; return out; } /** * Rotates a mat3 by the given angle * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function rotate$2(out, a, rad) { var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], s = Math.sin(rad), c = Math.cos(rad); out[0] = c * a00 + s * a10; out[1] = c * a01 + s * a11; out[2] = c * a02 + s * a12; out[3] = c * a10 - s * a00; out[4] = c * a11 - s * a01; out[5] = c * a12 - s * a02; out[6] = a20; out[7] = a21; out[8] = a22; return out; } /** * Scales the mat3 by the dimensions in the given vec2 * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the matrix to rotate * @param {ReadonlyVec2} v the vec2 to scale the matrix by * @returns {mat3} out **/ function scale$2(out, a, v) { var x = v[0], y = v[1]; out[0] = x * a[0]; out[1] = x * a[1]; out[2] = x * a[2]; out[3] = y * a[3]; out[4] = y * a[4]; out[5] = y * a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.translate(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {ReadonlyVec2} v Translation vector * @returns {mat3} out */ function fromTranslation$1(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = v[0]; out[7] = v[1]; out[8] = 1; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.rotate(dest, dest, rad); * * @param {mat3} out mat3 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat3} out */ function fromRotation$2(out, rad) { var s = Math.sin(rad), c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = -s; out[4] = c; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat3.identity(dest); * mat3.scale(dest, dest, vec); * * @param {mat3} out mat3 receiving operation result * @param {ReadonlyVec2} v Scaling vector * @returns {mat3} out */ function fromScaling$2(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = v[1]; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out; } /** * Copies the values from a mat2d into a mat3 * * @param {mat3} out the receiving matrix * @param {ReadonlyMat2d} a the matrix to copy * @returns {mat3} out **/ function fromMat2d(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = 0; out[3] = a[2]; out[4] = a[3]; out[5] = 0; out[6] = a[4]; out[7] = a[5]; out[8] = 1; return out; } /** * Calculates a 3x3 matrix from the given quaternion * * @param {mat3} out mat3 receiving operation result * @param {ReadonlyQuat} q Quaternion to create matrix from * * @returns {mat3} out */ function fromQuat(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[3] = yx - wz; out[6] = zx + wy; out[1] = yx + wz; out[4] = 1 - xx - zz; out[7] = zy - wx; out[2] = zx - wy; out[5] = zy + wx; out[8] = 1 - xx - yy; return out; } /** * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix * * @param {mat3} out mat3 receiving operation result * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from * * @returns {mat3} out */ function normalFromMat4(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; return out; } /** * Generates a 2D projection matrix with the given bounds * * @param {mat3} out mat3 frustum matrix will be written into * @param {number} width Width of your gl context * @param {number} height Height of gl context * @returns {mat3} out */ function projection(out, width, height) { out[0] = 2 / width; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = -2 / height; out[5] = 0; out[6] = -1; out[7] = 1; out[8] = 1; return out; } /** * Returns a string representation of a mat3 * * @param {ReadonlyMat3} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str$2(a) { return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")"; } /** * Returns Frobenius norm of a mat3 * * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob$2(a) { return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); } /** * Adds two mat3's * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the first operand * @param {ReadonlyMat3} b the second operand * @returns {mat3} out */ function add$3(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the first operand * @param {ReadonlyMat3} b the second operand * @returns {mat3} out */ function subtract$2(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat3} out the receiving matrix * @param {ReadonlyMat3} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat3} out */ function multiplyScalar$2(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; return out; } /** * Adds two mat3's after multiplying each element of the second operand by a scalar value. * * @param {mat3} out the receiving vector * @param {ReadonlyMat3} a the first operand * @param {ReadonlyMat3} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat3} out */ function multiplyScalarAndAdd$2(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyMat3} a The first matrix. * @param {ReadonlyMat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals$2(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {ReadonlyMat3} a The first matrix. * @param {ReadonlyMat3} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$3(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); } /** * Alias for {@link mat3.multiply} * @function */ var mul$2 = multiply$2; /** * Alias for {@link mat3.subtract} * @function */ var sub$2 = subtract$2; /** * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. * @module mat4 */ /** * Creates a new identity mat4 * * @returns {mat4} a new 4x4 matrix */ function create$3() { var out = new ARRAY_TYPE(16); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; } out[0] = 1; out[5] = 1; out[10] = 1; out[15] = 1; return out; } /** * Creates a new mat4 initialized with values from an existing matrix * * @param {ReadonlyMat4} a matrix to clone * @returns {mat4} a new 4x4 matrix */ function clone$4(a) { var out = new ARRAY_TYPE(16); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Copy the values from one mat4 to another * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the source matrix * @returns {mat4} out */ function copy$3(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Create a new mat4 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m03 Component in column 0, row 3 position (index 3) * @param {Number} m10 Component in column 1, row 0 position (index 4) * @param {Number} m11 Component in column 1, row 1 position (index 5) * @param {Number} m12 Component in column 1, row 2 position (index 6) * @param {Number} m13 Component in column 1, row 3 position (index 7) * @param {Number} m20 Component in column 2, row 0 position (index 8) * @param {Number} m21 Component in column 2, row 1 position (index 9) * @param {Number} m22 Component in column 2, row 2 position (index 10) * @param {Number} m23 Component in column 2, row 3 position (index 11) * @param {Number} m30 Component in column 3, row 0 position (index 12) * @param {Number} m31 Component in column 3, row 1 position (index 13) * @param {Number} m32 Component in column 3, row 2 position (index 14) * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} A new mat4 */ function fromValues$3(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { var out = new ARRAY_TYPE(16); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } /** * Set the components of a mat4 to the given values * * @param {mat4} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m02 Component in column 0, row 2 position (index 2) * @param {Number} m03 Component in column 0, row 3 position (index 3) * @param {Number} m10 Component in column 1, row 0 position (index 4) * @param {Number} m11 Component in column 1, row 1 position (index 5) * @param {Number} m12 Component in column 1, row 2 position (index 6) * @param {Number} m13 Component in column 1, row 3 position (index 7) * @param {Number} m20 Component in column 2, row 0 position (index 8) * @param {Number} m21 Component in column 2, row 1 position (index 9) * @param {Number} m22 Component in column 2, row 2 position (index 10) * @param {Number} m23 Component in column 2, row 3 position (index 11) * @param {Number} m30 Component in column 3, row 0 position (index 12) * @param {Number} m31 Component in column 3, row 1 position (index 13) * @param {Number} m32 Component in column 3, row 2 position (index 14) * @param {Number} m33 Component in column 3, row 3 position (index 15) * @returns {mat4} out */ function set$3(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out; } /** * Set a mat4 to the identity matrix * * @param {mat4} out the receiving matrix * @returns {mat4} out */ function identity$4(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Transpose the values of a mat4 * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the source matrix * @returns {mat4} out */ function transpose$2(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache some values if (out === a) { var a01 = a[1], a02 = a[2], a03 = a[3]; var a12 = a[6], a13 = a[7]; var a23 = a[11]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a01; out[6] = a[9]; out[7] = a[13]; out[8] = a02; out[9] = a12; out[11] = a[14]; out[12] = a03; out[13] = a13; out[14] = a23; } else { out[0] = a[0]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a[1]; out[5] = a[5]; out[6] = a[9]; out[7] = a[13]; out[8] = a[2]; out[9] = a[6]; out[10] = a[10]; out[11] = a[14]; out[12] = a[3]; out[13] = a[7]; out[14] = a[11]; out[15] = a[15]; } return out; } /** * Inverts a mat4 * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the source matrix * @returns {mat4} out */ function invert$3(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) { return null; } det = 1.0 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; return out; } /** * Calculates the adjugate of a mat4 * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the source matrix * @returns {mat4} out */ function adjoint$2(out, a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); return out; } /** * Calculates the determinant of a mat4 * * @param {ReadonlyMat4} a the source matrix * @returns {Number} determinant of a */ function determinant$3(a) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; // Calculate the determinant return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; } /** * Multiplies two mat4s * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the first operand * @param {ReadonlyMat4} b the second operand * @returns {mat4} out */ function multiply$3(out, a, b) { var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3]; var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7]; var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11]; var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; // Cache only the current line of the second matrix var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; return out; } /** * Translate a mat4 by the given vector * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the matrix to translate * @param {ReadonlyVec3} v vector to translate by * @returns {mat4} out */ function translate$3(out, a, v) { var x = v[0], y = v[1], z = v[2]; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; if (a === out) { out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; } else { a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; out[12] = a00 * x + a10 * y + a20 * z + a[12]; out[13] = a01 * x + a11 * y + a21 * z + a[13]; out[14] = a02 * x + a12 * y + a22 * z + a[14]; out[15] = a03 * x + a13 * y + a23 * z + a[15]; } return out; } /** * Scales the mat4 by the dimensions in the given vec3 not using vectorization * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the matrix to scale * @param {ReadonlyVec3} v the vec3 to scale the matrix by * @returns {mat4} out **/ function scale$3(out, a, v) { var x = v[0], y = v[1], z = v[2]; out[0] = a[0] * x; out[1] = a[1] * x; out[2] = a[2] * x; out[3] = a[3] * x; out[4] = a[4] * y; out[5] = a[5] * y; out[6] = a[6] * y; out[7] = a[7] * y; out[8] = a[8] * z; out[9] = a[9] * z; out[10] = a[10] * z; out[11] = a[11] * z; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out; } /** * Rotates a mat4 by the given angle around the given axis * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @param {ReadonlyVec3} axis the axis to rotate around * @returns {mat4} out */ function rotate$3(out, a, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len = Math.hypot(x, y, z); var s, c, t; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; var b00, b01, b02; var b10, b11, b12; var b20, b21, b22; if (len < EPSILON) { return null; } len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; // Construct the elements of the rotation matrix b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; // Perform rotation-specific matrix multiplication out[0] = a00 * b00 + a10 * b01 + a20 * b02; out[1] = a01 * b00 + a11 * b01 + a21 * b02; out[2] = a02 * b00 + a12 * b01 + a22 * b02; out[3] = a03 * b00 + a13 * b01 + a23 * b02; out[4] = a00 * b10 + a10 * b11 + a20 * b12; out[5] = a01 * b10 + a11 * b11 + a21 * b12; out[6] = a02 * b10 + a12 * b11 + a22 * b12; out[7] = a03 * b10 + a13 * b11 + a23 * b12; out[8] = a00 * b20 + a10 * b21 + a20 * b22; out[9] = a01 * b20 + a11 * b21 + a21 * b22; out[10] = a02 * b20 + a12 * b21 + a22 * b22; out[11] = a03 * b20 + a13 * b21 + a23 * b22; if (a !== out) { // If the source and destination differ, copy the unchanged last row out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } return out; } /** * Rotates a matrix by the given angle around the X axis * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateX(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { // If the source and destination differ, copy the unchanged rows out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[4] = a10 * c + a20 * s; out[5] = a11 * c + a21 * s; out[6] = a12 * c + a22 * s; out[7] = a13 * c + a23 * s; out[8] = a20 * c - a10 * s; out[9] = a21 * c - a11 * s; out[10] = a22 * c - a12 * s; out[11] = a23 * c - a13 * s; return out; } /** * Rotates a matrix by the given angle around the Y axis * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateY(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { // If the source and destination differ, copy the unchanged rows out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[0] = a00 * c - a20 * s; out[1] = a01 * c - a21 * s; out[2] = a02 * c - a22 * s; out[3] = a03 * c - a23 * s; out[8] = a00 * s + a20 * c; out[9] = a01 * s + a21 * c; out[10] = a02 * s + a22 * c; out[11] = a03 * s + a23 * c; return out; } /** * Rotates a matrix by the given angle around the Z axis * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function rotateZ(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; if (a !== out) { // If the source and destination differ, copy the unchanged last row out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; } // Perform axis-specific matrix multiplication out[0] = a00 * c + a10 * s; out[1] = a01 * c + a11 * s; out[2] = a02 * c + a12 * s; out[3] = a03 * c + a13 * s; out[4] = a10 * c - a00 * s; out[5] = a11 * c - a01 * s; out[6] = a12 * c - a02 * s; out[7] = a13 * c - a03 * s; return out; } /** * Creates a matrix from a vector translation * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, dest, vec); * * @param {mat4} out mat4 receiving operation result * @param {ReadonlyVec3} v Translation vector * @returns {mat4} out */ function fromTranslation$2(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.scale(dest, dest, vec); * * @param {mat4} out mat4 receiving operation result * @param {ReadonlyVec3} v Scaling vector * @returns {mat4} out */ function fromScaling$3(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = v[1]; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = v[2]; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from a given angle around a given axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotate(dest, dest, rad, axis); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @param {ReadonlyVec3} axis the axis to rotate around * @returns {mat4} out */ function fromRotation$3(out, rad, axis) { var x = axis[0], y = axis[1], z = axis[2]; var len = Math.hypot(x, y, z); var s, c, t; if (len < EPSILON) { return null; } len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; // Perform rotation-specific matrix multiplication out[0] = x * x * t + c; out[1] = y * x * t + z * s; out[2] = z * x * t - y * s; out[3] = 0; out[4] = x * y * t - z * s; out[5] = y * y * t + c; out[6] = z * y * t + x * s; out[7] = 0; out[8] = x * z * t + y * s; out[9] = y * z * t - x * s; out[10] = z * z * t + c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the X axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateX(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromXRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = c; out[6] = s; out[7] = 0; out[8] = 0; out[9] = -s; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the Y axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateY(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromYRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = c; out[1] = 0; out[2] = -s; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = s; out[9] = 0; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from the given angle around the Z axis * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.rotateZ(dest, dest, rad); * * @param {mat4} out mat4 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat4} out */ function fromZRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); // Perform axis-specific matrix multiplication out[0] = c; out[1] = s; out[2] = 0; out[3] = 0; out[4] = -s; out[5] = c; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Creates a matrix from a quaternion rotation and vector translation * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {ReadonlyVec3} v Translation vector * @returns {mat4} out */ function fromRotationTranslation(out, q, v) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - (yy + zz); out[1] = xy + wz; out[2] = xz - wy; out[3] = 0; out[4] = xy - wz; out[5] = 1 - (xx + zz); out[6] = yz + wx; out[7] = 0; out[8] = xz + wy; out[9] = yz - wx; out[10] = 1 - (xx + yy); out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a new mat4 from a dual quat. * * @param {mat4} out Matrix * @param {ReadonlyQuat2} a Dual Quaternion * @returns {mat4} mat4 receiving operation result */ function fromQuat2(out, a) { var translation = new ARRAY_TYPE(3); var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7]; var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense if (magnitude > 0) { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; } else { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; } fromRotationTranslation(out, a, translation); return out; } /** * Returns the translation vector component of a transformation * matrix. If a matrix is built with fromRotationTranslation, * the returned vector will be the same as the translation vector * originally supplied. * @param {vec3} out Vector to receive translation component * @param {ReadonlyMat4} mat Matrix to be decomposed (input) * @return {vec3} out */ function getTranslation(out, mat) { out[0] = mat[12]; out[1] = mat[13]; out[2] = mat[14]; return out; } /** * Returns the scaling factor component of a transformation * matrix. If a matrix is built with fromRotationTranslationScale * with a normalized Quaternion paramter, the returned vector will be * the same as the scaling vector * originally supplied. * @param {vec3} out Vector to receive scaling factor component * @param {ReadonlyMat4} mat Matrix to be decomposed (input) * @return {vec3} out */ function getScaling(out, mat) { var m11 = mat[0]; var m12 = mat[1]; var m13 = mat[2]; var m21 = mat[4]; var m22 = mat[5]; var m23 = mat[6]; var m31 = mat[8]; var m32 = mat[9]; var m33 = mat[10]; out[0] = Math.hypot(m11, m12, m13); out[1] = Math.hypot(m21, m22, m23); out[2] = Math.hypot(m31, m32, m33); return out; } /** * Returns a quaternion representing the rotational component * of a transformation matrix. If a matrix is built with * fromRotationTranslation, the returned quaternion will be the * same as the quaternion originally supplied. * @param {quat} out Quaternion to receive the rotation component * @param {ReadonlyMat4} mat Matrix to be decomposed (input) * @return {quat} out */ function getRotation(out, mat) { var scaling = new ARRAY_TYPE(3); getScaling(scaling, mat); var is1 = 1 / scaling[0]; var is2 = 1 / scaling[1]; var is3 = 1 / scaling[2]; var sm11 = mat[0] * is1; var sm12 = mat[1] * is2; var sm13 = mat[2] * is3; var sm21 = mat[4] * is1; var sm22 = mat[5] * is2; var sm23 = mat[6] * is3; var sm31 = mat[8] * is1; var sm32 = mat[9] * is2; var sm33 = mat[10] * is3; var trace = sm11 + sm22 + sm33; var S = 0; if (trace > 0) { S = Math.sqrt(trace + 1.0) * 2; out[3] = 0.25 * S; out[0] = (sm23 - sm32) / S; out[1] = (sm31 - sm13) / S; out[2] = (sm12 - sm21) / S; } else if (sm11 > sm22 && sm11 > sm33) { S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; out[3] = (sm23 - sm32) / S; out[0] = 0.25 * S; out[1] = (sm12 + sm21) / S; out[2] = (sm31 + sm13) / S; } else if (sm22 > sm33) { S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; out[3] = (sm31 - sm13) / S; out[0] = (sm12 + sm21) / S; out[1] = 0.25 * S; out[2] = (sm23 + sm32) / S; } else { S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; out[3] = (sm12 - sm21) / S; out[0] = (sm31 + sm13) / S; out[1] = (sm23 + sm32) / S; out[2] = 0.25 * S; } return out; } /** * Creates a matrix from a quaternion rotation, vector translation and vector scale * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * mat4.scale(dest, scale) * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {ReadonlyVec3} v Translation vector * @param {ReadonlyVec3} s Scaling vector * @returns {mat4} out */ function fromRotationTranslationScale(out, q, v, s) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; out[0] = (1 - (yy + zz)) * sx; out[1] = (xy + wz) * sx; out[2] = (xz - wy) * sx; out[3] = 0; out[4] = (xy - wz) * sy; out[5] = (1 - (xx + zz)) * sy; out[6] = (yz + wx) * sy; out[7] = 0; out[8] = (xz + wy) * sz; out[9] = (yz - wx) * sz; out[10] = (1 - (xx + yy)) * sz; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out; } /** * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin * This is equivalent to (but much faster than): * * mat4.identity(dest); * mat4.translate(dest, vec); * mat4.translate(dest, origin); * let quatMat = mat4.create(); * quat4.toMat4(quat, quatMat); * mat4.multiply(dest, quatMat); * mat4.scale(dest, scale) * mat4.translate(dest, negativeOrigin); * * @param {mat4} out mat4 receiving operation result * @param {quat4} q Rotation quaternion * @param {ReadonlyVec3} v Translation vector * @param {ReadonlyVec3} s Scaling vector * @param {ReadonlyVec3} o The origin vector around which to scale and rotate * @returns {mat4} out */ function fromRotationTranslationScaleOrigin(out, q, v, s, o) { // Quaternion math var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; var ox = o[0]; var oy = o[1]; var oz = o[2]; var out0 = (1 - (yy + zz)) * sx; var out1 = (xy + wz) * sx; var out2 = (xz - wy) * sx; var out4 = (xy - wz) * sy; var out5 = (1 - (xx + zz)) * sy; var out6 = (yz + wx) * sy; var out8 = (xz + wy) * sz; var out9 = (yz - wx) * sz; var out10 = (1 - (xx + yy)) * sz; out[0] = out0; out[1] = out1; out[2] = out2; out[3] = 0; out[4] = out4; out[5] = out5; out[6] = out6; out[7] = 0; out[8] = out8; out[9] = out9; out[10] = out10; out[11] = 0; out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); out[15] = 1; return out; } /** * Calculates a 4x4 matrix from the given quaternion * * @param {mat4} out mat4 receiving operation result * @param {ReadonlyQuat} q Quaternion to create matrix from * * @returns {mat4} out */ function fromQuat$1(out, q) { var x = q[0], y = q[1], z = q[2], w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[1] = yx + wz; out[2] = zx - wy; out[3] = 0; out[4] = yx - wz; out[5] = 1 - xx - zz; out[6] = zy + wx; out[7] = 0; out[8] = zx + wy; out[9] = zy - wx; out[10] = 1 - xx - yy; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out; } /** * Generates a frustum matrix with the given bounds * * @param {mat4} out mat4 frustum matrix will be written into * @param {Number} left Left bound of the frustum * @param {Number} right Right bound of the frustum * @param {Number} bottom Bottom bound of the frustum * @param {Number} top Top bound of the frustum * @param {Number} near Near bound of the frustum * @param {Number} far Far bound of the frustum * @returns {mat4} out */ function frustum(out, left, right, bottom, top, near, far) { var rl = 1 / (right - left); var tb = 1 / (top - bottom); var nf = 1 / (near - far); out[0] = near * 2 * rl; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = near * 2 * tb; out[6] = 0; out[7] = 0; out[8] = (right + left) * rl; out[9] = (top + bottom) * tb; out[10] = (far + near) * nf; out[11] = -1; out[12] = 0; out[13] = 0; out[14] = far * near * 2 * nf; out[15] = 0; return out; } /** * Generates a perspective projection matrix with the given bounds. * Passing null/undefined/no value for far will generate infinite projection matrix. * * @param {mat4} out mat4 frustum matrix will be written into * @param {number} fovy Vertical field of view in radians * @param {number} aspect Aspect ratio. typically viewport width/height * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum, can be null or Infinity * @returns {mat4} out */ function perspective(out, fovy, aspect, near, far) { var f = 1.0 / Math.tan(fovy / 2), nf; out[0] = f / aspect; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = f; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = -1; out[12] = 0; out[13] = 0; out[15] = 0; if (far != null && far !== Infinity) { nf = 1 / (near - far); out[10] = (far + near) * nf; out[14] = 2 * far * near * nf; } else { out[10] = -1; out[14] = -2 * near; } return out; } /** * Generates a perspective projection matrix with the given field of view. * This is primarily useful for generating projection matrices to be used * with the still experiemental WebVR API. * * @param {mat4} out mat4 frustum matrix will be written into * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum * @returns {mat4} out */ function perspectiveFromFieldOfView(out, fov, near, far) { var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); var xScale = 2.0 / (leftTan + rightTan); var yScale = 2.0 / (upTan + downTan); out[0] = xScale; out[1] = 0.0; out[2] = 0.0; out[3] = 0.0; out[4] = 0.0; out[5] = yScale; out[6] = 0.0; out[7] = 0.0; out[8] = -((leftTan - rightTan) * xScale * 0.5); out[9] = (upTan - downTan) * yScale * 0.5; out[10] = far / (near - far); out[11] = -1.0; out[12] = 0.0; out[13] = 0.0; out[14] = far * near / (near - far); out[15] = 0.0; return out; } /** * Generates a orthogonal projection matrix with the given bounds * * @param {mat4} out mat4 frustum matrix will be written into * @param {number} left Left bound of the frustum * @param {number} right Right bound of the frustum * @param {number} bottom Bottom bound of the frustum * @param {number} top Top bound of the frustum * @param {number} near Near bound of the frustum * @param {number} far Far bound of the frustum * @returns {mat4} out */ function ortho$1(out, left, right, bottom, top, near, far) { var lr = 1 / (left - right); var bt = 1 / (bottom - top); var nf = 1 / (near - far); out[0] = -2 * lr; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = -2 * bt; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 2 * nf; out[11] = 0; out[12] = (left + right) * lr; out[13] = (top + bottom) * bt; out[14] = (far + near) * nf; out[15] = 1; return out; } /** * Generates a look-at matrix with the given eye position, focal point, and up axis. * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. * * @param {mat4} out mat4 frustum matrix will be written into * @param {ReadonlyVec3} eye Position of the viewer * @param {ReadonlyVec3} center Point the viewer is looking at * @param {ReadonlyVec3} up vec3 pointing up * @returns {mat4} out */ function lookAt(out, eye, center, up) { var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; var eyex = eye[0]; var eyey = eye[1]; var eyez = eye[2]; var upx = up[0]; var upy = up[1]; var upz = up[2]; var centerx = center[0]; var centery = center[1]; var centerz = center[2]; if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) { return identity$4(out); } z0 = eyex - centerx; z1 = eyey - centery; z2 = eyez - centerz; len = 1 / Math.hypot(z0, z1, z2); z0 *= len; z1 *= len; z2 *= len; x0 = upy * z2 - upz * z1; x1 = upz * z0 - upx * z2; x2 = upx * z1 - upy * z0; len = Math.hypot(x0, x1, x2); if (!len) { x0 = 0; x1 = 0; x2 = 0; } else { len = 1 / len; x0 *= len; x1 *= len; x2 *= len; } y0 = z1 * x2 - z2 * x1; y1 = z2 * x0 - z0 * x2; y2 = z0 * x1 - z1 * x0; len = Math.hypot(y0, y1, y2); if (!len) { y0 = 0; y1 = 0; y2 = 0; } else { len = 1 / len; y0 *= len; y1 *= len; y2 *= len; } out[0] = x0; out[1] = y0; out[2] = z0; out[3] = 0; out[4] = x1; out[5] = y1; out[6] = z1; out[7] = 0; out[8] = x2; out[9] = y2; out[10] = z2; out[11] = 0; out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); out[15] = 1; return out; } /** * Generates a matrix that makes something look at something else. * * @param {mat4} out mat4 frustum matrix will be written into * @param {ReadonlyVec3} eye Position of the viewer * @param {ReadonlyVec3} center Point the viewer is looking at * @param {ReadonlyVec3} up vec3 pointing up * @returns {mat4} out */ function targetTo(out, eye, target, up) { var eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0], upy = up[1], upz = up[2]; var z0 = eyex - target[0], z1 = eyey - target[1], z2 = eyez - target[2]; var len = z0 * z0 + z1 * z1 + z2 * z2; if (len > 0) { len = 1 / Math.sqrt(len); z0 *= len; z1 *= len; z2 *= len; } var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0; len = x0 * x0 + x1 * x1 + x2 * x2; if (len > 0) { len = 1 / Math.sqrt(len); x0 *= len; x1 *= len; x2 *= len; } out[0] = x0; out[1] = x1; out[2] = x2; out[3] = 0; out[4] = z1 * x2 - z2 * x1; out[5] = z2 * x0 - z0 * x2; out[6] = z0 * x1 - z1 * x0; out[7] = 0; out[8] = z0; out[9] = z1; out[10] = z2; out[11] = 0; out[12] = eyex; out[13] = eyey; out[14] = eyez; out[15] = 1; return out; } /** * Returns a string representation of a mat4 * * @param {ReadonlyMat4} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str$3(a) { return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"; } /** * Returns Frobenius norm of a mat4 * * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob$3(a) { return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); } /** * Adds two mat4's * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the first operand * @param {ReadonlyMat4} b the second operand * @returns {mat4} out */ function add$4(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; out[9] = a[9] + b[9]; out[10] = a[10] + b[10]; out[11] = a[11] + b[11]; out[12] = a[12] + b[12]; out[13] = a[13] + b[13]; out[14] = a[14] + b[14]; out[15] = a[15] + b[15]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the first operand * @param {ReadonlyMat4} b the second operand * @returns {mat4} out */ function subtract$3(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; out[9] = a[9] - b[9]; out[10] = a[10] - b[10]; out[11] = a[11] - b[11]; out[12] = a[12] - b[12]; out[13] = a[13] - b[13]; out[14] = a[14] - b[14]; out[15] = a[15] - b[15]; return out; } /** * Multiply each element of the matrix by a scalar. * * @param {mat4} out the receiving matrix * @param {ReadonlyMat4} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat4} out */ function multiplyScalar$3(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; out[9] = a[9] * b; out[10] = a[10] * b; out[11] = a[11] * b; out[12] = a[12] * b; out[13] = a[13] * b; out[14] = a[14] * b; out[15] = a[15] * b; return out; } /** * Adds two mat4's after multiplying each element of the second operand by a scalar value. * * @param {mat4} out the receiving vector * @param {ReadonlyMat4} a the first operand * @param {ReadonlyMat4} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat4} out */ function multiplyScalarAndAdd$3(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; out[9] = a[9] + b[9] * scale; out[10] = a[10] + b[10] * scale; out[11] = a[11] + b[11] * scale; out[12] = a[12] + b[12] * scale; out[13] = a[13] + b[13] * scale; out[14] = a[14] + b[14] * scale; out[15] = a[15] + b[15] * scale; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyMat4} a The first matrix. * @param {ReadonlyMat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals$3(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {ReadonlyMat4} a The first matrix. * @param {ReadonlyMat4} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function equals$4(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7]; var a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11]; var a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; var b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7]; var b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11]; var b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); } /** * Alias for {@link mat4.multiply} * @function */ var mul$3 = multiply$3; /** * Alias for {@link mat4.subtract} * @function */ var sub$3 = subtract$3; /** * 3 Dimensional Vector * @module vec3 */ /** * Creates a new, empty vec3 * * @returns {vec3} a new 3D vector */ function create$4() { var out = new ARRAY_TYPE(3); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } return out; } /** * Creates a new vec3 initialized with values from an existing vector * * @param {ReadonlyVec3} a vector to clone * @returns {vec3} a new 3D vector */ function clone$5(a) { var out = new ARRAY_TYPE(3); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Calculates the length of a vec3 * * @param {ReadonlyVec3} a vector to calculate length of * @returns {Number} length of a */ function length(a) { var x = a[0]; var y = a[1]; var z = a[2]; return Math.hypot(x, y, z); } /** * Creates a new vec3 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} a new 3D vector */ function fromValues$4(x, y, z) { var out = new ARRAY_TYPE(3); out[0] = x; out[1] = y; out[2] = z; return out; } /** * Copy the values from one vec3 to another * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the source vector * @returns {vec3} out */ function copy$4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Set the components of a vec3 to the given values * * @param {vec3} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} out */ function set$4(out, x, y, z) { out[0] = x; out[1] = y; out[2] = z; return out; } /** * Adds two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function add$5(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; return out; } /** * Subtracts vector b from vector a * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function subtract$4(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; return out; } /** * Multiplies two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function multiply$4(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; return out; } /** * Divides two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; return out; } /** * Math.ceil the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to ceil * @returns {vec3} out */ function ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); return out; } /** * Math.floor the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to floor * @returns {vec3} out */ function floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); return out; } /** * Returns the minimum of two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); return out; } /** * Returns the maximum of two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); return out; } /** * Math.round the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to round * @returns {vec3} out */ function round(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); return out; } /** * Scales a vec3 by a scalar number * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec3} out */ function scale$4(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; return out; } /** * Adds two vec3's after scaling the second operand by a scalar value * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec3} out */ function scaleAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; return out; } /** * Calculates the euclidian distance between two vec3's * * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {Number} distance between a and b */ function distance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return Math.hypot(x, y, z); } /** * Calculates the squared euclidian distance between two vec3's * * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return x * x + y * y + z * z; } /** * Calculates the squared length of a vec3 * * @param {ReadonlyVec3} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength(a) { var x = a[0]; var y = a[1]; var z = a[2]; return x * x + y * y + z * z; } /** * Negates the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to negate * @returns {vec3} out */ function negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; return out; } /** * Returns the inverse of the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to invert * @returns {vec3} out */ function inverse$v(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; out[2] = 1.0 / a[2]; return out; } /** * Normalize a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to normalize * @returns {vec3} out */ function normalize(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var len = x * x + y * y + z * z; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); } out[0] = a[0] * len; out[1] = a[1] * len; out[2] = a[2] * len; return out; } /** * Calculates the dot product of two vec3's * * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {Number} dot product of a and b */ function dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } /** * Computes the cross product of two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function cross(out, a, b) { var ax = a[0], ay = a[1], az = a[2]; var bx = b[0], by = b[1], bz = b[2]; out[0] = ay * bz - az * by; out[1] = az * bx - ax * bz; out[2] = ax * by - ay * bx; return out; } /** * Performs a linear interpolation between two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function lerp(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); return out; } /** * Performs a hermite interpolation with two control points * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {ReadonlyVec3} c the third operand * @param {ReadonlyVec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function hermite(out, a, b, c, d, t) { var factorTimes2 = t * t; var factor1 = factorTimes2 * (2 * t - 3) + 1; var factor2 = factorTimes2 * (t - 2) + t; var factor3 = factorTimes2 * (t - 1); var factor4 = factorTimes2 * (3 - 2 * t); out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Performs a bezier interpolation with two control points * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {ReadonlyVec3} c the third operand * @param {ReadonlyVec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function bezier$1(out, a, b, c, d, t) { var inverseFactor = 1 - t; var inverseFactorTimesTwo = inverseFactor * inverseFactor; var factorTimes2 = t * t; var factor1 = inverseFactorTimesTwo * inverseFactor; var factor2 = 3 * t * inverseFactorTimesTwo; var factor3 = 3 * factorTimes2 * inverseFactor; var factor4 = factorTimes2 * t; out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Generates a random vector with the given scale * * @param {vec3} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec3} out */ function random(out, scale) { scale = scale || 1.0; var r = RANDOM() * 2.0 * Math.PI; var z = RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; out[0] = Math.cos(r) * zScale; out[1] = Math.sin(r) * zScale; out[2] = z * scale; return out; } /** * Transforms the vec3 with a mat4. * 4th vector component is implicitly '1' * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to transform * @param {ReadonlyMat4} m matrix to transform with * @returns {vec3} out */ function transformMat4(out, a, m) { var x = a[0], y = a[1], z = a[2]; var w = m[3] * x + m[7] * y + m[11] * z + m[15]; w = w || 1.0; out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; return out; } /** * Transforms the vec3 with a mat3. * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to transform * @param {ReadonlyMat3} m the 3x3 matrix to transform with * @returns {vec3} out */ function transformMat3(out, a, m) { var x = a[0], y = a[1], z = a[2]; out[0] = x * m[0] + y * m[3] + z * m[6]; out[1] = x * m[1] + y * m[4] + z * m[7]; out[2] = x * m[2] + y * m[5] + z * m[8]; return out; } /** * Transforms the vec3 with a quat * Can also be used for dual quaternions. (Multiply it with the real part) * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to transform * @param {ReadonlyQuat} q quaternion to transform with * @returns {vec3} out */ function transformQuat(out, a, q) { // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; var x = a[0], y = a[1], z = a[2]; // var qvec = [qx, qy, qz]; // var uv = vec3.cross([], qvec, a); var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); var w2 = qw * 2; uvx *= w2; uvy *= w2; uvz *= w2; // vec3.scale(uuv, uuv, 2); uuvx *= 2; uuvy *= 2; uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); out[0] = x + uvx + uuvx; out[1] = y + uvy + uuvy; out[2] = z + uvz + uuvz; return out; } /** * Rotate a 3D vector around the x-axis * @param {vec3} out The receiving vec3 * @param {ReadonlyVec3} a The vec3 point to rotate * @param {ReadonlyVec3} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec3} out */ function rotateX$1(out, a, b, rad) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0]; r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the y-axis * @param {vec3} out The receiving vec3 * @param {ReadonlyVec3} a The vec3 point to rotate * @param {ReadonlyVec3} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec3} out */ function rotateY$1(out, a, b, rad) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); r[1] = p[1]; r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the z-axis * @param {vec3} out The receiving vec3 * @param {ReadonlyVec3} a The vec3 point to rotate * @param {ReadonlyVec3} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec3} out */ function rotateZ$1(out, a, b, rad) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); r[2] = p[2]; //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Get the angle between two 3D vectors * @param {ReadonlyVec3} a The first operand * @param {ReadonlyVec3} b The second operand * @returns {Number} The angle in radians */ function angle(a, b) { var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2], mag1 = Math.sqrt(ax * ax + ay * ay + az * az), mag2 = Math.sqrt(bx * bx + by * by + bz * bz), mag = mag1 * mag2, cosine = mag && dot(a, b) / mag; return Math.acos(Math.min(Math.max(cosine, -1), 1)); } /** * Set the components of a vec3 to zero * * @param {vec3} out the receiving vector * @returns {vec3} out */ function zero(out) { out[0] = 0.0; out[1] = 0.0; out[2] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {ReadonlyVec3} a vector to represent as a string * @returns {String} string representation of the vector */ function str$4(a) { return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; } /** * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyVec3} a The first vector. * @param {ReadonlyVec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals$4(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {ReadonlyVec3} a The first vector. * @param {ReadonlyVec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$5(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2]; var b0 = b[0], b1 = b[1], b2 = b[2]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); } /** * Alias for {@link vec3.subtract} * @function */ var sub$4 = subtract$4; /** * Alias for {@link vec3.multiply} * @function */ var mul$4 = multiply$4; /** * Alias for {@link vec3.divide} * @function */ var div = divide; /** * Alias for {@link vec3.distance} * @function */ var dist = distance; /** * Alias for {@link vec3.squaredDistance} * @function */ var sqrDist = squaredDistance; /** * Alias for {@link vec3.length} * @function */ var len = length; /** * Alias for {@link vec3.squaredLength} * @function */ var sqrLen = squaredLength; /** * Perform some operation over an array of vec3s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach = function () { var vec = create$4(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 3; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; } return a; }; }(); /** * 4 Dimensional Vector * @module vec4 */ /** * Creates a new, empty vec4 * * @returns {vec4} a new 4D vector */ function create$5() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0; } return out; } /** * Creates a new vec4 initialized with values from an existing vector * * @param {ReadonlyVec4} a vector to clone * @returns {vec4} a new 4D vector */ function clone$6(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Creates a new vec4 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {vec4} a new 4D vector */ function fromValues$5(x, y, z, w) { var out = new ARRAY_TYPE(4); out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out; } /** * Copy the values from one vec4 to another * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the source vector * @returns {vec4} out */ function copy$5(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Set the components of a vec4 to the given values * * @param {vec4} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {vec4} out */ function set$5(out, x, y, z, w) { out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out; } /** * Adds two vec4's * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {vec4} out */ function add$6(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out; } /** * Subtracts vector b from vector a * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {vec4} out */ function subtract$5(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; return out; } /** * Multiplies two vec4's * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {vec4} out */ function multiply$5(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; out[3] = a[3] * b[3]; return out; } /** * Divides two vec4's * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {vec4} out */ function divide$1(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; out[3] = a[3] / b[3]; return out; } /** * Math.ceil the components of a vec4 * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a vector to ceil * @returns {vec4} out */ function ceil$1(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); out[3] = Math.ceil(a[3]); return out; } /** * Math.floor the components of a vec4 * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a vector to floor * @returns {vec4} out */ function floor$1(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); out[3] = Math.floor(a[3]); return out; } /** * Returns the minimum of two vec4's * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {vec4} out */ function min$1(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); out[3] = Math.min(a[3], b[3]); return out; } /** * Returns the maximum of two vec4's * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {vec4} out */ function max$1(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); out[3] = Math.max(a[3], b[3]); return out; } /** * Math.round the components of a vec4 * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a vector to round * @returns {vec4} out */ function round$1(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); out[3] = Math.round(a[3]); return out; } /** * Scales a vec4 by a scalar number * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec4} out */ function scale$5(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out; } /** * Adds two vec4's after scaling the second operand by a scalar value * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec4} out */ function scaleAndAdd$1(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; return out; } /** * Calculates the euclidian distance between two vec4's * * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {Number} distance between a and b */ function distance$1(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; var w = b[3] - a[3]; return Math.hypot(x, y, z, w); } /** * Calculates the squared euclidian distance between two vec4's * * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance$1(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; var w = b[3] - a[3]; return x * x + y * y + z * z + w * w; } /** * Calculates the length of a vec4 * * @param {ReadonlyVec4} a vector to calculate length of * @returns {Number} length of a */ function length$1(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return Math.hypot(x, y, z, w); } /** * Calculates the squared length of a vec4 * * @param {ReadonlyVec4} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength$1(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return x * x + y * y + z * z + w * w; } /** * Negates the components of a vec4 * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a vector to negate * @returns {vec4} out */ function negate$1(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = -a[3]; return out; } /** * Returns the inverse of the components of a vec4 * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a vector to invert * @returns {vec4} out */ function inverse$w(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; out[2] = 1.0 / a[2]; out[3] = 1.0 / a[3]; return out; } /** * Normalize a vec4 * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a vector to normalize * @returns {vec4} out */ function normalize$1(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; var len = x * x + y * y + z * z + w * w; if (len > 0) { len = 1 / Math.sqrt(len); } out[0] = x * len; out[1] = y * len; out[2] = z * len; out[3] = w * len; return out; } /** * Calculates the dot product of two vec4's * * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @returns {Number} dot product of a and b */ function dot$1(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; } /** * Returns the cross-product of three vectors in a 4-dimensional space * * @param {ReadonlyVec4} result the receiving vector * @param {ReadonlyVec4} U the first vector * @param {ReadonlyVec4} V the second vector * @param {ReadonlyVec4} W the third vector * @returns {vec4} result */ function cross$1(out, u, v, w) { var A = v[0] * w[1] - v[1] * w[0], B = v[0] * w[2] - v[2] * w[0], C = v[0] * w[3] - v[3] * w[0], D = v[1] * w[2] - v[2] * w[1], E = v[1] * w[3] - v[3] * w[1], F = v[2] * w[3] - v[3] * w[2]; var G = u[0]; var H = u[1]; var I = u[2]; var J = u[3]; out[0] = H * F - I * E + J * D; out[1] = -(G * F) + I * C - J * B; out[2] = G * E - H * C + J * A; out[3] = -(G * D) + H * B - I * A; return out; } /** * Performs a linear interpolation between two vec4's * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the first operand * @param {ReadonlyVec4} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec4} out */ function lerp$1(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; var aw = a[3]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); out[3] = aw + t * (b[3] - aw); return out; } /** * Generates a random vector with the given scale * * @param {vec4} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec4} out */ function random$1(out, scale) { scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646. // http://projecteuclid.org/euclid.aoms/1177692644; var v1, v2, v3, v4; var s1, s2; do { v1 = RANDOM() * 2 - 1; v2 = RANDOM() * 2 - 1; s1 = v1 * v1 + v2 * v2; } while (s1 >= 1); do { v3 = RANDOM() * 2 - 1; v4 = RANDOM() * 2 - 1; s2 = v3 * v3 + v4 * v4; } while (s2 >= 1); var d = Math.sqrt((1 - s1) / s2); out[0] = scale * v1; out[1] = scale * v2; out[2] = scale * v3 * d; out[3] = scale * v4 * d; return out; } /** * Transforms the vec4 with a mat4. * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the vector to transform * @param {ReadonlyMat4} m matrix to transform with * @returns {vec4} out */ function transformMat4$1(out, a, m) { var x = a[0], y = a[1], z = a[2], w = a[3]; out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; return out; } /** * Transforms the vec4 with a quat * * @param {vec4} out the receiving vector * @param {ReadonlyVec4} a the vector to transform * @param {ReadonlyQuat} q quaternion to transform with * @returns {vec4} out */ function transformQuat$1(out, a, q) { var x = a[0], y = a[1], z = a[2]; var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; // calculate quat * vec var ix = qw * x + qy * z - qz * y; var iy = qw * y + qz * x - qx * z; var iz = qw * z + qx * y - qy * x; var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; out[3] = a[3]; return out; } /** * Set the components of a vec4 to zero * * @param {vec4} out the receiving vector * @returns {vec4} out */ function zero$1(out) { out[0] = 0.0; out[1] = 0.0; out[2] = 0.0; out[3] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {ReadonlyVec4} a vector to represent as a string * @returns {String} string representation of the vector */ function str$5(a) { return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; } /** * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyVec4} a The first vector. * @param {ReadonlyVec4} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals$5(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {ReadonlyVec4} a The first vector. * @param {ReadonlyVec4} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$6(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); } /** * Alias for {@link vec4.subtract} * @function */ var sub$5 = subtract$5; /** * Alias for {@link vec4.multiply} * @function */ var mul$5 = multiply$5; /** * Alias for {@link vec4.divide} * @function */ var div$1 = divide$1; /** * Alias for {@link vec4.distance} * @function */ var dist$1 = distance$1; /** * Alias for {@link vec4.squaredDistance} * @function */ var sqrDist$1 = squaredDistance$1; /** * Alias for {@link vec4.length} * @function */ var len$1 = length$1; /** * Alias for {@link vec4.squaredLength} * @function */ var sqrLen$1 = squaredLength$1; /** * Perform some operation over an array of vec4s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach$1 = function () { var vec = create$5(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 4; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; vec[3] = a[i + 3]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; a[i + 3] = vec[3]; } return a; }; }(); /** * Quaternion * @module quat */ /** * Creates a new identity quat * * @returns {quat} a new quaternion */ function create$6() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } out[3] = 1; return out; } /** * Set a quat to the identity quaternion * * @param {quat} out the receiving quaternion * @returns {quat} out */ function identity$5(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out; } /** * Sets a quat from the given angle and rotation axis, * then returns it. * * @param {quat} out the receiving quaternion * @param {ReadonlyVec3} axis the axis around which to rotate * @param {Number} rad the angle in radians * @returns {quat} out **/ function setAxisAngle(out, axis, rad) { rad = rad * 0.5; var s = Math.sin(rad); out[0] = s * axis[0]; out[1] = s * axis[1]; out[2] = s * axis[2]; out[3] = Math.cos(rad); return out; } /** * Gets the rotation axis and angle for a given * quaternion. If a quaternion is created with * setAxisAngle, this method will return the same * values as providied in the original parameter list * OR functionally equivalent values. * Example: The quaternion formed by axis [0, 0, 1] and * angle -90 is the same as the quaternion formed by * [0, 0, 1] and 270. This method favors the latter. * @param {vec3} out_axis Vector receiving the axis of rotation * @param {ReadonlyQuat} q Quaternion to be decomposed * @return {Number} Angle, in radians, of the rotation */ function getAxisAngle(out_axis, q) { var rad = Math.acos(q[3]) * 2.0; var s = Math.sin(rad / 2.0); if (s > EPSILON) { out_axis[0] = q[0] / s; out_axis[1] = q[1] / s; out_axis[2] = q[2] / s; } else { // If s is zero, return any axis (no rotation - axis does not matter) out_axis[0] = 1; out_axis[1] = 0; out_axis[2] = 0; } return rad; } /** * Gets the angular distance between two unit quaternions * * @param {ReadonlyQuat} a Origin unit quaternion * @param {ReadonlyQuat} b Destination unit quaternion * @return {Number} Angle, in radians, between the two quaternions */ function getAngle(a, b) { var dotproduct = dot$2(a, b); return Math.acos(2 * dotproduct * dotproduct - 1); } /** * Multiplies two quat's * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a the first operand * @param {ReadonlyQuat} b the second operand * @returns {quat} out */ function multiply$6(out, a, b) { var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = b[0], by = b[1], bz = b[2], bw = b[3]; out[0] = ax * bw + aw * bx + ay * bz - az * by; out[1] = ay * bw + aw * by + az * bx - ax * bz; out[2] = az * bw + aw * bz + ax * by - ay * bx; out[3] = aw * bw - ax * bx - ay * by - az * bz; return out; } /** * Rotates a quaternion by the given angle about the X axis * * @param {quat} out quat receiving operation result * @param {ReadonlyQuat} a quat to rotate * @param {number} rad angle (in radians) to rotate * @returns {quat} out */ function rotateX$2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw + aw * bx; out[1] = ay * bw + az * bx; out[2] = az * bw - ay * bx; out[3] = aw * bw - ax * bx; return out; } /** * Rotates a quaternion by the given angle about the Y axis * * @param {quat} out quat receiving operation result * @param {ReadonlyQuat} a quat to rotate * @param {number} rad angle (in radians) to rotate * @returns {quat} out */ function rotateY$2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var by = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw - az * by; out[1] = ay * bw + aw * by; out[2] = az * bw + ax * by; out[3] = aw * bw - ay * by; return out; } /** * Rotates a quaternion by the given angle about the Z axis * * @param {quat} out quat receiving operation result * @param {ReadonlyQuat} a quat to rotate * @param {number} rad angle (in radians) to rotate * @returns {quat} out */ function rotateZ$2(out, a, rad) { rad *= 0.5; var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bz = Math.sin(rad), bw = Math.cos(rad); out[0] = ax * bw + ay * bz; out[1] = ay * bw - ax * bz; out[2] = az * bw + aw * bz; out[3] = aw * bw - az * bz; return out; } /** * Calculates the W component of a quat from the X, Y, and Z components. * Assumes that quaternion is 1 unit in length. * Any existing W component will be ignored. * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a quat to calculate W component of * @returns {quat} out */ function calculateW(out, a) { var x = a[0], y = a[1], z = a[2]; out[0] = x; out[1] = y; out[2] = z; out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); return out; } /** * Calculate the exponential of a unit quaternion. * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a quat to calculate the exponential of * @returns {quat} out */ function exp(out, a) { var x = a[0], y = a[1], z = a[2], w = a[3]; var r = Math.sqrt(x * x + y * y + z * z); var et = Math.exp(w); var s = r > 0 ? et * Math.sin(r) / r : 0; out[0] = x * s; out[1] = y * s; out[2] = z * s; out[3] = et * Math.cos(r); return out; } /** * Calculate the natural logarithm of a unit quaternion. * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a quat to calculate the exponential of * @returns {quat} out */ function ln(out, a) { var x = a[0], y = a[1], z = a[2], w = a[3]; var r = Math.sqrt(x * x + y * y + z * z); var t = r > 0 ? Math.atan2(r, w) / r : 0; out[0] = x * t; out[1] = y * t; out[2] = z * t; out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w); return out; } /** * Calculate the scalar power of a unit quaternion. * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a quat to calculate the exponential of * @param {Number} b amount to scale the quaternion by * @returns {quat} out */ function pow(out, a, b) { ln(out, a); scale$6(out, out, b); exp(out, out); return out; } /** * Performs a spherical linear interpolation between two quat * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a the first operand * @param {ReadonlyQuat} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out */ function slerp(out, a, b, t) { // benchmarks: // http://jsperf.com/quaternion-slerp-implementations var ax = a[0], ay = a[1], az = a[2], aw = a[3]; var bx = b[0], by = b[1], bz = b[2], bw = b[3]; var omega, cosom, sinom, scale0, scale1; // calc cosine cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary) if (cosom < 0.0) { cosom = -cosom; bx = -bx; by = -by; bz = -bz; bw = -bw; } // calculate coefficients if (1.0 - cosom > EPSILON) { // standard case (slerp) omega = Math.acos(cosom); sinom = Math.sin(omega); scale0 = Math.sin((1.0 - t) * omega) / sinom; scale1 = Math.sin(t * omega) / sinom; } else { // "from" and "to" quaternions are very close // ... so we can do a linear interpolation scale0 = 1.0 - t; scale1 = t; } // calculate final values out[0] = scale0 * ax + scale1 * bx; out[1] = scale0 * ay + scale1 * by; out[2] = scale0 * az + scale1 * bz; out[3] = scale0 * aw + scale1 * bw; return out; } /** * Generates a random unit quaternion * * @param {quat} out the receiving quaternion * @returns {quat} out */ function random$2(out) { // Implementation of http://planning.cs.uiuc.edu/node198.html // TODO: Calling random 3 times is probably not the fastest solution var u1 = RANDOM(); var u2 = RANDOM(); var u3 = RANDOM(); var sqrt1MinusU1 = Math.sqrt(1 - u1); var sqrtU1 = Math.sqrt(u1); out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2); out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2); out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3); out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3); return out; } /** * Calculates the inverse of a quat * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a quat to calculate inverse of * @returns {quat} out */ function invert$4(out, a) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 out[0] = -a0 * invDot; out[1] = -a1 * invDot; out[2] = -a2 * invDot; out[3] = a3 * invDot; return out; } /** * Calculates the conjugate of a quat * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a quat to calculate conjugate of * @returns {quat} out */ function conjugate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a[3]; return out; } /** * Creates a quaternion from the given 3x3 rotation matrix. * * NOTE: The resultant quaternion is not normalized, so you should be sure * to renormalize the quaternion yourself where necessary. * * @param {quat} out the receiving quaternion * @param {ReadonlyMat3} m rotation matrix * @returns {quat} out * @function */ function fromMat3(out, m) { // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes // article "Quaternion Calculus and Fast Animation". var fTrace = m[0] + m[4] + m[8]; var fRoot; if (fTrace > 0.0) { // |w| > 1/2, may as well choose w > 1/2 fRoot = Math.sqrt(fTrace + 1.0); // 2w out[3] = 0.5 * fRoot; fRoot = 0.5 / fRoot; // 1/(4w) out[0] = (m[5] - m[7]) * fRoot; out[1] = (m[6] - m[2]) * fRoot; out[2] = (m[1] - m[3]) * fRoot; } else { // |w| <= 1/2 var i = 0; if (m[4] > m[0]) { i = 1; } if (m[8] > m[i * 3 + i]) { i = 2; } var j = (i + 1) % 3; var k = (i + 2) % 3; fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0); out[i] = 0.5 * fRoot; fRoot = 0.5 / fRoot; out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; } return out; } /** * Creates a quaternion from the given euler angle x, y, z. * * @param {quat} out the receiving quaternion * @param {x} Angle to rotate around X axis in degrees. * @param {y} Angle to rotate around Y axis in degrees. * @param {z} Angle to rotate around Z axis in degrees. * @returns {quat} out * @function */ function fromEuler(out, x, y, z) { var halfToRad = 0.5 * Math.PI / 180.0; x *= halfToRad; y *= halfToRad; z *= halfToRad; var sx = Math.sin(x); var cx = Math.cos(x); var sy = Math.sin(y); var cy = Math.cos(y); var sz = Math.sin(z); var cz = Math.cos(z); out[0] = sx * cy * cz - cx * sy * sz; out[1] = cx * sy * cz + sx * cy * sz; out[2] = cx * cy * sz - sx * sy * cz; out[3] = cx * cy * cz + sx * sy * sz; return out; } /** * Returns a string representation of a quatenion * * @param {ReadonlyQuat} a vector to represent as a string * @returns {String} string representation of the vector */ function str$6(a) { return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; } /** * Creates a new quat initialized with values from an existing quaternion * * @param {ReadonlyQuat} a quaternion to clone * @returns {quat} a new quaternion * @function */ var clone$7 = clone$6; /** * Creates a new quat initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {quat} a new quaternion * @function */ var fromValues$6 = fromValues$5; /** * Copy the values from one quat to another * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a the source quaternion * @returns {quat} out * @function */ var copy$6 = copy$5; /** * Set the components of a quat to the given values * * @param {quat} out the receiving quaternion * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @param {Number} w W component * @returns {quat} out * @function */ var set$6 = set$5; /** * Adds two quat's * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a the first operand * @param {ReadonlyQuat} b the second operand * @returns {quat} out * @function */ var add$7 = add$6; /** * Alias for {@link quat.multiply} * @function */ var mul$6 = multiply$6; /** * Scales a quat by a scalar number * * @param {quat} out the receiving vector * @param {ReadonlyQuat} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {quat} out * @function */ var scale$6 = scale$5; /** * Calculates the dot product of two quat's * * @param {ReadonlyQuat} a the first operand * @param {ReadonlyQuat} b the second operand * @returns {Number} dot product of a and b * @function */ var dot$2 = dot$1; /** * Performs a linear interpolation between two quat's * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a the first operand * @param {ReadonlyQuat} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out * @function */ var lerp$2 = lerp$1; /** * Calculates the length of a quat * * @param {ReadonlyQuat} a vector to calculate length of * @returns {Number} length of a */ var length$2 = length$1; /** * Alias for {@link quat.length} * @function */ var len$2 = length$2; /** * Calculates the squared length of a quat * * @param {ReadonlyQuat} a vector to calculate squared length of * @returns {Number} squared length of a * @function */ var squaredLength$2 = squaredLength$1; /** * Alias for {@link quat.squaredLength} * @function */ var sqrLen$2 = squaredLength$2; /** * Normalize a quat * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a quaternion to normalize * @returns {quat} out * @function */ var normalize$2 = normalize$1; /** * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyQuat} a The first quaternion. * @param {ReadonlyQuat} b The second quaternion. * @returns {Boolean} True if the vectors are equal, false otherwise. */ var exactEquals$6 = exactEquals$5; /** * Returns whether or not the quaternions have approximately the same elements in the same position. * * @param {ReadonlyQuat} a The first vector. * @param {ReadonlyQuat} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ var equals$7 = equals$6; /** * Sets a quaternion to represent the shortest rotation from one * vector to another. * * Both vectors are assumed to be unit length. * * @param {quat} out the receiving quaternion. * @param {ReadonlyVec3} a the initial vector * @param {ReadonlyVec3} b the destination vector * @returns {quat} out */ var rotationTo = function () { var tmpvec3 = create$4(); var xUnitVec3 = fromValues$4(1, 0, 0); var yUnitVec3 = fromValues$4(0, 1, 0); return function (out, a, b) { var dot$1 = dot(a, b); if (dot$1 < -0.999999) { cross(tmpvec3, xUnitVec3, a); if (len(tmpvec3) < 0.000001) { cross(tmpvec3, yUnitVec3, a); } normalize(tmpvec3, tmpvec3); setAxisAngle(out, tmpvec3, Math.PI); return out; } else if (dot$1 > 0.999999) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out; } else { cross(tmpvec3, a, b); out[0] = tmpvec3[0]; out[1] = tmpvec3[1]; out[2] = tmpvec3[2]; out[3] = 1 + dot$1; return normalize$2(out, out); } }; }(); /** * Performs a spherical linear interpolation with two control points * * @param {quat} out the receiving quaternion * @param {ReadonlyQuat} a the first operand * @param {ReadonlyQuat} b the second operand * @param {ReadonlyQuat} c the third operand * @param {ReadonlyQuat} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat} out */ var sqlerp = function () { var temp1 = create$6(); var temp2 = create$6(); return function (out, a, b, c, d, t) { slerp(temp1, a, d, t); slerp(temp2, b, c, t); slerp(out, temp1, temp2, 2 * t * (1 - t)); return out; }; }(); /** * Sets the specified quaternion with values corresponding to the given * axes. Each axis is a vec3 and is expected to be unit length and * perpendicular to all other specified axes. * * @param {ReadonlyVec3} view the vector representing the viewing direction * @param {ReadonlyVec3} right the vector representing the local "right" direction * @param {ReadonlyVec3} up the vector representing the local "up" direction * @returns {quat} out */ var setAxes = function () { var matr = create$2(); return function (out, view, right, up) { matr[0] = right[0]; matr[3] = right[1]; matr[6] = right[2]; matr[1] = up[0]; matr[4] = up[1]; matr[7] = up[2]; matr[2] = -view[0]; matr[5] = -view[1]; matr[8] = -view[2]; return normalize$2(out, fromMat3(out, matr)); }; }(); /** * Dual Quaternion
* Format: [real, dual]
* Quaternion format: XYZW
* Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.
* @module quat2 */ /** * Creates a new identity dual quat * * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation] */ function create$7() { var dq = new ARRAY_TYPE(8); if (ARRAY_TYPE != Float32Array) { dq[0] = 0; dq[1] = 0; dq[2] = 0; dq[4] = 0; dq[5] = 0; dq[6] = 0; dq[7] = 0; } dq[3] = 1; return dq; } /** * Creates a new quat initialized with values from an existing quaternion * * @param {ReadonlyQuat2} a dual quaternion to clone * @returns {quat2} new dual quaternion * @function */ function clone$8(a) { var dq = new ARRAY_TYPE(8); dq[0] = a[0]; dq[1] = a[1]; dq[2] = a[2]; dq[3] = a[3]; dq[4] = a[4]; dq[5] = a[5]; dq[6] = a[6]; dq[7] = a[7]; return dq; } /** * Creates a new dual quat initialized with the given values * * @param {Number} x1 X component * @param {Number} y1 Y component * @param {Number} z1 Z component * @param {Number} w1 W component * @param {Number} x2 X component * @param {Number} y2 Y component * @param {Number} z2 Z component * @param {Number} w2 W component * @returns {quat2} new dual quaternion * @function */ function fromValues$7(x1, y1, z1, w1, x2, y2, z2, w2) { var dq = new ARRAY_TYPE(8); dq[0] = x1; dq[1] = y1; dq[2] = z1; dq[3] = w1; dq[4] = x2; dq[5] = y2; dq[6] = z2; dq[7] = w2; return dq; } /** * Creates a new dual quat from the given values (quat and translation) * * @param {Number} x1 X component * @param {Number} y1 Y component * @param {Number} z1 Z component * @param {Number} w1 W component * @param {Number} x2 X component (translation) * @param {Number} y2 Y component (translation) * @param {Number} z2 Z component (translation) * @returns {quat2} new dual quaternion * @function */ function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) { var dq = new ARRAY_TYPE(8); dq[0] = x1; dq[1] = y1; dq[2] = z1; dq[3] = w1; var ax = x2 * 0.5, ay = y2 * 0.5, az = z2 * 0.5; dq[4] = ax * w1 + ay * z1 - az * y1; dq[5] = ay * w1 + az * x1 - ax * z1; dq[6] = az * w1 + ax * y1 - ay * x1; dq[7] = -ax * x1 - ay * y1 - az * z1; return dq; } /** * Creates a dual quat from a quaternion and a translation * * @param {ReadonlyQuat2} dual quaternion receiving operation result * @param {ReadonlyQuat} q a normalized quaternion * @param {ReadonlyVec3} t tranlation vector * @returns {quat2} dual quaternion receiving operation result * @function */ function fromRotationTranslation$1(out, q, t) { var ax = t[0] * 0.5, ay = t[1] * 0.5, az = t[2] * 0.5, bx = q[0], by = q[1], bz = q[2], bw = q[3]; out[0] = bx; out[1] = by; out[2] = bz; out[3] = bw; out[4] = ax * bw + ay * bz - az * by; out[5] = ay * bw + az * bx - ax * bz; out[6] = az * bw + ax * by - ay * bx; out[7] = -ax * bx - ay * by - az * bz; return out; } /** * Creates a dual quat from a translation * * @param {ReadonlyQuat2} dual quaternion receiving operation result * @param {ReadonlyVec3} t translation vector * @returns {quat2} dual quaternion receiving operation result * @function */ function fromTranslation$3(out, t) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = t[0] * 0.5; out[5] = t[1] * 0.5; out[6] = t[2] * 0.5; out[7] = 0; return out; } /** * Creates a dual quat from a quaternion * * @param {ReadonlyQuat2} dual quaternion receiving operation result * @param {ReadonlyQuat} q the quaternion * @returns {quat2} dual quaternion receiving operation result * @function */ function fromRotation$4(out, q) { out[0] = q[0]; out[1] = q[1]; out[2] = q[2]; out[3] = q[3]; out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0; return out; } /** * Creates a new dual quat from a matrix (4x4) * * @param {quat2} out the dual quaternion * @param {ReadonlyMat4} a the matrix * @returns {quat2} dual quat receiving operation result * @function */ function fromMat4$1(out, a) { //TODO Optimize this var outer = create$6(); getRotation(outer, a); var t = new ARRAY_TYPE(3); getTranslation(t, a); fromRotationTranslation$1(out, outer, t); return out; } /** * Copy the values from one dual quat to another * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the source dual quaternion * @returns {quat2} out * @function */ function copy$7(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; return out; } /** * Set a dual quat to the identity dual quaternion * * @param {quat2} out the receiving quaternion * @returns {quat2} out */ function identity$6(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0; return out; } /** * Set the components of a dual quat to the given values * * @param {quat2} out the receiving quaternion * @param {Number} x1 X component * @param {Number} y1 Y component * @param {Number} z1 Z component * @param {Number} w1 W component * @param {Number} x2 X component * @param {Number} y2 Y component * @param {Number} z2 Z component * @param {Number} w2 W component * @returns {quat2} out * @function */ function set$7(out, x1, y1, z1, w1, x2, y2, z2, w2) { out[0] = x1; out[1] = y1; out[2] = z1; out[3] = w1; out[4] = x2; out[5] = y2; out[6] = z2; out[7] = w2; return out; } /** * Gets the real part of a dual quat * @param {quat} out real part * @param {ReadonlyQuat2} a Dual Quaternion * @return {quat} real part */ var getReal = copy$6; /** * Gets the dual part of a dual quat * @param {quat} out dual part * @param {ReadonlyQuat2} a Dual Quaternion * @return {quat} dual part */ function getDual(out, a) { out[0] = a[4]; out[1] = a[5]; out[2] = a[6]; out[3] = a[7]; return out; } /** * Set the real component of a dual quat to the given quaternion * * @param {quat2} out the receiving quaternion * @param {ReadonlyQuat} q a quaternion representing the real part * @returns {quat2} out * @function */ var setReal = copy$6; /** * Set the dual component of a dual quat to the given quaternion * * @param {quat2} out the receiving quaternion * @param {ReadonlyQuat} q a quaternion representing the dual part * @returns {quat2} out * @function */ function setDual(out, q) { out[4] = q[0]; out[5] = q[1]; out[6] = q[2]; out[7] = q[3]; return out; } /** * Gets the translation of a normalized dual quat * @param {vec3} out translation * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed * @return {vec3} translation */ function getTranslation$1(out, a) { var ax = a[4], ay = a[5], az = a[6], aw = a[7], bx = -a[0], by = -a[1], bz = -a[2], bw = a[3]; out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; return out; } /** * Translates a dual quat by the given vector * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the dual quaternion to translate * @param {ReadonlyVec3} v vector to translate by * @returns {quat2} out */ function translate$4(out, a, v) { var ax1 = a[0], ay1 = a[1], az1 = a[2], aw1 = a[3], bx1 = v[0] * 0.5, by1 = v[1] * 0.5, bz1 = v[2] * 0.5, ax2 = a[4], ay2 = a[5], az2 = a[6], aw2 = a[7]; out[0] = ax1; out[1] = ay1; out[2] = az1; out[3] = aw1; out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2; out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2; out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2; out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2; return out; } /** * Rotates a dual quat around the X axis * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the dual quaternion to rotate * @param {number} rad how far should the rotation be * @returns {quat2} out */ function rotateX$3(out, a, rad) { var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7], ax1 = ax * bw + aw * bx + ay * bz - az * by, ay1 = ay * bw + aw * by + az * bx - ax * bz, az1 = az * bw + aw * bz + ax * by - ay * bx, aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateX$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out; } /** * Rotates a dual quat around the Y axis * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the dual quaternion to rotate * @param {number} rad how far should the rotation be * @returns {quat2} out */ function rotateY$3(out, a, rad) { var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7], ax1 = ax * bw + aw * bx + ay * bz - az * by, ay1 = ay * bw + aw * by + az * bx - ax * bz, az1 = az * bw + aw * bz + ax * by - ay * bx, aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateY$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out; } /** * Rotates a dual quat around the Z axis * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the dual quaternion to rotate * @param {number} rad how far should the rotation be * @returns {quat2} out */ function rotateZ$3(out, a, rad) { var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7], ax1 = ax * bw + aw * bx + ay * bz - az * by, ay1 = ay * bw + aw * by + az * bx - ax * bz, az1 = az * bw + aw * bz + ax * by - ay * bx, aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateZ$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out; } /** * Rotates a dual quat by a given quaternion (a * q) * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the dual quaternion to rotate * @param {ReadonlyQuat} q quaternion to rotate by * @returns {quat2} out */ function rotateByQuatAppend(out, a, q) { var qx = q[0], qy = q[1], qz = q[2], qw = q[3], ax = a[0], ay = a[1], az = a[2], aw = a[3]; out[0] = ax * qw + aw * qx + ay * qz - az * qy; out[1] = ay * qw + aw * qy + az * qx - ax * qz; out[2] = az * qw + aw * qz + ax * qy - ay * qx; out[3] = aw * qw - ax * qx - ay * qy - az * qz; ax = a[4]; ay = a[5]; az = a[6]; aw = a[7]; out[4] = ax * qw + aw * qx + ay * qz - az * qy; out[5] = ay * qw + aw * qy + az * qx - ax * qz; out[6] = az * qw + aw * qz + ax * qy - ay * qx; out[7] = aw * qw - ax * qx - ay * qy - az * qz; return out; } /** * Rotates a dual quat by a given quaternion (q * a) * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat} q quaternion to rotate by * @param {ReadonlyQuat2} a the dual quaternion to rotate * @returns {quat2} out */ function rotateByQuatPrepend(out, q, a) { var qx = q[0], qy = q[1], qz = q[2], qw = q[3], bx = a[0], by = a[1], bz = a[2], bw = a[3]; out[0] = qx * bw + qw * bx + qy * bz - qz * by; out[1] = qy * bw + qw * by + qz * bx - qx * bz; out[2] = qz * bw + qw * bz + qx * by - qy * bx; out[3] = qw * bw - qx * bx - qy * by - qz * bz; bx = a[4]; by = a[5]; bz = a[6]; bw = a[7]; out[4] = qx * bw + qw * bx + qy * bz - qz * by; out[5] = qy * bw + qw * by + qz * bx - qx * bz; out[6] = qz * bw + qw * bz + qx * by - qy * bx; out[7] = qw * bw - qx * bx - qy * by - qz * bz; return out; } /** * Rotates a dual quat around a given axis. Does the normalisation automatically * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the dual quaternion to rotate * @param {ReadonlyVec3} axis the axis to rotate around * @param {Number} rad how far the rotation should be * @returns {quat2} out */ function rotateAroundAxis(out, a, axis, rad) { //Special case for rad = 0 if (Math.abs(rad) < EPSILON) { return copy$7(out, a); } var axisLength = Math.hypot(axis[0], axis[1], axis[2]); rad = rad * 0.5; var s = Math.sin(rad); var bx = s * axis[0] / axisLength; var by = s * axis[1] / axisLength; var bz = s * axis[2] / axisLength; var bw = Math.cos(rad); var ax1 = a[0], ay1 = a[1], az1 = a[2], aw1 = a[3]; out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; var ax = a[4], ay = a[5], az = a[6], aw = a[7]; out[4] = ax * bw + aw * bx + ay * bz - az * by; out[5] = ay * bw + aw * by + az * bx - ax * bz; out[6] = az * bw + aw * bz + ax * by - ay * bx; out[7] = aw * bw - ax * bx - ay * by - az * bz; return out; } /** * Adds two dual quat's * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the first operand * @param {ReadonlyQuat2} b the second operand * @returns {quat2} out * @function */ function add$8(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; return out; } /** * Multiplies two dual quat's * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a the first operand * @param {ReadonlyQuat2} b the second operand * @returns {quat2} out */ function multiply$7(out, a, b) { var ax0 = a[0], ay0 = a[1], az0 = a[2], aw0 = a[3], bx1 = b[4], by1 = b[5], bz1 = b[6], bw1 = b[7], ax1 = a[4], ay1 = a[5], az1 = a[6], aw1 = a[7], bx0 = b[0], by0 = b[1], bz0 = b[2], bw0 = b[3]; out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0; out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0; out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0; out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0; out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0; out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0; out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0; out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0; return out; } /** * Alias for {@link quat2.multiply} * @function */ var mul$7 = multiply$7; /** * Scales a dual quat by a scalar number * * @param {quat2} out the receiving dual quat * @param {ReadonlyQuat2} a the dual quat to scale * @param {Number} b amount to scale the dual quat by * @returns {quat2} out * @function */ function scale$7(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; return out; } /** * Calculates the dot product of two dual quat's (The dot product of the real parts) * * @param {ReadonlyQuat2} a the first operand * @param {ReadonlyQuat2} b the second operand * @returns {Number} dot product of a and b * @function */ var dot$3 = dot$2; /** * Performs a linear interpolation between two dual quats's * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5) * * @param {quat2} out the receiving dual quat * @param {ReadonlyQuat2} a the first operand * @param {ReadonlyQuat2} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {quat2} out */ function lerp$3(out, a, b, t) { var mt = 1 - t; if (dot$3(a, b) < 0) { t = -t; } out[0] = a[0] * mt + b[0] * t; out[1] = a[1] * mt + b[1] * t; out[2] = a[2] * mt + b[2] * t; out[3] = a[3] * mt + b[3] * t; out[4] = a[4] * mt + b[4] * t; out[5] = a[5] * mt + b[5] * t; out[6] = a[6] * mt + b[6] * t; out[7] = a[7] * mt + b[7] * t; return out; } /** * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a dual quat to calculate inverse of * @returns {quat2} out */ function invert$5(out, a) { var sqlen = squaredLength$3(a); out[0] = -a[0] / sqlen; out[1] = -a[1] / sqlen; out[2] = -a[2] / sqlen; out[3] = a[3] / sqlen; out[4] = -a[4] / sqlen; out[5] = -a[5] / sqlen; out[6] = -a[6] / sqlen; out[7] = a[7] / sqlen; return out; } /** * Calculates the conjugate of a dual quat * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result. * * @param {quat2} out the receiving quaternion * @param {ReadonlyQuat2} a quat to calculate conjugate of * @returns {quat2} out */ function conjugate$1(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a[3]; out[4] = -a[4]; out[5] = -a[5]; out[6] = -a[6]; out[7] = a[7]; return out; } /** * Calculates the length of a dual quat * * @param {ReadonlyQuat2} a dual quat to calculate length of * @returns {Number} length of a * @function */ var length$3 = length$2; /** * Alias for {@link quat2.length} * @function */ var len$3 = length$3; /** * Calculates the squared length of a dual quat * * @param {ReadonlyQuat2} a dual quat to calculate squared length of * @returns {Number} squared length of a * @function */ var squaredLength$3 = squaredLength$2; /** * Alias for {@link quat2.squaredLength} * @function */ var sqrLen$3 = squaredLength$3; /** * Normalize a dual quat * * @param {quat2} out the receiving dual quaternion * @param {ReadonlyQuat2} a dual quaternion to normalize * @returns {quat2} out * @function */ function normalize$3(out, a) { var magnitude = squaredLength$3(a); if (magnitude > 0) { magnitude = Math.sqrt(magnitude); var a0 = a[0] / magnitude; var a1 = a[1] / magnitude; var a2 = a[2] / magnitude; var a3 = a[3] / magnitude; var b0 = a[4]; var b1 = a[5]; var b2 = a[6]; var b3 = a[7]; var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3; out[0] = a0; out[1] = a1; out[2] = a2; out[3] = a3; out[4] = (b0 - a0 * a_dot_b) / magnitude; out[5] = (b1 - a1 * a_dot_b) / magnitude; out[6] = (b2 - a2 * a_dot_b) / magnitude; out[7] = (b3 - a3 * a_dot_b) / magnitude; } return out; } /** * Returns a string representation of a dual quatenion * * @param {ReadonlyQuat2} a dual quaternion to represent as a string * @returns {String} string representation of the dual quat */ function str$7(a) { return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")"; } /** * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyQuat2} a the first dual quaternion. * @param {ReadonlyQuat2} b the second dual quaternion. * @returns {Boolean} true if the dual quaternions are equal, false otherwise. */ function exactEquals$7(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7]; } /** * Returns whether or not the dual quaternions have approximately the same elements in the same position. * * @param {ReadonlyQuat2} a the first dual quat. * @param {ReadonlyQuat2} b the second dual quat. * @returns {Boolean} true if the dual quats are equal, false otherwise. */ function equals$8(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)); } /** * 2 Dimensional Vector * @module vec2 */ /** * Creates a new, empty vec2 * * @returns {vec2} a new 2D vector */ function create$8() { var out = new ARRAY_TYPE(2); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; } return out; } /** * Creates a new vec2 initialized with values from an existing vector * * @param {ReadonlyVec2} a vector to clone * @returns {vec2} a new 2D vector */ function clone$9(a) { var out = new ARRAY_TYPE(2); out[0] = a[0]; out[1] = a[1]; return out; } /** * Creates a new vec2 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} a new 2D vector */ function fromValues$8(x, y) { var out = new ARRAY_TYPE(2); out[0] = x; out[1] = y; return out; } /** * Copy the values from one vec2 to another * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the source vector * @returns {vec2} out */ function copy$8(out, a) { out[0] = a[0]; out[1] = a[1]; return out; } /** * Set the components of a vec2 to the given values * * @param {vec2} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} out */ function set$8(out, x, y) { out[0] = x; out[1] = y; return out; } /** * Adds two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function add$9(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; return out; } /** * Subtracts vector b from vector a * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function subtract$6(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; return out; } /** * Multiplies two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function multiply$8(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; return out; } /** * Divides two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function divide$2(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; return out; } /** * Math.ceil the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to ceil * @returns {vec2} out */ function ceil$2(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); return out; } /** * Math.floor the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to floor * @returns {vec2} out */ function floor$2(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); return out; } /** * Returns the minimum of two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function min$2(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); return out; } /** * Returns the maximum of two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function max$2(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); return out; } /** * Math.round the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to round * @returns {vec2} out */ function round$2(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); return out; } /** * Scales a vec2 by a scalar number * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec2} out */ function scale$8(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; return out; } /** * Adds two vec2's after scaling the second operand by a scalar value * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec2} out */ function scaleAndAdd$2(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; return out; } /** * Calculates the euclidian distance between two vec2's * * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {Number} distance between a and b */ function distance$2(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return Math.hypot(x, y); } /** * Calculates the squared euclidian distance between two vec2's * * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance$2(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return x * x + y * y; } /** * Calculates the length of a vec2 * * @param {ReadonlyVec2} a vector to calculate length of * @returns {Number} length of a */ function length$4(a) { var x = a[0], y = a[1]; return Math.hypot(x, y); } /** * Calculates the squared length of a vec2 * * @param {ReadonlyVec2} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength$4(a) { var x = a[0], y = a[1]; return x * x + y * y; } /** * Negates the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to negate * @returns {vec2} out */ function negate$2(out, a) { out[0] = -a[0]; out[1] = -a[1]; return out; } /** * Returns the inverse of the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to invert * @returns {vec2} out */ function inverse$x(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; return out; } /** * Normalize a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to normalize * @returns {vec2} out */ function normalize$4(out, a) { var x = a[0], y = a[1]; var len = x * x + y * y; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); } out[0] = a[0] * len; out[1] = a[1] * len; return out; } /** * Calculates the dot product of two vec2's * * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {Number} dot product of a and b */ function dot$4(a, b) { return a[0] * b[0] + a[1] * b[1]; } /** * Computes the cross product of two vec2's * Note that the cross product must by definition produce a 3D vector * * @param {vec3} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec3} out */ function cross$2(out, a, b) { var z = a[0] * b[1] - a[1] * b[0]; out[0] = out[1] = 0; out[2] = z; return out; } /** * Performs a linear interpolation between two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec2} out */ function lerp$4(out, a, b, t) { var ax = a[0], ay = a[1]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); return out; } /** * Generates a random vector with the given scale * * @param {vec2} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned * @returns {vec2} out */ function random$3(out, scale) { scale = scale || 1.0; var r = RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; return out; } /** * Transforms the vec2 with a mat2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat2} m matrix to transform with * @returns {vec2} out */ function transformMat2(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y; out[1] = m[1] * x + m[3] * y; return out; } /** * Transforms the vec2 with a mat2d * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat2d} m matrix to transform with * @returns {vec2} out */ function transformMat2d(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y + m[4]; out[1] = m[1] * x + m[3] * y + m[5]; return out; } /** * Transforms the vec2 with a mat3 * 3rd vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat3} m matrix to transform with * @returns {vec2} out */ function transformMat3$1(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[3] * y + m[6]; out[1] = m[1] * x + m[4] * y + m[7]; return out; } /** * Transforms the vec2 with a mat4 * 3rd vector component is implicitly '0' * 4th vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat4} m matrix to transform with * @returns {vec2} out */ function transformMat4$2(out, a, m) { var x = a[0]; var y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; return out; } /** * Rotate a 2D vector * @param {vec2} out The receiving vec2 * @param {ReadonlyVec2} a The vec2 point to rotate * @param {ReadonlyVec2} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec2} out */ function rotate$4(out, a, b, rad) { //Translate point to the origin var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(rad), cosC = Math.cos(rad); //perform rotation and translate to correct position out[0] = p0 * cosC - p1 * sinC + b[0]; out[1] = p0 * sinC + p1 * cosC + b[1]; return out; } /** * Get the angle between two 2D vectors * @param {ReadonlyVec2} a The first operand * @param {ReadonlyVec2} b The second operand * @returns {Number} The angle in radians */ function angle$1(a, b) { var x1 = a[0], y1 = a[1], x2 = b[0], y2 = b[1], // mag is the product of the magnitudes of a and b mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2), // mag &&.. short circuits if mag == 0 cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1 return Math.acos(Math.min(Math.max(cosine, -1), 1)); } /** * Set the components of a vec2 to zero * * @param {vec2} out the receiving vector * @returns {vec2} out */ function zero$2(out) { out[0] = 0.0; out[1] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {ReadonlyVec2} a vector to represent as a string * @returns {String} string representation of the vector */ function str$8(a) { return "vec2(" + a[0] + ", " + a[1] + ")"; } /** * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) * * @param {ReadonlyVec2} a The first vector. * @param {ReadonlyVec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function exactEquals$8(a, b) { return a[0] === b[0] && a[1] === b[1]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {ReadonlyVec2} a The first vector. * @param {ReadonlyVec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function equals$9(a, b) { var a0 = a[0], a1 = a[1]; var b0 = b[0], b1 = b[1]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); } /** * Alias for {@link vec2.length} * @function */ var len$4 = length$4; /** * Alias for {@link vec2.subtract} * @function */ var sub$6 = subtract$6; /** * Alias for {@link vec2.multiply} * @function */ var mul$8 = multiply$8; /** * Alias for {@link vec2.divide} * @function */ var div$2 = divide$2; /** * Alias for {@link vec2.distance} * @function */ var dist$2 = distance$2; /** * Alias for {@link vec2.squaredDistance} * @function */ var sqrDist$2 = squaredDistance$2; /** * Alias for {@link vec2.squaredLength} * @function */ var sqrLen$4 = squaredLength$4; /** * Perform some operation over an array of vec2s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach$2 = function () { var vec = create$8(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 2; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; } return a; }; }(); // var CircleStyleLayer = /*@__PURE__*/(function (StyleLayer) { function CircleStyleLayer(layer ) { StyleLayer.call(this, layer, properties); } if ( StyleLayer ) CircleStyleLayer.__proto__ = StyleLayer; CircleStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); CircleStyleLayer.prototype.constructor = CircleStyleLayer; CircleStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new CircleBucket(parameters); }; CircleStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var circleBucket = (bucket ); return getMaximumPaintValue('circle-radius', this, circleBucket) + getMaximumPaintValue('circle-stroke-width', this, circleBucket) + translateDistance(this.paint.get('circle-translate')); }; CircleStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits , pixelPosMatrix ) { var translatedPolygon = translate(queryGeometry, this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), transform.angle, pixelsToTileUnits); var radius = this.paint.get('circle-radius').evaluate(feature, featureState); var stroke = this.paint.get('circle-stroke-width').evaluate(feature, featureState); var size = radius + stroke; // For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile // // Otherwise, compare geometry in the plane of the viewport // // A circle with fixed scaling relative to the viewport gets larger in tile space as it moves into the distance // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance var alignWithMap = this.paint.get('circle-pitch-alignment') === 'map'; var transformedPolygon = alignWithMap ? translatedPolygon : projectQueryGeometry(translatedPolygon, pixelPosMatrix); var transformedSize = alignWithMap ? size * pixelsToTileUnits : size; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var ring = list$1[i$1]; for (var i = 0, list = ring; i < list.length; i += 1) { var point = list[i]; var transformedPoint = alignWithMap ? point : projectPoint(point, pixelPosMatrix); var adjustedSize = transformedSize; var projectedCenter = transformMat4$1([], [point.x, point.y, 0, 1], pixelPosMatrix); if (this.paint.get('circle-pitch-scale') === 'viewport' && this.paint.get('circle-pitch-alignment') === 'map') { adjustedSize *= projectedCenter[3] / transform.cameraToCenterDistance; } else if (this.paint.get('circle-pitch-scale') === 'map' && this.paint.get('circle-pitch-alignment') === 'viewport') { adjustedSize *= transform.cameraToCenterDistance / projectedCenter[3]; } if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, adjustedSize)) { return true; } } } return false; }; return CircleStyleLayer; }(StyleLayer)); function projectPoint(p , pixelPosMatrix ) { var point = transformMat4$1([], [p.x, p.y, 0, 1], pixelPosMatrix); return new pointGeometry(point[0] / point[3], point[1] / point[3]); } function projectQueryGeometry(queryGeometry , pixelPosMatrix ) { return queryGeometry.map(function (p) { return projectPoint(p, pixelPosMatrix); }); } // var HeatmapBucket = /*@__PURE__*/(function (CircleBucket) { function HeatmapBucket () { CircleBucket.apply(this, arguments); }if ( CircleBucket ) HeatmapBucket.__proto__ = CircleBucket; HeatmapBucket.prototype = Object.create( CircleBucket && CircleBucket.prototype ); HeatmapBucket.prototype.constructor = HeatmapBucket; return HeatmapBucket; }(CircleBucket)); register('HeatmapBucket', HeatmapBucket, {omit: ['layers']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$2 = new Properties({ "heatmap-radius": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-radius"]), "heatmap-weight": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-weight"]), "heatmap-intensity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-intensity"]), "heatmap-color": new ColorRampProperty(spec["paint_heatmap"]["heatmap-color"]), "heatmap-opacity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-opacity"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$1 = ({ paint: paint$2 } ); // /** * Given an expression that should evaluate to a color ramp, * return a RGBA image representing that ramp expression. * * @private */ function renderColorRamp(params ) { var evaluationGlobals = {}; var width = params.resolution || 256; var height = params.clips ? params.clips.length : 1; var image = params.image || new RGBAImage({width: width, height: height}); assert_1(isPowerOfTwo(width)); var renderPixel = function (stride, index, progress) { evaluationGlobals[params.evaluationKey] = progress; var pxColor = params.expression.evaluate((evaluationGlobals )); // the colors are being unpremultiplied because Color uses // premultiplied values, and the Texture class expects unpremultiplied ones image.data[stride + index + 0] = Math.floor(pxColor.r * 255 / pxColor.a); image.data[stride + index + 1] = Math.floor(pxColor.g * 255 / pxColor.a); image.data[stride + index + 2] = Math.floor(pxColor.b * 255 / pxColor.a); image.data[stride + index + 3] = Math.floor(pxColor.a * 255); }; if (!params.clips) { for (var i = 0, j = 0; i < width; i++, j += 4) { var progress = i / (width - 1); renderPixel(0, j, progress); } } else { for (var clip = 0, stride = 0; clip < height; ++clip, stride += width * 4) { for (var i$1 = 0, j$1 = 0; i$1 < width; i$1++, j$1 += 4) { // Remap progress between clips var progress$1 = i$1 / (width - 1); var ref = params.clips[clip]; var start = ref.start; var end = ref.end; var evaluationProgress = start * (1 - progress$1) + end * progress$1; renderPixel(stride, j$1, evaluationProgress); } } } return image; } // var HeatmapStyleLayer = /*@__PURE__*/(function (StyleLayer) { function HeatmapStyleLayer(layer ) { StyleLayer.call(this, layer, properties$1); // make sure color ramp texture is generated for default heatmap color too this._updateColorRamp(); } if ( StyleLayer ) HeatmapStyleLayer.__proto__ = StyleLayer; HeatmapStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HeatmapStyleLayer.prototype.constructor = HeatmapStyleLayer; HeatmapStyleLayer.prototype.createBucket = function createBucket (options ) { return new HeatmapBucket(options); }; HeatmapStyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (name ) { if (name === 'heatmap-color') { this._updateColorRamp(); } }; HeatmapStyleLayer.prototype._updateColorRamp = function _updateColorRamp () { var expression = this._transitionablePaint._values['heatmap-color'].value.expression; this.colorRamp = renderColorRamp({ expression: expression, evaluationKey: 'heatmapDensity', image: this.colorRamp }); this.colorRampTexture = null; }; HeatmapStyleLayer.prototype.resize = function resize () { if (this.heatmapFbo) { this.heatmapFbo.destroy(); this.heatmapFbo = null; } }; HeatmapStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; HeatmapStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { return false; }; HeatmapStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none'; }; return HeatmapStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$3 = new Properties({ "hillshade-illumination-direction": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-direction"]), "hillshade-illumination-anchor": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-anchor"]), "hillshade-exaggeration": new DataConstantProperty(spec["paint_hillshade"]["hillshade-exaggeration"]), "hillshade-shadow-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-shadow-color"]), "hillshade-highlight-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-highlight-color"]), "hillshade-accent-color": new DataConstantProperty(spec["paint_hillshade"]["hillshade-accent-color"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$2 = ({ paint: paint$3 } ); // var HillshadeStyleLayer = /*@__PURE__*/(function (StyleLayer) { function HillshadeStyleLayer(layer ) { StyleLayer.call(this, layer, properties$2); } if ( StyleLayer ) HillshadeStyleLayer.__proto__ = StyleLayer; HillshadeStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); HillshadeStyleLayer.prototype.constructor = HillshadeStyleLayer; HillshadeStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none'; }; return HillshadeStyleLayer; }(StyleLayer)); // var layout$3 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); var members$1 = layout$3.members; var size$1 = layout$3.size; var alignment$1 = layout$3.alignment; 'use strict'; var earcut_1 = earcut; var default_1 = earcut; function earcut(data, holeIndices, dim) { dim = dim || 2; var hasHoles = holeIndices && holeIndices.length, outerLen = hasHoles ? holeIndices[0] * dim : data.length, outerNode = linkedList(data, 0, outerLen, dim, true), triangles = []; if (!outerNode || outerNode.next === outerNode.prev) { return triangles; } var minX, minY, maxX, maxY, x, y, invSize; if (hasHoles) { outerNode = eliminateHoles(data, holeIndices, outerNode, dim); } // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox if (data.length > 80 * dim) { minX = maxX = data[0]; minY = maxY = data[1]; for (var i = dim; i < outerLen; i += dim) { x = data[i]; y = data[i + 1]; if (x < minX) { minX = x; } if (y < minY) { minY = y; } if (x > maxX) { maxX = x; } if (y > maxY) { maxY = y; } } // minX, minY and invSize are later used to transform coords into integers for z-order calculation invSize = Math.max(maxX - minX, maxY - minY); invSize = invSize !== 0 ? 1 / invSize : 0; } earcutLinked(outerNode, triangles, dim, minX, minY, invSize); return triangles; } // create a circular doubly linked list from polygon points in the specified winding order function linkedList(data, start, end, dim, clockwise) { var i, last; if (clockwise === (signedArea(data, start, end, dim) > 0)) { for (i = start; i < end; i += dim) { last = insertNode(i, data[i], data[i + 1], last); } } else { for (i = end - dim; i >= start; i -= dim) { last = insertNode(i, data[i], data[i + 1], last); } } if (last && equals$a(last, last.next)) { removeNode(last); last = last.next; } return last; } // eliminate colinear or duplicate points function filterPoints(start, end) { if (!start) { return start; } if (!end) { end = start; } var p = start, again; do { again = false; if (!p.steiner && (equals$a(p, p.next) || area(p.prev, p, p.next) === 0)) { removeNode(p); p = end = p.prev; if (p === p.next) { break; } again = true; } else { p = p.next; } } while (again || p !== end); return end; } // main ear slicing loop which triangulates a polygon (given as a linked list) function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { if (!ear) { return; } // interlink polygon nodes in z-order if (!pass && invSize) { indexCurve(ear, minX, minY, invSize); } var stop = ear, prev, next; // iterate through ears, slicing them one by one while (ear.prev !== ear.next) { prev = ear.prev; next = ear.next; if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { // cut off the triangle triangles.push(prev.i / dim); triangles.push(ear.i / dim); triangles.push(next.i / dim); removeNode(ear); // skipping the next vertex leads to less sliver triangles ear = next.next; stop = next.next; continue; } ear = next; // if we looped through the whole remaining polygon and can't find any more ears if (ear === stop) { // try filtering points and slicing again if (!pass) { earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally } else if (pass === 1) { ear = cureLocalIntersections(filterPoints(ear), triangles, dim); earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two } else if (pass === 2) { splitEarcut(ear, triangles, dim, minX, minY, invSize); } break; } } } // check whether a polygon node forms a valid ear with adjacent nodes function isEar(ear) { var a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) { return false; } // reflex, can't be an ear // now make sure we don't have other points inside the potential ear var p = ear.next.next; while (p !== ear.prev) { if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) { return false; } p = p.next; } return true; } function isEarHashed(ear, minX, minY, invSize) { var a = ear.prev, b = ear, c = ear.next; if (area(a, b, c) >= 0) { return false; } // reflex, can't be an ear // triangle bbox; min & max are calculated like this for speed var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); // z-order range for the current triangle bbox; var minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); var p = ear.prevZ, n = ear.nextZ; // look for points inside the triangle in both directions while (p && p.z >= minZ && n && n.z <= maxZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) { return false; } p = p.prevZ; if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) { return false; } n = n.nextZ; } // look for remaining points in decreasing z-order while (p && p.z >= minZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) { return false; } p = p.prevZ; } // look for remaining points in increasing z-order while (n && n.z <= maxZ) { if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) { return false; } n = n.nextZ; } return true; } // go through all polygon nodes and cure small local self-intersections function cureLocalIntersections(start, triangles, dim) { var p = start; do { var a = p.prev, b = p.next.next; if (!equals$a(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { triangles.push(a.i / dim); triangles.push(p.i / dim); triangles.push(b.i / dim); // remove two nodes involved removeNode(p); removeNode(p.next); p = start = b; } p = p.next; } while (p !== start); return filterPoints(p); } // try splitting polygon into two and triangulate them independently function splitEarcut(start, triangles, dim, minX, minY, invSize) { // look for a valid diagonal that divides the polygon into two var a = start; do { var b = a.next.next; while (b !== a.prev) { if (a.i !== b.i && isValidDiagonal(a, b)) { // split the polygon in two by the diagonal var c = splitPolygon(a, b); // filter colinear points around the cuts a = filterPoints(a, a.next); c = filterPoints(c, c.next); // run earcut on each half earcutLinked(a, triangles, dim, minX, minY, invSize); earcutLinked(c, triangles, dim, minX, minY, invSize); return; } b = b.next; } a = a.next; } while (a !== start); } // link every hole into the outer loop, producing a single-ring polygon without holes function eliminateHoles(data, holeIndices, outerNode, dim) { var queue = [], i, len, start, end, list; for (i = 0, len = holeIndices.length; i < len; i++) { start = holeIndices[i] * dim; end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; list = linkedList(data, start, end, dim, false); if (list === list.next) { list.steiner = true; } queue.push(getLeftmost(list)); } queue.sort(compareX); // process holes from left to right for (i = 0; i < queue.length; i++) { eliminateHole(queue[i], outerNode); outerNode = filterPoints(outerNode, outerNode.next); } return outerNode; } function compareX(a, b) { return a.x - b.x; } // find a bridge between vertices that connects hole with an outer ring and and link it function eliminateHole(hole, outerNode) { outerNode = findHoleBridge(hole, outerNode); if (outerNode) { var b = splitPolygon(outerNode, hole); // filter collinear points around the cuts filterPoints(outerNode, outerNode.next); filterPoints(b, b.next); } } // David Eberly's algorithm for finding a bridge between hole and outer polygon function findHoleBridge(hole, outerNode) { var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m; // find a segment intersected by a ray from the hole's leftmost point to the left; // segment's endpoint with lesser x will be potential connection point do { if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); if (x <= hx && x > qx) { qx = x; if (x === hx) { if (hy === p.y) { return p; } if (hy === p.next.y) { return p.next; } } m = p.x < p.next.x ? p : p.next; } } p = p.next; } while (p !== outerNode); if (!m) { return null; } if (hx === qx) { return m; } // hole touches outer segment; pick leftmost endpoint // look for points inside the triangle of hole point, segment intersection and endpoint; // if there are no points found, we have a valid connection; // otherwise choose the point of the minimum angle with the ray as connection point var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan; p = m; do { if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { tan = Math.abs(hy - p.y) / (hx - p.x); // tangential if (locallyInside(p, hole) && (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) { m = p; tanMin = tan; } } p = p.next; } while (p !== stop); return m; } // whether sector in vertex m contains sector in vertex p in the same coordinates function sectorContainsSector(m, p) { return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0; } // interlink polygon nodes in z-order function indexCurve(start, minX, minY, invSize) { var p = start; do { if (p.z === null) { p.z = zOrder(p.x, p.y, minX, minY, invSize); } p.prevZ = p.prev; p.nextZ = p.next; p = p.next; } while (p !== start); p.prevZ.nextZ = null; p.prevZ = null; sortLinked(p); } // Simon Tatham's linked list merge sort algorithm // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html function sortLinked(list) { var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1; do { p = list; list = null; tail = null; numMerges = 0; while (p) { numMerges++; q = p; pSize = 0; for (i = 0; i < inSize; i++) { pSize++; q = q.nextZ; if (!q) { break; } } qSize = inSize; while (pSize > 0 || (qSize > 0 && q)) { if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { e = p; p = p.nextZ; pSize--; } else { e = q; q = q.nextZ; qSize--; } if (tail) { tail.nextZ = e; } else { list = e; } e.prevZ = tail; tail = e; } p = q; } tail.nextZ = null; inSize *= 2; } while (numMerges > 1); return list; } // z-order of a point given coords and inverse of the longer side of data bbox function zOrder(x, y, minX, minY, invSize) { // coords are transformed into non-negative 15-bit integer range x = 32767 * (x - minX) * invSize; y = 32767 * (y - minY) * invSize; x = (x | (x << 8)) & 0x00FF00FF; x = (x | (x << 4)) & 0x0F0F0F0F; x = (x | (x << 2)) & 0x33333333; x = (x | (x << 1)) & 0x55555555; y = (y | (y << 8)) & 0x00FF00FF; y = (y | (y << 4)) & 0x0F0F0F0F; y = (y | (y << 2)) & 0x33333333; y = (y | (y << 1)) & 0x55555555; return x | (y << 1); } // find the leftmost node of a polygon ring function getLeftmost(start) { var p = start, leftmost = start; do { if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) { leftmost = p; } p = p.next; } while (p !== start); return leftmost; } // check if a point lies within a convex triangle function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; } // check if a diagonal between two polygon nodes is valid (lies in polygon interior) function isValidDiagonal(a, b) { return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors equals$a(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case } // signed area of a triangle function area(p, q, r) { return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); } // check if two points are equal function equals$a(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } // check if two segments intersect function intersects(p1, q1, p2, q2) { var o1 = sign$1(area(p1, q1, p2)); var o2 = sign$1(area(p1, q1, q2)); var o3 = sign$1(area(p2, q2, p1)); var o4 = sign$1(area(p2, q2, q1)); if (o1 !== o2 && o3 !== o4) { return true; } // general case if (o1 === 0 && onSegment(p1, p2, q1)) { return true; } // p1, q1 and p2 are collinear and p2 lies on p1q1 if (o2 === 0 && onSegment(p1, q2, q1)) { return true; } // p1, q1 and q2 are collinear and q2 lies on p1q1 if (o3 === 0 && onSegment(p2, p1, q2)) { return true; } // p2, q2 and p1 are collinear and p1 lies on p2q2 if (o4 === 0 && onSegment(p2, q1, q2)) { return true; } // p2, q2 and q1 are collinear and q1 lies on p2q2 return false; } // for collinear points p, q, r, check if point q lies on segment pr function onSegment(p, q, r) { return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y); } function sign$1(num) { return num > 0 ? 1 : num < 0 ? -1 : 0; } // check if a polygon diagonal intersects any polygon segments function intersectsPolygon(a, b) { var p = a; do { if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) { return true; } p = p.next; } while (p !== a); return false; } // check if a polygon diagonal is locally inside the polygon function locallyInside(a, b) { return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; } // check if the middle point of a polygon diagonal is inside the polygon function middleInside(a, b) { var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2; do { if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) { inside = !inside; } p = p.next; } while (p !== a); return inside; } // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; // if one belongs to the outer ring and another to a hole, it merges it into a single ring function splitPolygon(a, b) { var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev; a.next = b; b.prev = a; a2.next = an; an.prev = a2; b2.next = a2; a2.prev = b2; bp.next = b2; b2.prev = bp; return b2; } // create a node and optionally link it with previous one (in a circular doubly linked list) function insertNode(i, x, y, last) { var p = new Node(i, x, y); if (!last) { p.prev = p; p.next = p; } else { p.next = last.next; p.prev = last; last.next.prev = p; last.next = p; } return p; } function removeNode(p) { p.next.prev = p.prev; p.prev.next = p.next; if (p.prevZ) { p.prevZ.nextZ = p.nextZ; } if (p.nextZ) { p.nextZ.prevZ = p.prevZ; } } function Node(i, x, y) { // vertex index in coordinates array this.i = i; // vertex coordinates this.x = x; this.y = y; // previous and next vertex nodes in a polygon ring this.prev = null; this.next = null; // z-order curve value this.z = null; // previous and next nodes in z-order this.prevZ = null; this.nextZ = null; // indicates whether this is a steiner point this.steiner = false; } // return a percentage difference between the polygon area and its triangulation area; // used to verify correctness of triangulation earcut.deviation = function (data, holeIndices, dim, triangles) { var hasHoles = holeIndices && holeIndices.length; var outerLen = hasHoles ? holeIndices[0] * dim : data.length; var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); if (hasHoles) { for (var i = 0, len = holeIndices.length; i < len; i++) { var start = holeIndices[i] * dim; var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; polygonArea -= Math.abs(signedArea(data, start, end, dim)); } } var trianglesArea = 0; for (i = 0; i < triangles.length; i += 3) { var a = triangles[i] * dim; var b = triangles[i + 1] * dim; var c = triangles[i + 2] * dim; trianglesArea += Math.abs( (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1])); } return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea); }; function signedArea(data, start, end, dim) { var sum = 0; for (var i = start, j = end - dim; i < end; i += dim) { sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); j = i; } return sum; } // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts earcut.flatten = function (data) { var dim = data[0][0].length, result = {vertices: [], holes: [], dimensions: dim}, holeIndex = 0; for (var i = 0; i < data.length; i++) { for (var j = 0; j < data[i].length; j++) { for (var d = 0; d < dim; d++) { result.vertices.push(data[i][j][d]); } } if (i > 0) { holeIndex += data[i - 1].length; result.holes.push(holeIndex); } } return result; }; earcut_1.default = default_1; function quickselect(arr, k, left, right, compare) { quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); } function quickselectStep(arr, k, left, right, compare) { while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); quickselectStep(arr, k, newLeft, newRight, compare); } var t = arr[k]; var i = left; var j = right; swap$1(arr, left, k); if (compare(arr[right], t) > 0) { swap$1(arr, left, right); } while (i < j) { swap$1(arr, i, j); i++; j--; while (compare(arr[i], t) < 0) { i++; } while (compare(arr[j], t) > 0) { j--; } } if (compare(arr[left], t) === 0) { swap$1(arr, left, j); } else { j++; swap$1(arr, j, right); } if (j <= k) { left = j + 1; } if (k <= j) { right = j - 1; } } } function swap$1(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } function defaultCompare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } // // classifies an array of rings into polygons with outer rings and holes function classifyRings(rings , maxRings ) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = []; var polygon, ccw; for (var i = 0; i < len; i++) { var area = calculateSignedArea(rings[i]); if (area === 0) { continue; } (rings[i] ).area = Math.abs(area); if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { (polygon ).push(rings[i]); } } if (polygon) { polygons.push(polygon); } // Earcut performance degrades with the # of rings in a polygon. For this // reason, we limit strip out all but the `maxRings` largest rings. if (maxRings > 1) { for (var j = 0; j < polygons.length; j++) { if (polygons[j].length <= maxRings) { continue; } quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas); polygons[j] = polygons[j].slice(0, maxRings); } } return polygons; } function compareAreas(a, b) { return b.area - a.area; } // function hasPattern(type , layers , options ) { var patterns = options.patternDependencies; var hasPattern = false; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; var patternProperty = layer.paint.get((type + "-pattern")); if (!patternProperty.isConstant()) { hasPattern = true; } var constantPattern = patternProperty.constantOr(null); if (constantPattern) { hasPattern = true; patterns[constantPattern.to] = true; patterns[constantPattern.from] = true; } } return hasPattern; } function addPatternDependencies(type , layers , patternFeature , zoom , options ) { var patterns = options.patternDependencies; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; var patternProperty = layer.paint.get((type + "-pattern")); var patternPropertyValue = patternProperty.value; if (patternPropertyValue.kind !== "constant") { var min = patternPropertyValue.evaluate({zoom: zoom - 1}, patternFeature, {}, options.availableImages); var mid = patternPropertyValue.evaluate({zoom: zoom}, patternFeature, {}, options.availableImages); var max = patternPropertyValue.evaluate({zoom: zoom + 1}, patternFeature, {}, options.availableImages); min = min && min.name ? min.name : min; mid = mid && mid.name ? mid.name : mid; max = max && max.name ? max.name : max; // add to patternDependencies patterns[min] = true; patterns[mid] = true; patterns[max] = true; // save for layout patternFeature.patterns[layer.id] = {min: min, mid: mid, max: max}; } } return patternFeature; } // var EARCUT_MAX_RINGS = 500; var FillBucket = function FillBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.patternFeatures = []; this.layoutVertexArray = new StructArrayLayout2i4(); this.indexArray = new StructArrayLayout3ui6(); this.indexArray2 = new StructArrayLayout2ui4(); this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); this.segments = new SegmentVector(); this.segments2 = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; FillBucket.prototype.populate = function populate (features , options , canonical ) { this.hasPattern = hasPattern('fill', this.layers, options); var fillSortKey = this.layers[0].layout.get('fill-sort-key'); var bucketFeatures = []; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var id = ref.id; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; var needGeometry = this.layers[0]._featureFilter.needGeometry; var evaluationFeature = {type: feature.type, id: id, properties: feature.properties, geometry: needGeometry ? loadGeometry(feature) : []}; if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) { continue; } if (!needGeometry) { evaluationFeature.geometry = loadGeometry(feature); } var sortKey = fillSortKey ? fillSortKey.evaluate(evaluationFeature, {}, canonical, options.availableImages) : undefined; var bucketFeature = { id: id, properties: feature.properties, type: feature.type, sourceLayerIndex: sourceLayerIndex, index: index, geometry: evaluationFeature.geometry, patterns: {}, sortKey: sortKey }; bucketFeatures.push(bucketFeature); } if (fillSortKey) { bucketFeatures.sort(function (a, b) { // a.sortKey is always a number when in use return ((a.sortKey ) ) - ((b.sortKey ) ); }); } for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) { var bucketFeature$1 = list$1[i$1]; var ref$1 = bucketFeature$1; var geometry = ref$1.geometry; var index$1 = ref$1.index; var sourceLayerIndex$1 = ref$1.sourceLayerIndex; if (this.hasPattern) { var patternFeature = addPatternDependencies('fill', this.layers, bucketFeature$1, this.zoom, options); // pattern features are added only once the pattern is loaded into the image atlas // so are stored during populate until later updated with positions by tile worker in addFeatures this.patternFeatures.push(patternFeature); } else { this.addFeature(bucketFeature$1, geometry, index$1, canonical, {}); } var feature$1 = features[index$1].feature; options.featureIndex.insert(feature$1, geometry, index$1, sourceLayerIndex$1, this.index); } }; FillBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; FillBucket.prototype.addFeatures = function addFeatures (options , canonical , imagePositions ) { for (var i = 0, list = this.patternFeatures; i < list.length; i += 1) { var feature = list[i]; this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions); } }; FillBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; FillBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.indexBuffer2 = context.createIndexBuffer(this.indexArray2); } this.programConfigurations.upload(context); this.uploaded = true; }; FillBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.indexBuffer2.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.segments2.destroy(); }; FillBucket.prototype.addFeature = function addFeature (feature , geometry , index , canonical , imagePositions ) { for (var i$4 = 0, list$2 = classifyRings(geometry, EARCUT_MAX_RINGS); i$4 < list$2.length; i$4 += 1) { var polygon = list$2[i$4]; var numVertices = 0; for (var i$2 = 0, list = polygon; i$2 < list.length; i$2 += 1) { var ring = list[i$2]; numVertices += ring.length; } var triangleSegment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); var triangleIndex = triangleSegment.vertexLength; var flattened = []; var holeIndices = []; for (var i$3 = 0, list$1 = polygon; i$3 < list$1.length; i$3 += 1) { var ring$1 = list$1[i$3]; if (ring$1.length === 0) { continue; } if (ring$1 !== polygon[0]) { holeIndices.push(flattened.length / 2); } var lineSegment = this.segments2.prepareSegment(ring$1.length, this.layoutVertexArray, this.indexArray2); var lineIndex = lineSegment.vertexLength; this.layoutVertexArray.emplaceBack(ring$1[0].x, ring$1[0].y); this.indexArray2.emplaceBack(lineIndex + ring$1.length - 1, lineIndex); flattened.push(ring$1[0].x); flattened.push(ring$1[0].y); for (var i = 1; i < ring$1.length; i++) { this.layoutVertexArray.emplaceBack(ring$1[i].x, ring$1[i].y); this.indexArray2.emplaceBack(lineIndex + i - 1, lineIndex + i); flattened.push(ring$1[i].x); flattened.push(ring$1[i].y); } lineSegment.vertexLength += ring$1.length; lineSegment.primitiveLength += ring$1.length; } var indices = earcut_1(flattened, holeIndices); assert_1(indices.length % 3 === 0); for (var i$1 = 0; i$1 < indices.length; i$1 += 3) { this.indexArray.emplaceBack( triangleIndex + indices[i$1], triangleIndex + indices[i$1 + 1], triangleIndex + indices[i$1 + 2]); } triangleSegment.vertexLength += numVertices; triangleSegment.primitiveLength += indices.length / 3; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical); }; register('FillBucket', FillBucket, {omit: ['layers', 'patternFeatures']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$4 = new Properties({ "fill-sort-key": new DataDrivenProperty(spec["layout_fill"]["fill-sort-key"]), }); var paint$4 = new Properties({ "fill-antialias": new DataConstantProperty(spec["paint_fill"]["fill-antialias"]), "fill-opacity": new DataDrivenProperty(spec["paint_fill"]["fill-opacity"]), "fill-color": new DataDrivenProperty(spec["paint_fill"]["fill-color"]), "fill-outline-color": new DataDrivenProperty(spec["paint_fill"]["fill-outline-color"]), "fill-translate": new DataConstantProperty(spec["paint_fill"]["fill-translate"]), "fill-translate-anchor": new DataConstantProperty(spec["paint_fill"]["fill-translate-anchor"]), "fill-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill"]["fill-pattern"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$3 = ({ paint: paint$4, layout: layout$4 } ); // var FillStyleLayer = /*@__PURE__*/(function (StyleLayer) { function FillStyleLayer(layer ) { StyleLayer.call(this, layer, properties$3); } if ( StyleLayer ) FillStyleLayer.__proto__ = StyleLayer; FillStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillStyleLayer.prototype.constructor = FillStyleLayer; FillStyleLayer.prototype.recalculate = function recalculate (parameters , availableImages ) { StyleLayer.prototype.recalculate.call(this, parameters, availableImages); var outlineColor = this.paint._values['fill-outline-color']; if (outlineColor.value.kind === 'constant' && outlineColor.value.value === undefined) { this.paint._values['fill-outline-color'] = this.paint._values['fill-color']; } }; FillStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillBucket(parameters); }; FillStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-translate')); }; FillStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-translate'), this.paint.get('fill-translate-anchor'), transform.angle, pixelsToTileUnits); return polygonIntersectsMultiPolygon(translatedPolygon, geometry); }; FillStyleLayer.prototype.isTileClipped = function isTileClipped () { return true; }; return FillStyleLayer; }(StyleLayer)); // var layout$5 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_normal_ed', components: 4, type: 'Int16'} ], 4); var members$2 = layout$5.members; var size$2 = layout$5.size; var alignment$2 = layout$5.alignment; 'use strict'; var vectortilefeature = VectorTileFeature; function VectorTileFeature(pbf, end, extent, keys, values) { // Public this.properties = {}; this.extent = extent; this.type = 0; // Private this._pbf = pbf; this._geometry = -1; this._keys = keys; this._values = values; pbf.readFields(readFeature, this, end); } function readFeature(tag, feature, pbf) { if (tag == 1) { feature.id = pbf.readVarint(); } else if (tag == 2) { readTag(pbf, feature); } else if (tag == 3) { feature.type = pbf.readVarint(); } else if (tag == 4) { feature._geometry = pbf.pos; } } function readTag(pbf, feature) { var end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var key = feature._keys[pbf.readVarint()], value = feature._values[pbf.readVarint()]; feature.properties[key] = value; } } VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; VectorTileFeature.prototype.loadGeometry = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (cmd === 1) { // moveTo if (line) { lines.push(line); } line = []; } line.push(new pointGeometry(x, y)); } else if (cmd === 7) { // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 if (line) { line.push(line[0].clone()); // closePolygon } } else { throw new Error('unknown command ' + cmd); } } if (line) { lines.push(line); } return lines; }; VectorTileFeature.prototype.bbox = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x1 = Infinity, x2 = -Infinity, y1 = Infinity, y2 = -Infinity; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (x < x1) { x1 = x; } if (x > x2) { x2 = x; } if (y < y1) { y1 = y; } if (y > y2) { y2 = y; } } else if (cmd !== 7) { throw new Error('unknown command ' + cmd); } } return [x1, y1, x2, y2]; }; VectorTileFeature.prototype.toGeoJSON = function(x, y, z, toLngLat) { var size = this.extent * Math.pow(2, z), x0 = this.extent * x, y0 = this.extent * y, coords = this.loadGeometry(), type = VectorTileFeature.types[this.type], i, j; function project(line) { for (var j = 0; j < line.length; j++) { var p = line[j]; // var y2 = 180 - (p.y + y0) * 360 / size; // var yTemp = yLat && yLat(p.y + y0,size); line[j] = toLngLat((p.x + x0)/ size , (p.y + y0)/size ); // line[j] = [ // (p.x + x0) * 360 / size - 180, // yTemp? yTemp : 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 // ]; } } switch (this.type) { case 1: var points = []; for (i = 0; i < coords.length; i++) { points[i] = coords[i][0]; } coords = points; project(coords); break; case 2: for (i = 0; i < coords.length; i++) { project(coords[i]); } break; case 3: coords = classifyRings$1(coords); for (i = 0; i < coords.length; i++) { for (j = 0; j < coords[i].length; j++) { project(coords[i][j]); } } break; } if (coords.length === 1) { coords = coords[0]; } else { type = 'Multi' + type; } var result = { type: "Feature", geometry: { type: type, coordinates: coords }, properties: this.properties }; if ('id' in this) { result.id = this.id; } return result; }; // classifies an array of rings into polygons with outer rings and holes function classifyRings$1(rings) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = [], polygon, ccw; for (var i = 0; i < len; i++) { var area = signedArea$1(rings[i]); if (area === 0) { continue; } if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { polygon.push(rings[i]); } } if (polygon) { polygons.push(polygon); } return polygons; } function signedArea$1(ring) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } 'use strict'; var vectortilelayer = VectorTileLayer; function VectorTileLayer(pbf, end) { // Public this.version = 1; this.name = null; this.extent = 4096; this.length = 0; // Private this._pbf = pbf; this._keys = []; this._values = []; this._features = []; pbf.readFields(readLayer, this, end); this.length = this._features.length; } function readLayer(tag, layer, pbf) { if (tag === 15) { layer.version = pbf.readVarint(); } else if (tag === 1) { layer.name = pbf.readString(); } else if (tag === 5) { layer.extent = pbf.readVarint(); } else if (tag === 2) { layer._features.push(pbf.pos); } else if (tag === 3) { layer._keys.push(pbf.readString()); } else if (tag === 4) { layer._values.push(readValueMessage(pbf)); } } function readValueMessage(pbf) { var value = null, end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var tag = pbf.readVarint() >> 3; value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null; } return value; } // return feature `i` from this layer as a `VectorTileFeature` VectorTileLayer.prototype.feature = function(i) { if (i < 0 || i >= this._features.length) { throw new Error('feature index out of bounds'); } this._pbf.pos = this._features[i]; var end = this._pbf.readVarint() + this._pbf.pos; return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values); }; 'use strict'; var vectortile = VectorTile; function VectorTile(pbf, end) { this.layers = pbf.readFields(readTile, {}, end); } function readTile(tag, layers, pbf) { if (tag === 3) { var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos); if (layer.length) { layers[layer.name] = layer; } } } var VectorTile$1 = vectortile; var VectorTileFeature$1 = vectortilefeature; var VectorTileLayer$1 = vectortilelayer; var vectorTile = { VectorTile: VectorTile$1, VectorTileFeature: VectorTileFeature$1, VectorTileLayer: VectorTileLayer$1 }; // var vectorTileFeatureTypes = vectorTile.VectorTileFeature.types; var EARCUT_MAX_RINGS$1 = 500; var FACTOR = Math.pow(2, 13); function addVertex(vertexArray, x, y, nx, ny, nz, t, e) { vertexArray.emplaceBack( // a_pos x, y, // a_normal_ed: 3-component normal and 1-component edgedistance Math.floor(nx * FACTOR) * 2 + t, ny * FACTOR * 2, nz * FACTOR * 2, // edgedistance (used for wrapping patterns around extrusion sides) Math.round(e) ); } var FillExtrusionBucket = function FillExtrusionBucket(options ) { this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.layoutVertexArray = new StructArrayLayout2i4i12(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); this.segments = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; FillExtrusionBucket.prototype.populate = function populate (features , options , canonical ) { this.features = []; this.hasPattern = hasPattern('fill-extrusion', this.layers, options); for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var id = ref.id; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; var needGeometry = this.layers[0]._featureFilter.needGeometry; var evaluationFeature = {type: feature.type, id: id, properties: feature.properties, geometry: needGeometry ? loadGeometry(feature) : []}; if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) { continue; } var bucketFeature = { id: id, sourceLayerIndex: sourceLayerIndex, index: index, geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature), properties: feature.properties, type: feature.type, patterns: {} }; if (this.hasPattern) { this.features.push(addPatternDependencies('fill-extrusion', this.layers, bucketFeature, this.zoom, options)); } else { this.addFeature(bucketFeature, bucketFeature.geometry, index, canonical, {}); } options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, true); } }; FillExtrusionBucket.prototype.addFeatures = function addFeatures (options , canonical , imagePositions ) { for (var i = 0, list = this.features; i < list.length; i += 1) { var feature = list[i]; var geometry = feature.geometry; this.addFeature(feature, geometry, feature.index, canonical, imagePositions); } }; FillExtrusionBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; FillExtrusionBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; FillExtrusionBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; FillExtrusionBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; FillExtrusionBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; FillExtrusionBucket.prototype.addFeature = function addFeature (feature , geometry , index , canonical , imagePositions ) { for (var i$4 = 0, list$3 = classifyRings(geometry, EARCUT_MAX_RINGS$1); i$4 < list$3.length; i$4 += 1) { var polygon = list$3[i$4]; var numVertices = 0; for (var i$1 = 0, list = polygon; i$1 < list.length; i$1 += 1) { var ring = list[i$1]; numVertices += ring.length; } var segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); for (var i$2 = 0, list$1 = polygon; i$2 < list$1.length; i$2 += 1) { var ring$1 = list$1[i$2]; if (ring$1.length === 0) { continue; } if (isEntirelyOutside(ring$1)) { continue; } var edgeDistance = 0; for (var p = 0; p < ring$1.length; p++) { var p1 = ring$1[p]; if (p >= 1) { var p2 = ring$1[p - 1]; if (!isBoundaryEdge(p1, p2)) { if (segment.vertexLength + 4 > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); } var perp = p1.sub(p2)._perp()._unit(); var dist = p2.dist(p1); if (edgeDistance + dist > 32768) { edgeDistance = 0; } addVertex(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance); edgeDistance += dist; addVertex(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance); addVertex(this.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance); var bottomRight = segment.vertexLength; // ┌──────┐ // │ 0 1 │ Counter-clockwise winding order. // │ │ Triangle 1: 0 => 2 => 1 // │ 2 3 │ Triangle 2: 1 => 2 => 3 // └──────┘ this.indexArray.emplaceBack(bottomRight, bottomRight + 2, bottomRight + 1); this.indexArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3); segment.vertexLength += 4; segment.primitiveLength += 2; } } } } if (segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { segment = this.segments.prepareSegment(numVertices, this.layoutVertexArray, this.indexArray); } //Only triangulate and draw the area of the feature if it is a polygon //Other feature types (e.g. LineString) do not have area, so triangulation is pointless / undefined if (vectorTileFeatureTypes[feature.type] !== 'Polygon') { continue; } var flattened = []; var holeIndices = []; var triangleIndex = segment.vertexLength; for (var i$3 = 0, list$2 = polygon; i$3 < list$2.length; i$3 += 1) { var ring$2 = list$2[i$3]; if (ring$2.length === 0) { continue; } if (ring$2 !== polygon[0]) { holeIndices.push(flattened.length / 2); } for (var i = 0; i < ring$2.length; i++) { var p$1 = ring$2[i]; addVertex(this.layoutVertexArray, p$1.x, p$1.y, 0, 0, 1, 1, 0); flattened.push(p$1.x); flattened.push(p$1.y); } } var indices = earcut_1(flattened, holeIndices); assert_1(indices.length % 3 === 0); for (var j = 0; j < indices.length; j += 3) { // Counter-clockwise winding order. this.indexArray.emplaceBack( triangleIndex + indices[j], triangleIndex + indices[j + 2], triangleIndex + indices[j + 1]); } segment.primitiveLength += indices.length / 3; segment.vertexLength += numVertices; } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical); }; register('FillExtrusionBucket', FillExtrusionBucket, {omit: ['layers', 'features']}); function isBoundaryEdge(p1, p2) { return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT$1)) || (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT$1)); } function isEntirelyOutside(ring) { return ring.every(function (p) { return p.x < 0; }) || ring.every(function (p) { return p.x > EXTENT$1; }) || ring.every(function (p) { return p.y < 0; }) || ring.every(function (p) { return p.y > EXTENT$1; }); } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$5 = new Properties({ "fill-extrusion-opacity": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-opacity"]), "fill-extrusion-color": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-color"]), "fill-extrusion-translate": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate"]), "fill-extrusion-translate-anchor": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]), "fill-extrusion-pattern": new CrossFadedDataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-pattern"]), "fill-extrusion-height": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-height"]), "fill-extrusion-base": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-base"]), "fill-extrusion-vertical-gradient": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-vertical-gradient"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$4 = ({ paint: paint$5 } ); // var FillExtrusionStyleLayer = /*@__PURE__*/(function (StyleLayer) { function FillExtrusionStyleLayer(layer ) { StyleLayer.call(this, layer, properties$4); } if ( StyleLayer ) FillExtrusionStyleLayer.__proto__ = StyleLayer; FillExtrusionStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); FillExtrusionStyleLayer.prototype.constructor = FillExtrusionStyleLayer; FillExtrusionStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new FillExtrusionBucket(parameters); }; FillExtrusionStyleLayer.prototype.queryRadius = function queryRadius () { return translateDistance(this.paint.get('fill-extrusion-translate')); }; FillExtrusionStyleLayer.prototype.is3D = function is3D () { return true; }; FillExtrusionStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits , pixelPosMatrix ) { var translatedPolygon = translate(queryGeometry, this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), transform.angle, pixelsToTileUnits); var height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState); var base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState); var projectedQueryGeometry = projectQueryGeometry$1(translatedPolygon, pixelPosMatrix, transform, 0); var projected = projectExtrusion(geometry, base, height, pixelPosMatrix); var projectedBase = projected[0]; var projectedTop = projected[1]; return checkIntersection(projectedBase, projectedTop, projectedQueryGeometry); }; return FillExtrusionStyleLayer; }(StyleLayer)); function dot$5(a, b) { return a.x * b.x + a.y * b.y; } function getIntersectionDistance(projectedQueryGeometry , projectedFace ) { if (projectedQueryGeometry.length === 1) { // For point queries calculate the z at which the point intersects the face // using barycentric coordinates. // Find the barycentric coordinates of the projected point within the first // triangle of the face, using only the xy plane. It doesn't matter if the // point is outside the first triangle because all the triangles in the face // are in the same plane. // // Check whether points are coincident and use other points if they are. var i = 0; var a = projectedFace[i++]; var b; while (!b || a.equals(b)) { b = projectedFace[i++]; if (!b) { return Infinity; } } // Loop until point `c` is not colinear with points `a` and `b`. for (; i < projectedFace.length; i++) { var c = projectedFace[i]; var p = projectedQueryGeometry[0]; var ab = b.sub(a); var ac = c.sub(a); var ap = p.sub(a); var dotABAB = dot$5(ab, ab); var dotABAC = dot$5(ab, ac); var dotACAC = dot$5(ac, ac); var dotAPAB = dot$5(ap, ab); var dotAPAC = dot$5(ap, ac); var denom = dotABAB * dotACAC - dotABAC * dotABAC; var v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom; var w = (dotABAB * dotAPAC - dotABAC * dotAPAB) / denom; var u = 1 - v - w; // Use the barycentric weighting along with the original triangle z coordinates to get the point of intersection. var distance = a.z * u + b.z * v + c.z * w; if (isFinite(distance)) { return distance; } } return Infinity; } else { // The counts as closest is less clear when the query is a box. This // returns the distance to the nearest point on the face, whether it is // within the query or not. It could be more correct to return the // distance to the closest point within the query box but this would be // more complicated and expensive to calculate with little benefit. var closestDistance = Infinity; for (var i$1 = 0, list = projectedFace; i$1 < list.length; i$1 += 1) { var p$1 = list[i$1]; closestDistance = Math.min(closestDistance, p$1.z); } return closestDistance; } } function checkIntersection(projectedBase , projectedTop , projectedQueryGeometry ) { var closestDistance = Infinity; if (polygonIntersectsMultiPolygon(projectedQueryGeometry, projectedTop)) { closestDistance = getIntersectionDistance(projectedQueryGeometry, projectedTop[0]); } for (var r = 0; r < projectedTop.length; r++) { var ringTop = projectedTop[r]; var ringBase = projectedBase[r]; for (var p = 0; p < ringTop.length - 1; p++) { var topA = ringTop[p]; var topB = ringTop[p + 1]; var baseA = ringBase[p]; var baseB = ringBase[p + 1]; var face = [topA, topB, baseB, baseA, topA]; if (polygonIntersectsPolygon(projectedQueryGeometry, face)) { closestDistance = Math.min(closestDistance, getIntersectionDistance(projectedQueryGeometry, face)); } } } return closestDistance === Infinity ? false : closestDistance; } /* * Project the geometry using matrix `m`. This is essentially doing * `vec4.transformMat4([], [p.x, p.y, z, 1], m)` but the multiplication * is inlined so that parts of the projection that are the same across * different points can only be done once. This produced a measurable * performance improvement. */ function projectExtrusion(geometry , zBase , zTop , m ) { var projectedBase = []; var projectedTop = []; var baseXZ = m[8] * zBase; var baseYZ = m[9] * zBase; var baseZZ = m[10] * zBase; var baseWZ = m[11] * zBase; var topXZ = m[8] * zTop; var topYZ = m[9] * zTop; var topZZ = m[10] * zTop; var topWZ = m[11] * zTop; for (var i$1 = 0, list$1 = geometry; i$1 < list$1.length; i$1 += 1) { var r = list$1[i$1]; var ringBase = []; var ringTop = []; for (var i = 0, list = r; i < list.length; i += 1) { var p = list[i]; var x = p.x; var y = p.y; var sX = m[0] * x + m[4] * y + m[12]; var sY = m[1] * x + m[5] * y + m[13]; var sZ = m[2] * x + m[6] * y + m[14]; var sW = m[3] * x + m[7] * y + m[15]; var baseX = sX + baseXZ; var baseY = sY + baseYZ; var baseZ = sZ + baseZZ; var baseW = sW + baseWZ; var topX = sX + topXZ; var topY = sY + topYZ; var topZ = sZ + topZZ; var topW = sW + topWZ; var b = new pointGeometry(baseX / baseW, baseY / baseW); b.z = baseZ / baseW; ringBase.push(b); var t = new pointGeometry(topX / topW, topY / topW); t.z = topZ / topW; ringTop.push(t); } projectedBase.push(ringBase); projectedTop.push(ringTop); } return [projectedBase, projectedTop]; } function projectQueryGeometry$1(queryGeometry , pixelPosMatrix , transform , z ) { var projectedQueryGeometry = []; for (var i = 0, list = queryGeometry; i < list.length; i += 1) { var p = list[i]; var v = [p.x, p.y, z, 1]; transformMat4$1(v, v, pixelPosMatrix); projectedQueryGeometry.push(new pointGeometry(v[0] / v[3], v[1] / v[3])); } return projectedQueryGeometry; } // var lineLayoutAttributes = createLayout([ {name: 'a_pos_normal', components: 2, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint8'} ], 4); var members$3 = lineLayoutAttributes.members; var size$3 = lineLayoutAttributes.size; var alignment$3 = lineLayoutAttributes.alignment; // var lineLayoutAttributesExt = createLayout([ {name: 'a_uv_x', components: 1, type: 'Float32'}, {name: 'a_split_index', components: 1, type: 'Float32'} ]); var members$4 = lineLayoutAttributesExt.members; var size$4 = lineLayoutAttributesExt.size; var alignment$4 = lineLayoutAttributesExt.alignment; // var vectorTileFeatureTypes$1 = vectorTile.VectorTileFeature.types; // NOTE ON EXTRUDE SCALE: // scale the extrusion vector so that the normal length is this value. // contains the "texture" normals (-1..1). this is distinct from the extrude // normals for line joins, because the x-value remains 0 for the texture // normal array, while the extrude normal actually moves the vertex to create // the acute/bevelled line join. var EXTRUDE_SCALE = 63; /* * Sharp corners cause dashed lines to tilt because the distance along the line * is the same at both the inner and outer corners. To improve the appearance of * dashed lines we add extra points near sharp corners so that a smaller part * of the line is tilted. * * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an * extra vertex. The default is 75 degrees. * * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner. */ var COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180)); var SHARP_CORNER_OFFSET = 15; // Angle per triangle for approximating round line joins. var DEG_PER_TRIANGLE = 20; // The number of bits that is used to store the line distance in the buffer. var LINE_DISTANCE_BUFFER_BITS = 15; // We don't have enough bits for the line distance as we'd like to have, so // use this value to scale the line distance (in tile units) down to a smaller // value. This lets us store longer distances while sacrificing precision. var LINE_DISTANCE_SCALE = 1 / 2; // The maximum line distance, in tile units, that fits in the buffer. var MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE; /** * @private */ var LineBucket = function LineBucket(options ) { var this$1 = this; this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.hasPattern = false; this.patternFeatures = []; this.lineClipsArray = []; this.gradients = {}; this.layers.forEach(function (layer) { this$1.gradients[layer.id] = {}; }); this.layoutVertexArray = new StructArrayLayout2i4ub8(); this.layoutVertexArray2 = new StructArrayLayout2f8(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); this.segments = new SegmentVector(); this.maxLineLength = 0; this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); }; LineBucket.prototype.populate = function populate (features , options , canonical ) { this.hasPattern = hasPattern('line', this.layers, options); var lineSortKey = this.layers[0].layout.get('line-sort-key'); var bucketFeatures = []; for (var i = 0, list = features; i < list.length; i += 1) { var ref = list[i]; var feature = ref.feature; var id = ref.id; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; var needGeometry = this.layers[0]._featureFilter.needGeometry; var evaluationFeature = {type: feature.type, id: id, properties: feature.properties, geometry: needGeometry ? loadGeometry(feature) : []}; if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) { continue; } if (!needGeometry) { evaluationFeature.geometry = loadGeometry(feature); } var sortKey = lineSortKey ? lineSortKey.evaluate(evaluationFeature, {}, canonical) : undefined; var bucketFeature = { id: id, properties: feature.properties, type: feature.type, sourceLayerIndex: sourceLayerIndex, index: index, geometry: evaluationFeature.geometry, patterns: {}, sortKey: sortKey }; bucketFeatures.push(bucketFeature); } if (lineSortKey) { bucketFeatures.sort(function (a, b) { // a.sortKey is always a number when in use return ((a.sortKey ) ) - ((b.sortKey ) ); }); } for (var i$1 = 0, list$1 = bucketFeatures; i$1 < list$1.length; i$1 += 1) { var bucketFeature$1 = list$1[i$1]; var ref$1 = bucketFeature$1; var geometry = ref$1.geometry; var index$1 = ref$1.index; var sourceLayerIndex$1 = ref$1.sourceLayerIndex; if (this.hasPattern) { var patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature$1, this.zoom, options); // pattern features are added only once the pattern is loaded into the image atlas // so are stored during populate until later updated with positions by tile worker in addFeatures this.patternFeatures.push(patternBucketFeature); } else { this.addFeature(bucketFeature$1, geometry, index$1, canonical, {}); } var feature$1 = features[index$1].feature; options.featureIndex.insert(feature$1, geometry, index$1, sourceLayerIndex$1, this.index); } }; LineBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions); }; LineBucket.prototype.addFeatures = function addFeatures (options , canonical , imagePositions ) { for (var i = 0, list = this.patternFeatures; i < list.length; i += 1) { var feature = list[i]; this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions); } }; LineBucket.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0; }; LineBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.programConfigurations.needsUpload; }; LineBucket.prototype.upload = function upload (context ) { if (!this.uploaded) { if (this.layoutVertexArray2.length !== 0) { this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, members$4); } this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); this.uploaded = true; }; LineBucket.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); }; LineBucket.prototype.lineFeatureClips = function lineFeatureClips (feature ) { if (!!feature.properties && feature.properties.hasOwnProperty('mapbox_clip_start') && feature.properties.hasOwnProperty('mapbox_clip_end')) { var start = +feature.properties['mapbox_clip_start']; var end = +feature.properties['mapbox_clip_end']; return {start: start, end: end}; } }; LineBucket.prototype.addFeature = function addFeature (feature , geometry , index , canonical , imagePositions ) { var layout = this.layers[0].layout; var join = layout.get('line-join').evaluate(feature, {}); var cap = layout.get('line-cap'); var miterLimit = layout.get('line-miter-limit'); var roundLimit = layout.get('line-round-limit'); this.lineClips = this.lineFeatureClips(feature); for (var i = 0, list = geometry; i < list.length; i += 1) { var line = list[i]; this.addLine(line, feature, join, cap, miterLimit, roundLimit); } this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical); }; LineBucket.prototype.addLine = function addLine (vertices , feature , join , cap , miterLimit , roundLimit ) { this.distance = 0; this.scaledDistance = 0; this.totalDistance = 0; if (this.lineClips) { this.lineClipsArray.push(this.lineClips); // Calculate the total distance, in tile units, of this tiled line feature for (var i = 0; i < vertices.length - 1; i++) { this.totalDistance += vertices[i].dist(vertices[i + 1]); } this.updateScaledDistance(); this.maxLineLength = Math.max(this.maxLineLength, this.totalDistance); } var isPolygon = vectorTileFeatureTypes$1[feature.type] === 'Polygon'; // If the line has duplicate vertices at the ends, adjust start/length to remove them. var len = vertices.length; while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) { len--; } var first = 0; while (first < len - 1 && vertices[first].equals(vertices[first + 1])) { first++; } // Ignore invalid geometry. if (len < (isPolygon ? 3 : 2)) { return; } if (join === 'bevel') { miterLimit = 1.05; } var sharpCornerOffset = this.overscaling <= 16 ? SHARP_CORNER_OFFSET * EXTENT$1 / (512 * this.overscaling) : 0; // we could be more precise, but it would only save a negligible amount of space var segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray); var currentVertex; var prevVertex = ((undefined ) ); var nextVertex = ((undefined ) ); var prevNormal = ((undefined ) ); var nextNormal = ((undefined ) ); // the last two vertices added this.e1 = this.e2 = -1; if (isPolygon) { currentVertex = vertices[len - 2]; nextNormal = vertices[first].sub(currentVertex)._unit()._perp(); } for (var i$1 = first; i$1 < len; i$1++) { nextVertex = i$1 === len - 1 ? (isPolygon ? vertices[first + 1] : (undefined )) : // if it's a polygon, treat the last vertex like the first vertices[i$1 + 1]; // just the next vertex // if two consecutive vertices exist, skip the current one if (nextVertex && vertices[i$1].equals(nextVertex)) { continue; } if (nextNormal) { prevNormal = nextNormal; } if (currentVertex) { prevVertex = currentVertex; } currentVertex = vertices[i$1]; // Calculate the normal towards the next vertex in this line. In case // there is no next vertex, pretend that the line is continuing straight, // meaning that we are just using the previous normal. nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; // If we still don't have a previous normal, this is the beginning of a // non-closed line, so we're doing a straight "join". prevNormal = prevNormal || nextNormal; // Determine the normal of the join extrusion. It is the angle bisector // of the segments between the previous line and the next line. // In the case of 180° angles, the prev and next normals cancel each other out: // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle // below will also become 0 and miterLength will become Infinity. var joinNormal = prevNormal.add(nextNormal); if (joinNormal.x !== 0 || joinNormal.y !== 0) { joinNormal._unit(); } /* joinNormal prevNormal * ↖ ↑ * .________. prevVertex * | * nextNormal ← | currentVertex * | * nextVertex ! * */ // calculate cosines of the angle (and its half) using dot product var cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y; var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; // Calculate the length of the miter (the ratio of the miter to the width) // as the inverse of cosine of the angle between next and join normals var miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity; // approximate angle from cosine var approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle); var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex; var lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0; if (isSharpCorner && i$1 > first) { var prevSegmentLength = currentVertex.dist(prevVertex); if (prevSegmentLength > 2 * sharpCornerOffset) { var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round()); this.updateDistance(prevVertex, newPrevVertex); this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment); prevVertex = newPrevVertex; } } // The join if a middle vertex, otherwise the cap. var middleVertex = prevVertex && nextVertex; var currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap; if (middleVertex && currentJoin === 'round') { if (miterLength < roundLimit) { currentJoin = 'miter'; } else if (miterLength <= 2) { currentJoin = 'fakeround'; } } if (currentJoin === 'miter' && miterLength > miterLimit) { currentJoin = 'bevel'; } if (currentJoin === 'bevel') { // The maximum extrude length is 128 / 63 = 2 times the width of the line // so if miterLength >= 2 we need to draw a different type of bevel here. if (miterLength > 2) { currentJoin = 'flipbevel'; } // If the miterLength is really small and the line bevel wouldn't be visible, // just draw a miter join to save a triangle. if (miterLength < miterLimit) { currentJoin = 'miter'; } } // Calculate how far along the line the currentVertex is if (prevVertex) { this.updateDistance(prevVertex, currentVertex); } if (currentJoin === 'miter') { joinNormal._mult(miterLength); this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); } else if (currentJoin === 'flipbevel') { // miter is too big, flip the direction to make a beveled join if (miterLength > 100) { // Almost parallel lines joinNormal = nextNormal.mult(-1); } else { var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1)); } this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment); } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { var offset = -Math.sqrt(miterLength * miterLength - 1); var offsetA = lineTurnsLeft ? offset : 0; var offsetB = lineTurnsLeft ? 0 : offset; // Close previous segment with a bevel if (prevVertex) { this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment); } if (currentJoin === 'fakeround') { // The join angle is sharp enough that a round join would be visible. // Bevel joins fill the gap between segments with a single pie slice triangle. // Create a round join by adding multiple pie slices. The join isn't actually round, but // it looks like it is at the sizes we render lines at. // pick the number of triangles for approximating round join by based on the angle between normals var n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE); for (var m = 1; m < n; m++) { var t = m / n; if (t !== 0.5) { // approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp var t2 = t - 0.5; var A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519)); var B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638); t = t + t * t2 * (t - 1) * (A * t2 * t2 + B); } var extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1); this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment); } } if (nextVertex) { // Start next segment this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment); } } else if (currentJoin === 'butt') { this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap } else if (currentJoin === 'square') { var offset$1 = prevVertex ? 1 : -1; // closing or starting square cap this.addCurrentVertex(currentVertex, joinNormal, offset$1, offset$1, segment); } else if (currentJoin === 'round') { if (prevVertex) { // Close previous segment with butt this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment); // Add round cap or linejoin at end of segment this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true); } if (nextVertex) { // Add round cap before first segment this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true); // Start next segment with a butt this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment); } } if (isSharpCorner && i$1 < len - 1) { var nextSegmentLength = currentVertex.dist(nextVertex); if (nextSegmentLength > 2 * sharpCornerOffset) { var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round()); this.updateDistance(currentVertex, newCurrentVertex); this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment); currentVertex = newCurrentVertex; } } } }; /** * Add two vertices to the buffers. * * @param p the line vertex to add buffer vertices for * @param normal vertex normal * @param endLeft extrude to shift the left vertex along the line * @param endRight extrude to shift the left vertex along the line * @param segment the segment object to add the vertex to * @param round whether this is a round cap * @private */ LineBucket.prototype.addCurrentVertex = function addCurrentVertex (p , normal , endLeft , endRight , segment , round) { if ( round === void 0 ) round = false; // left and right extrude vectors, perpendicularly shifted by endLeft/endRight var leftX = normal.x + normal.y * endLeft; var leftY = normal.y - normal.x * endLeft; var rightX = -normal.x + normal.y * endRight; var rightY = -normal.y - normal.x * endRight; this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment); this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment); // There is a maximum "distance along the line" that we can store in the buffers. // When we get close to the distance, reset it to zero and add the vertex again with // a distance of zero. The max distance is determined by the number of bits we allocate // to `linesofar`. if (this.distance > MAX_LINE_DISTANCE / 2 && this.totalDistance === 0) { this.distance = 0; this.addCurrentVertex(p, normal, endLeft, endRight, segment, round); } }; LineBucket.prototype.addHalfVertex = function addHalfVertex (ref , extrudeX , extrudeY , round , up , dir , segment ) { var x = ref.x; var y = ref.y; var totalDistance = this.lineClips ? this.scaledDistance * (MAX_LINE_DISTANCE - 1) : this.scaledDistance; // scale down so that we can store longer distances while sacrificing precision. var linesofarScaled = totalDistance * LINE_DISTANCE_SCALE; this.layoutVertexArray.emplaceBack( // a_pos_normal // Encode round/up the least significant bits (x << 1) + (round ? 1 : 0), (y << 1) + (up ? 1 : 0), // a_data // add 128 to store a byte in an unsigned byte Math.round(EXTRUDE_SCALE * extrudeX) + 128, Math.round(EXTRUDE_SCALE * extrudeY) + 128, // Encode the -1/0/1 direction value into the first two bits of .z of a_data. // Combine it with the lower 6 bits of `linesofarScaled` (shifted by 2 bits to make // room for the direction value). The upper 8 bits of `linesofarScaled` are placed in // the `w` component. ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofarScaled & 0x3F) << 2), linesofarScaled >> 6); // Constructs a second vertex buffer with higher precision line progress if (this.lineClips) { var progressRealigned = this.scaledDistance - this.lineClips.start; var endClipRealigned = this.lineClips.end - this.lineClips.start; var uvX = progressRealigned / endClipRealigned; this.layoutVertexArray2.emplaceBack(uvX, this.lineClipsArray.length); } var e = segment.vertexLength++; if (this.e1 >= 0 && this.e2 >= 0) { this.indexArray.emplaceBack(this.e1, this.e2, e); segment.primitiveLength++; } if (up) { this.e2 = e; } else { this.e1 = e; } }; LineBucket.prototype.updateScaledDistance = function updateScaledDistance () { // Knowing the ratio of the full linestring covered by this tiled feature, as well // as the total distance (in tile units) of this tiled feature, and the distance // (in tile units) of the current vertex, we can determine the relative distance // of this vertex along the full linestring feature and scale it to [0, 2^15) this.scaledDistance = this.lineClips ? this.lineClips.start + (this.lineClips.end - this.lineClips.start) * this.distance / this.totalDistance : this.distance; }; LineBucket.prototype.updateDistance = function updateDistance (prev , next ) { this.distance += prev.dist(next); this.updateScaledDistance(); }; register('LineBucket', LineBucket, {omit: ['layers', 'patternFeatures']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$6 = new Properties({ "line-cap": new DataConstantProperty(spec["layout_line"]["line-cap"]), "line-join": new DataDrivenProperty(spec["layout_line"]["line-join"]), "line-miter-limit": new DataConstantProperty(spec["layout_line"]["line-miter-limit"]), "line-round-limit": new DataConstantProperty(spec["layout_line"]["line-round-limit"]), "line-sort-key": new DataDrivenProperty(spec["layout_line"]["line-sort-key"]), }); var paint$6 = new Properties({ "line-opacity": new DataDrivenProperty(spec["paint_line"]["line-opacity"]), "line-color": new DataDrivenProperty(spec["paint_line"]["line-color"]), "line-translate": new DataConstantProperty(spec["paint_line"]["line-translate"]), "line-translate-anchor": new DataConstantProperty(spec["paint_line"]["line-translate-anchor"]), "line-width": new DataDrivenProperty(spec["paint_line"]["line-width"]), "line-gap-width": new DataDrivenProperty(spec["paint_line"]["line-gap-width"]), "line-offset": new DataDrivenProperty(spec["paint_line"]["line-offset"]), "line-blur": new DataDrivenProperty(spec["paint_line"]["line-blur"]), "line-dasharray": new CrossFadedProperty(spec["paint_line"]["line-dasharray"]), "line-pattern": new CrossFadedDataDrivenProperty(spec["paint_line"]["line-pattern"]), "line-gradient": new ColorRampProperty(spec["paint_line"]["line-gradient"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$5 = ({ paint: paint$6, layout: layout$6 } ); // var LineFloorwidthProperty = /*@__PURE__*/(function (DataDrivenProperty) { function LineFloorwidthProperty () { DataDrivenProperty.apply(this, arguments); } if ( DataDrivenProperty ) LineFloorwidthProperty.__proto__ = DataDrivenProperty; LineFloorwidthProperty.prototype = Object.create( DataDrivenProperty && DataDrivenProperty.prototype ); LineFloorwidthProperty.prototype.constructor = LineFloorwidthProperty; LineFloorwidthProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value, parameters) { parameters = new EvaluationParameters(Math.floor(parameters.zoom), { now: parameters.now, fadeDuration: parameters.fadeDuration, zoomHistory: parameters.zoomHistory, transition: parameters.transition }); return DataDrivenProperty.prototype.possiblyEvaluate.call(this, value, parameters); }; LineFloorwidthProperty.prototype.evaluate = function evaluate (value, globals, feature, featureState) { globals = extend({}, globals, {zoom: Math.floor(globals.zoom)}); return DataDrivenProperty.prototype.evaluate.call(this, value, globals, feature, featureState); }; return LineFloorwidthProperty; }(DataDrivenProperty)); var lineFloorwidthProperty = new LineFloorwidthProperty(properties$5.paint.properties['line-width'].specification); lineFloorwidthProperty.useIntegerZoom = true; var LineStyleLayer = /*@__PURE__*/(function (StyleLayer) { function LineStyleLayer(layer ) { StyleLayer.call(this, layer, properties$5); this.gradientVersion = 0; } if ( StyleLayer ) LineStyleLayer.__proto__ = StyleLayer; LineStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); LineStyleLayer.prototype.constructor = LineStyleLayer; LineStyleLayer.prototype._handleSpecialPaintPropertyUpdate = function _handleSpecialPaintPropertyUpdate (name ) { if (name === 'line-gradient') { var expression = ((this._transitionablePaint._values['line-gradient'].value.expression) ); this.stepInterpolant = expression._styleExpression.expression instanceof Step; this.gradientVersion = (this.gradientVersion + 1) % MAX_SAFE_INTEGER; } }; LineStyleLayer.prototype.gradientExpression = function gradientExpression () { return this._transitionablePaint._values['line-gradient'].value.expression; }; LineStyleLayer.prototype.recalculate = function recalculate (parameters , availableImages ) { StyleLayer.prototype.recalculate.call(this, parameters, availableImages); (this.paint._values )['line-floorwidth'] = lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters); }; LineStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new LineBucket(parameters); }; LineStyleLayer.prototype.queryRadius = function queryRadius (bucket ) { var lineBucket = (bucket ); var width = getLineWidth( getMaximumPaintValue('line-width', this, lineBucket), getMaximumPaintValue('line-gap-width', this, lineBucket)); var offset = getMaximumPaintValue('line-offset', this, lineBucket); return width / 2 + Math.abs(offset) + translateDistance(this.paint.get('line-translate')); }; LineStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature (queryGeometry , feature , featureState , geometry , zoom , transform , pixelsToTileUnits ) { var translatedPolygon = translate(queryGeometry, this.paint.get('line-translate'), this.paint.get('line-translate-anchor'), transform.angle, pixelsToTileUnits); var halfWidth = pixelsToTileUnits / 2 * getLineWidth( this.paint.get('line-width').evaluate(feature, featureState), this.paint.get('line-gap-width').evaluate(feature, featureState)); var lineOffset = this.paint.get('line-offset').evaluate(feature, featureState); if (lineOffset) { geometry = offsetLine(geometry, lineOffset * pixelsToTileUnits); } return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth); }; LineStyleLayer.prototype.isTileClipped = function isTileClipped () { return true; }; return LineStyleLayer; }(StyleLayer)); function getLineWidth(lineWidth, lineGapWidth) { if (lineGapWidth > 0) { return lineGapWidth + 2 * lineWidth; } else { return lineWidth; } } function offsetLine(rings, offset) { var newRings = []; var zero = new pointGeometry(0, 0); for (var k = 0; k < rings.length; k++) { var ring = rings[k]; var newRing = []; for (var i = 0; i < ring.length; i++) { var a = ring[i - 1]; var b = ring[i]; var c = ring[i + 1]; var aToB = i === 0 ? zero : b.sub(a)._unit()._perp(); var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp(); var extrude = aToB._add(bToC)._unit(); var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y; extrude._mult(1 / cosHalfAngle); newRing.push(extrude._mult(offset)._add(b)); } newRings.push(newRing); } return newRings; } // var symbolLayoutAttributes = createLayout([ {name: 'a_pos_offset', components: 4, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint16'}, {name: 'a_pixeloffset', components: 4, type: 'Int16'} ], 4); var dynamicLayoutAttributes = createLayout([ {name: 'a_projected_pos', components: 3, type: 'Float32'} ], 4); var placementOpacityAttributes = createLayout([ {name: 'a_fade_opacity', components: 1, type: 'Uint32'} ], 4); var collisionVertexAttributes = createLayout([ {name: 'a_placed', components: 2, type: 'Uint8'}, {name: 'a_shift', components: 2, type: 'Float32'} ]); var collisionBox = createLayout([ // the box is centered around the anchor point {type: 'Int16', name: 'anchorPointX'}, {type: 'Int16', name: 'anchorPointY'}, // distances to the edges from the anchor {type: 'Int16', name: 'x1'}, {type: 'Int16', name: 'y1'}, {type: 'Int16', name: 'x2'}, {type: 'Int16', name: 'y2'}, // the index of the feature in the original vectortile {type: 'Uint32', name: 'featureIndex'}, // the source layer the feature appears in {type: 'Uint16', name: 'sourceLayerIndex'}, // the bucket the feature appears in {type: 'Uint16', name: 'bucketIndex'} ]); var collisionBoxLayout = createLayout([ // used to render collision boxes for debugging purposes {name: 'a_pos', components: 2, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4); var collisionCircleLayout = createLayout([ // used to render collision circles for debugging purposes {name: 'a_pos', components: 2, type: 'Float32'}, {name: 'a_radius', components: 1, type: 'Float32'}, {name: 'a_flags', components: 2, type: 'Int16'} ], 4); var quadTriangle = createLayout([ {name: 'triangle', components: 3, type: 'Uint16'} ]); var placement = createLayout([ {type: 'Int16', name: 'anchorX'}, {type: 'Int16', name: 'anchorY'}, {type: 'Uint16', name: 'glyphStartIndex'}, {type: 'Uint16', name: 'numGlyphs'}, {type: 'Uint32', name: 'vertexStartIndex'}, {type: 'Uint32', name: 'lineStartIndex'}, {type: 'Uint32', name: 'lineLength'}, {type: 'Uint16', name: 'segment'}, {type: 'Uint16', name: 'lowerSize'}, {type: 'Uint16', name: 'upperSize'}, {type: 'Float32', name: 'lineOffsetX'}, {type: 'Float32', name: 'lineOffsetY'}, {type: 'Uint8', name: 'writingMode'}, {type: 'Uint8', name: 'placedOrientation'}, {type: 'Uint8', name: 'hidden'}, {type: 'Uint32', name: 'crossTileID'}, {type: 'Int16', name: 'associatedIconIndex'} ]); var symbolInstance = createLayout([ {type: 'Int16', name: 'anchorX'}, {type: 'Int16', name: 'anchorY'}, {type: 'Int16', name: 'rightJustifiedTextSymbolIndex'}, {type: 'Int16', name: 'centerJustifiedTextSymbolIndex'}, {type: 'Int16', name: 'leftJustifiedTextSymbolIndex'}, {type: 'Int16', name: 'verticalPlacedTextSymbolIndex'}, {type: 'Int16', name: 'placedIconSymbolIndex'}, {type: 'Int16', name: 'verticalPlacedIconSymbolIndex'}, {type: 'Uint16', name: 'key'}, {type: 'Uint16', name: 'textBoxStartIndex'}, {type: 'Uint16', name: 'textBoxEndIndex'}, {type: 'Uint16', name: 'verticalTextBoxStartIndex'}, {type: 'Uint16', name: 'verticalTextBoxEndIndex'}, {type: 'Uint16', name: 'iconBoxStartIndex'}, {type: 'Uint16', name: 'iconBoxEndIndex'}, {type: 'Uint16', name: 'verticalIconBoxStartIndex'}, {type: 'Uint16', name: 'verticalIconBoxEndIndex'}, {type: 'Uint16', name: 'featureIndex'}, {type: 'Uint16', name: 'numHorizontalGlyphVertices'}, {type: 'Uint16', name: 'numVerticalGlyphVertices'}, {type: 'Uint16', name: 'numIconVertices'}, {type: 'Uint16', name: 'numVerticalIconVertices'}, {type: 'Uint16', name: 'useRuntimeCollisionCircles'}, {type: 'Uint32', name: 'crossTileID'}, {type: 'Float32', name: 'textBoxScale'}, {type: 'Float32', components: 2, name: 'textOffset'}, {type: 'Float32', name: 'collisionCircleDiameter'} ]); var glyphOffset = createLayout([ {type: 'Float32', name: 'offsetX'} ]); var lineVertex = createLayout([ {type: 'Int16', name: 'x'}, {type: 'Int16', name: 'y'}, {type: 'Int16', name: 'tileUnitDistanceFromAnchor'} ]); // function transformText(text , layer , feature ) { var transform = layer.layout.get('text-transform').evaluate(feature, {}); if (transform === 'uppercase') { text = text.toLocaleUpperCase(); } else if (transform === 'lowercase') { text = text.toLocaleLowerCase(); } if (plugin.applyArabicShaping) { text = plugin.applyArabicShaping(text); } return text; } function transformText$1(text , layer , feature ) { text.sections.forEach(function (section) { section.text = transformText(section.text, layer, feature); }); return text; } // function mergeLines (features ) { var leftIndex = {}; var rightIndex = {}; var mergedFeatures = []; var mergedIndex = 0; function add(k) { mergedFeatures.push(features[k]); mergedIndex++; } function mergeFromRight(leftKey , rightKey , geom) { var i = rightIndex[leftKey]; delete rightIndex[leftKey]; rightIndex[rightKey] = i; mergedFeatures[i].geometry[0].pop(); mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]); return i; } function mergeFromLeft(leftKey , rightKey , geom) { var i = leftIndex[rightKey]; delete leftIndex[rightKey]; leftIndex[leftKey] = i; mergedFeatures[i].geometry[0].shift(); mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]); return i; } function getKey(text, geom, onRight) { var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; return (text + ":" + (point.x) + ":" + (point.y)); } for (var k = 0; k < features.length; k++) { var feature = features[k]; var geom = feature.geometry; var text = feature.text ? feature.text.toString() : null; if (!text) { add(k); continue; } var leftKey = getKey(text, geom), rightKey = getKey(text, geom, true); if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { // found lines with the same text adjacent to both ends of the current line, merge all three var j = mergeFromLeft(leftKey, rightKey, geom); var i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry); delete leftIndex[leftKey]; delete rightIndex[rightKey]; rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i; mergedFeatures[j].geometry = (null ); } else if (leftKey in rightIndex) { // found mergeable line adjacent to the start of the current line, merge mergeFromRight(leftKey, rightKey, geom); } else if (rightKey in leftIndex) { // found mergeable line adjacent to the end of the current line, merge mergeFromLeft(leftKey, rightKey, geom); } else { // no adjacent lines, add as a new item add(k); leftIndex[leftKey] = mergedIndex - 1; rightIndex[rightKey] = mergedIndex - 1; } } return mergedFeatures.filter(function (f) { return f.geometry; }); } // var verticalizedCharacterMap = { '!': '︕', '#': '#', '$': '$', '%': '%', '&': '&', '(': '︵', ')': '︶', '*': '*', '+': '+', ',': '︐', '-': '︲', '.': '・', '/': '/', ':': '︓', ';': '︔', '<': '︿', '=': '=', '>': '﹀', '?': '︖', '@': '@', '[': '﹇', '\\': '\', ']': '﹈', '^': '^', '_': '︳', '`': '`', '{': '︷', '|': '―', '}': '︸', '~': '~', '¢': '¢', '£': '£', '¥': '¥', '¦': '¦', '¬': '¬', '¯': ' ̄', '–': '︲', '—': '︱', '‘': '﹃', '’': '﹄', '“': '﹁', '”': '﹂', '…': '︙', '‧': '・', '₩': '₩', '、': '︑', '。': '︒', '〈': '︿', '〉': '﹀', '《': '︽', '》': '︾', '「': '﹁', '」': '﹂', '『': '﹃', '』': '﹄', '【': '︻', '】': '︼', '〔': '︹', '〕': '︺', '〖': '︗', '〗': '︘', '!': '︕', '(': '︵', ')': '︶', ',': '︐', '-': '︲', '.': '・', ':': '︓', ';': '︔', '<': '︿', '>': '﹀', '?': '︖', '[': '﹇', ']': '﹈', '_': '︳', '{': '︷', '|': '―', '}': '︸', '⦅': '︵', '⦆': '︶', '。': '︒', '「': '﹁', '」': '﹂' }; function verticalizePunctuation(input ) { var output = ''; for (var i = 0; i < input.length; i++) { var nextCharCode = input.charCodeAt(i + 1) || null; var prevCharCode = input.charCodeAt(i - 1) || null; var canReplacePunctuation = ( (!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) && (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]]) ); if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) { output += verticalizedCharacterMap[input[i]]; } else { output += input[i]; } } return output; } // // ONE_EM constant used to go between "em" units used in style spec and "points" used internally for layout var ONE_EM = 24; var read = function (buffer, offset, isLE, mLen, nBytes) { var e, m; var eLen = (nBytes * 8) - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var nBits = -7; var i = isLE ? (nBytes - 1) : 0; var d = isLE ? -1 : 1; var s = buffer[offset + i]; i += d; e = s & ((1 << (-nBits)) - 1); s >>= (-nBits); nBits += eLen; for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1); e >>= (-nBits); nBits += mLen; for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} if (e === 0) { e = 1 - eBias; } else if (e === eMax) { return m ? NaN : ((s ? -1 : 1) * Infinity) } else { m = m + Math.pow(2, mLen); e = e - eBias; } return (s ? -1 : 1) * m * Math.pow(2, e - mLen) }; var write = function (buffer, value, offset, isLE, mLen, nBytes) { var e, m, c; var eLen = (nBytes * 8) - mLen - 1; var eMax = (1 << eLen) - 1; var eBias = eMax >> 1; var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); var i = isLE ? 0 : (nBytes - 1); var d = isLE ? 1 : -1; var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; value = Math.abs(value); if (isNaN(value) || value === Infinity) { m = isNaN(value) ? 1 : 0; e = eMax; } else { e = Math.floor(Math.log(value) / Math.LN2); if (value * (c = Math.pow(2, -e)) < 1) { e--; c *= 2; } if (e + eBias >= 1) { value += rt / c; } else { value += rt * Math.pow(2, 1 - eBias); } if (value * c >= 2) { e++; c /= 2; } if (e + eBias >= eMax) { m = 0; e = eMax; } else if (e + eBias >= 1) { m = ((value * c) - 1) * Math.pow(2, mLen); e = e + eBias; } else { m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); e = 0; } } for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} e = (e << mLen) | m; eLen += mLen; for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} buffer[offset + i - d] |= s * 128; }; var ieee754 = { read: read, write: write }; 'use strict'; var pbf = Pbf; function Pbf(buf) { this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); this.pos = 0; this.type = 0; this.length = this.buf.length; } Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; // Threshold chosen based on both benchmarking and knowledge about browser string // data structures (which currently switch structure types at 12 bytes or more) var TEXT_DECODER_MIN_LENGTH = 12; var utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf8'); Pbf.prototype = { destroy: function() { this.buf = null; }, // === READING ================================================================= readFields: function(readField, result, end) { end = end || this.length; while (this.pos < end) { var val = this.readVarint(), tag = val >> 3, startPos = this.pos; this.type = val & 0x7; readField(tag, result, this); if (this.pos === startPos) { this.skip(val); } } return result; }, readMessage: function(readField, result) { return this.readFields(readField, result, this.readVarint() + this.pos); }, readFixed32: function() { var val = readUInt32(this.buf, this.pos); this.pos += 4; return val; }, readSFixed32: function() { var val = readInt32(this.buf, this.pos); this.pos += 4; return val; }, // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) readFixed64: function() { var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readSFixed64: function() { var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; this.pos += 8; return val; }, readFloat: function() { var val = ieee754.read(this.buf, this.pos, true, 23, 4); this.pos += 4; return val; }, readDouble: function() { var val = ieee754.read(this.buf, this.pos, true, 52, 8); this.pos += 8; return val; }, readVarint: function(isSigned) { var buf = this.buf, val, b; b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) { return val; } b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) { return val; } b = buf[this.pos]; val |= (b & 0x0f) << 28; return readVarintRemainder(val, isSigned, this); }, readVarint64: function() { // for compatibility with v2.0.1 return this.readVarint(true); }, readSVarint: function() { var num = this.readVarint(); return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding }, readBoolean: function() { return Boolean(this.readVarint()); }, readString: function() { var end = this.readVarint() + this.pos; var pos = this.pos; this.pos = end; if (end - pos >= TEXT_DECODER_MIN_LENGTH && utf8TextDecoder) { // longer strings are fast with the built-in browser TextDecoder API return readUtf8TextDecoder(this.buf, pos, end); } // short strings are fast with our custom implementation return readUtf8(this.buf, pos, end); }, readBytes: function() { var end = this.readVarint() + this.pos, buffer = this.buf.subarray(this.pos, end); this.pos = end; return buffer; }, // verbose for performance reasons; doesn't affect gzipped size readPackedVarint: function(arr, isSigned) { if (this.type !== Pbf.Bytes) { return arr.push(this.readVarint(isSigned)); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readVarint(isSigned)); } return arr; }, readPackedSVarint: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readSVarint()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSVarint()); } return arr; }, readPackedBoolean: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readBoolean()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readBoolean()); } return arr; }, readPackedFloat: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readFloat()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFloat()); } return arr; }, readPackedDouble: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readDouble()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readDouble()); } return arr; }, readPackedFixed32: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readFixed32()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFixed32()); } return arr; }, readPackedSFixed32: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readSFixed32()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSFixed32()); } return arr; }, readPackedFixed64: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readFixed64()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readFixed64()); } return arr; }, readPackedSFixed64: function(arr) { if (this.type !== Pbf.Bytes) { return arr.push(this.readSFixed64()); } var end = readPackedEnd(this); arr = arr || []; while (this.pos < end) { arr.push(this.readSFixed64()); } return arr; }, skip: function(val) { var type = val & 0x7; if (type === Pbf.Varint) { while (this.buf[this.pos++] > 0x7f) {} } else if (type === Pbf.Bytes) { this.pos = this.readVarint() + this.pos; } else if (type === Pbf.Fixed32) { this.pos += 4; } else if (type === Pbf.Fixed64) { this.pos += 8; } else { throw new Error('Unimplemented type: ' + type); } }, // === WRITING ================================================================= writeTag: function(tag, type) { this.writeVarint((tag << 3) | type); }, realloc: function(min) { var length = this.length || 16; while (length < this.pos + min) { length *= 2; } if (length !== this.length) { var buf = new Uint8Array(length); buf.set(this.buf); this.buf = buf; this.length = length; } }, finish: function() { this.length = this.pos; this.pos = 0; return this.buf.subarray(0, this.length); }, writeFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeSFixed32: function(val) { this.realloc(4); writeInt32(this.buf, val, this.pos); this.pos += 4; }, writeFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeSFixed64: function(val) { this.realloc(8); writeInt32(this.buf, val & -1, this.pos); writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); this.pos += 8; }, writeVarint: function(val) { val = +val || 0; if (val > 0xfffffff || val < 0) { writeBigVarint(val, this); return; } this.realloc(4); this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } this.buf[this.pos++] = (val >>> 7) & 0x7f; }, writeSVarint: function(val) { this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); }, writeBoolean: function(val) { this.writeVarint(Boolean(val)); }, writeString: function(str) { str = String(str); this.realloc(str.length * 4); this.pos++; // reserve 1 byte for short string length var startPos = this.pos; // write the string directly to the buffer and see how much was written this.pos = writeUtf8(this.buf, str, this.pos); var len = this.pos - startPos; if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeFloat: function(val) { this.realloc(4); ieee754.write(this.buf, val, this.pos, true, 23, 4); this.pos += 4; }, writeDouble: function(val) { this.realloc(8); ieee754.write(this.buf, val, this.pos, true, 52, 8); this.pos += 8; }, writeBytes: function(buffer) { var len = buffer.length; this.writeVarint(len); this.realloc(len); for (var i = 0; i < len; i++) { this.buf[this.pos++] = buffer[i]; } }, writeRawMessage: function(fn, obj) { this.pos++; // reserve 1 byte for short message length // write the message directly to the buffer and see how much was written var startPos = this.pos; fn(obj, this); var len = this.pos - startPos; if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } // finally, write the message length in the reserved place and restore the position this.pos = startPos - 1; this.writeVarint(len); this.pos += len; }, writeMessage: function(tag, fn, obj) { this.writeTag(tag, Pbf.Bytes); this.writeRawMessage(fn, obj); }, writePackedVarint: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedVarint, arr); } }, writePackedSVarint: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSVarint, arr); } }, writePackedBoolean: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedBoolean, arr); } }, writePackedFloat: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFloat, arr); } }, writePackedDouble: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedDouble, arr); } }, writePackedFixed32: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFixed32, arr); } }, writePackedSFixed32: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSFixed32, arr); } }, writePackedFixed64: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedFixed64, arr); } }, writePackedSFixed64: function(tag, arr) { if (arr.length) { this.writeMessage(tag, writePackedSFixed64, arr); } }, writeBytesField: function(tag, buffer) { this.writeTag(tag, Pbf.Bytes); this.writeBytes(buffer); }, writeFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFixed32(val); }, writeSFixed32Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeSFixed32(val); }, writeFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeFixed64(val); }, writeSFixed64Field: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeSFixed64(val); }, writeVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeVarint(val); }, writeSVarintField: function(tag, val) { this.writeTag(tag, Pbf.Varint); this.writeSVarint(val); }, writeStringField: function(tag, str) { this.writeTag(tag, Pbf.Bytes); this.writeString(str); }, writeFloatField: function(tag, val) { this.writeTag(tag, Pbf.Fixed32); this.writeFloat(val); }, writeDoubleField: function(tag, val) { this.writeTag(tag, Pbf.Fixed64); this.writeDouble(val); }, writeBooleanField: function(tag, val) { this.writeVarintField(tag, Boolean(val)); } }; function readVarintRemainder(l, s, p) { var buf = p.buf, h, b; b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) { return toNum(l, h, s); } b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) { return toNum(l, h, s); } throw new Error('Expected varint not more than 10 bytes'); } function readPackedEnd(pbf) { return pbf.type === Pbf.Bytes ? pbf.readVarint() + pbf.pos : pbf.pos + 1; } function toNum(low, high, isSigned) { if (isSigned) { return high * 0x100000000 + (low >>> 0); } return ((high >>> 0) * 0x100000000) + (low >>> 0); } function writeBigVarint(val, pbf) { var low, high; if (val >= 0) { low = (val % 0x100000000) | 0; high = (val / 0x100000000) | 0; } else { low = ~(-val % 0x100000000); high = ~(-val / 0x100000000); if (low ^ 0xffffffff) { low = (low + 1) | 0; } else { low = 0; high = (high + 1) | 0; } } if (val >= 0x10000000000000000 || val < -0x10000000000000000) { throw new Error('Given varint doesn\'t fit into 10 bytes'); } pbf.realloc(10); writeBigVarintLow(low, high, pbf); writeBigVarintHigh(high, pbf); } function writeBigVarintLow(low, high, pbf) { pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; pbf.buf[pbf.pos] = low & 0x7f; } function writeBigVarintHigh(high, pbf) { var lsb = (high & 0x07) << 4; pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } pbf.buf[pbf.pos++] = high & 0x7f; } function makeRoomForExtraLength(startPos, len, pbf) { var extraLen = len <= 0x3fff ? 1 : len <= 0x1fffff ? 2 : len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7)); // if 1 byte isn't enough for encoding message length, shift the data to the right pbf.realloc(extraLen); for (var i = pbf.pos - 1; i >= startPos; i--) { pbf.buf[i + extraLen] = pbf.buf[i]; } } function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeVarint(arr[i]); } } function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSVarint(arr[i]); } } function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFloat(arr[i]); } } function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeDouble(arr[i]); } } function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeBoolean(arr[i]); } } function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed32(arr[i]); } } function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed32(arr[i]); } } function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed64(arr[i]); } } function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed64(arr[i]); } } // Buffer code below from https://github.com/feross/buffer, MIT-licensed function readUInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] * 0x1000000); } function writeInt32(buf, val, pos) { buf[pos] = val; buf[pos + 1] = (val >>> 8); buf[pos + 2] = (val >>> 16); buf[pos + 3] = (val >>> 24); } function readInt32(buf, pos) { return ((buf[pos]) | (buf[pos + 1] << 8) | (buf[pos + 2] << 16)) + (buf[pos + 3] << 24); } function readUtf8(buf, pos, end) { var str = ''; var i = pos; while (i < end) { var b0 = buf[i]; var c = null; // codepoint var bytesPerSequence = b0 > 0xEF ? 4 : b0 > 0xDF ? 3 : b0 > 0xBF ? 2 : 1; if (i + bytesPerSequence > end) { break; } var b1, b2, b3; if (bytesPerSequence === 1) { if (b0 < 0x80) { c = b0; } } else if (bytesPerSequence === 2) { b1 = buf[i + 1]; if ((b1 & 0xC0) === 0x80) { c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F); if (c <= 0x7F) { c = null; } } } else if (bytesPerSequence === 3) { b1 = buf[i + 1]; b2 = buf[i + 2]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F); if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) { c = null; } } } else if (bytesPerSequence === 4) { b1 = buf[i + 1]; b2 = buf[i + 2]; b3 = buf[i + 3]; if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F); if (c <= 0xFFFF || c >= 0x110000) { c = null; } } } if (c === null) { c = 0xFFFD; bytesPerSequence = 1; } else if (c > 0xFFFF) { c -= 0x10000; str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); c = 0xDC00 | c & 0x3FF; } str += String.fromCharCode(c); i += bytesPerSequence; } return str; } function readUtf8TextDecoder(buf, pos, end) { return utf8TextDecoder.decode(buf.subarray(pos, end)); } function writeUtf8(buf, str, pos) { for (var i = 0, c, lead; i < str.length; i++) { c = str.charCodeAt(i); // code point if (c > 0xD7FF && c < 0xE000) { if (lead) { if (c < 0xDC00) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = c; continue; } else { c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; lead = null; } } else { if (c > 0xDBFF || (i + 1 === str.length)) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; } else { lead = c; } continue; } } else if (lead) { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; lead = null; } if (c < 0x80) { buf[pos++] = c; } else { if (c < 0x800) { buf[pos++] = c >> 0x6 | 0xC0; } else { if (c < 0x10000) { buf[pos++] = c >> 0xC | 0xE0; } else { buf[pos++] = c >> 0x12 | 0xF0; buf[pos++] = c >> 0xC & 0x3F | 0x80; } buf[pos++] = c >> 0x6 & 0x3F | 0x80; } buf[pos++] = c & 0x3F | 0x80; } } return pos; } // var border = 3; function readFontstacks(tag , glyphs , pbf ) { if (tag === 1) { pbf.readMessage(readFontstack, glyphs); } } function readFontstack(tag , glyphs , pbf ) { if (tag === 3) { var ref = pbf.readMessage(readGlyph, {}); var id = ref.id; var bitmap = ref.bitmap; var width = ref.width; var height = ref.height; var left = ref.left; var top = ref.top; var advance = ref.advance; glyphs.push({ id: id, bitmap: new AlphaImage({ width: width + 2 * border, height: height + 2 * border }, bitmap), metrics: {width: width, height: height, left: left, top: top, advance: advance} }); } } function readGlyph(tag , glyph , pbf ) { if (tag === 1) { glyph.id = pbf.readVarint(); } else if (tag === 2) { glyph.bitmap = pbf.readBytes(); } else if (tag === 3) { glyph.width = pbf.readVarint(); } else if (tag === 4) { glyph.height = pbf.readVarint(); } else if (tag === 5) { glyph.left = pbf.readSVarint(); } else if (tag === 6) { glyph.top = pbf.readSVarint(); } else if (tag === 7) { glyph.advance = pbf.readVarint(); } } function parseGlyphPBF (data ) { return new pbf(data).readFields(readFontstacks, []); } var GLYPH_PBF_BORDER = border; function potpack(boxes) { // calculate total box area and maximum box width var area = 0; var maxWidth = 0; for (var i$1 = 0, list = boxes; i$1 < list.length; i$1 += 1) { var box = list[i$1]; area += box.w * box.h; maxWidth = Math.max(maxWidth, box.w); } // sort the boxes for insertion by height, descending boxes.sort(function (a, b) { return b.h - a.h; }); // aim for a squarish resulting container, // slightly adjusted for sub-100% space utilization var startWidth = Math.max(Math.ceil(Math.sqrt(area / 0.95)), maxWidth); // start with a single empty space, unbounded at the bottom var spaces = [{x: 0, y: 0, w: startWidth, h: Infinity}]; var width = 0; var height = 0; for (var i$2 = 0, list$1 = boxes; i$2 < list$1.length; i$2 += 1) { // look through spaces backwards so that we check smaller spaces first var box$1 = list$1[i$2]; for (var i = spaces.length - 1; i >= 0; i--) { var space = spaces[i]; // look for empty spaces that can accommodate the current box if (box$1.w > space.w || box$1.h > space.h) { continue; } // found the space; add the box to its top-left corner // |-------|-------| // | box | | // |_______| | // | space | // |_______________| box$1.x = space.x; box$1.y = space.y; height = Math.max(height, box$1.y + box$1.h); width = Math.max(width, box$1.x + box$1.w); if (box$1.w === space.w && box$1.h === space.h) { // space matches the box exactly; remove it var last = spaces.pop(); if (i < spaces.length) { spaces[i] = last; } } else if (box$1.h === space.h) { // space matches the box height; update it accordingly // |-------|---------------| // | box | updated space | // |_______|_______________| space.x += box$1.w; space.w -= box$1.w; } else if (box$1.w === space.w) { // space matches the box width; update it accordingly // |---------------| // | box | // |_______________| // | updated space | // |_______________| space.y += box$1.h; space.h -= box$1.h; } else { // otherwise the box splits the space into two spaces // |-------|-----------| // | box | new space | // |_______|___________| // | updated space | // |___________________| spaces.push({ x: space.x + box$1.w, y: space.y, w: space.w - box$1.w, h: box$1.h }); space.y += box$1.h; space.h -= box$1.h; } break; } } return { w: width, // container width h: height, // container height fill: (area / (width * height)) || 0 // space utilization }; } // var IMAGE_PADDING = 1; var ImagePosition = function ImagePosition(paddedRect , ref ) { var pixelRatio = ref.pixelRatio; var version = ref.version; var stretchX = ref.stretchX; var stretchY = ref.stretchY; var content = ref.content; this.paddedRect = paddedRect; this.pixelRatio = pixelRatio; this.stretchX = stretchX; this.stretchY = stretchY; this.content = content; this.version = version; }; var prototypeAccessors = { tl: { configurable: true },br: { configurable: true },tlbr: { configurable: true },displaySize: { configurable: true } }; prototypeAccessors.tl.get = function () { return [ this.paddedRect.x + IMAGE_PADDING, this.paddedRect.y + IMAGE_PADDING ]; }; prototypeAccessors.br.get = function () { return [ this.paddedRect.x + this.paddedRect.w - IMAGE_PADDING, this.paddedRect.y + this.paddedRect.h - IMAGE_PADDING ]; }; prototypeAccessors.tlbr.get = function () { return this.tl.concat(this.br); }; prototypeAccessors.displaySize.get = function () { return [ (this.paddedRect.w - IMAGE_PADDING * 2) / this.pixelRatio, (this.paddedRect.h - IMAGE_PADDING * 2) / this.pixelRatio ]; }; Object.defineProperties( ImagePosition.prototype, prototypeAccessors ); var ImageAtlas = function ImageAtlas(icons , patterns ) { var iconPositions = {}, patternPositions = {}; this.haveRenderCallbacks = []; var bins = []; this.addImages(icons, iconPositions, bins); this.addImages(patterns, patternPositions, bins); var ref = potpack(bins); var w = ref.w; var h = ref.h; var image = new RGBAImage({width: w || 1, height: h || 1}); for (var id in icons) { var src = icons[id]; var bin = iconPositions[id].paddedRect; RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: bin.x + IMAGE_PADDING, y: bin.y + IMAGE_PADDING}, src.data); } for (var id$1 in patterns) { var src$1 = patterns[id$1]; var bin$1 = patternPositions[id$1].paddedRect; var x = bin$1.x + IMAGE_PADDING, y = bin$1.y + IMAGE_PADDING, w$1 = src$1.data.width, h$1 = src$1.data.height; RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x, y: y}, src$1.data); // Add 1 pixel wrapped padding on each side of the image. // RGBAImage.copy(src.data, image, {x: 0, y: h - 1}, {x, y: y - 1}, {width: w, height: 1}); // T // RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x, y: y + h}, {width: w, height: 1}); // B // RGBAImage.copy(src.data, image, {x: w - 1, y: 0}, {x: x - 1, y}, {width: 1, height: h}); // L // RGBAImage.copy(src.data, image, {x: 0, y: 0}, {x: x + w, y}, {width: 1, height: h}); // R RGBAImage.copy(src$1.data, image, {x: 0, y: h$1 - 1}, {x: x, y: y + h$1}, {width: w$1, height: 1}); // B RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x, y: y - 1}, {width: w$1, height: 1}); // T RGBAImage.copy(src$1.data, image, {x: w$1 - 1, y: 0}, {x: x + w$1, y: y}, {width: 1, height: h$1}); // R RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: x - 1, y: y}, {width: 1, height: h$1}); // L // 单个图片的4个顶点填充像素值 RGBAImage.copy(src$1.data, image, {x: 0, y: 0}, {x: 0, y: y - 1}, {width: 1, height: 1}); // BL RGBAImage.copy(src$1.data, image, {x: w$1 - 1, y: 0}, {x: x + w$1, y: y - 1}, {width: 1, height: 1}); // BR RGBAImage.copy(src$1.data, image, {x: w$1 - 1, y: h$1 - 1}, {x: x + w$1, y: y + h$1}, {width: 1, height: 1}); // TR RGBAImage.copy(src$1.data, image, {x: 0, y: h$1 - 1}, {x: 0, y: y + h$1}, {width: 1, height: 1}); // TL } this.image = image; this.iconPositions = iconPositions; this.patternPositions = patternPositions; }; ImageAtlas.prototype.addImages = function addImages (images , positions , bins ) { for (var id in images) { var src = images[id]; var bin = { x: 0, y: 0, w: src.data.width + 2 * IMAGE_PADDING, h: src.data.height + 2 * IMAGE_PADDING, }; bins.push(bin); positions[id] = new ImagePosition(bin, src); if (src.hasRenderCallback) { this.haveRenderCallbacks.push(id); } } }; ImageAtlas.prototype.patchUpdatedImages = function patchUpdatedImages (imageManager , texture ) { imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks); for (var name in imageManager.updatedImages) { this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture); this.patchUpdatedImage(this.patternPositions[name], imageManager.getImage(name), texture); } }; ImageAtlas.prototype.patchUpdatedImage = function patchUpdatedImage (position , image , texture ) { if (!position || !image) { return; } if (position.version === image.version) { return; } position.version = image.version; var ref = position.tl; var x = ref[0]; var y = ref[1]; texture.update(image.data, undefined, {x: x, y: y}); }; register('ImagePosition', ImagePosition); register('ImageAtlas', ImageAtlas); // var WritingMode = { horizontal: 1, vertical: 2, horizontalOnly: 3 }; var SHAPING_DEFAULT_OFFSET = -17; // The position of a glyph relative to the text's anchor point. // A collection of positioned glyphs and some metadata function isEmpty(positionedLines ) { for (var i = 0, list = positionedLines; i < list.length; i += 1) { var line = list[i]; if (line.positionedGlyphs.length !== 0) { return false; } } return true; } // Max number of images in label is 6401 U+E000–U+F8FF that covers // Basic Multilingual Plane Unicode Private Use Area (PUA). var PUAbegin = 0xE000; var PUAend = 0xF8FF; var SectionOptions = function SectionOptions() { this.scale = 1.0; this.fontStack = ""; this.imageName = null; }; SectionOptions.forText = function forText (scale , fontStack ) { var textOptions = new SectionOptions(); textOptions.scale = scale || 1; textOptions.fontStack = fontStack; return textOptions; }; SectionOptions.forImage = function forImage (imageName ) { var imageOptions = new SectionOptions(); imageOptions.imageName = imageName; return imageOptions; }; var TaggedString = function TaggedString() { this.text = ""; this.sectionIndex = []; this.sections = []; this.imageSectionID = null; }; TaggedString.fromFeature = function fromFeature (text , defaultFontStack ) { var result = new TaggedString(); for (var i = 0; i < text.sections.length; i++) { var section = text.sections[i]; if (!section.image) { result.addTextSection(section, defaultFontStack); } else { result.addImageSection(section); } } return result; }; TaggedString.prototype.length = function length () { return this.text.length; }; TaggedString.prototype.getSection = function getSection (index ) { return this.sections[this.sectionIndex[index]]; }; TaggedString.prototype.getSectionIndex = function getSectionIndex (index ) { return this.sectionIndex[index]; }; TaggedString.prototype.getCharCode = function getCharCode (index ) { return this.text.charCodeAt(index); }; TaggedString.prototype.verticalizePunctuation = function verticalizePunctuation$1 () { this.text = verticalizePunctuation(this.text); }; TaggedString.prototype.trim = function trim () { var beginningWhitespace = 0; for (var i = 0; i < this.text.length && whitespace$1[this.text.charCodeAt(i)]; i++) { beginningWhitespace++; } var trailingWhitespace = this.text.length; for (var i$1 = this.text.length - 1; i$1 >= 0 && i$1 >= beginningWhitespace && whitespace$1[this.text.charCodeAt(i$1)]; i$1--) { trailingWhitespace--; } this.text = this.text.substring(beginningWhitespace, trailingWhitespace); this.sectionIndex = this.sectionIndex.slice(beginningWhitespace, trailingWhitespace); }; TaggedString.prototype.substring = function substring (start , end ) { var substring = new TaggedString(); substring.text = this.text.substring(start, end); substring.sectionIndex = this.sectionIndex.slice(start, end); substring.sections = this.sections; return substring; }; TaggedString.prototype.toString = function toString () { return this.text; }; TaggedString.prototype.getMaxScale = function getMaxScale () { var this$1 = this; return this.sectionIndex.reduce(function (max, index) { return Math.max(max, this$1.sections[index].scale); }, 0); }; TaggedString.prototype.addTextSection = function addTextSection (section , defaultFontStack ) { this.text += section.text; this.sections.push(SectionOptions.forText(section.scale, section.fontStack || defaultFontStack)); var index = this.sections.length - 1; for (var i = 0; i < section.text.length; ++i) { this.sectionIndex.push(index); } }; TaggedString.prototype.addImageSection = function addImageSection (section ) { var imageName = section.image ? section.image.name : ''; if (imageName.length === 0) { warnOnce("Can't add FormattedSection with an empty image."); return; } var nextImageSectionCharCode = this.getNextImageSectionCharCode(); if (!nextImageSectionCharCode) { warnOnce(("Reached maximum number of images " + (PUAend - PUAbegin + 2))); return; } this.text += String.fromCharCode(nextImageSectionCharCode); this.sections.push(SectionOptions.forImage(imageName)); this.sectionIndex.push(this.sections.length - 1); }; TaggedString.prototype.getNextImageSectionCharCode = function getNextImageSectionCharCode () { if (!this.imageSectionID) { this.imageSectionID = PUAbegin; return this.imageSectionID; } if (this.imageSectionID >= PUAend) { return null; } return ++this.imageSectionID; }; function breakLines(input , lineBreakPoints ) { var lines = []; var text = input.text; var start = 0; for (var i = 0, list = lineBreakPoints; i < list.length; i += 1) { var lineBreak = list[i]; lines.push(input.substring(start, lineBreak)); start = lineBreak; } if (start < text.length) { lines.push(input.substring(start, text.length)); } return lines; } function shapeText(text , glyphMap , glyphPositions , imagePositions , defaultFontStack , maxWidth , lineHeight , textAnchor , textJustify , spacing , translate , writingMode , allowVerticalPlacement , symbolPlacement , layoutTextSize , layoutTextSizeThisZoom ) { var logicalInput = TaggedString.fromFeature(text, defaultFontStack); if (writingMode === WritingMode.vertical) { logicalInput.verticalizePunctuation(); } var lines ; var processBidirectionalText = plugin.processBidirectionalText; var processStyledBidirectionalText = plugin.processStyledBidirectionalText; if (processBidirectionalText && logicalInput.sections.length === 1) { // Bidi doesn't have to be style-aware lines = []; var untaggedLines = processBidirectionalText(logicalInput.toString(), determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize)); for (var i$1 = 0, list = untaggedLines; i$1 < list.length; i$1 += 1) { var line = list[i$1]; var taggedLine = new TaggedString(); taggedLine.text = line; taggedLine.sections = logicalInput.sections; for (var i = 0; i < line.length; i++) { taggedLine.sectionIndex.push(0); } lines.push(taggedLine); } } else if (processStyledBidirectionalText) { // Need version of mapbox-gl-rtl-text with style support for combining RTL text // with formatting lines = []; var processedLines = processStyledBidirectionalText(logicalInput.text, logicalInput.sectionIndex, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize)); for (var i$2 = 0, list$1 = processedLines; i$2 < list$1.length; i$2 += 1) { var line$1 = list$1[i$2]; var taggedLine$1 = new TaggedString(); taggedLine$1.text = line$1[0]; taggedLine$1.sectionIndex = line$1[1]; taggedLine$1.sections = logicalInput.sections; lines.push(taggedLine$1); } } else { lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphMap, imagePositions, symbolPlacement, layoutTextSize)); } var positionedLines = []; var shaping = { positionedLines: positionedLines, text: logicalInput.toString(), top: translate[1], bottom: translate[1], left: translate[0], right: translate[0], writingMode: writingMode, iconsInText: false, verticalizable: false }; shapeLines(shaping, glyphMap, glyphPositions, imagePositions, lines, lineHeight, textAnchor, textJustify, writingMode, spacing, allowVerticalPlacement, layoutTextSizeThisZoom); if (isEmpty(positionedLines)) { return false; } return shaping; } // using computed properties due to https://github.com/facebook/flow/issues/380 /* eslint no-useless-computed-key: 0 */ var whitespace$1 = {}; whitespace$1[0x09] = true; whitespace$1[0x0a] = true; whitespace$1[0x0b] = true; whitespace$1[0x0c] = true; whitespace$1[0x0d] = true; whitespace$1[0x20] = true; var breakable = {}; breakable[0x0a] = true; breakable[0x20] = true; breakable[0x26] = true; breakable[0x28] = true; breakable[0x29] = true; breakable[0x2b] = true; breakable[0x2d] = true; breakable[0x2f] = true; breakable[0xad] = true; breakable[0xb7] = true; breakable[0x200b] = true; breakable[0x2010] = true; breakable[0x2013] = true; breakable[0x2027] = true; function getGlyphAdvance(codePoint , section , glyphMap , imagePositions , spacing , layoutTextSize ) { if (!section.imageName) { var positions = glyphMap[section.fontStack]; var glyph = positions && positions[codePoint]; if (!glyph) { return 0; } return glyph.metrics.advance * section.scale + spacing; } else { var imagePosition = imagePositions[section.imageName]; if (!imagePosition) { return 0; } return imagePosition.displaySize[0] * section.scale * ONE_EM / layoutTextSize + spacing; } } function determineAverageLineWidth(logicalInput , spacing , maxWidth , glyphMap , imagePositions , layoutTextSize ) { var totalWidth = 0; for (var index = 0; index < logicalInput.length(); index++) { var section = logicalInput.getSection(index); totalWidth += getGlyphAdvance(logicalInput.getCharCode(index), section, glyphMap, imagePositions, spacing, layoutTextSize); } var lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth)); return totalWidth / lineCount; } function calculateBadness(lineWidth , targetWidth , penalty , isLastBreak ) { var raggedness = Math.pow(lineWidth - targetWidth, 2); if (isLastBreak) { // Favor finals lines shorter than average over longer than average if (lineWidth < targetWidth) { return raggedness / 2; } else { return raggedness * 2; } } return raggedness + Math.abs(penalty) * penalty; } function calculatePenalty(codePoint , nextCodePoint , penalizableIdeographicBreak ) { var penalty = 0; // Force break on newline if (codePoint === 0x0a) { penalty -= 10000; } // Penalize breaks between characters that allow ideographic breaking because // they are less preferable than breaks at spaces (or zero width spaces). if (penalizableIdeographicBreak) { penalty += 150; } // Penalize open parenthesis at end of line if (codePoint === 0x28 || codePoint === 0xff08) { penalty += 50; } // Penalize close parenthesis at beginning of line if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) { penalty += 50; } return penalty; } function evaluateBreak(breakIndex , breakX , targetWidth , potentialBreaks , penalty , isLastBreak ) { // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth // ...but in fact we allow lines longer than maxWidth (if there's no break points) // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give // more lopsided results. var bestPriorBreak = null; var bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak); for (var i = 0, list = potentialBreaks; i < list.length; i += 1) { var potentialBreak = list[i]; var lineWidth = breakX - potentialBreak.x; var breakBadness = calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness; if (breakBadness <= bestBreakBadness) { bestPriorBreak = potentialBreak; bestBreakBadness = breakBadness; } } return { index: breakIndex, x: breakX, priorBreak: bestPriorBreak, badness: bestBreakBadness }; } function leastBadBreaks(lastLineBreak ) { if (!lastLineBreak) { return []; } return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index); } function determineLineBreaks(logicalInput , spacing , maxWidth , glyphMap , imagePositions , symbolPlacement , layoutTextSize ) { if (symbolPlacement !== 'point') { return []; } if (!logicalInput) { return []; } var potentialLineBreaks = []; var targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphMap, imagePositions, layoutTextSize); var hasServerSuggestedBreakpoints = logicalInput.text.indexOf("\u200b") >= 0; var currentX = 0; for (var i = 0; i < logicalInput.length(); i++) { var section = logicalInput.getSection(i); var codePoint = logicalInput.getCharCode(i); if (!whitespace$1[codePoint]) { currentX += getGlyphAdvance(codePoint, section, glyphMap, imagePositions, spacing, layoutTextSize); } // Ideographic characters, spaces, and word-breaking punctuation that often appear without // surrounding spaces. if ((i < logicalInput.length() - 1)) { var ideographicBreak = charAllowsIdeographicBreaking(codePoint); if (breakable[codePoint] || ideographicBreak || section.imageName) { potentialLineBreaks.push( evaluateBreak( i + 1, currentX, targetWidth, potentialLineBreaks, calculatePenalty(codePoint, logicalInput.getCharCode(i + 1), ideographicBreak && hasServerSuggestedBreakpoints), false)); } } } return leastBadBreaks( evaluateBreak( logicalInput.length(), currentX, targetWidth, potentialLineBreaks, 0, true)); } function getAnchorAlignment(anchor ) { var horizontalAlign = 0.5, verticalAlign = 0.5; switch (anchor) { case 'right': case 'top-right': case 'bottom-right': horizontalAlign = 1; break; case 'left': case 'top-left': case 'bottom-left': horizontalAlign = 0; break; } switch (anchor) { case 'bottom': case 'bottom-right': case 'bottom-left': verticalAlign = 1; break; case 'top': case 'top-right': case 'top-left': verticalAlign = 0; break; } return {horizontalAlign: horizontalAlign, verticalAlign: verticalAlign}; } function shapeLines(shaping , glyphMap , glyphPositions , imagePositions , lines , lineHeight , textAnchor , textJustify , writingMode , spacing , allowVerticalPlacement , layoutTextSizeThisZoom ) { var x = 0; var y = SHAPING_DEFAULT_OFFSET; var maxLineLength = 0; var maxLineHeight = 0; var justify = textJustify === 'right' ? 1 : textJustify === 'left' ? 0 : 0.5; var lineIndex = 0; for (var i$1 = 0, list = lines; i$1 < list.length; i$1 += 1) { var line = list[i$1]; line.trim(); var lineMaxScale = line.getMaxScale(); var maxLineOffset = (lineMaxScale - 1) * ONE_EM; var positionedLine = {positionedGlyphs: [], lineOffset: 0}; shaping.positionedLines[lineIndex] = positionedLine; var positionedGlyphs = positionedLine.positionedGlyphs; var lineOffset = 0.0; if (!line.length()) { y += lineHeight; // Still need a line feed after empty line ++lineIndex; continue; } for (var i = 0; i < line.length(); i++) { var section = line.getSection(i); var sectionIndex = line.getSectionIndex(i); var codePoint = line.getCharCode(i); var baselineOffset = 0.0; var metrics = null; var rect = null; var imageName = null; var verticalAdvance = ONE_EM; var vertical = !(writingMode === WritingMode.horizontal || // Don't verticalize glyphs that have no upright orientation if vertical placement is disabled. (!allowVerticalPlacement && !charHasUprightVerticalOrientation(codePoint)) || // If vertical placement is enabled, don't verticalize glyphs that // are from complex text layout script, or whitespaces. (allowVerticalPlacement && (whitespace$1[codePoint] || charInComplexShapingScript(codePoint)))); if (!section.imageName) { var positions = glyphPositions[section.fontStack]; var glyphPosition = positions && positions[codePoint]; if (glyphPosition && glyphPosition.rect) { rect = glyphPosition.rect; metrics = glyphPosition.metrics; } else { var glyphs = glyphMap[section.fontStack]; var glyph = glyphs && glyphs[codePoint]; if (!glyph) { continue; } metrics = glyph.metrics; } // We don't know the baseline, but since we're laying out // at 24 points, we can calculate how much it will move when // we scale up or down. baselineOffset = (lineMaxScale - section.scale) * ONE_EM; } else { var imagePosition = imagePositions[section.imageName]; if (!imagePosition) { continue; } imageName = section.imageName; shaping.iconsInText = shaping.iconsInText || true; rect = imagePosition.paddedRect; var size = imagePosition.displaySize; // If needed, allow to set scale factor for an image using // alias "image-scale" that could be alias for "font-scale" // when FormattedSection is an image section. section.scale = section.scale * ONE_EM / layoutTextSizeThisZoom; metrics = {width: size[0], height: size[1], left: IMAGE_PADDING, top: -GLYPH_PBF_BORDER, advance: vertical ? size[1] : size[0]}; // Difference between one EM and an image size. // Aligns bottom of an image to a baseline level. var imageOffset = ONE_EM - size[1] * section.scale; baselineOffset = maxLineOffset + imageOffset; verticalAdvance = metrics.advance; // Difference between height of an image and one EM at max line scale. // Pushes current line down if an image size is over 1 EM at max line scale. var offset = vertical ? size[0] * section.scale - ONE_EM * lineMaxScale : size[1] * section.scale - ONE_EM * lineMaxScale; if (offset > 0 && offset > lineOffset) { lineOffset = offset; } } if (!vertical) { positionedGlyphs.push({glyph: codePoint, imageName: imageName, x: x, y: y + baselineOffset, vertical: vertical, scale: section.scale, fontStack: section.fontStack, sectionIndex: sectionIndex, metrics: metrics, rect: rect}); x += metrics.advance * section.scale + spacing; } else { shaping.verticalizable = true; positionedGlyphs.push({glyph: codePoint, imageName: imageName, x: x, y: y + baselineOffset, vertical: vertical, scale: section.scale, fontStack: section.fontStack, sectionIndex: sectionIndex, metrics: metrics, rect: rect}); x += verticalAdvance * section.scale + spacing; } } // Only justify if we placed at least one glyph if (positionedGlyphs.length !== 0) { var lineLength = x - spacing; maxLineLength = Math.max(lineLength, maxLineLength); justifyLine(positionedGlyphs, 0, positionedGlyphs.length - 1, justify, lineOffset); } x = 0; var currentLineHeight = lineHeight * lineMaxScale + lineOffset; positionedLine.lineOffset = Math.max(lineOffset, maxLineOffset); y += currentLineHeight; maxLineHeight = Math.max(currentLineHeight, maxLineHeight); ++lineIndex; } // Calculate the bounding box and justify / align text block. var height = y - SHAPING_DEFAULT_OFFSET; var ref = getAnchorAlignment(textAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; align$1(shaping.positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, maxLineHeight, lineHeight, height, lines.length); shaping.top += -verticalAlign * height; shaping.bottom = shaping.top + height; shaping.left += -horizontalAlign * maxLineLength; shaping.right = shaping.left + maxLineLength; } // justify right = 1, left = 0, center = 0.5 function justifyLine(positionedGlyphs , start , end , justify , lineOffset ) { if (!justify && !lineOffset) { return; } var lastPositionedGlyph = positionedGlyphs[end]; var lastAdvance = lastPositionedGlyph.metrics.advance * lastPositionedGlyph.scale; var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; for (var j = start; j <= end; j++) { positionedGlyphs[j].x -= lineIndent; positionedGlyphs[j].y += lineOffset; } } function align$1(positionedLines , justify , horizontalAlign , verticalAlign , maxLineLength , maxLineHeight , lineHeight , blockHeight , lineCount ) { var shiftX = (justify - horizontalAlign) * maxLineLength; var shiftY = 0; if (maxLineHeight !== lineHeight) { shiftY = -blockHeight * verticalAlign - SHAPING_DEFAULT_OFFSET; } else { shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight; } for (var i$1 = 0, list$1 = positionedLines; i$1 < list$1.length; i$1 += 1) { var line = list$1[i$1]; for (var i = 0, list = line.positionedGlyphs; i < list.length; i += 1) { var positionedGlyph = list[i]; positionedGlyph.x += shiftX; positionedGlyph.y += shiftY; } } } function shapeIcon(image , iconOffset , iconAnchor ) { var ref = getAnchorAlignment(iconAnchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var dx = iconOffset[0]; var dy = iconOffset[1]; var x1 = dx - image.displaySize[0] * horizontalAlign; var x2 = x1 + image.displaySize[0]; var y1 = dy - image.displaySize[1] * verticalAlign; var y2 = y1 + image.displaySize[1]; return {image: image, top: y1, bottom: y2, left: x1, right: x2}; } function fitIconToText(shapedIcon , shapedText , textFit , padding , iconOffset , fontScale ) { assert_1(textFit !== 'none'); assert_1(Array.isArray(padding) && padding.length === 4); assert_1(Array.isArray(iconOffset) && iconOffset.length === 2); var image = shapedIcon.image; var collisionPadding; if (image.content) { var content = image.content; var pixelRatio = image.pixelRatio || 1; collisionPadding = [ content[0] / pixelRatio, content[1] / pixelRatio, image.displaySize[0] - content[2] / pixelRatio, image.displaySize[1] - content[3] / pixelRatio ]; } // We don't respect the icon-anchor, because icon-text-fit is set. Instead, // the icon will be centered on the text, then stretched in the given // dimensions. var textLeft = shapedText.left * fontScale; var textRight = shapedText.right * fontScale; var top, right, bottom, left; if (textFit === 'width' || textFit === 'both') { // Stretched horizontally to the text width left = iconOffset[0] + textLeft - padding[3]; right = iconOffset[0] + textRight + padding[1]; } else { // Centered on the text left = iconOffset[0] + (textLeft + textRight - image.displaySize[0]) / 2; right = left + image.displaySize[0]; } var textTop = shapedText.top * fontScale; var textBottom = shapedText.bottom * fontScale; if (textFit === 'height' || textFit === 'both') { // Stretched vertically to the text height top = iconOffset[1] + textTop - padding[0]; bottom = iconOffset[1] + textBottom + padding[2]; } else { // Centered on the text top = iconOffset[1] + (textTop + textBottom - image.displaySize[1]) / 2; bottom = top + image.displaySize[1]; } return {image: image, top: top, right: right, bottom: bottom, left: left, collisionPadding: collisionPadding}; } // var Anchor = /*@__PURE__*/(function (Point) { function Anchor(x , y , angle , segment ) { Point.call(this, x, y); this.angle = angle; if (segment !== undefined) { this.segment = segment; } } if ( Point ) Anchor.__proto__ = Point; Anchor.prototype = Object.create( Point && Point.prototype ); Anchor.prototype.constructor = Anchor; Anchor.prototype.clone = function clone () { return new Anchor(this.x, this.y, this.angle, this.segment); }; return Anchor; }(pointGeometry)); register('Anchor', Anchor); // var SIZE_PACK_FACTOR = 128; // For {text,icon}-size, get the bucket-level data that will be needed by // the painter to set symbol-size-related uniforms function getSizeData(tileZoom , value ) { var expression = value.expression; if (expression.kind === 'constant') { var layoutSize = expression.evaluate(new EvaluationParameters(tileZoom + 1)); return {kind: 'constant', layoutSize: layoutSize}; } else if (expression.kind === 'source') { return {kind: 'source'}; } else { var zoomStops = expression.zoomStops; var interpolationType = expression.interpolationType; // calculate covering zoom stops for zoom-dependent values var lower = 0; while (lower < zoomStops.length && zoomStops[lower] <= tileZoom) { lower++; } lower = Math.max(0, lower - 1); var upper = lower; while (upper < zoomStops.length && zoomStops[upper] < tileZoom + 1) { upper++; } upper = Math.min(zoomStops.length - 1, upper); var minZoom = zoomStops[lower]; var maxZoom = zoomStops[upper]; // We'd like to be able to use CameraExpression or CompositeExpression in these // return types rather than ExpressionSpecification, but the former are not // transferrable across Web Worker boundaries. if (expression.kind === 'composite') { return {kind: 'composite', minZoom: minZoom, maxZoom: maxZoom, interpolationType: interpolationType}; } // for camera functions, also save off the function values // evaluated at the covering zoom levels var minSize = expression.evaluate(new EvaluationParameters(minZoom)); var maxSize = expression.evaluate(new EvaluationParameters(maxZoom)); return {kind: 'camera', minZoom: minZoom, maxZoom: maxZoom, minSize: minSize, maxSize: maxSize, interpolationType: interpolationType}; } } function evaluateSizeForFeature(sizeData , ref , ref$1 ) { var uSize = ref.uSize; var uSizeT = ref.uSizeT; var lowerSize = ref$1.lowerSize; var upperSize = ref$1.upperSize; if (sizeData.kind === 'source') { return lowerSize / SIZE_PACK_FACTOR; } else if (sizeData.kind === 'composite') { return number(lowerSize / SIZE_PACK_FACTOR, upperSize / SIZE_PACK_FACTOR, uSizeT); } return uSize; } function evaluateSizeForZoom(sizeData , zoom ) { var uSizeT = 0; var uSize = 0; if (sizeData.kind === 'constant') { uSize = sizeData.layoutSize; } else if (sizeData.kind !== 'source') { var interpolationType = sizeData.interpolationType; var minZoom = sizeData.minZoom; var maxZoom = sizeData.maxZoom; // Even though we could get the exact value of the camera function // at z = tr.zoom, we intentionally do not: instead, we interpolate // between the camera function values at a pair of zoom stops covering // [tileZoom, tileZoom + 1] in order to be consistent with this // restriction on composite functions var t = !interpolationType ? 0 : clamp( Interpolate.interpolationFactor(interpolationType, zoom, minZoom, maxZoom), 0, 1); if (sizeData.kind === 'camera') { uSize = number(sizeData.minSize, sizeData.maxSize, t); } else { uSizeT = t; } } return {uSizeT: uSizeT, uSize: uSize}; } var symbolSize = /*#__PURE__*/Object.freeze({ __proto__: null, getSizeData: getSizeData, evaluateSizeForFeature: evaluateSizeForFeature, evaluateSizeForZoom: evaluateSizeForZoom, SIZE_PACK_FACTOR: SIZE_PACK_FACTOR }); // /** * Labels placed around really sharp angles aren't readable. Check if any * part of the potential label has a combined angle that is too big. * * @param line * @param anchor The point on the line around which the label is anchored. * @param labelLength The length of the label in geometry units. * @param windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big. * @param maxAngle The maximum combined angle that any window along the label is allowed to have. * * @returns {boolean} whether the label should be placed * @private */ function checkMaxAngle(line , anchor , labelLength , windowSize , maxAngle ) { // horizontal labels always pass if (anchor.segment === undefined) { return true; } var p = anchor; var index = anchor.segment + 1; var anchorDistance = 0; // move backwards along the line to the first segment the label appears on while (anchorDistance > -labelLength / 2) { index--; // there isn't enough room for the label after the beginning of the line if (index < 0) { return false; } anchorDistance -= line[index].dist(p); p = line[index]; } anchorDistance += line[index].dist(line[index + 1]); index++; // store recent corners and their total angle difference var recentCorners = []; var recentAngleDelta = 0; // move forwards by the length of the label and check angles along the way while (anchorDistance < labelLength / 2) { var prev = line[index - 1]; var current = line[index]; var next = line[index + 1]; // there isn't enough room for the label before the end of the line if (!next) { return false; } var angleDelta = prev.angleTo(current) - current.angleTo(next); // restrict angle to -pi..pi range angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI); recentCorners.push({ distance: anchorDistance, angleDelta: angleDelta }); recentAngleDelta += angleDelta; // remove corners that are far enough away from the list of recent anchors while (anchorDistance - recentCorners[0].distance > windowSize) { recentAngleDelta -= recentCorners.shift().angleDelta; } // the sum of angles within the window area exceeds the maximum allowed value. check fails. if (recentAngleDelta > maxAngle) { return false; } index++; anchorDistance += current.dist(next); } // no part of the line had an angle greater than the maximum allowed. check passes. return true; } // function getLineLength(line ) { var lineLength = 0; for (var k = 0; k < line.length - 1; k++) { lineLength += line[k].dist(line[k + 1]); } return lineLength; } function getAngleWindowSize(shapedText , glyphSize , boxScale ) { return shapedText ? 3 / 5 * glyphSize * boxScale : 0; } function getShapedLabelLength(shapedText , shapedIcon ) { return Math.max( shapedText ? shapedText.right - shapedText.left : 0, shapedIcon ? shapedIcon.right - shapedIcon.left : 0); } function getCenterAnchor(line , maxAngle , shapedText , shapedIcon , glyphSize , boxScale ) { var angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); var labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale; var prevDistance = 0; var centerDistance = getLineLength(line) / 2; for (var i = 0; i < line.length - 1; i++) { var a = line[i], b = line[i + 1]; var segmentDistance = a.dist(b); if (prevDistance + segmentDistance > centerDistance) { // The center is on this segment var t = (centerDistance - prevDistance) / segmentDistance, x = number(a.x, b.x, t), y = number(a.y, b.y, t); var anchor = new Anchor(x, y, b.angleTo(a), i); anchor._round(); if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { return anchor; } else { return; } } prevDistance += segmentDistance; } } function getAnchors(line , spacing , maxAngle , shapedText , shapedIcon , glyphSize , boxScale , overscaling , tileExtent ) { // Resample a line to get anchor points for labels and check that each // potential label passes text-max-angle check and has enough froom to fit // on the line. var angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); var shapedLabelLength = getShapedLabelLength(shapedText, shapedIcon); var labelLength = shapedLabelLength * boxScale; // Is the line continued from outside the tile boundary? var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent; // Is the label long, relative to the spacing? // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges. if (spacing - labelLength < spacing / 4) { spacing = labelLength + spacing / 4; } // Offset the first anchor by: // Either half the label length plus a fixed extra offset if the line is not continued // Or half the spacing if the line is continued. // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections. var fixedExtraOffset = glyphSize * 2; var offset = !isLineContinued ? ((shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : (spacing / 2 * overscaling) % spacing; return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent); } function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { var halfLabelLength = labelLength / 2; var lineLength = getLineLength(line); var distance = 0, markedDistance = offset - spacing; var anchors = []; for (var i = 0; i < line.length - 1; i++) { var a = line[i], b = line[i + 1]; var segmentDist = a.dist(b), angle = b.angleTo(a); while (markedDistance + spacing < distance + segmentDist) { markedDistance += spacing; var t = (markedDistance - distance) / segmentDist, x = number(a.x, b.x, t), y = number(a.y, b.y, t); // Check that the point is within the tile boundaries and that // the label would fit before the beginning and end of the line // if placed at this point. if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent && markedDistance - halfLabelLength >= 0 && markedDistance + halfLabelLength <= lineLength) { var anchor = new Anchor(x, y, angle, i); anchor._round(); if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { anchors.push(anchor); } } } distance += segmentDist; } if (!placeAtMiddle && !anchors.length && !isLineContinued) { // The first attempt at finding anchors at which labels can be placed failed. // Try again, but this time just try placing one anchor at the middle of the line. // This has the most effect for short lines in overscaled tiles, since the // initial offset used in overscaled tiles is calculated to align labels with positions in // parent tiles instead of placing the label as close to the beginning as possible. anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); } return anchors; } // /** * Returns the part of a multiline that intersects with the provided rectangular box. * * @param lines * @param x1 the left edge of the box * @param y1 the top edge of the box * @param x2 the right edge of the box * @param y2 the bottom edge of the box * @returns lines * @private */ function clipLine(lines , x1 , y1 , x2 , y2 ) { var clippedLines = []; for (var l = 0; l < lines.length; l++) { var line = lines[l]; var clippedLine = (void 0); for (var i = 0; i < line.length - 1; i++) { var p0 = line[i]; var p1 = line[i + 1]; if (p0.x < x1 && p1.x < x1) { continue; } else if (p0.x < x1) { p0 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x < x1) { p1 = new pointGeometry(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y < y1 && p1.y < y1) { continue; } else if (p0.y < y1) { p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } else if (p1.y < y1) { p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); } if (p0.x >= x2 && p1.x >= x2) { continue; } else if (p0.x >= x2) { p0 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } else if (p1.x >= x2) { p1 = new pointGeometry(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); } if (p0.y >= y2 && p1.y >= y2) { continue; } else if (p0.y >= y2) { p0 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } else if (p1.y >= y2) { p1 = new pointGeometry(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); } if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { clippedLine = [p0]; clippedLines.push(clippedLine); } clippedLine.push(p1); } } return clippedLines; } // /** * A textured quad for rendering a single icon or glyph. * * The zoom range the glyph can be shown is defined by minScale and maxScale. * * @param tl The offset of the top left corner from the anchor. * @param tr The offset of the top right corner from the anchor. * @param bl The offset of the bottom left corner from the anchor. * @param br The offset of the bottom right corner from the anchor. * @param tex The texture coordinates. * * @private */ // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual // pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped // on one edge in some cases. var border$1 = IMAGE_PADDING; /** * Create the quads used for rendering an icon. * @private */ function getIconQuads( shapedIcon , iconRotate , isSDFIcon , hasIconTextFit ) { var quads = []; var image = shapedIcon.image; var pixelRatio = image.pixelRatio; var imageWidth = image.paddedRect.w - 2 * border$1; var imageHeight = image.paddedRect.h - 2 * border$1; var iconWidth = shapedIcon.right - shapedIcon.left; var iconHeight = shapedIcon.bottom - shapedIcon.top; var stretchX = image.stretchX || [[0, imageWidth]]; var stretchY = image.stretchY || [[0, imageHeight]]; var reduceRanges = function (sum, range) { return sum + range[1] - range[0]; }; var stretchWidth = stretchX.reduce(reduceRanges, 0); var stretchHeight = stretchY.reduce(reduceRanges, 0); var fixedWidth = imageWidth - stretchWidth; var fixedHeight = imageHeight - stretchHeight; var stretchOffsetX = 0; var stretchContentWidth = stretchWidth; var stretchOffsetY = 0; var stretchContentHeight = stretchHeight; var fixedOffsetX = 0; var fixedContentWidth = fixedWidth; var fixedOffsetY = 0; var fixedContentHeight = fixedHeight; if (image.content && hasIconTextFit) { var content = image.content; stretchOffsetX = sumWithinRange(stretchX, 0, content[0]); stretchOffsetY = sumWithinRange(stretchY, 0, content[1]); stretchContentWidth = sumWithinRange(stretchX, content[0], content[2]); stretchContentHeight = sumWithinRange(stretchY, content[1], content[3]); fixedOffsetX = content[0] - stretchOffsetX; fixedOffsetY = content[1] - stretchOffsetY; fixedContentWidth = content[2] - content[0] - stretchContentWidth; fixedContentHeight = content[3] - content[1] - stretchContentHeight; } var makeBox = function (left, top, right, bottom) { var leftEm = getEmOffset(left.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left); var leftPx = getPxOffset(left.fixed - fixedOffsetX, fixedContentWidth, left.stretch, stretchWidth); var topEm = getEmOffset(top.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top); var topPx = getPxOffset(top.fixed - fixedOffsetY, fixedContentHeight, top.stretch, stretchHeight); var rightEm = getEmOffset(right.stretch - stretchOffsetX, stretchContentWidth, iconWidth, shapedIcon.left); var rightPx = getPxOffset(right.fixed - fixedOffsetX, fixedContentWidth, right.stretch, stretchWidth); var bottomEm = getEmOffset(bottom.stretch - stretchOffsetY, stretchContentHeight, iconHeight, shapedIcon.top); var bottomPx = getPxOffset(bottom.fixed - fixedOffsetY, fixedContentHeight, bottom.stretch, stretchHeight); var tl = new pointGeometry(leftEm, topEm); var tr = new pointGeometry(rightEm, topEm); var br = new pointGeometry(rightEm, bottomEm); var bl = new pointGeometry(leftEm, bottomEm); var pixelOffsetTL = new pointGeometry(leftPx / pixelRatio, topPx / pixelRatio); var pixelOffsetBR = new pointGeometry(rightPx / pixelRatio, bottomPx / pixelRatio); var angle = iconRotate * Math.PI / 180; if (angle) { var sin = Math.sin(angle), cos = Math.cos(angle), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } var x1 = left.stretch + left.fixed; var x2 = right.stretch + right.fixed; var y1 = top.stretch + top.fixed; var y2 = bottom.stretch + bottom.fixed; var subRect = { x: image.paddedRect.x + border$1 + x1, y: image.paddedRect.y + border$1 + y1, w: x2 - x1, h: y2 - y1 }; var minFontScaleX = fixedContentWidth / pixelRatio / iconWidth; var minFontScaleY = fixedContentHeight / pixelRatio / iconHeight; // Icon quad is padded, so texture coordinates also need to be padded. return {tl: tl, tr: tr, bl: bl, br: br, tex: subRect, writingMode: undefined, glyphOffset: [0, 0], sectionIndex: 0, pixelOffsetTL: pixelOffsetTL, pixelOffsetBR: pixelOffsetBR, minFontScaleX: minFontScaleX, minFontScaleY: minFontScaleY, isSDF: isSDFIcon}; }; if (!hasIconTextFit || (!image.stretchX && !image.stretchY)) { quads.push(makeBox( {fixed: 0, stretch: -1}, {fixed: 0, stretch: -1}, {fixed: 0, stretch: imageWidth + 1}, {fixed: 0, stretch: imageHeight + 1})); } else { var xCuts = stretchZonesToCuts(stretchX, fixedWidth, stretchWidth); var yCuts = stretchZonesToCuts(stretchY, fixedHeight, stretchHeight); for (var xi = 0; xi < xCuts.length - 1; xi++) { var x1 = xCuts[xi]; var x2 = xCuts[xi + 1]; for (var yi = 0; yi < yCuts.length - 1; yi++) { var y1 = yCuts[yi]; var y2 = yCuts[yi + 1]; quads.push(makeBox(x1, y1, x2, y2)); } } } return quads; } function sumWithinRange(ranges, min, max) { var sum = 0; for (var i = 0, list = ranges; i < list.length; i += 1) { var range = list[i]; sum += Math.max(min, Math.min(max, range[1])) - Math.max(min, Math.min(max, range[0])); } return sum; } function stretchZonesToCuts(stretchZones, fixedSize, stretchSize) { var cuts = [{fixed: -border$1, stretch: 0}]; for (var i = 0, list = stretchZones; i < list.length; i += 1) { var ref = list[i]; var c1 = ref[0]; var c2 = ref[1]; var last = cuts[cuts.length - 1]; cuts.push({ fixed: c1 - last.stretch, stretch: last.stretch }); cuts.push({ fixed: c1 - last.stretch, stretch: last.stretch + (c2 - c1) }); } cuts.push({ fixed: fixedSize + border$1, stretch: stretchSize }); return cuts; } function getEmOffset(stretchOffset, stretchSize, iconSize, iconOffset) { return stretchOffset / stretchSize * iconSize + iconOffset; } function getPxOffset(fixedOffset, fixedSize, stretchOffset, stretchSize) { return fixedOffset - fixedSize * stretchOffset / stretchSize; } /** * Create the quads used for rendering a text label. * @private */ function getGlyphQuads(anchor , shaping , textOffset , layer , alongLine , feature , imageMap , allowVerticalPlacement ) { var textRotate = layer.layout.get('text-rotate').evaluate(feature, {}) * Math.PI / 180; var quads = []; for (var i$1 = 0, list$1 = shaping.positionedLines; i$1 < list$1.length; i$1 += 1) { var line = list$1[i$1]; for (var i = 0, list = line.positionedGlyphs; i < list.length; i += 1) { var positionedGlyph = list[i]; if (!positionedGlyph.rect) { continue; } var textureRect = positionedGlyph.rect || {}; // The rects have an additional buffer that is not included in their size. var glyphPadding = 1.0; var rectBuffer = GLYPH_PBF_BORDER + glyphPadding; var isSDF = true; var pixelRatio = 1.0; var lineOffset = 0.0; var rotateVerticalGlyph = (alongLine || allowVerticalPlacement) && positionedGlyph.vertical; var halfAdvance = positionedGlyph.metrics.advance * positionedGlyph.scale / 2; // Align images and scaled glyphs in the middle of a vertical line. if (allowVerticalPlacement && shaping.verticalizable) { var scaledGlyphOffset = (positionedGlyph.scale - 1) * ONE_EM; var imageOffset = (ONE_EM - positionedGlyph.metrics.width * positionedGlyph.scale) / 2; lineOffset = line.lineOffset / 2 - (positionedGlyph.imageName ? -imageOffset : scaledGlyphOffset); } if (positionedGlyph.imageName) { var image = imageMap[positionedGlyph.imageName]; isSDF = image.sdf; pixelRatio = image.pixelRatio; rectBuffer = IMAGE_PADDING / pixelRatio; } var glyphOffset = alongLine ? [positionedGlyph.x + halfAdvance, positionedGlyph.y] : [0, 0]; var builtInOffset = alongLine ? [0, 0] : [positionedGlyph.x + halfAdvance + textOffset[0], positionedGlyph.y + textOffset[1] - lineOffset]; var verticalizedLabelOffset = [0, 0]; if (rotateVerticalGlyph) { // Vertical POI labels that are rotated 90deg CW and whose glyphs must preserve upright orientation // need to be rotated 90deg CCW. After a quad is rotated, it is translated to the original built-in offset. verticalizedLabelOffset = builtInOffset; builtInOffset = [0, 0]; } var x1 = (positionedGlyph.metrics.left - rectBuffer) * positionedGlyph.scale - halfAdvance + builtInOffset[0]; var y1 = (-positionedGlyph.metrics.top - rectBuffer) * positionedGlyph.scale + builtInOffset[1]; var x2 = x1 + textureRect.w * positionedGlyph.scale / pixelRatio; var y2 = y1 + textureRect.h * positionedGlyph.scale / pixelRatio; var tl = new pointGeometry(x1, y1); var tr = new pointGeometry(x2, y1); var bl = new pointGeometry(x1, y2); var br = new pointGeometry(x2, y2); if (rotateVerticalGlyph) { // Vertical-supporting glyphs are laid out in 24x24 point boxes (1 square em) // In horizontal orientation, the y values for glyphs are below the midline // and we use a "yOffset" of -17 to pull them up to the middle. // By rotating counter-clockwise around the point at the center of the left // edge of a 24x24 layout box centered below the midline, we align the center // of the glyphs with the horizontal midline, so the yOffset is no longer // necessary, but we also pull the glyph to the left along the x axis. // The y coordinate includes baseline yOffset, thus needs to be accounted // for when glyph is rotated and translated. var center = new pointGeometry(-halfAdvance, halfAdvance - SHAPING_DEFAULT_OFFSET); var verticalRotation = -Math.PI / 2; // xHalfWidthOffsetCorrection is a difference between full-width and half-width // advance, should be 0 for full-width glyphs and will pull up half-width glyphs. var xHalfWidthOffsetCorrection = ONE_EM / 2 - halfAdvance; var yImageOffsetCorrection = positionedGlyph.imageName ? xHalfWidthOffsetCorrection : 0.0; var halfWidthOffsetCorrection = new pointGeometry(5 - SHAPING_DEFAULT_OFFSET - xHalfWidthOffsetCorrection, -yImageOffsetCorrection); var verticalOffsetCorrection = new (Function.prototype.bind.apply( pointGeometry, [ null ].concat( verticalizedLabelOffset) )); tl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); tr._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); bl._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); br._rotateAround(verticalRotation, center)._add(halfWidthOffsetCorrection)._add(verticalOffsetCorrection); } if (textRotate) { var sin = Math.sin(textRotate), cos = Math.cos(textRotate), matrix = [cos, -sin, sin, cos]; tl._matMult(matrix); tr._matMult(matrix); bl._matMult(matrix); br._matMult(matrix); } var pixelOffsetTL = new pointGeometry(0, 0); var pixelOffsetBR = new pointGeometry(0, 0); var minFontScaleX = 0; var minFontScaleY = 0; quads.push({tl: tl, tr: tr, bl: bl, br: br, tex: textureRect, writingMode: shaping.writingMode, glyphOffset: glyphOffset, sectionIndex: positionedGlyph.sectionIndex, isSDF: isSDF, pixelOffsetTL: pixelOffsetTL, pixelOffsetBR: pixelOffsetBR, minFontScaleX: minFontScaleX, minFontScaleY: minFontScaleY}); } } return quads; } // /** * A CollisionFeature represents the area of the tile covered by a single label. * It is used with CollisionIndex to check if the label overlaps with any * previous labels. A CollisionFeature is mostly just a set of CollisionBox * objects. * * @private */ var CollisionFeature = function CollisionFeature(collisionBoxArray , anchor , featureIndex , sourceLayerIndex , bucketIndex , shaped , boxScale , padding , alignLine , rotate ) { this.boxStartIndex = collisionBoxArray.length; if (alignLine) { // Compute height of the shape in glyph metrics and apply collision padding. // Note that the pixel based 'text-padding' is applied at runtime var top = shaped.top; var bottom = shaped.bottom; var collisionPadding = shaped.collisionPadding; if (collisionPadding) { top -= collisionPadding[1]; bottom += collisionPadding[3]; } var height = bottom - top; if (height > 0) { // set minimum box height to avoid very many small labels height = Math.max(10, height); this.circleDiameter = height; } } else { var y1 = shaped.top * boxScale - padding; var y2 = shaped.bottom * boxScale + padding; var x1 = shaped.left * boxScale - padding; var x2 = shaped.right * boxScale + padding; var collisionPadding$1 = shaped.collisionPadding; if (collisionPadding$1) { x1 -= collisionPadding$1[0] * boxScale; y1 -= collisionPadding$1[1] * boxScale; x2 += collisionPadding$1[2] * boxScale; y2 += collisionPadding$1[3] * boxScale; } if (rotate) { // Account for *-rotate in point collision boxes // See https://github.com/mapbox/mapbox-gl-js/issues/6075 // Doesn't account for icon-text-fit var tl = new pointGeometry(x1, y1); var tr = new pointGeometry(x2, y1); var bl = new pointGeometry(x1, y2); var br = new pointGeometry(x2, y2); var rotateRadians = rotate * Math.PI / 180; tl._rotate(rotateRadians); tr._rotate(rotateRadians); bl._rotate(rotateRadians); br._rotate(rotateRadians); // Collision features require an "on-axis" geometry, // so take the envelope of the rotated geometry // (may be quite large for wide labels rotated 45 degrees) x1 = Math.min(tl.x, tr.x, bl.x, br.x); x2 = Math.max(tl.x, tr.x, bl.x, br.x); y1 = Math.min(tl.y, tr.y, bl.y, br.y); y2 = Math.max(tl.y, tr.y, bl.y, br.y); } collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, featureIndex, sourceLayerIndex, bucketIndex); } this.boxEndIndex = collisionBoxArray.length; }; var TinyQueue = function TinyQueue(data, compare) { if ( data === void 0 ) data = []; if ( compare === void 0 ) compare = defaultCompare$1; this.data = data; this.length = this.data.length; this.compare = compare; if (this.length > 0) { for (var i = (this.length >> 1) - 1; i >= 0; i--) { this._down(i); } } }; TinyQueue.prototype.push = function push (item) { this.data.push(item); this.length++; this._up(this.length - 1); }; TinyQueue.prototype.pop = function pop () { if (this.length === 0) { return undefined; } var top = this.data[0]; var bottom = this.data.pop(); this.length--; if (this.length > 0) { this.data[0] = bottom; this._down(0); } return top; }; TinyQueue.prototype.peek = function peek () { return this.data[0]; }; TinyQueue.prototype._up = function _up (pos) { var ref = this; var data = ref.data; var compare = ref.compare; var item = data[pos]; while (pos > 0) { var parent = (pos - 1) >> 1; var current = data[parent]; if (compare(item, current) >= 0) { break; } data[pos] = current; pos = parent; } data[pos] = item; }; TinyQueue.prototype._down = function _down (pos) { var ref = this; var data = ref.data; var compare = ref.compare; var halfLength = this.length >> 1; var item = data[pos]; while (pos < halfLength) { var left = (pos << 1) + 1; var best = data[left]; var right = left + 1; if (right < this.length && compare(data[right], best) < 0) { left = right; best = data[right]; } if (compare(best, item) >= 0) { break; } data[pos] = best; pos = left; } data[pos] = item; }; function defaultCompare$1(a, b) { return a < b ? -1 : a > b ? 1 : 0; } // /** * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility * This is a copy of http://github.com/mapbox/polylabel adapted to use Points * * @param polygonRings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings * @param precision Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision * @param debug Print some statistics to the console during execution * @returns Pole of Inaccessibiliy. * @private */ function findPoleOfInaccessibility (polygonRings , precision, debug) { if ( precision === void 0 ) precision = 1; if ( debug === void 0 ) debug = false; // find the bounding box of the outer ring var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; var outerRing = polygonRings[0]; for (var i = 0; i < outerRing.length; i++) { var p = outerRing[i]; if (!i || p.x < minX) { minX = p.x; } if (!i || p.y < minY) { minY = p.y; } if (!i || p.x > maxX) { maxX = p.x; } if (!i || p.y > maxY) { maxY = p.y; } } var width = maxX - minX; var height = maxY - minY; var cellSize = Math.min(width, height); var h = cellSize / 2; // a priority queue of cells in order of their "potential" (max distance to polygon) var cellQueue = new TinyQueue([], compareMax); if (cellSize === 0) { return new pointGeometry(minX, minY); } // cover polygon with initial cells for (var x = minX; x < maxX; x += cellSize) { for (var y = minY; y < maxY; y += cellSize) { cellQueue.push(new Cell(x + h, y + h, h, polygonRings)); } } // take centroid as the first best guess var bestCell = getCentroidCell(polygonRings); var numProbes = cellQueue.length; while (cellQueue.length) { // pick the most promising cell from the queue var cell = cellQueue.pop(); // update the best cell if we found a better one if (cell.d > bestCell.d || !bestCell.d) { bestCell = cell; if (debug) { console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes); } } // do not drill down further if there's no chance of a better solution if (cell.max - bestCell.d <= precision) { continue; } // split the cell into four cells h = cell.h / 2; cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings)); cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings)); numProbes += 4; } if (debug) { console.log(("num probes: " + numProbes)); console.log(("best distance: " + (bestCell.d))); } return bestCell.p; } function compareMax(a, b) { return b.max - a.max; } function Cell(x, y, h, polygon) { this.p = new pointGeometry(x, y); this.h = h; // half the cell size this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell } // signed distance from point to polygon outline (negative if point is outside) function pointToPolygonDist(p, polygon) { var inside = false; var minDistSq = Infinity; for (var k = 0; k < polygon.length; k++) { var ring = polygon[k]; for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { var a = ring[i]; var b = ring[j]; if ((a.y > p.y !== b.y > p.y) && (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) { inside = !inside; } minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b)); } } return (inside ? 1 : -1) * Math.sqrt(minDistSq); } // get polygon centroid function getCentroidCell(polygon) { var area = 0; var x = 0; var y = 0; var points = polygon[0]; for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) { var a = points[i]; var b = points[j]; var f = a.x * b.y - b.x * a.y; x += (a.x + b.x) * f; y += (a.y + b.y) * f; area += f * 3; } return new Cell(x / area, y / area, 0, polygon); } // // The symbol layout process needs `text-size` evaluated at up to five different zoom levels, and // `icon-size` at up to three: // // 1. `text-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `text-size` // expressions, and to calculate the box dimensions for icon-text-fit. // 2. `icon-size` at the zoom level of the bucket. Used to calculate a per-feature size for source `icon-size` // expressions. // 3. `text-size` and `icon-size` at the zoom level of the bucket, plus one. Used to calculate collision boxes. // 4. `text-size` at zoom level 18. Used for something line-symbol-placement-related. // 5. For composite `*-size` expressions: two zoom levels of curve stops that "cover" the zoom level of the // bucket. These go into a vertex buffer and are used by the shader to interpolate the size at render time. // // (1) and (2) are stored in `bucket.layers[0].layout`. The remainder are below. // // The radial offset is to the edge of the text box // In the horizontal direction, the edge of the text box is where glyphs start // But in the vertical direction, the glyphs appear to "start" at the baseline // We don't actually load baseline data, but we assume an offset of ONE_EM - 17 // (see "yOffset" in shaping.js) var baselineOffset = 7; var INVALID_TEXT_OFFSET = Number.POSITIVE_INFINITY; function evaluateVariableOffset(anchor , offset ) { function fromRadialOffset(anchor , radialOffset ) { var x = 0, y = 0; if (radialOffset < 0) { radialOffset = 0; } // Ignore negative offset. // solve for r where r^2 + r^2 = radialOffset^2 var hypotenuse = radialOffset / Math.sqrt(2); switch (anchor) { case 'top-right': case 'top-left': y = hypotenuse - baselineOffset; break; case 'bottom-right': case 'bottom-left': y = -hypotenuse + baselineOffset; break; case 'bottom': y = -radialOffset + baselineOffset; break; case 'top': y = radialOffset - baselineOffset; break; } switch (anchor) { case 'top-right': case 'bottom-right': x = -hypotenuse; break; case 'top-left': case 'bottom-left': x = hypotenuse; break; case 'left': x = radialOffset; break; case 'right': x = -radialOffset; break; } return [x, y]; } function fromTextOffset(anchor , offsetX , offsetY ) { var x = 0, y = 0; // Use absolute offset values. offsetX = Math.abs(offsetX); offsetY = Math.abs(offsetY); switch (anchor) { case 'top-right': case 'top-left': case 'top': y = offsetY - baselineOffset; break; case 'bottom-right': case 'bottom-left': case 'bottom': y = -offsetY + baselineOffset; break; } switch (anchor) { case 'top-right': case 'bottom-right': case 'right': x = -offsetX; break; case 'top-left': case 'bottom-left': case 'left': x = offsetX; break; } return [x, y]; } return (offset[1] !== INVALID_TEXT_OFFSET) ? fromTextOffset(anchor, offset[0], offset[1]) : fromRadialOffset(anchor, offset[0]); } function performSymbolLayout(bucket , glyphMap , glyphPositions , imageMap , imagePositions , showCollisionBoxes , canonical ) { bucket.createArrays(); var tileSize = 512 * bucket.overscaling; bucket.tilePixelRatio = EXTENT$1 / tileSize; bucket.compareText = {}; bucket.iconsNeedLinear = false; var layout = bucket.layers[0].layout; var unevaluatedLayoutValues = bucket.layers[0]._unevaluatedLayout._values; var sizes = {}; if (bucket.textSizeData.kind === 'composite') { var ref = bucket.textSizeData; var minZoom = ref.minZoom; var maxZoom = ref.maxZoom; sizes.compositeTextSizes = [ unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(minZoom), canonical), unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(maxZoom), canonical) ]; } if (bucket.iconSizeData.kind === 'composite') { var ref$1 = bucket.iconSizeData; var minZoom$1 = ref$1.minZoom; var maxZoom$1 = ref$1.maxZoom; sizes.compositeIconSizes = [ unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(minZoom$1), canonical), unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(maxZoom$1), canonical) ]; } sizes.layoutTextSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1), canonical); sizes.layoutIconSize = unevaluatedLayoutValues['icon-size'].possiblyEvaluate(new EvaluationParameters(bucket.zoom + 1), canonical); sizes.textMaxSize = unevaluatedLayoutValues['text-size'].possiblyEvaluate(new EvaluationParameters(18)); var lineHeight = layout.get('text-line-height') * ONE_EM; var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; var keepUpright = layout.get('text-keep-upright'); var textSize = layout.get('text-size'); var loop = function () { var feature = list[i$1]; var fontstack = layout.get('text-font').evaluate(feature, {}, canonical).join(','); var layoutTextSizeThisZoom = textSize.evaluate(feature, {}, canonical); var layoutTextSize = sizes.layoutTextSize.evaluate(feature, {}, canonical); var layoutIconSize = sizes.layoutIconSize.evaluate(feature, {}, canonical); var shapedTextOrientations = { horizontal: {}, vertical: undefined }; var text = feature.text; var textOffset = [0, 0]; if (text) { var unformattedText = text.toString(); var spacing = layout.get('text-letter-spacing').evaluate(feature, {}, canonical) * ONE_EM; var spacingIfAllowed = allowsLetterSpacing(unformattedText) ? spacing : 0; var textAnchor = layout.get('text-anchor').evaluate(feature, {}, canonical); var variableTextAnchor = layout.get('text-variable-anchor'); if (!variableTextAnchor) { var radialOffset = layout.get('text-radial-offset').evaluate(feature, {}, canonical); // Layers with variable anchors use the `text-radial-offset` property and the [x, y] offset vector // is calculated at placement time instead of layout time if (radialOffset) { // The style spec says don't use `text-offset` and `text-radial-offset` together // but doesn't actually specify what happens if you use both. We go with the radial offset. textOffset = evaluateVariableOffset(textAnchor, [radialOffset * ONE_EM, INVALID_TEXT_OFFSET]); } else { textOffset = (layout.get('text-offset').evaluate(feature, {}, canonical).map(function (t) { return t * ONE_EM; }) ); } } var textJustify = textAlongLine ? "center" : layout.get('text-justify').evaluate(feature, {}, canonical); var symbolPlacement = layout.get('symbol-placement'); var maxWidth = symbolPlacement === 'point' ? layout.get('text-max-width').evaluate(feature, {}, canonical) * ONE_EM : 0; var addVerticalShapingForPointLabelIfNeeded = function () { if (bucket.allowVerticalPlacement && allowsVerticalWritingMode(unformattedText)) { // Vertical POI label placement is meant to be used for scripts that support vertical // writing mode, thus, default left justification is used. If Latin // scripts would need to be supported, this should take into account other justifications. shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, 'left', spacingIfAllowed, textOffset, WritingMode.vertical, true, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); } }; // If this layer uses text-variable-anchor, generate shapings for all justification possibilities. if (!textAlongLine && variableTextAnchor) { var justifications = textJustify === "auto" ? variableTextAnchor.map(function (a) { return getAnchorJustification(a); }) : [textJustify]; var singleLine = false; for (var i = 0; i < justifications.length; i++) { var justification = justifications[i]; if (shapedTextOrientations.horizontal[justification]) { continue; } if (singleLine) { // If the shaping for the first justification was only a single line, we // can re-use it for the other justifications shapedTextOrientations.horizontal[justification] = shapedTextOrientations.horizontal[0]; } else { // If using text-variable-anchor for the layer, we use a center anchor for all shapings and apply // the offsets for the anchor in the placement step. var shaping = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, 'center', justification, spacingIfAllowed, textOffset, WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); if (shaping) { shapedTextOrientations.horizontal[justification] = shaping; singleLine = shaping.positionedLines.length === 1; } } } addVerticalShapingForPointLabelIfNeeded(); } else { if (textJustify === "auto") { textJustify = getAnchorJustification(textAnchor); } // Horizontal point or line label. var shaping$1 = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.horizontal, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); if (shaping$1) { shapedTextOrientations.horizontal[textJustify] = shaping$1; } // Vertical point label (if allowVerticalPlacement is enabled). addVerticalShapingForPointLabelIfNeeded(); // Verticalized line label. if (allowsVerticalWritingMode(unformattedText) && textAlongLine && keepUpright) { shapedTextOrientations.vertical = shapeText(text, glyphMap, glyphPositions, imagePositions, fontstack, maxWidth, lineHeight, textAnchor, textJustify, spacingIfAllowed, textOffset, WritingMode.vertical, false, symbolPlacement, layoutTextSize, layoutTextSizeThisZoom); } } } var shapedIcon = (void 0); var isSDFIcon = false; if (feature.icon && feature.icon.name) { var image = imageMap[feature.icon.name]; if (image) { shapedIcon = shapeIcon( imagePositions[feature.icon.name], layout.get('icon-offset').evaluate(feature, {}, canonical), layout.get('icon-anchor').evaluate(feature, {}, canonical)); isSDFIcon = image.sdf; if (bucket.sdfIcons === undefined) { bucket.sdfIcons = image.sdf; } else if (bucket.sdfIcons !== image.sdf) { warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer'); } if (image.pixelRatio !== bucket.pixelRatio) { bucket.iconsNeedLinear = true; } else if (layout.get('icon-rotate').constantOr(1) !== 0) { bucket.iconsNeedLinear = true; } } } var shapedText = getDefaultHorizontalShaping(shapedTextOrientations.horizontal) || shapedTextOrientations.vertical; bucket.iconsInText = shapedText ? shapedText.iconsInText : false; if (shapedText || shapedIcon) { addFeature(bucket, feature, shapedTextOrientations, shapedIcon, imageMap, sizes, layoutTextSize, layoutIconSize, textOffset, isSDFIcon, canonical); } }; for (var i$1 = 0, list = bucket.features; i$1 < list.length; i$1 += 1) loop(); if (showCollisionBoxes) { bucket.generateCollisionDebugBuffers(); } } // Choose the justification that matches the direction of the TextAnchor function getAnchorJustification(anchor ) { switch (anchor) { case 'right': case 'top-right': case 'bottom-right': return 'right'; case 'left': case 'top-left': case 'bottom-left': return 'left'; } return 'center'; } /** * Given a feature and its shaped text and icon data, add a 'symbol * instance' for each _possible_ placement of the symbol feature. * (At render timePlaceSymbols#place() selects which of these instances to * show or hide based on collisions with symbols in other layers.) * @private */ function addFeature(bucket , feature , shapedTextOrientations , shapedIcon , imageMap , sizes , layoutTextSize , layoutIconSize , textOffset , isSDFIcon , canonical ) { // To reduce the number of labels that jump around when zooming we need // to use a text-size value that is the same for all zoom levels. // bucket calculates text-size at a high zoom level so that all tiles can // use the same value when calculating anchor positions. var textMaxSize = sizes.textMaxSize.evaluate(feature, {}); if (textMaxSize === undefined) { textMaxSize = layoutTextSize; } var layout = bucket.layers[0].layout; var iconOffset = layout.get('icon-offset').evaluate(feature, {}, canonical); var defaultHorizontalShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal); var glyphSize = 24, fontScale = layoutTextSize / glyphSize, textBoxScale = bucket.tilePixelRatio * fontScale, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = layout.get('text-max-angle') / 180 * Math.PI, textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', iconAlongLine = layout.get('icon-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point', symbolPlacement = layout.get('symbol-placement'), textRepeatDistance = symbolMinDistance / 2; var iconTextFit = layout.get('icon-text-fit'); var verticallyShapedIcon; // Adjust shaped icon size when icon-text-fit is used. if (shapedIcon && iconTextFit !== 'none') { if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) { verticallyShapedIcon = fitIconToText(shapedIcon, shapedTextOrientations.vertical, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale); } if (defaultHorizontalShaping) { shapedIcon = fitIconToText(shapedIcon, defaultHorizontalShaping, iconTextFit, layout.get('icon-text-fit-padding'), iconOffset, fontScale); } } var addSymbolAtAnchor = function (line, anchor) { if (anchor.x < 0 || anchor.x >= EXTENT$1 || anchor.y < 0 || anchor.y >= EXTENT$1) { // Symbol layers are drawn across tile boundaries, We filter out symbols // outside our tile boundaries (which may be included in vector tile buffers) // to prevent double-drawing symbols. return; } addSymbol(bucket, anchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textBoxScale, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, feature, sizes, isSDFIcon, canonical, layoutTextSize); }; if (symbolPlacement === 'line') { for (var i$1 = 0, list$1 = clipLine(feature.geometry, 0, 0, EXTENT$1, EXTENT$1); i$1 < list$1.length; i$1 += 1) { var line = list$1[i$1]; var anchors = getAnchors( line, symbolMinDistance, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale, bucket.overscaling, EXTENT$1 ); for (var i = 0, list = anchors; i < list.length; i += 1) { var anchor = list[i]; var shapedText = defaultHorizontalShaping; if (!shapedText || !anchorIsTooClose(bucket, shapedText.text, textRepeatDistance, anchor)) { addSymbolAtAnchor(line, anchor); } } } } else if (symbolPlacement === 'line-center') { // No clipping, multiple lines per feature are allowed // "lines" with only one point are ignored as in clipLines for (var i$2 = 0, list$2 = feature.geometry; i$2 < list$2.length; i$2 += 1) { var line$1 = list$2[i$2]; if (line$1.length > 1) { var anchor$1 = getCenterAnchor( line$1, textMaxAngle, shapedTextOrientations.vertical || defaultHorizontalShaping, shapedIcon, glyphSize, textMaxBoxScale); if (anchor$1) { addSymbolAtAnchor(line$1, anchor$1); } } } } else if (feature.type === 'Polygon') { for (var i$3 = 0, list$3 = classifyRings(feature.geometry, 0); i$3 < list$3.length; i$3 += 1) { // 16 here represents 2 pixels var polygon = list$3[i$3]; var poi = findPoleOfInaccessibility(polygon, 16); addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0)); } } else if (feature.type === 'LineString') { // https://github.com/mapbox/mapbox-gl-js/issues/3808 for (var i$4 = 0, list$4 = feature.geometry; i$4 < list$4.length; i$4 += 1) { var line$2 = list$4[i$4]; addSymbolAtAnchor(line$2, new Anchor(line$2[0].x, line$2[0].y, 0)); } } else if (feature.type === 'Point') { for (var i$6 = 0, list$6 = feature.geometry; i$6 < list$6.length; i$6 += 1) { var points = list$6[i$6]; for (var i$5 = 0, list$5 = points; i$5 < list$5.length; i$5 += 1) { var point = list$5[i$5]; addSymbolAtAnchor([point], new Anchor(point.x, point.y, 0)); } } } } var MAX_GLYPH_ICON_SIZE = 255; var MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR; function addTextVertices(bucket , anchor , shapedText , imageMap , layer , textAlongLine , feature , textOffset , lineArray , writingMode , placementTypes , placedTextSymbolIndices , placedIconIndex , sizes , canonical ) { var glyphQuads = getGlyphQuads(anchor, shapedText, textOffset, layer, textAlongLine, feature, imageMap, bucket.allowVerticalPlacement); var sizeData = bucket.textSizeData; var textSizeData = null; if (sizeData.kind === 'source') { textSizeData = [ SIZE_PACK_FACTOR * layer.layout.get('text-size').evaluate(feature, {}) ]; if (textSizeData[0] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"text-size\" is >= " + MAX_GLYPH_ICON_SIZE + ". Reduce your \"text-size\".")); } } else if (sizeData.kind === 'composite') { textSizeData = [ SIZE_PACK_FACTOR * sizes.compositeTextSizes[0].evaluate(feature, {}, canonical), SIZE_PACK_FACTOR * sizes.compositeTextSizes[1].evaluate(feature, {}, canonical) ]; if (textSizeData[0] > MAX_PACKED_SIZE || textSizeData[1] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"text-size\" is >= " + MAX_GLYPH_ICON_SIZE + ". Reduce your \"text-size\".")); } } bucket.addSymbols( bucket.text, glyphQuads, textSizeData, textOffset, textAlongLine, feature, writingMode, anchor, lineArray.lineStartIndex, lineArray.lineLength, placedIconIndex, canonical); // The placedSymbolArray is used at render time in drawTileSymbols // These indices allow access to the array at collision detection time for (var i = 0, list = placementTypes; i < list.length; i += 1) { var placementType = list[i]; placedTextSymbolIndices[placementType] = bucket.text.placedSymbolArray.length - 1; } return glyphQuads.length * 4; } function getDefaultHorizontalShaping(horizontalShaping ) { // We don't care which shaping we get because this is used for collision purposes // and all the justifications have the same collision box for (var justification in horizontalShaping) { return horizontalShaping[justification]; } return null; } /** * Add a single label & icon placement. * * @private */ function addSymbol(bucket , anchor , line , shapedTextOrientations , shapedIcon , imageMap , verticallyShapedIcon , layer , collisionBoxArray , featureIndex , sourceLayerIndex , bucketIndex , textBoxScale , textPadding , textAlongLine , textOffset , iconBoxScale , iconPadding , iconAlongLine , iconOffset , feature , sizes , isSDFIcon , canonical , layoutTextSize ) { var assign; var lineArray = bucket.addToLineVertexArray(anchor, line); var textCollisionFeature, iconCollisionFeature, verticalTextCollisionFeature, verticalIconCollisionFeature; var numIconVertices = 0; var numVerticalIconVertices = 0; var numHorizontalGlyphVertices = 0; var numVerticalGlyphVertices = 0; var placedIconSymbolIndex = -1; var verticalPlacedIconSymbolIndex = -1; var placedTextSymbolIndices = {}; var key = murmurhashJs(''); var textOffset0 = 0; var textOffset1 = 0; if (layer._unevaluatedLayout.getValue('text-radial-offset') === undefined) { (assign = (layer.layout.get('text-offset').evaluate(feature, {}, canonical).map(function (t) { return t * ONE_EM; }) ), textOffset0 = assign[0], textOffset1 = assign[1]); } else { textOffset0 = layer.layout.get('text-radial-offset').evaluate(feature, {}, canonical) * ONE_EM; textOffset1 = INVALID_TEXT_OFFSET; } if (bucket.allowVerticalPlacement && shapedTextOrientations.vertical) { var textRotation = layer.layout.get('text-rotate').evaluate(feature, {}, canonical); var verticalTextRotation = textRotation + 90.0; var verticalShaping = shapedTextOrientations.vertical; verticalTextCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textBoxScale, textPadding, textAlongLine, verticalTextRotation); if (verticallyShapedIcon) { verticalIconCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticallyShapedIcon, iconBoxScale, iconPadding, textAlongLine, verticalTextRotation); } } //Place icon first, so text can have a reference to its index in the placed symbol array. //Text symbols can lazily shift at render-time because of variable anchor placement. //If the style specifies an `icon-text-fit` then the icon would have to shift along with it. // For more info check `updateVariableAnchors` in `draw_symbol.js` . if (shapedIcon) { var iconRotate = layer.layout.get('icon-rotate').evaluate(feature, {}); var hasIconTextFit = layer.layout.get('icon-text-fit') !== 'none'; var iconQuads = getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit); var verticalIconQuads = verticallyShapedIcon ? getIconQuads(verticallyShapedIcon, iconRotate, isSDFIcon, hasIconTextFit) : undefined; iconCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, /*align boxes to line*/false, iconRotate); numIconVertices = iconQuads.length * 4; var sizeData = bucket.iconSizeData; var iconSizeData = null; if (sizeData.kind === 'source') { iconSizeData = [ SIZE_PACK_FACTOR * layer.layout.get('icon-size').evaluate(feature, {}) ]; if (iconSizeData[0] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"icon-size\" is >= " + MAX_GLYPH_ICON_SIZE + ". Reduce your \"icon-size\".")); } } else if (sizeData.kind === 'composite') { iconSizeData = [ SIZE_PACK_FACTOR * sizes.compositeIconSizes[0].evaluate(feature, {}, canonical), SIZE_PACK_FACTOR * sizes.compositeIconSizes[1].evaluate(feature, {}, canonical) ]; if (iconSizeData[0] > MAX_PACKED_SIZE || iconSizeData[1] > MAX_PACKED_SIZE) { warnOnce(((bucket.layerIds[0]) + ": Value for \"icon-size\" is >= " + MAX_GLYPH_ICON_SIZE + ". Reduce your \"icon-size\".")); } } bucket.addSymbols( bucket.icon, iconQuads, iconSizeData, iconOffset, iconAlongLine, feature, false, anchor, lineArray.lineStartIndex, lineArray.lineLength, // The icon itself does not have an associated symbol since the text isnt placed yet -1, canonical); placedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1; if (verticalIconQuads) { numVerticalIconVertices = verticalIconQuads.length * 4; bucket.addSymbols( bucket.icon, verticalIconQuads, iconSizeData, iconOffset, iconAlongLine, feature, WritingMode.vertical, anchor, lineArray.lineStartIndex, lineArray.lineLength, // The icon itself does not have an associated symbol since the text isnt placed yet -1, canonical); verticalPlacedIconSymbolIndex = bucket.icon.placedSymbolArray.length - 1; } } for (var justification in shapedTextOrientations.horizontal) { var shaping = shapedTextOrientations.horizontal[justification]; if (!textCollisionFeature) { key = murmurhashJs(shaping.text); var textRotate = layer.layout.get('text-rotate').evaluate(feature, {}, canonical); // As a collision approximation, we can use either the vertical or any of the horizontal versions of the feature // We're counting on all versions having similar dimensions textCollisionFeature = new CollisionFeature(collisionBoxArray, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textBoxScale, textPadding, textAlongLine, textRotate); } var singleLine = shaping.positionedLines.length === 1; numHorizontalGlyphVertices += addTextVertices( bucket, anchor, shaping, imageMap, layer, textAlongLine, feature, textOffset, lineArray, shapedTextOrientations.vertical ? WritingMode.horizontal : WritingMode.horizontalOnly, singleLine ? (Object.keys(shapedTextOrientations.horizontal) ) : [justification], placedTextSymbolIndices, placedIconSymbolIndex, sizes, canonical); if (singleLine) { break; } } if (shapedTextOrientations.vertical) { numVerticalGlyphVertices += addTextVertices( bucket, anchor, shapedTextOrientations.vertical, imageMap, layer, textAlongLine, feature, textOffset, lineArray, WritingMode.vertical, ['vertical'], placedTextSymbolIndices, verticalPlacedIconSymbolIndex, sizes, canonical); } var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; var verticalTextBoxStartIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var verticalTextBoxEndIndex = verticalTextCollisionFeature ? verticalTextCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; var verticalIconBoxStartIndex = verticalIconCollisionFeature ? verticalIconCollisionFeature.boxStartIndex : bucket.collisionBoxArray.length; var verticalIconBoxEndIndex = verticalIconCollisionFeature ? verticalIconCollisionFeature.boxEndIndex : bucket.collisionBoxArray.length; // Check if runtime collision circles should be used for any of the collision features. // It is enough to choose the tallest feature shape as circles are always placed on a line. // All measurements are in glyph metrics and later converted into pixels using proper font size "layoutTextSize" var collisionCircleDiameter = -1; var getCollisionCircleHeight = function (feature , prevHeight ) { if (feature && feature.circleDiameter) { return Math.max(feature.circleDiameter, prevHeight); } return prevHeight; }; collisionCircleDiameter = getCollisionCircleHeight(textCollisionFeature, collisionCircleDiameter); collisionCircleDiameter = getCollisionCircleHeight(verticalTextCollisionFeature, collisionCircleDiameter); collisionCircleDiameter = getCollisionCircleHeight(iconCollisionFeature, collisionCircleDiameter); collisionCircleDiameter = getCollisionCircleHeight(verticalIconCollisionFeature, collisionCircleDiameter); var useRuntimeCollisionCircles = (collisionCircleDiameter > -1) ? 1 : 0; // Convert circle collision height into pixels if (useRuntimeCollisionCircles) { collisionCircleDiameter *= layoutTextSize / ONE_EM; } if (bucket.glyphOffsetArray.length >= SymbolBucket.MAX_GLYPHS) { warnOnce( "Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907" ); } if (feature.sortKey !== undefined) { bucket.addToSortKeyRanges(bucket.symbolInstances.length, feature.sortKey); } bucket.symbolInstances.emplaceBack( anchor.x, anchor.y, placedTextSymbolIndices.right >= 0 ? placedTextSymbolIndices.right : -1, placedTextSymbolIndices.center >= 0 ? placedTextSymbolIndices.center : -1, placedTextSymbolIndices.left >= 0 ? placedTextSymbolIndices.left : -1, placedTextSymbolIndices.vertical || -1, placedIconSymbolIndex, verticalPlacedIconSymbolIndex, key, textBoxStartIndex, textBoxEndIndex, verticalTextBoxStartIndex, verticalTextBoxEndIndex, iconBoxStartIndex, iconBoxEndIndex, verticalIconBoxStartIndex, verticalIconBoxEndIndex, featureIndex, numHorizontalGlyphVertices, numVerticalGlyphVertices, numIconVertices, numVerticalIconVertices, useRuntimeCollisionCircles, 0, textBoxScale, textOffset0, textOffset1, collisionCircleDiameter); } function anchorIsTooClose(bucket , text , repeatDistance , anchor ) { var compareText = bucket.compareText; if (!(text in compareText)) { compareText[text] = []; } else { var otherAnchors = compareText[text]; for (var k = otherAnchors.length - 1; k >= 0; k--) { if (anchor.dist(otherAnchors[k]) < repeatDistance) { // If it's within repeatDistance of one anchor, stop looking return true; } } } // If anchor is not within repeatDistance of any other anchor, add to array compareText[text].push(anchor); return false; } // var vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types; // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph // 7 bits are for the current opacity, and the lowest bit is the target opacity // actually defined in symbol_attributes.js // const placementOpacityAttributes = [ // { name: 'a_fade_opacity', components: 1, type: 'Uint32' } // ]; var shaderOpacityAttributes = [ {name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0} ]; function addVertex$1(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex, isSDF , pixelOffsetX, pixelOffsetY, minFontScaleX, minFontScaleY) { var aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0; var aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0; array.emplaceBack( // a_pos_offset anchorX, anchorY, Math.round(ox * 32), Math.round(oy * 32), // a_data tx, // x coordinate of symbol on glyph atlas texture ty, // y coordinate of symbol on glyph atlas texture (aSizeX << 1) + (isSDF ? 1 : 0), aSizeY, pixelOffsetX * 16, pixelOffsetY * 16, minFontScaleX * 256, minFontScaleY * 256 ); } function addDynamicAttributes(dynamicLayoutVertexArray , p , angle ) { dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle); } function containsRTLText(formattedText ) { for (var i = 0, list = formattedText.sections; i < list.length; i += 1) { var section = list[i]; if (stringContainsRTLText(section.text)) { return true; } } return false; } var SymbolBuffers = function SymbolBuffers(programConfigurations ) { this.layoutVertexArray = new StructArrayLayout4i4ui4i24(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = programConfigurations; this.segments = new SegmentVector(); this.dynamicLayoutVertexArray = new StructArrayLayout3f12(); this.opacityVertexArray = new StructArrayLayout1ul4(); this.placedSymbolArray = new PlacedSymbolArray(); }; SymbolBuffers.prototype.isEmpty = function isEmpty () { return this.layoutVertexArray.length === 0 && this.indexArray.length === 0 && this.dynamicLayoutVertexArray.length === 0 && this.opacityVertexArray.length === 0; }; SymbolBuffers.prototype.upload = function upload (context , dynamicIndexBuffer , upload$1 , update ) { if (this.isEmpty()) { return; } if (upload$1) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members); this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer); this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true); this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true); // This is a performance hack so that we can write to opacityVertexArray with uint32s // even though the shaders read uint8s this.opacityVertexBuffer.itemSize = 1; } if (upload$1 || update) { this.programConfigurations.upload(context); } }; SymbolBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); this.dynamicLayoutVertexBuffer.destroy(); this.opacityVertexBuffer.destroy(); }; register('SymbolBuffers', SymbolBuffers); var CollisionBuffers = function CollisionBuffers(LayoutArray , layoutAttributes , IndexArray ) { this.layoutVertexArray = new LayoutArray(); this.layoutAttributes = layoutAttributes; this.indexArray = new IndexArray(); this.segments = new SegmentVector(); this.collisionVertexArray = new StructArrayLayout2ub2f12(); }; CollisionBuffers.prototype.upload = function upload (context ) { this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.collisionVertexBuffer = context.createVertexBuffer(this.collisionVertexArray, collisionVertexAttributes.members, true); }; CollisionBuffers.prototype.destroy = function destroy () { if (!this.layoutVertexBuffer) { return; } this.layoutVertexBuffer.destroy(); this.indexBuffer.destroy(); this.segments.destroy(); this.collisionVertexBuffer.destroy(); }; register('CollisionBuffers', CollisionBuffers); /** * Unlike other buckets, which simply implement #addFeature with type-specific * logic for (essentially) triangulating feature geometries, SymbolBucket * requires specialized behavior: * * 1. WorkerTile#parse(), the logical owner of the bucket creation process, * calls SymbolBucket#populate(), which resolves text and icon tokens on * each feature, adds each glyphs and symbols needed to the passed-in * collections options.glyphDependencies and options.iconDependencies, and * stores the feature data for use in subsequent step (this.features). * * 2. WorkerTile asynchronously requests from the main thread all of the glyphs * and icons needed (by this bucket and any others). When glyphs and icons * have been received, the WorkerTile creates a CollisionIndex and invokes: * * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and * layout on a Symbol Bucket. This step populates: * `this.symbolInstances`: metadata on generated symbols * `this.collisionBoxArray`: collision data for use by foreground * `this.text`: SymbolBuffers for text symbols * `this.icons`: SymbolBuffers for icons * `this.iconCollisionBox`: Debug SymbolBuffers for icon collision boxes * `this.textCollisionBox`: Debug SymbolBuffers for text collision boxes * The results are sent to the foreground for rendering * * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground, * and uses the CollisionIndex along with current camera settings to determine * which symbols can actually show on the map. Collided symbols are hidden * using a dynamic "OpacityVertexArray". * * @private */ var SymbolBucket = function SymbolBucket(options ) { this.collisionBoxArray = options.collisionBoxArray; this.zoom = options.zoom; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(function (layer) { return layer.id; }); this.index = options.index; this.pixelRatio = options.pixelRatio; this.sourceLayerIndex = options.sourceLayerIndex; this.hasPattern = false; this.hasRTLText = false; this.sortKeyRanges = []; this.collisionCircleArray = []; this.placementInvProjMatrix = identity$4([]); this.placementViewportMatrix = identity$4([]); var layer = this.layers[0]; var unevaluatedLayoutValues = layer._unevaluatedLayout._values; this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']); this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); var layout = this.layers[0].layout; var sortKey = layout.get('symbol-sort-key'); var zOrder = layout.get('symbol-z-order'); this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined; var zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey); this.sortFeaturesByY = zOrderByViewportY && (layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') || layout.get('text-ignore-placement') || layout.get('icon-ignore-placement')); if (layout.get('symbol-placement') === 'point') { this.writingModes = layout.get('text-writing-mode').map(function (wm) { return WritingMode[wm]; }); } this.stateDependentLayerIds = this.layers.filter(function (l) { return l.isStateDependent(); }).map(function (l) { return l.id; }); this.sourceID = options.sourceID; }; SymbolBucket.prototype.createArrays = function createArrays () { this.text = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, function (property) { return /^text/.test(property); })); this.icon = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, function (property) { return /^icon/.test(property); })); this.glyphOffsetArray = new GlyphOffsetArray(); this.lineVertexArray = new SymbolLineVertexArray(); this.symbolInstances = new SymbolInstanceArray(); }; SymbolBucket.prototype.calculateGlyphDependencies = function calculateGlyphDependencies (text , stack , textAlongLine , allowVerticalPlacement , doesAllowVerticalWritingMode ) { for (var i = 0; i < text.length; i++) { stack[text.charCodeAt(i)] = true; if ((textAlongLine || allowVerticalPlacement) && doesAllowVerticalWritingMode) { var verticalChar = verticalizedCharacterMap[text.charAt(i)]; if (verticalChar) { stack[verticalChar.charCodeAt(0)] = true; } } } }; SymbolBucket.prototype.populate = function populate (features , options , canonical ) { var layer = this.layers[0]; var layout = layer.layout; var textFont = layout.get('text-font'); var textField = layout.get('text-field'); var iconImage = layout.get('icon-image'); var hasText = (textField.value.kind !== 'constant' || (textField.value.value instanceof Formatted && !textField.value.value.isEmpty()) || textField.value.value.toString().length > 0) && (textFont.value.kind !== 'constant' || textFont.value.value.length > 0); // we should always resolve the icon-image value if the property was defined in the style // this allows us to fire the styleimagemissing event if image evaluation returns null // the only way to distinguish between null returned from a coalesce statement with no valid images // and null returned because icon-image wasn't defined is to check whether or not iconImage.parameters is an empty object var hasIcon = iconImage.value.kind !== 'constant' || !!iconImage.value.value || Object.keys(iconImage.parameters).length > 0; var symbolSortKey = layout.get('symbol-sort-key'); this.features = []; if (!hasText && !hasIcon) { return; } var icons = options.iconDependencies; var stacks = options.glyphDependencies; var availableImages = options.availableImages; var globalProperties = new EvaluationParameters(this.zoom); for (var i$1 = 0, list$1 = features; i$1 < list$1.length; i$1 += 1) { var ref = list$1[i$1]; var feature = ref.feature; var id = ref.id; var index = ref.index; var sourceLayerIndex = ref.sourceLayerIndex; var needGeometry = layer._featureFilter.needGeometry; var evaluationFeature = {type: feature.type, id: id, properties: feature.properties, geometry: needGeometry ? loadGeometry(feature) : []}; if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) { continue; } if (!needGeometry){ evaluationFeature.geometry = loadGeometry(feature); } var text = (void 0) ; if (hasText) { // Expression evaluation will automatically coerce to Formatted // but plain string token evaluation skips that pathway so do the // conversion here. var resolvedTokens = layer.getValueAndResolveTokens('text-field', evaluationFeature, canonical, availableImages); var formattedText = Formatted.factory(resolvedTokens); if (containsRTLText(formattedText)) { this.hasRTLText = true; } if ( !this.hasRTLText || // non-rtl text so can proceed safely getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping this.hasRTLText && plugin.isParsed() // Use the rtlText plugin to shape text ) { text = transformText$1(formattedText, layer, evaluationFeature); } } var icon = (void 0) ; if (hasIcon) { // Expression evaluation will automatically coerce to Image // but plain string token evaluation skips that pathway so do the // conversion here. var resolvedTokens$1 = layer.getValueAndResolveTokens('icon-image', evaluationFeature, canonical, availableImages); if (resolvedTokens$1 instanceof ResolvedImage) { icon = resolvedTokens$1; } else { icon = ResolvedImage.fromString(resolvedTokens$1); } } if (!text && !icon) { continue; } var sortKey = this.sortFeaturesByKey ? symbolSortKey.evaluate(evaluationFeature, {}, canonical) : undefined; var symbolFeature = { id: id, text: text, icon: icon, index: index, sourceLayerIndex: sourceLayerIndex, geometry: loadGeometry(feature), properties: feature.properties, type: vectorTileFeatureTypes$2[feature.type], sortKey: sortKey }; this.features.push(symbolFeature); if (icon) { icons[icon.name] = true; } if (text) { var fontStack = textFont.evaluate(evaluationFeature, {}, canonical).join(','); var textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(WritingMode.vertical) >= 0; for (var i = 0, list = text.sections; i < list.length; i += 1) { var section = list[i]; if (!section.image) { var doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString()); var sectionFont = section.fontStack || fontStack; var sectionStack = stacks[sectionFont] = stacks[sectionFont] || {}; this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode); } else { // Add section image to the list of dependencies. icons[section.image.name] = true; } } } } if (layout.get('symbol-placement') === 'line') { // Merge adjacent lines with the same text to improve labelling. // It's better to place labels on one long line than on many short segments. this.features = mergeLines(this.features); } if (this.sortFeaturesByKey) { this.features.sort(function (a, b) { // a.sortKey is always a number when sortFeaturesByKey is true return ((a.sortKey ) ) - ((b.sortKey ) ); }); } }; SymbolBucket.prototype.update = function update (states , vtLayer , imagePositions ) { if (!this.stateDependentLayers.length) { return; } this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions); }; SymbolBucket.prototype.isEmpty = function isEmpty () { // When the bucket encounters only rtl-text but the plugin isnt loaded, no symbol instances will be created. // In order for the bucket to be serialized, and not discarded as an empty bucket both checks are necessary. return this.symbolInstances.length === 0 && !this.hasRTLText; }; SymbolBucket.prototype.uploadPending = function uploadPending () { return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload; }; SymbolBucket.prototype.upload = function upload (context ) { if (!this.uploaded && this.hasDebugData()) { this.textCollisionBox.upload(context); this.iconCollisionBox.upload(context); } this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload); this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload); this.uploaded = true; }; SymbolBucket.prototype.destroyDebugData = function destroyDebugData () { this.textCollisionBox.destroy(); this.iconCollisionBox.destroy(); }; SymbolBucket.prototype.destroy = function destroy () { this.text.destroy(); this.icon.destroy(); if (this.hasDebugData()) { this.destroyDebugData(); } }; SymbolBucket.prototype.addToLineVertexArray = function addToLineVertexArray (anchor , line ) { var lineStartIndex = this.lineVertexArray.length; if (anchor.segment !== undefined) { var sumForwardLength = anchor.dist(line[anchor.segment + 1]); var sumBackwardLength = anchor.dist(line[anchor.segment]); var vertices = {}; for (var i = anchor.segment + 1; i < line.length; i++) { vertices[i] = {x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength}; if (i < line.length - 1) { sumForwardLength += line[i + 1].dist(line[i]); } } for (var i$1 = anchor.segment || 0; i$1 >= 0; i$1--) { vertices[i$1] = {x: line[i$1].x, y: line[i$1].y, tileUnitDistanceFromAnchor: sumBackwardLength}; if (i$1 > 0) { sumBackwardLength += line[i$1 - 1].dist(line[i$1]); } } for (var i$2 = 0; i$2 < line.length; i$2++) { var vertex = vertices[i$2]; this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor); } } return { lineStartIndex: lineStartIndex, lineLength: this.lineVertexArray.length - lineStartIndex }; }; SymbolBucket.prototype.addSymbols = function addSymbols (arrays , quads , sizeVertex , lineOffset , alongLine , feature , writingMode , labelAnchor , lineStartIndex , lineLength , associatedIconIndex , canonical ) { var indexArray = arrays.indexArray; var layoutVertexArray = arrays.layoutVertexArray; var segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, feature.sortKey); var glyphOffsetArrayStart = this.glyphOffsetArray.length; var vertexStartIndex = segment.vertexLength; var angle = (this.allowVerticalPlacement && writingMode === WritingMode.vertical) ? Math.PI / 2 : 0; var sections = feature.text && feature.text.sections; for (var i = 0; i < quads.length; i++) { var ref = quads[i]; var tl = ref.tl; var tr = ref.tr; var bl = ref.bl; var br = ref.br; var tex = ref.tex; var pixelOffsetTL = ref.pixelOffsetTL; var pixelOffsetBR = ref.pixelOffsetBR; var minFontScaleX = ref.minFontScaleX; var minFontScaleY = ref.minFontScaleY; var glyphOffset = ref.glyphOffset; var isSDF = ref.isSDF; var sectionIndex = ref.sectionIndex; var index = segment.vertexLength; var y = glyphOffset[1]; addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); addDynamicAttributes(arrays.dynamicLayoutVertexArray, labelAnchor, angle); indexArray.emplaceBack(index, index + 1, index + 2); indexArray.emplaceBack(index + 1, index + 2, index + 3); segment.vertexLength += 4; segment.primitiveLength += 2; this.glyphOffsetArray.emplaceBack(glyphOffset[0]); if (i === quads.length - 1 || sectionIndex !== quads[i + 1].sectionIndex) { arrays.programConfigurations.populatePaintArrays(layoutVertexArray.length, feature, feature.index, {}, canonical, sections && sections[sectionIndex]); } } arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, lineStartIndex, lineLength, (labelAnchor.segment ), sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, lineOffset[0], lineOffset[1], writingMode, // placedOrientation is null initially; will be updated to horizontal(1)/vertical(2) if placed 0, (false ), // The crossTileID is only filled/used on the foreground for dynamic text anchors 0, associatedIconIndex ); }; SymbolBucket.prototype._addCollisionDebugVertex = function _addCollisionDebugVertex (layoutVertexArray , collisionVertexArray , point , anchorX , anchorY , extrude ) { collisionVertexArray.emplaceBack(0, 0); return layoutVertexArray.emplaceBack( // pos point.x, point.y, // a_anchor_pos anchorX, anchorY, // extrude Math.round(extrude.x), Math.round(extrude.y)); }; SymbolBucket.prototype.addCollisionDebugVertices = function addCollisionDebugVertices (x1 , y1 , x2 , y2 , arrays , boxAnchorPoint , symbolInstance ) { var segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray); var index = segment.vertexLength; var layoutVertexArray = arrays.layoutVertexArray; var collisionVertexArray = arrays.collisionVertexArray; var anchorX = symbolInstance.anchorX; var anchorY = symbolInstance.anchorY; this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y1)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x2, y2)); this._addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, new pointGeometry(x1, y2)); segment.vertexLength += 4; var indexArray = (arrays.indexArray ); indexArray.emplaceBack(index, index + 1); indexArray.emplaceBack(index + 1, index + 2); indexArray.emplaceBack(index + 2, index + 3); indexArray.emplaceBack(index + 3, index); segment.primitiveLength += 4; }; SymbolBucket.prototype.addDebugCollisionBoxes = function addDebugCollisionBoxes (startIndex , endIndex , symbolInstance , isText ) { for (var b = startIndex; b < endIndex; b++) { var box = (this.collisionBoxArray.get(b) ); var x1 = box.x1; var y1 = box.y1; var x2 = box.x2; var y2 = box.y2; this.addCollisionDebugVertices(x1, y1, x2, y2, isText ? this.textCollisionBox : this.iconCollisionBox, box.anchorPoint, symbolInstance); } }; SymbolBucket.prototype.generateCollisionDebugBuffers = function generateCollisionDebugBuffers () { if (this.hasDebugData()) { this.destroyDebugData(); } this.textCollisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionBoxLayout.members, StructArrayLayout2ui4); this.iconCollisionBox = new CollisionBuffers(StructArrayLayout2i2i2i12, collisionBoxLayout.members, StructArrayLayout2ui4); for (var i = 0; i < this.symbolInstances.length; i++) { var symbolInstance = this.symbolInstances.get(i); this.addDebugCollisionBoxes(symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance, true); this.addDebugCollisionBoxes(symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance, true); this.addDebugCollisionBoxes(symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance, false); this.addDebugCollisionBoxes(symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance, false); } }; // These flat arrays are meant to be quicker to iterate over than the source // CollisionBoxArray SymbolBucket.prototype._deserializeCollisionBoxesForSymbol = function _deserializeCollisionBoxesForSymbol (collisionBoxArray , textStartIndex , textEndIndex , verticalTextStartIndex , verticalTextEndIndex , iconStartIndex , iconEndIndex , verticalIconStartIndex , verticalIconEndIndex ) { var collisionArrays = {}; for (var k = textStartIndex; k < textEndIndex; k++) { var box = (collisionBoxArray.get(k) ); collisionArrays.textBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, anchorPointX: box.anchorPointX, anchorPointY: box.anchorPointY}; collisionArrays.textFeatureIndex = box.featureIndex; break; // Only one box allowed per instance } for (var k$1 = verticalTextStartIndex; k$1 < verticalTextEndIndex; k$1++) { var box$1 = (collisionBoxArray.get(k$1) ); collisionArrays.verticalTextBox = {x1: box$1.x1, y1: box$1.y1, x2: box$1.x2, y2: box$1.y2, anchorPointX: box$1.anchorPointX, anchorPointY: box$1.anchorPointY}; collisionArrays.verticalTextFeatureIndex = box$1.featureIndex; break; // Only one box allowed per instance } for (var k$2 = iconStartIndex; k$2 < iconEndIndex; k$2++) { // An icon can only have one box now, so this indexing is a bit vestigial... var box$2 = (collisionBoxArray.get(k$2) ); collisionArrays.iconBox = {x1: box$2.x1, y1: box$2.y1, x2: box$2.x2, y2: box$2.y2, anchorPointX: box$2.anchorPointX, anchorPointY: box$2.anchorPointY}; collisionArrays.iconFeatureIndex = box$2.featureIndex; break; // Only one box allowed per instance } for (var k$3 = verticalIconStartIndex; k$3 < verticalIconEndIndex; k$3++) { // An icon can only have one box now, so this indexing is a bit vestigial... var box$3 = (collisionBoxArray.get(k$3) ); collisionArrays.verticalIconBox = {x1: box$3.x1, y1: box$3.y1, x2: box$3.x2, y2: box$3.y2, anchorPointX: box$3.anchorPointX, anchorPointY: box$3.anchorPointY}; collisionArrays.verticalIconFeatureIndex = box$3.featureIndex; break; // Only one box allowed per instance } return collisionArrays; }; SymbolBucket.prototype.deserializeCollisionBoxes = function deserializeCollisionBoxes (collisionBoxArray ) { this.collisionArrays = []; for (var i = 0; i < this.symbolInstances.length; i++) { var symbolInstance = this.symbolInstances.get(i); this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol( collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex )); } }; SymbolBucket.prototype.hasTextData = function hasTextData () { return this.text.segments.get().length > 0; }; SymbolBucket.prototype.hasIconData = function hasIconData () { return this.icon.segments.get().length > 0; }; SymbolBucket.prototype.hasDebugData = function hasDebugData () { return this.textCollisionBox && this.iconCollisionBox; }; SymbolBucket.prototype.hasTextCollisionBoxData = function hasTextCollisionBoxData () { return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0; }; SymbolBucket.prototype.hasIconCollisionBoxData = function hasIconCollisionBoxData () { return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0; }; SymbolBucket.prototype.addIndicesForPlacedSymbol = function addIndicesForPlacedSymbol (iconOrText , placedSymbolIndex ) { var placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex); var endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4; for (var vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); } }; SymbolBucket.prototype.getSortedSymbolIndexes = function getSortedSymbolIndexes (angle ) { if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) { return this.symbolInstanceIndexes; } var sin = Math.sin(angle); var cos = Math.cos(angle); var rotatedYs = []; var featureIndexes = []; var result = []; for (var i = 0; i < this.symbolInstances.length; ++i) { result.push(i); var symbolInstance = this.symbolInstances.get(i); rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0); featureIndexes.push(symbolInstance.featureIndex); } result.sort(function (aIndex, bIndex) { return (rotatedYs[aIndex] - rotatedYs[bIndex]) || (featureIndexes[bIndex] - featureIndexes[aIndex]); }); return result; }; SymbolBucket.prototype.addToSortKeyRanges = function addToSortKeyRanges (symbolInstanceIndex , sortKey ) { var last = this.sortKeyRanges[this.sortKeyRanges.length - 1]; if (last && last.sortKey === sortKey) { last.symbolInstanceEnd = symbolInstanceIndex + 1; } else { this.sortKeyRanges.push({ sortKey: sortKey, symbolInstanceStart: symbolInstanceIndex, symbolInstanceEnd: symbolInstanceIndex + 1 }); } }; SymbolBucket.prototype.sortFeatures = function sortFeatures (angle ) { var this$1 = this; if (!this.sortFeaturesByY) { return; } if (this.sortedAngle === angle) { return; } // The current approach to sorting doesn't sort across segments so don't try. // Sorting within segments separately seemed not to be worth the complexity. if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) { return; } // If the symbols are allowed to overlap sort them by their vertical screen position. // The index array buffer is rewritten to reference the (unchanged) vertices in the // sorted order. // To avoid sorting the actual symbolInstance array we sort an array of indexes. this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle); this.sortedAngle = angle; this.text.indexArray.clear(); this.icon.indexArray.clear(); this.featureSortOrder = []; for (var i$1 = 0, list = this.symbolInstanceIndexes; i$1 < list.length; i$1 += 1) { var i = list[i$1]; var symbolInstance = this.symbolInstances.get(i); this.featureSortOrder.push(symbolInstance.featureIndex); [ symbolInstance.rightJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.leftJustifiedTextSymbolIndex ].forEach(function (index, i, array) { // Only add a given index the first time it shows up, // to avoid duplicate opacity entries when multiple justifications // share the same glyphs. if (index >= 0 && array.indexOf(index) === i) { this$1.addIndicesForPlacedSymbol(this$1.text, index); } }); if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { this.addIndicesForPlacedSymbol(this.text, symbolInstance.verticalPlacedTextSymbolIndex); } if (symbolInstance.placedIconSymbolIndex >= 0) { this.addIndicesForPlacedSymbol(this.icon, symbolInstance.placedIconSymbolIndex); } if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { this.addIndicesForPlacedSymbol(this.icon, symbolInstance.verticalPlacedIconSymbolIndex); } } if (this.text.indexBuffer) { this.text.indexBuffer.updateData(this.text.indexArray); } if (this.icon.indexBuffer) { this.icon.indexBuffer.updateData(this.icon.indexArray); } }; register('SymbolBucket', SymbolBucket, { omit: ['layers', 'collisionBoxArray', 'features', 'compareText'] }); // this constant is based on the size of StructArray indexes used in a symbol // bucket--namely, glyphOffsetArrayStart // eg the max valid UInt16 is 65,535 // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation // lineStartIndex and textBoxStartIndex could potentially be concerns // but we expect there to be many fewer boxes/lines than glyphs SymbolBucket.MAX_GLYPHS = 65535; SymbolBucket.addDynamicAttributes = addDynamicAttributes; // /** * Replace tokens in a string template with values in an object * * @param properties a key/value relationship between tokens and replacements * @param text the template string * @returns the template with tokens replaced * @private */ function resolveTokens(properties , text ) { return text.replace(/{([^{}]+)}/g, function (match, key ) { return key in properties ? String(properties[key]) : ''; }); } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var layout$7 = new Properties({ "symbol-placement": new DataConstantProperty(spec["layout_symbol"]["symbol-placement"]), "symbol-spacing": new DataConstantProperty(spec["layout_symbol"]["symbol-spacing"]), "symbol-avoid-edges": new DataConstantProperty(spec["layout_symbol"]["symbol-avoid-edges"]), "symbol-sort-key": new DataDrivenProperty(spec["layout_symbol"]["symbol-sort-key"]), "symbol-z-order": new DataConstantProperty(spec["layout_symbol"]["symbol-z-order"]), "icon-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-allow-overlap"]), "icon-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["icon-ignore-placement"]), "icon-optional": new DataConstantProperty(spec["layout_symbol"]["icon-optional"]), "icon-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-rotation-alignment"]), "icon-size": new DataDrivenProperty(spec["layout_symbol"]["icon-size"]), "icon-text-fit": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit"]), "icon-text-fit-padding": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit-padding"]), "icon-image": new DataDrivenProperty(spec["layout_symbol"]["icon-image"]), "icon-rotate": new DataDrivenProperty(spec["layout_symbol"]["icon-rotate"]), "icon-padding": new DataConstantProperty(spec["layout_symbol"]["icon-padding"]), "icon-keep-upright": new DataConstantProperty(spec["layout_symbol"]["icon-keep-upright"]), "icon-offset": new DataDrivenProperty(spec["layout_symbol"]["icon-offset"]), "icon-anchor": new DataDrivenProperty(spec["layout_symbol"]["icon-anchor"]), "icon-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-pitch-alignment"]), "text-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["text-pitch-alignment"]), "text-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["text-rotation-alignment"]), "text-field": new DataDrivenProperty(spec["layout_symbol"]["text-field"]), "text-font": new DataDrivenProperty(spec["layout_symbol"]["text-font"]), "text-size": new DataDrivenProperty(spec["layout_symbol"]["text-size"]), "text-max-width": new DataDrivenProperty(spec["layout_symbol"]["text-max-width"]), "text-line-height": new DataConstantProperty(spec["layout_symbol"]["text-line-height"]), "text-letter-spacing": new DataDrivenProperty(spec["layout_symbol"]["text-letter-spacing"]), "text-justify": new DataDrivenProperty(spec["layout_symbol"]["text-justify"]), "text-radial-offset": new DataDrivenProperty(spec["layout_symbol"]["text-radial-offset"]), "text-variable-anchor": new DataConstantProperty(spec["layout_symbol"]["text-variable-anchor"]), "text-anchor": new DataDrivenProperty(spec["layout_symbol"]["text-anchor"]), "text-max-angle": new DataConstantProperty(spec["layout_symbol"]["text-max-angle"]), "text-writing-mode": new DataConstantProperty(spec["layout_symbol"]["text-writing-mode"]), "text-rotate": new DataDrivenProperty(spec["layout_symbol"]["text-rotate"]), "text-padding": new DataConstantProperty(spec["layout_symbol"]["text-padding"]), "text-keep-upright": new DataConstantProperty(spec["layout_symbol"]["text-keep-upright"]), "text-transform": new DataDrivenProperty(spec["layout_symbol"]["text-transform"]), "text-offset": new DataDrivenProperty(spec["layout_symbol"]["text-offset"]), "text-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["text-allow-overlap"]), "text-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["text-ignore-placement"]), "text-optional": new DataConstantProperty(spec["layout_symbol"]["text-optional"]), }); var paint$7 = new Properties({ "icon-opacity": new DataDrivenProperty(spec["paint_symbol"]["icon-opacity"]), "icon-color": new DataDrivenProperty(spec["paint_symbol"]["icon-color"]), "icon-halo-color": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-color"]), "icon-halo-width": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-width"]), "icon-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-blur"]), "icon-translate": new DataConstantProperty(spec["paint_symbol"]["icon-translate"]), "icon-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["icon-translate-anchor"]), "text-opacity": new DataDrivenProperty(spec["paint_symbol"]["text-opacity"]), "text-color": new DataDrivenProperty(spec["paint_symbol"]["text-color"], { runtimeType: ColorType, getOverride: function (o) { return o.textColor; }, hasOverride: function (o) { return !!o.textColor; } }), "text-halo-color": new DataDrivenProperty(spec["paint_symbol"]["text-halo-color"]), "text-halo-width": new DataDrivenProperty(spec["paint_symbol"]["text-halo-width"]), "text-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["text-halo-blur"]), "text-translate": new DataConstantProperty(spec["paint_symbol"]["text-translate"]), "text-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["text-translate-anchor"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$6 = ({ paint: paint$7, layout: layout$7 } ); // // This is an internal expression class. It is only used in GL JS and // has GL JS dependencies which can break the standalone style-spec module var FormatSectionOverride = function FormatSectionOverride(defaultValue ) { assert_1(defaultValue.property.overrides !== undefined); this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType; this.defaultValue = defaultValue; }; FormatSectionOverride.prototype.evaluate = function evaluate (ctx ) { if (ctx.formattedSection) { var overrides = this.defaultValue.property.overrides; if (overrides && overrides.hasOverride(ctx.formattedSection)) { return overrides.getOverride(ctx.formattedSection); } } if (ctx.feature && ctx.featureState) { return this.defaultValue.evaluate(ctx.feature, ctx.featureState); } return this.defaultValue.property.specification.default; }; FormatSectionOverride.prototype.eachChild = function eachChild (fn ) { if (!this.defaultValue.isConstant()) { var expr = ((this.defaultValue.value) ); fn(expr._styleExpression.expression); } }; // Cannot be statically evaluated, as the output depends on the evaluation context. FormatSectionOverride.prototype.outputDefined = function outputDefined () { return false; }; FormatSectionOverride.prototype.serialize = function serialize () { return null; }; register('FormatSectionOverride', FormatSectionOverride, {omit: ['defaultValue']}); // var SymbolStyleLayer = /*@__PURE__*/(function (StyleLayer) { function SymbolStyleLayer(layer ) { StyleLayer.call(this, layer, properties$6); } if ( StyleLayer ) SymbolStyleLayer.__proto__ = StyleLayer; SymbolStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); SymbolStyleLayer.prototype.constructor = SymbolStyleLayer; SymbolStyleLayer.prototype.recalculate = function recalculate (parameters , availableImages ) { StyleLayer.prototype.recalculate.call(this, parameters, availableImages); if (this.layout.get('icon-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') !== 'point') { this.layout._values['icon-rotation-alignment'] = 'map'; } else { this.layout._values['icon-rotation-alignment'] = 'viewport'; } } if (this.layout.get('text-rotation-alignment') === 'auto') { if (this.layout.get('symbol-placement') !== 'point') { this.layout._values['text-rotation-alignment'] = 'map'; } else { this.layout._values['text-rotation-alignment'] = 'viewport'; } } // If unspecified, `*-pitch-alignment` inherits `*-rotation-alignment` if (this.layout.get('text-pitch-alignment') === 'auto') { this.layout._values['text-pitch-alignment'] = this.layout.get('text-rotation-alignment'); } if (this.layout.get('icon-pitch-alignment') === 'auto') { this.layout._values['icon-pitch-alignment'] = this.layout.get('icon-rotation-alignment'); } if (this.layout.get('symbol-placement') === 'point') { var writingModes = this.layout.get('text-writing-mode'); if (writingModes) { // remove duplicates, preserving order var deduped = []; for (var i = 0, list = writingModes; i < list.length; i += 1) { var m = list[i]; if (deduped.indexOf(m) < 0) { deduped.push(m); } } this.layout._values['text-writing-mode'] = deduped; } else { this.layout._values['text-writing-mode'] = ['horizontal']; } } this._setPaintOverrides(); }; SymbolStyleLayer.prototype.getValueAndResolveTokens = function getValueAndResolveTokens (name , feature , canonical , availableImages ) { var value = this.layout.get(name).evaluate(feature, {}, canonical, availableImages); var unevaluated = this._unevaluatedLayout._values[name]; if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value) && value) { return resolveTokens(feature.properties, value); } return value; }; SymbolStyleLayer.prototype.createBucket = function createBucket (parameters ) { return new SymbolBucket(parameters); }; SymbolStyleLayer.prototype.queryRadius = function queryRadius () { return 0; }; SymbolStyleLayer.prototype.queryIntersectsFeature = function queryIntersectsFeature () { assert_1(false); // Should take a different path in FeatureIndex return false; }; SymbolStyleLayer.prototype._setPaintOverrides = function _setPaintOverrides () { for (var i = 0, list = properties$6.paint.overridableProperties; i < list.length; i += 1) { var overridable = list[i]; if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) { continue; } var overriden = this.paint.get(overridable); var override = new FormatSectionOverride(overriden); var styleExpression = new StyleExpression(override, overriden.property.specification); var expression = null; if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') { expression = (new ZoomConstantExpression('source', styleExpression) ); } else { expression = (new ZoomDependentExpression('composite', styleExpression, overriden.value.zoomStops, overriden.value._interpolationType) ); } this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property, expression, overriden.parameters); } }; SymbolStyleLayer.prototype._handleOverridablePaintPropertyUpdate = function _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) { return false; } return SymbolStyleLayer.hasPaintOverride(this.layout, name); }; SymbolStyleLayer.hasPaintOverride = function hasPaintOverride (layout , propertyName ) { var textField = layout.get('text-field'); var property = properties$6.paint.properties[propertyName]; var hasOverrides = false; var checkSections = function (sections) { for (var i = 0, list = sections; i < list.length; i += 1) { var section = list[i]; if (property.overrides && property.overrides.hasOverride(section)) { hasOverrides = true; return; } } }; if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted) { checkSections(textField.value.value.sections); } else if (textField.value.kind === 'source') { var checkExpression = function (expression ) { if (hasOverrides) { return; } if (expression instanceof Literal && typeOf(expression.value) === FormattedType) { var formatted = ((expression.value) ); checkSections(formatted.sections); } else if (expression instanceof FormatExpression) { checkSections(expression.sections); } else { expression.eachChild(checkExpression); } }; var expr = ((textField.value) ); if (expr._styleExpression) { checkExpression(expr._styleExpression.expression); } } return hasOverrides; }; return SymbolStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$8 = new Properties({ "background-color": new DataConstantProperty(spec["paint_background"]["background-color"]), "background-pattern": new CrossFadedProperty(spec["paint_background"]["background-pattern"]), "background-opacity": new DataConstantProperty(spec["paint_background"]["background-opacity"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$7 = ({ paint: paint$8 } ); // var BackgroundStyleLayer = /*@__PURE__*/(function (StyleLayer) { function BackgroundStyleLayer(layer ) { StyleLayer.call(this, layer, properties$7); } if ( StyleLayer ) BackgroundStyleLayer.__proto__ = StyleLayer; BackgroundStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); BackgroundStyleLayer.prototype.constructor = BackgroundStyleLayer; return BackgroundStyleLayer; }(StyleLayer)); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. var paint$9 = new Properties({ "raster-opacity": new DataConstantProperty(spec["paint_raster"]["raster-opacity"]), "raster-hue-rotate": new DataConstantProperty(spec["paint_raster"]["raster-hue-rotate"]), "raster-brightness-min": new DataConstantProperty(spec["paint_raster"]["raster-brightness-min"]), "raster-brightness-max": new DataConstantProperty(spec["paint_raster"]["raster-brightness-max"]), "raster-saturation": new DataConstantProperty(spec["paint_raster"]["raster-saturation"]), "raster-contrast": new DataConstantProperty(spec["paint_raster"]["raster-contrast"]), "raster-resampling": new DataConstantProperty(spec["paint_raster"]["raster-resampling"]), "raster-fade-duration": new DataConstantProperty(spec["paint_raster"]["raster-fade-duration"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} var properties$8 = ({ paint: paint$9 } ); // var RasterStyleLayer = /*@__PURE__*/(function (StyleLayer) { function RasterStyleLayer(layer ) { StyleLayer.call(this, layer, properties$8); } if ( StyleLayer ) RasterStyleLayer.__proto__ = StyleLayer; RasterStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); RasterStyleLayer.prototype.constructor = RasterStyleLayer; return RasterStyleLayer; }(StyleLayer)); // /** * Interface for custom style layers. This is a specification for * implementers to model: it is not an exported method or class. * * Custom layers allow a user to render directly into the map's GL context using the map's camera. * These layers can be added between any regular layers using {@link Map#addLayer}. * * Custom layers must have a unique `id` and must have the `type` of `"custom"`. * They must implement `render` and may implement `prerender`, `onAdd` and `onRemove`. * They can trigger rendering using {@link Map#triggerRepaint} * and they should appropriately handle {@link Map.event:webglcontextlost} and * {@link Map.event:webglcontextrestored}. * * The `renderingMode` property controls whether the layer is treated as a `"2d"` or `"3d"` map layer. Use: * - `"renderingMode": "3d"` to use the depth buffer and share it with other layers * - `"renderingMode": "2d"` to add a layer with no depth. If you need to use the depth buffer for a `"2d"` layer you must use an offscreen * framebuffer and {@link CustomLayerInterface#prerender} * * @interface CustomLayerInterface * @property {string} id A unique layer id. * @property {string} type The layer's type. Must be `"custom"`. * @property {string} renderingMode Either `"2d"` or `"3d"`. Defaults to `"2d"`. * @example * // Custom layer implemented as ES6 class * class NullIslandLayer { * constructor() { * this.id = 'null-island'; * this.type = 'custom'; * this.renderingMode = '2d'; * } * * onAdd(map, gl) { * const vertexSource = ` * uniform mat4 u_matrix; * void main() { * gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0); * gl_PointSize = 20.0; * }`; * * const fragmentSource = ` * void main() { * gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); * }`; * * const vertexShader = gl.createShader(gl.VERTEX_SHADER); * gl.shaderSource(vertexShader, vertexSource); * gl.compileShader(vertexShader); * const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); * gl.shaderSource(fragmentShader, fragmentSource); * gl.compileShader(fragmentShader); * * this.program = gl.createProgram(); * gl.attachShader(this.program, vertexShader); * gl.attachShader(this.program, fragmentShader); * gl.linkProgram(this.program); * } * * render(gl, matrix) { * gl.useProgram(this.program); * gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "u_matrix"), false, matrix); * gl.drawArrays(gl.POINTS, 0, 1); * } * } * * map.on('load', function() { * map.addLayer(new NullIslandLayer()); * }); */ /** * Optional method called when the layer has been added to the Map with {@link Map#addLayer}. This * gives the layer a chance to initialize gl resources and register event listeners. * * @function * @memberof CustomLayerInterface * @instance * @name onAdd * @param {Map} map The Map this custom layer was just added to. * @param {WebGLRenderingContext} gl The gl context for the map. */ /** * Optional method called when the layer has been removed from the Map with {@link Map#removeLayer}. This * gives the layer a chance to clean up gl resources and event listeners. * * @function * @memberof CustomLayerInterface * @instance * @name onRemove * @param {Map} map The Map this custom layer was just added to. * @param {WebGLRenderingContext} gl The gl context for the map. */ /** * Optional method called during a render frame to allow a layer to prepare resources or render into a texture. * * The layer cannot make any assumptions about the current GL state and must bind a framebuffer before rendering. * * @function * @memberof CustomLayerInterface * @instance * @name prerender * @param {WebGLRenderingContext} gl The map's gl context. * @param {Array} matrix The map's camera matrix. It projects spherical mercator * coordinates to gl coordinates. The mercator coordinate `[0, 0]` represents the * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat * can be used to project a `LngLat` to a mercator coordinate. */ /** * Called during a render frame allowing the layer to draw into the GL context. * * The layer can assume blending and depth state is set to allow the layer to properly * blend and clip other layers. The layer cannot make any other assumptions about the * current GL state. * * If the layer needs to render to a texture, it should implement the `prerender` method * to do this and only use the `render` method for drawing directly into the main framebuffer. * * The blend function is set to `gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. This expects * colors to be provided in premultiplied alpha form where the `r`, `g` and `b` values are already * multiplied by the `a` value. If you are unable to provide colors in premultiplied form you * may want to change the blend function to * `gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. * * @function * @memberof CustomLayerInterface * @instance * @name render * @param {WebGLRenderingContext} gl The map's gl context. * @param {Array} matrix The map's camera matrix. It projects spherical mercator * coordinates to gl coordinates. The spherical mercator coordinate `[0, 0]` represents the * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat * can be used to project a `LngLat` to a mercator coordinate. */ function validateCustomStyleLayer(layerObject ) { var errors = []; var id = layerObject.id; if (id === undefined) { errors.push({ message: ("layers." + id + ": missing required property \"id\"") }); } if (layerObject.render === undefined) { errors.push({ message: ("layers." + id + ": missing required method \"render\"") }); } if (layerObject.renderingMode && layerObject.renderingMode !== '2d' && layerObject.renderingMode !== '3d') { errors.push({ message: ("layers." + id + ": property \"renderingMode\" must be either \"2d\" or \"3d\"") }); } return errors; } var CustomStyleLayer = /*@__PURE__*/(function (StyleLayer) { function CustomStyleLayer(implementation ) { StyleLayer.call(this, implementation, {}); this.implementation = implementation; } if ( StyleLayer ) CustomStyleLayer.__proto__ = StyleLayer; CustomStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); CustomStyleLayer.prototype.constructor = CustomStyleLayer; CustomStyleLayer.prototype.is3D = function is3D () { return this.implementation.renderingMode === '3d'; }; CustomStyleLayer.prototype.hasOffscreenPass = function hasOffscreenPass () { return this.implementation.prerender !== undefined; }; CustomStyleLayer.prototype.recalculate = function recalculate () {}; CustomStyleLayer.prototype.updateTransitions = function updateTransitions () {}; CustomStyleLayer.prototype.hasTransition = function hasTransition () {}; CustomStyleLayer.prototype.serialize = function serialize () { assert_1(false, "Custom layers cannot be serialized"); }; CustomStyleLayer.prototype.onAdd = function onAdd (map ) { if (this.implementation.onAdd) { this.implementation.onAdd(map, map.painter.context.gl); } }; CustomStyleLayer.prototype.onRemove = function onRemove (map ) { if (this.implementation.onRemove) { this.implementation.onRemove(map, map.painter.context.gl); } }; return CustomStyleLayer; }(StyleLayer)); // var subclasses = { circle: CircleStyleLayer, heatmap: HeatmapStyleLayer, hillshade: HillshadeStyleLayer, fill: FillStyleLayer, 'fill-extrusion': FillExtrusionStyleLayer, line: LineStyleLayer, symbol: SymbolStyleLayer, background: BackgroundStyleLayer, raster: RasterStyleLayer }; function createStyleLayer(layer ) { if (layer.type === 'custom') { return new CustomStyleLayer(layer); } else { return new subclasses[layer.type](layer); } } // var HTMLImageElement = window$1.HTMLImageElement; var HTMLCanvasElement = window$1.HTMLCanvasElement; var HTMLVideoElement = window$1.HTMLVideoElement; var ImageData$1 = window$1.ImageData; var ImageBitmap$1 = window$1.ImageBitmap; var Texture = function Texture(context , image , format , options ) { this.context = context; this.format = format; this.texture = context.gl.createTexture(); this.update(image, options); }; Texture.prototype.update = function update (image , options , position ) { var width = image.width; var height = image.height; var resize = (!this.size || this.size[0] !== width || this.size[1] !== height) && !position; var ref = this; var context = ref.context; var gl = context.gl; this.useMipmap = Boolean(options && options.useMipmap); gl.bindTexture(gl.TEXTURE_2D, this.texture); context.pixelStoreUnpackFlipY.set(false); context.pixelStoreUnpack.set(1); context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false)); if (resize) { this.size = [width, height]; if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1 || (ImageBitmap$1 && image instanceof ImageBitmap$1)) { gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, gl.UNSIGNED_BYTE, image); } else { gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, gl.UNSIGNED_BYTE, image.data); } } else { var ref$1 = position || {x: 0, y: 0}; var x = ref$1.x; var y = ref$1.y; if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1 || (ImageBitmap$1 && image instanceof ImageBitmap$1)) { gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image); } else { gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, image.data); } } if (this.useMipmap && this.isSizePowerOfTwo()) { gl.generateMipmap(gl.TEXTURE_2D); } }; Texture.prototype.bind = function bind (filter , wrap , minFilter ) { var ref = this; var context = ref.context; var gl = context.gl; gl.bindTexture(gl.TEXTURE_2D, this.texture); if (minFilter === gl.LINEAR_MIPMAP_NEAREST && !this.isSizePowerOfTwo()) { minFilter = gl.LINEAR; } if (filter !== this.filter) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter || filter); this.filter = filter; } if (wrap !== this.wrap) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap); this.wrap = wrap; } }; Texture.prototype.isSizePowerOfTwo = function isSizePowerOfTwo () { return this.size[0] === this.size[1] && (Math.log(this.size[0]) / Math.LN2) % 1 === 0; }; Texture.prototype.destroy = function destroy () { var ref = this.context; var gl = ref.gl; gl.deleteTexture(this.texture); this.texture = (null ); }; // /** * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests * are ignored until the function was actually invoked. * * @private */ var ThrottledInvoker = function ThrottledInvoker(callback ) { var this$1 = this; this._callback = callback; this._triggered = false; if (typeof MessageChannel !== 'undefined') { this._channel = new MessageChannel(); this._channel.port2.onmessage = function () { this$1._triggered = false; this$1._callback(); }; } }; ThrottledInvoker.prototype.trigger = function trigger () { var this$1 = this; if (!this._triggered) { this._triggered = true; if (this._channel) { this._channel.port1.postMessage(true); } else { setTimeout(function () { this$1._triggered = false; this$1._callback(); }, 0); } } }; ThrottledInvoker.prototype.remove = function remove () { delete this._channel; this._callback = function () {}; }; // /** * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model) * that maintains the relationship between asynchronous tasks and the objects * that spin them off - in this case, tasks like parsing parts of styles, * owned by the styles * * @param {WebWorker} target * @param {WebWorker} parent * @param {string|number} mapId A unique identifier for the Map instance using this Actor. * @private */ var Actor = function Actor(target , parent , mapId ) { this.target = target; this.parent = parent; this.mapId = mapId; this.callbacks = {}; this.tasks = {}; this.taskQueue = []; this.cancelCallbacks = {}; bindAll(['receive', 'process'], this); this.invoker = new ThrottledInvoker(this.process); this.target.addEventListener('message', this.receive, false); this.globalScope = isWorker() ? target : window$1; }; /** * Sends a message from a main-thread map to a Worker or from a Worker back to * a main-thread map instance. * * @param type The name of the target method to invoke or '[source-type].[source-name].name' for a method on a WorkerSource. * @param targetMapId A particular mapId to which to send this message. * @private */ Actor.prototype.send = function send (type , data , callback , targetMapId , mustQueue, sourceId ) { var this$1 = this; if ( mustQueue === void 0 ) mustQueue = false; // We're using a string ID instead of numbers because they are being used as object keys // anyway, and thus stringified implicitly. We use random IDs because an actor may receive // message from multiple other actors which could run in different execution context. A // linearly increasing ID could produce collisions. var id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10); if (callback) { this.callbacks[id] = callback; } var buffers = isSafari(this.globalScope) ? undefined : []; this.target.postMessage({ sourceId: sourceId, id: id, type: type, hasCallback: !!callback, targetMapId: targetMapId, mustQueue: mustQueue, sourceMapId: this.mapId, data: serialize(data, buffers) }, buffers); return { cancel: function () { if (callback) { // Set the callback to null so that it never fires after the request is aborted. delete this$1.callbacks[id]; } this$1.target.postMessage({ id: id, type: '', targetMapId: targetMapId, sourceMapId: this$1.mapId }); } }; }; Actor.prototype.receive = function receive (message ) { var data = message.data, id = data.id; if (!id) { return; } if (data.targetMapId && this.mapId !== data.targetMapId) { return; } if (data.type === '') { // Remove the original request from the queue. This is only possible if it // hasn't been kicked off yet. The id will remain in the queue, but because // there is no associated task, it will be dropped once it's time to execute it. delete this.tasks[id]; var cancel = this.cancelCallbacks[id]; delete this.cancelCallbacks[id]; if (cancel) { cancel(); } } else { if (isWorker() || data.mustQueue) { // In workers, store the tasks that we need to process before actually processing them. This // is necessary because we want to keep receiving messages, and in particular, // messages. Some tasks may take a while in the worker thread, so before // executing the next task in our queue, postMessage preempts this and // messages can be processed. We're using a MessageChannel object to get throttle the // process() flow to one at a time. this.tasks[id] = data; this.taskQueue.push(id); this.invoker.trigger(); } else { // In the main thread, process messages immediately so that other work does not slip in // between getting partial data back from workers. this.processTask(id, data); } } }; Actor.prototype.process = function process () { if (!this.taskQueue.length) { return; } var id = this.taskQueue.shift(); var task = this.tasks[id]; delete this.tasks[id]; // Schedule another process call if we know there's more to process _before_ invoking the // current task. This is necessary so that processing continues even if the current task // doesn't execute successfully. if (this.taskQueue.length) { this.invoker.trigger(); } if (!task) { // If the task ID doesn't have associated task data anymore, it was canceled. return; } this.processTask(id, task); }; Actor.prototype.processTask = function processTask (id , task ) { var this$1 = this; if (task.type === '') { // The done() function in the counterpart has been called, and we are now // firing the callback in the originating actor, if there is one. var callback = this.callbacks[id]; delete this.callbacks[id]; if (callback) { // If we get a response, but don't have a callback, the request was canceled. if (task.error) { callback(deserialize(task.error)); } else { callback(null, deserialize(task.data)); } } } else { var completed = false; var buffers = isSafari(this.globalScope) ? undefined : []; var done = task.hasCallback ? function (err, data) { completed = true; delete this$1.cancelCallbacks[id]; this$1.target.postMessage({ id: id, type: '', sourceMapId: this$1.mapId, error: err ? serialize(err) : null, data: serialize(data, buffers) }, buffers); } : function (_) { completed = true; }; var callback$1 = null; var params = (deserialize(task.data) ); if (this.parent[task.type]) { // task.type == 'loadTile', 'removeTile', etc. callback$1 = this.parent[task.type](task.sourceMapId, params, done, task.sourceId); } else if (this.parent.getWorkerSource) { // task.type == sourcetype.method var keys = task.type.split('.'); var scope = (this.parent ).getWorkerSource(task.sourceMapId, keys[0], params.source, params.crs); callback$1 = scope[keys[1]](params, done); } else { // No function was found. done(new Error(("Could not find function " + (task.type)))); } if (!completed && callback$1 && callback$1.cancel) { // Allows canceling the task as long as it hasn't been completed yet. this.cancelCallbacks[id] = callback$1.cancel; } } }; Actor.prototype.remove = function remove () { this.invoker.remove(); this.target.removeEventListener('message', this.receive, false); }; /** * getURL * * @param {String} baseUrl Base url of the WMS server * @param {String} layer Layer name * @param {Number} x Tile coordinate x * @param {Number} y Tile coordinate y * @param {Number} z Tile zoom * @param {Object} [options] * @param {String} [options.format='image/png'] * @param {String} [options.service='WMS'] * @param {String} [options.version='1.1.1'] * @param {String} [options.request='GetMap'] * @param {String} [options.srs='EPSG:3857'] * @param {Number} [options.width='256'] * @param {Number} [options.height='256'] * @returns {String} url * @example * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015'; * var layer = 'Natural2015'; * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19); */ function getURL(baseUrl, layer, x, y, z, options) { options = options || {}; var url = baseUrl + '?' + [ 'bbox=' + getTileBBox(x, y, z), 'format=' + (options.format || 'image/png'), 'service=' + (options.service || 'WMS'), 'version=' + (options.version || '1.1.1'), 'request=' + (options.request || 'GetMap'), 'srs=' + (options.srs || 'EPSG:3857'), 'width=' + (options.width || 256), 'height=' + (options.height || 256), 'layers=' + layer ].join('&'); return url; } /** * getTileBBox * * @param {Number} x Tile coordinate x * @param {Number} y Tile coordinate y * @param {Number} z Tile zoom * @returns {String} String of the bounding box */ function getTileBBox(x, y, z) { // for Google/OSM tile scheme we need to alter the y y = (Math.pow(2, z) - y - 1); var min = getMercCoords(x * 256, y * 256, z), max = getMercCoords((x + 1) * 256, (y + 1) * 256, z); return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1]; } /** * getMercCoords * * @param {Number} x Pixel coordinate x * @param {Number} y Pixel coordinate y * @param {Number} z Tile zoom * @returns {Array} [x, y] */ function getMercCoords(x, y, z) { var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z), merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0), merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0); return [merc_x, merc_y]; } // /** * A `LngLatBounds` object represents a geographical bounding box, * defined by its southwest and northeast points in longitude and latitude. * * If no arguments are provided to the constructor, a `null` bounding box is created. * * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option * can also accept an `Array` of two {@link LngLatLike} constructs and will perform an implicit conversion. * This flexible type is documented as {@link LngLatBoundsLike}. * * @param {LngLatLike} [sw] The southwest corner of the bounding box. * @param {LngLatLike} [ne] The northeast corner of the bounding box. * @example * var sw = new mapboxgl.LngLat(-73.9876, 40.7661); * var ne = new mapboxgl.LngLat(-73.9397, 40.8002); * var llb = new mapboxgl.LngLatBounds(sw, ne); */ var LngLatBounds = function LngLatBounds(sw , ne ) { if (!sw) { // noop } else if (ne) { this.setSouthWest(sw).setNorthEast(ne); } else if (sw.length === 4) { this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]); } else { this.setSouthWest(sw[0]).setNorthEast(sw[1]); } }; /** * Set the northeast corner of the bounding box * * @param {LngLatLike} ne a {@link LngLatLike} object describing the northeast corner of the bounding box. * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setNorthEast = function setNorthEast (ne ) { this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne); return this; }; /** * Set the southwest corner of the bounding box * * @param {LngLatLike} sw a {@link LngLatLike} object describing the southwest corner of the bounding box. * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.setSouthWest = function setSouthWest (sw ) { this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw); return this; }; /** * Extend the bounds to include a given LngLatLike or LngLatBoundsLike. * * @param {LngLatLike|LngLatBoundsLike} obj object to extend to * @returns {LngLatBounds} `this` */ LngLatBounds.prototype.extend = function extend (obj ) { var sw = this._sw, ne = this._ne; var sw2, ne2; if (obj instanceof LngLat) { sw2 = obj; ne2 = obj; } else if (obj instanceof LngLatBounds) { sw2 = obj._sw; ne2 = obj._ne; if (!sw2 || !ne2) { return this; } } else { if (Array.isArray(obj)) { if (obj.length === 4 || obj.every(Array.isArray)) { var lngLatBoundsObj = ((obj ) ); return this.extend(LngLatBounds.convert(lngLatBoundsObj)); } else { var lngLatObj = ((obj ) ); return this.extend(LngLat.convert(lngLatObj)); } } return this; } if (!sw && !ne) { this._sw = new LngLat(sw2.lng, sw2.lat); this._ne = new LngLat(ne2.lng, ne2.lat); } else { sw.lng = Math.min(sw2.lng, sw.lng); sw.lat = Math.min(sw2.lat, sw.lat); ne.lng = Math.max(ne2.lng, ne.lng); ne.lat = Math.max(ne2.lat, ne.lat); } return this; }; /** * Returns the geographical coordinate equidistant from the bounding box's corners. * * @returns {LngLat} The bounding box's center. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315} */ LngLatBounds.prototype.getCenter = function getCenter () { return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2); }; /** * Returns the southwest corner of the bounding box. * * @returns {LngLat} The southwest corner of the bounding box. */ LngLatBounds.prototype.getSouthWest = function getSouthWest () { return this._sw; }; /** * Returns the northeast corner of the bounding box. * * @returns {LngLat} The northeast corner of the bounding box. */ LngLatBounds.prototype.getNorthEast = function getNorthEast () { return this._ne; }; /** * Returns the northwest corner of the bounding box. * * @returns {LngLat} The northwest corner of the bounding box. */ LngLatBounds.prototype.getNorthWest = function getNorthWest () { return new LngLat(this.getWest(), this.getNorth()); }; /** * Returns the southeast corner of the bounding box. * * @returns {LngLat} The southeast corner of the bounding box. */ LngLatBounds.prototype.getSouthEast = function getSouthEast () { return new LngLat(this.getEast(), this.getSouth()); }; /** * Returns the west edge of the bounding box. * * @returns {number} The west edge of the bounding box. */ LngLatBounds.prototype.getWest = function getWest () { return this._sw.lng; }; /** * Returns the south edge of the bounding box. * * @returns {number} The south edge of the bounding box. */ LngLatBounds.prototype.getSouth = function getSouth () { return this._sw.lat; }; /** * Returns the east edge of the bounding box. * * @returns {number} The east edge of the bounding box. */ LngLatBounds.prototype.getEast = function getEast () { return this._ne.lng; }; /** * Returns the north edge of the bounding box. * * @returns {number} The north edge of the bounding box. */ LngLatBounds.prototype.getNorth = function getNorth () { return this._ne.lat; }; /** * Returns the bounding box represented as an array. * * @returns {Array>} The bounding box represented as an array, consisting of the * southwest and northeast coordinates of the bounding represented as arrays of numbers. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]] */ LngLatBounds.prototype.toArray = function toArray () { return [this._sw.toArray(), this._ne.toArray()]; }; /** * Return the bounding box represented as a string. * * @returns {string} The bounding box represents as a string of the format * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`. * @example * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); * llb.toString(); // = "LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))" */ LngLatBounds.prototype.toString = function toString () { return ("LngLatBounds(" + (this._sw.toString()) + ", " + (this._ne.toString()) + ")"); }; /** * Check if the bounding box is an empty/`null`-type box. * * @returns {boolean} True if bounds have been defined, otherwise false. */ LngLatBounds.prototype.isEmpty = function isEmpty () { return !(this._sw && this._ne); }; /** * Check if the point is within the bounding box. * * @param {LngLatLike} lnglat geographic point to check against. * @returns {boolean} True if the point is within the bounding box. * @example * var llb = new mapboxgl.LngLatBounds( * new mapboxgl.LngLat(-73.9876, 40.7661), * new mapboxgl.LngLat(-73.9397, 40.8002) * ); * * var ll = new mapboxgl.LngLat(-73.9567, 40.7789); * * console.log(llb.contains(ll)); // = true */ LngLatBounds.prototype.contains = function contains (lnglat ) { var ref = LngLat.convert(lnglat); var lng = ref.lng; var lat = ref.lat; var containsLatitude = this._sw.lat <= lat && lat <= this._ne.lat; var containsLongitude = this._sw.lng <= lng && lng <= this._ne.lng; if (this._sw.lng > this._ne.lng) { // wrapped coordinates containsLongitude = this._sw.lng >= lng && lng >= this._ne.lng; } return containsLatitude && containsLongitude; }; /** * Converts an array to a `LngLatBounds` object. * * If a `LngLatBounds` object is passed in, the function returns it unchanged. * * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values. * * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return. * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object. * @example * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; * var llb = mapboxgl.LngLatBounds.convert(arr); * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} */ LngLatBounds.convert = function convert (input ) { if (!input || input instanceof LngLatBounds) { return input; } return new LngLatBounds(input); }; // /* * Approximate radius of the earth in meters. * Uses the WGS-84 approximation. The radius at the equator is ~6378137 and at the poles is ~6356752. https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84 * 6371008.8 is one published "average radius" see https://en.wikipedia.org/wiki/Earth_radius#Mean_radius, or ftp://athena.fsv.cvut.cz/ZFG/grs80-Moritz.pdf p.4 */ var earthRadius = 6371008.8; /** * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees. * These coordinates are based on the [WGS84 (EPSG:4326) standard](https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84). * * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match the * [GeoJSON specification](https://tools.ietf.org/html/rfc7946). * * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option * can also accept an `Array` of two numbers and will perform an implicit conversion. * This flexible type is documented as {@link LngLatLike}. * * @param {number} lng Longitude, measured in degrees. * @param {number} lat Latitude, measured in degrees. * @example * var ll = new mapboxgl.LngLat(-123.9749, 40.7736); * ll.lng; // = -123.9749 * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) */ var LngLat = function LngLat(lng , lat ) { if (isNaN(lng) || isNaN(lat)) { throw new Error(("Invalid LngLat object: (" + lng + ", " + lat + ")")); } this.lng = +lng; this.lat = +lat; // if (this.lat > 90 || this.lat < -90) { // throw new Error('Invalid LngLat latitude value: must be between -90 and 90'); // } }; /** * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180). * * @returns {LngLat} The wrapped `LngLat` object. * @example * var ll = new mapboxgl.LngLat(286.0251, 40.7736); * var wrapped = ll.wrap(); * wrapped.lng; // = -73.9749 */ LngLat.prototype.wrap = function wrap$1 () { return new LngLat(wrap(this.lng, -180, 180), this.lat); }; /** * Returns the coordinates represented as an array of two numbers. * * @returns {Array} The coordinates represeted as an array of longitude and latitude. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toArray(); // = [-73.9749, 40.7736] */ LngLat.prototype.toArray = function toArray () { return [this.lng, this.lat]; }; /** * Returns the coordinates represent as a string. * * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toString(); // = "LngLat(-73.9749, 40.7736)" */ LngLat.prototype.toString = function toString () { return ("LngLat(" + (this.lng) + ", " + (this.lat) + ")"); }; /** * Returns the approximate distance between a pair of coordinates in meters * Uses the Haversine Formula (from R.W. Sinnott, "Virtues of the Haversine", Sky and Telescope, vol. 68, no. 2, 1984, p. 159) * * @param {LngLat} lngLat coordinates to compute the distance to * @returns {number} Distance in meters between the two coordinates. * @example * var new_york = new mapboxgl.LngLat(-74.0060, 40.7128); * var los_angeles = new mapboxgl.LngLat(-118.2437, 34.0522); * new_york.distanceTo(los_angeles); // = 3935751.690893987, "true distance" using a non-spherical approximation is ~3966km */ LngLat.prototype.distanceTo = function distanceTo (lngLat ) { var rad = Math.PI / 180; var lat1 = this.lat * rad; var lat2 = lngLat.lat * rad; var a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat.lng - this.lng) * rad); var maxMeters = earthRadius * Math.acos(Math.min(a, 1)); return maxMeters; }; /** * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. The returned `LngLatBounds` completely contains the `radius`. * * @param {number} [radius=0] Distance in meters from the coordinates to extend the bounds. * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`. * @example * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]] */ LngLat.prototype.toBounds = function toBounds (radius) { if ( radius === void 0 ) radius = 0; var earthCircumferenceInMetersAtEquator = 40075017; var latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); return new LngLatBounds(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy)); }; /** * Converts an array of two numbers or an object with `lng` and `lat` or `lon` and `lat` properties * to a `LngLat` object. * * If a `LngLat` object is passed in, the function returns it unchanged. * * @param {LngLatLike} input An array of two numbers or object to convert, or a `LngLat` object to return. * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object. * @example * var arr = [-73.9749, 40.7736]; * var ll = mapboxgl.LngLat.convert(arr); * ll; // = LngLat {lng: -73.9749, lat: 40.7736} */ LngLat.convert = function convert (input ) { if (input instanceof LngLat) { return input; } if (Array.isArray(input) && (input.length === 2 || input.length === 3)) { return new LngLat(Number(input[0]), Number(input[1])); } if (!Array.isArray(input) && typeof input === 'object' && input !== null) { return new LngLat( // flow can't refine this to have one of lng or lat, so we have to cast to any Number('lng' in input ? (input ).lng : (input ).lon), Number(input.lat) ); } throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]"); }; // /* * The average circumference of the world in meters. */ var earthCircumfrence = 2 * Math.PI * earthRadius; // meters /* * The circumference at a line of latitude in meters. */ function circumferenceAtLatitude(latitude ) { return earthCircumfrence * Math.cos(latitude * Math.PI / 180); } function mercatorXfromLng$1(lng ) { return (180 + lng) / 360; } function mercatorYfromLat$1(lat ) { return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; } function mercatorZfromAltitude(altitude , lat ) { return altitude / circumferenceAtLatitude(lat); } function lngFromMercatorX(x ) { return x * 360 - 180; } function latFromMercatorY(y ) { var y2 = 180 - y * 360; return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; } function altitudeFromMercatorZ(z , y ) { return z * circumferenceAtLatitude(latFromMercatorY(y)); } /** * Determine the Mercator scale factor for a given latitude, see * https://en.wikipedia.org/wiki/Mercator_projection#Scale_factor * * At the equator the scale factor will be 1, which increases at higher latitudes. * * @param {number} lat Latitude * @returns {number} scale factor * @private */ function mercatorScale(lat ) { return 1 / Math.cos(lat * Math.PI / 180); } /** * A `MercatorCoordinate` object represents a projected three dimensional position. * * `MercatorCoordinate` uses the web mercator projection ([EPSG:3857](https://epsg.io/3857)) with slightly different units: * - the size of 1 unit is the width of the projected world instead of the "mercator meter" * - the origin of the coordinate space is at the north-west corner instead of the middle * * For example, `MercatorCoordinate(0, 0, 0)` is the north-west corner of the mercator world and * `MercatorCoordinate(1, 1, 0)` is the south-east corner. If you are familiar with * [vector tiles](https://github.com/mapbox/vector-tile-spec) it may be helpful to think * of the coordinate space as the `0/0/0` tile with an extent of `1`. * * The `z` dimension of `MercatorCoordinate` is conformal. A cube in the mercator coordinate space would be rendered as a cube. * * @param {number} x The x component of the position. * @param {number} y The y component of the position. * @param {number} z The z component of the position. * @example * var nullIsland = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); * * @see [Add a custom style layer](https://www.mapbox.com/mapbox-gl-js/example/custom-style-layer/) */ var MercatorCoordinate = function MercatorCoordinate(x , y , z) { if ( z === void 0 ) z = 0; this.x = +x; this.y = +y; this.z = +z; }; /** * Project a `LngLat` to a `MercatorCoordinate`. * * @param {LngLatLike} lngLatLike The location to project. * @param {number} altitude The altitude in meters of the position. * @returns {MercatorCoordinate} The projected mercator coordinate. * @example * var coord = mapboxgl.MercatorCoordinate.fromLngLat({ lng: 0, lat: 0}, 0); * coord; // MercatorCoordinate(0.5, 0.5, 0) */ MercatorCoordinate.fromLngLat = function fromLngLat (lngLatLike , altitude) { if ( altitude === void 0 ) altitude = 0; var lngLat = LngLat.convert(lngLatLike); return new MercatorCoordinate( mercatorXfromLng$1(lngLat.lng), mercatorYfromLat$1(lngLat.lat), mercatorZfromAltitude(altitude, lngLat.lat)); }; /** * Returns the `LngLat` for the coordinate. * * @returns {LngLat} The `LngLat` object. * @example * var coord = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); * var lngLat = coord.toLngLat(); // LngLat(0, 0) */ MercatorCoordinate.prototype.toLngLat = function toLngLat () { return new LngLat( lngFromMercatorX(this.x), latFromMercatorY(this.y)); }; /** * Returns the altitude in meters of the coordinate. * * @returns {number} The altitude in meters. * @example * var coord = new mapboxgl.MercatorCoordinate(0, 0, 0.02); * coord.toAltitude(); // 6914.281956295339 */ MercatorCoordinate.prototype.toAltitude = function toAltitude () { return altitudeFromMercatorZ(this.z, this.y); }; /** * Returns the distance of 1 meter in `MercatorCoordinate` units at this latitude. * * For coordinates in real world units using meters, this naturally provides the scale * to transform into `MercatorCoordinate`s. * * @returns {number} Distance of 1 meter in `MercatorCoordinate` units. */ MercatorCoordinate.prototype.meterInMercatorCoordinateUnits = function meterInMercatorCoordinateUnits () { // 1 meter / circumference at equator in meters * Mercator projection scale factor at this latitude return 1 / earthCircumfrence * mercatorScale(latFromMercatorY(this.y)); }; // var CanonicalTileID = function CanonicalTileID(z , x , y , indexExtent ) { assert_1(z >= 0 && z <= 25); assert_1(x >= 0 && x < Math.pow(2, z)); assert_1(y >= 0 && y < Math.pow(2, z)); this.z = z; this.x = x; this.y = y; this.key = calculateKey(0, z, z, x, y); if(indexExtent){ this.indexExtent = indexExtent; this.worldWidth = indexExtent[2] - indexExtent[0]; this.worldHeight = indexExtent[3] - indexExtent[1]; } }; CanonicalTileID.prototype.equals = function equals (id ) { return this.z === id.z && this.x === id.x && this.y === id.y; }; CanonicalTileID.prototype.getTileBBox = function getTileBBox () { var a = Math.pow(2, this.z); return ((this.indexExtent[0] + (this.worldWidth * this.x) / a) + "," + (this.indexExtent[3] - (this.worldHeight * (this.y + 1)) / a) + "," + (this.indexExtent[0] + (this.worldWidth * (this.x + 1)) / a) + "," + (this.indexExtent[3] - (this.worldHeight * this.y) / a)); }; // given a list of urls, choose a url template and return a tile URL CanonicalTileID.prototype.url = function url (urls , scheme , r , tileSize , scale ) { var bbox = this.getTileBBox(); var quadkey = getQuadkey(this.z, this.x, this.y); r = r || 0; var u = urls[(this.x + this.y) % urls.length] .replace( "{prefix}", (this.x % 16).toString(16) + (this.y % 16).toString(16) ) .replace("{z}", String(this.z - r)) //iclient .replace("{x}", String(this.x)) .replace( "{y}", String( scheme === "tms" ? Math.pow(2, this.z) - this.y - 1 : this.y ) ) .replace("{quadkey}", quadkey) .replace("{bbox-epsg-3857}", bbox) .replace("{bbox}", bbox) .replace("{width}", tileSize) .replace("{height}", tileSize); if (this.getViewBounds) { var b = this.getViewBounds(); if (b) { u = u.replace("{viewBounds}", b); } } if (this.getTileBBoxReverseXY){ var t = this.getTileBBoxReverseXY(); if(t){ u = u.replace("{bbox-wms-1.3.0}", t); } } if (scale) { u = u.replace("{scale}", scale); } return u; }; CanonicalTileID.prototype.getTilePoint = function getTilePoint (coord ) { var tilesAtZoom = Math.pow(2, this.z); return new pointGeometry( (coord.x * tilesAtZoom - this.x) * EXTENT$1, (coord.y * tilesAtZoom - this.y) * EXTENT$1 ); }; CanonicalTileID.prototype.toString = function toString () { return ((this.z) + "/" + (this.x) + "/" + (this.y)); }; CanonicalTileID.prototype.getTileBBoxReverseXY = function getTileBBoxReverseXY () { var a = Math.pow(2, this.z); return ((this.indexExtent[3] - (this.worldHeight * (this.y + 1)) / a) + "," + (this.indexExtent[0] + (this.worldWidth * this.x) / a) + "," + (this.indexExtent[3] - (this.worldHeight * this.y) / a) + "," + (this.indexExtent[0] + (this.worldWidth * (this.x + 1)) / a)); }; CanonicalTileID.prototype.getViewBounds = function getViewBounds () { var a = Math.pow(2, this.z); return ("{\"leftBottom\":{\"x\":" + (this.indexExtent[0] + (this.worldWidth * this.x) / a) + ",\"y\":" + (this.indexExtent[3] - (this.worldHeight * (this.y + 1)) / a) + "},\"rightTop\":{\"x\":" + (this.indexExtent[0] + (this.worldWidth * (this.x + 1)) / a) + ",\"y\": " + (this.indexExtent[3] - (this.worldHeight * this.y) / a) + "}}"); }; var UnwrappedTileID = function UnwrappedTileID(wrap , canonical ) { this.wrap = wrap; this.canonical = canonical; this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y); }; var OverscaledTileID = function OverscaledTileID(overscaledZ , wrap , z , x , y , indexExtent ) { assert_1(overscaledZ >= z); this.overscaledZ = overscaledZ; this.wrap = wrap; this.canonical = new CanonicalTileID(z, +x, +y, indexExtent); this.key = calculateKey(wrap, overscaledZ, z, x, y); }; OverscaledTileID.prototype.equals = function equals (id ) { return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical); }; OverscaledTileID.prototype.scaledTo = function scaledTo (targetZ ) { assert_1(targetZ <= this.overscaledZ); var zDifference = this.canonical.z - targetZ; if (targetZ > this.canonical.z) { return new OverscaledTileID(targetZ, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y, this.canonical.indexExtent); } else { return new OverscaledTileID(targetZ, this.wrap, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference, this.canonical.indexExtent); } }; /* * calculateScaledKey is an optimization: * when withWrap == true, implements the same as this.scaledTo(z).key, * when withWrap == false, implements the same as this.scaledTo(z).wrapped().key. */ OverscaledTileID.prototype.calculateScaledKey = function calculateScaledKey (targetZ , withWrap ) { assert_1(targetZ <= this.overscaledZ); var zDifference = this.canonical.z - targetZ; if (targetZ > this.canonical.z) { return calculateKey(this.wrap * +withWrap, targetZ, this.canonical.z, this.canonical.x, this.canonical.y); } else { return calculateKey(this.wrap * +withWrap, targetZ, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); } }; OverscaledTileID.prototype.isChildOf = function isChildOf (parent ) { if (parent.wrap !== this.wrap) { // We can't be a child if we're in a different world copy return false; } var zDifference = this.canonical.z - parent.canonical.z; // We're first testing for z == 0, to avoid a 32 bit shift, which is undefined. return parent.overscaledZ === 0 || ( parent.overscaledZ < this.overscaledZ && parent.canonical.x === (this.canonical.x >> zDifference) && parent.canonical.y === (this.canonical.y >> zDifference)); }; OverscaledTileID.prototype.children = function children (sourceMaxZoom ) { if (this.overscaledZ >= sourceMaxZoom) { // return a single tile coord representing a an overscaled tile return [new OverscaledTileID(this.overscaledZ + 1, this.wrap, this.canonical.z, this.canonical.x, this.canonical.y, this.canonical.indexExtent)]; } var z = this.canonical.z + 1; var x = this.canonical.x * 2; var y = this.canonical.y * 2; return [ new OverscaledTileID(z, this.wrap, z, x, y, this.canonical.indexExtent), new OverscaledTileID(z, this.wrap, z, x + 1, y, this.canonical.indexExtent), new OverscaledTileID(z, this.wrap, z, x, y + 1, this.canonical.indexExtent), new OverscaledTileID(z, this.wrap, z, x + 1, y + 1, this.canonical.indexExtent) ]; }; OverscaledTileID.prototype.isLessThan = function isLessThan (rhs ) { if (this.wrap < rhs.wrap) { return true; } if (this.wrap > rhs.wrap) { return false; } if (this.overscaledZ < rhs.overscaledZ) { return true; } if (this.overscaledZ > rhs.overscaledZ) { return false; } if (this.canonical.x < rhs.canonical.x) { return true; } if (this.canonical.x > rhs.canonical.x) { return false; } if (this.canonical.y < rhs.canonical.y) { return true; } return false; }; OverscaledTileID.prototype.wrapped = function wrapped () { return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y, this.canonical.indexExtent); }; OverscaledTileID.prototype.unwrapTo = function unwrapTo (wrap ) { return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y, this.canonical.indexExtent); }; OverscaledTileID.prototype.overscaleFactor = function overscaleFactor () { return Math.pow(2, this.overscaledZ - this.canonical.z); }; OverscaledTileID.prototype.toUnwrapped = function toUnwrapped () { return new UnwrappedTileID(this.wrap, this.canonical); }; OverscaledTileID.prototype.toString = function toString () { return ((this.overscaledZ) + "/" + (this.canonical.x) + "/" + (this.canonical.y)); }; OverscaledTileID.prototype.getTilePoint = function getTilePoint (coord ) { return this.canonical.getTilePoint(new MercatorCoordinate(coord.x - this.wrap, coord.y)); }; function calculateKey(wrap , overscaledZ , z , x , y ) { wrap *= 2; if (wrap < 0) { wrap = wrap * -1 - 1; } var dim = 1 << z; return (dim * dim * wrap + dim * y + x).toString(36) + z.toString(36) + overscaledZ.toString(36); } function getQuadkey(z, x, y) { var quadkey = '', mask; for (var i = z; i > 0; i--) { mask = 1 << (i - 1); quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0)); } return quadkey; } register('CanonicalTileID', CanonicalTileID); register('OverscaledTileID', OverscaledTileID, {omit: ['posMatrix']}); // // DEMData is a data structure for decoding, backfilling, and storing elevation data for processing in the hillshade shaders // data can be populated either from a pngraw image tile or from serliazed data sent back from a worker. When data is initially // loaded from a image tile, we decode the pixel values using the appropriate decoding formula, but we store the // elevation data as an Int32 value. we add 65536 (2^16) to eliminate negative values and enable the use of // integer overflow when creating the texture used in the hillshadePrepare step. // DEMData also handles the backfilling of data from a tile's neighboring tiles. This is necessary because we use a pixel's 8 // surrounding pixel values to compute the slope at that pixel, and we cannot accurately calculate the slope at pixels on a // tile's edge without backfilling from neighboring tiles. var DEMData = function DEMData(uid , data , encoding ) { this.uid = uid; if (data.height !== data.width) { throw new RangeError('DEM tiles must be square'); } if (encoding && encoding !== "mapbox" && encoding !== "terrarium") { return warnOnce( ("\"" + encoding + "\" is not a valid encoding type. Valid types include \"mapbox\" and \"terrarium\".") ); } this.stride = data.height; var dim = this.dim = data.height - 2; this.data = new Uint32Array(data.data.buffer); this.encoding = encoding || 'mapbox'; // in order to avoid flashing seams between tiles, here we are initially populating a 1px border of pixels around the image // with the data of the nearest pixel from the image. this data is eventually replaced when the tile's neighboring // tiles are loaded and the accurate data can be backfilled using DEMData#backfillBorder for (var x = 0; x < dim; x++) { // left vertical border this.data[this._idx(-1, x)] = this.data[this._idx(0, x)]; // right vertical border this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)]; // left horizontal border this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)]; // right horizontal border this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)]; } // corners this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)]; this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)]; this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)]; this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)]; }; DEMData.prototype.get = function get (x , y ) { var pixels = new Uint8Array(this.data.buffer); var index = this._idx(x, y) * 4; var unpack = this.encoding === "terrarium" ? this._unpackTerrarium : this._unpackMapbox; return unpack(pixels[index], pixels[index + 1], pixels[index + 2]); }; DEMData.prototype.getUnpackVector = function getUnpackVector () { return this.encoding === "terrarium" ? [256.0, 1.0, 1.0 / 256.0, 32768.0] : [6553.6, 25.6, 0.1, 10000.0]; }; DEMData.prototype._idx = function _idx (x , y ) { if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) { throw new RangeError('out of range source coordinates for DEM data'); } return (y + 1) * this.stride + (x + 1); }; DEMData.prototype._unpackMapbox = function _unpackMapbox (r , g , b ) { // unpacking formula for mapbox.terrain-rgb: // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0); }; DEMData.prototype._unpackTerrarium = function _unpackTerrarium (r , g , b ) { // unpacking formula for mapzen terrarium: // https://aws.amazon.com/public-datasets/terrain/ return ((r * 256 + g + b / 256) - 32768.0); }; DEMData.prototype.getPixels = function getPixels () { return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer)); }; DEMData.prototype.backfillBorder = function backfillBorder (borderTile , dx , dy ) { if (this.dim !== borderTile.dim) { throw new Error('dem dimension mismatch'); } var xMin = dx * this.dim, xMax = dx * this.dim + this.dim, yMin = dy * this.dim, yMax = dy * this.dim + this.dim; switch (dx) { case -1: xMin = xMax - 1; break; case 1: xMax = xMin + 1; break; } switch (dy) { case -1: yMin = yMax - 1; break; case 1: yMax = yMin + 1; break; } var ox = -dx * this.dim; var oy = -dy * this.dim; for (var y = yMin; y < yMax; y++) { for (var x = xMin; x < xMax; x++) { this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)]; } } }; register('DEMData', DEMData); // /** * The `Bucket` interface is the single point of knowledge about turning vector * tiles into WebGL buffers. * * `Bucket` is an abstract interface. An implementation exists for each style layer type. * Create a bucket via the `StyleLayer#createBucket` method. * * The concrete bucket types, using layout options from the style layer, * transform feature geometries into vertex and index data for use by the * vertex shader. They also (via `ProgramConfiguration`) use feature * properties and the zoom level to populate the attributes needed for * data-driven styling. * * Buckets are designed to be built on a worker thread and then serialized and * transferred back to the main thread for rendering. On the worker side, a * bucket's vertex, index, and attribute data is stored in `bucket.arrays: * ArrayGroup`. When a bucket's data is serialized and sent back to the main * thread, is gets deserialized (using `new Bucket(serializedBucketData)`, with * the array data now stored in `bucket.buffers: BufferGroup`. BufferGroups * hold the same data as ArrayGroups, but are tuned for consumption by WebGL. * * @private */ function deserialize$1(input , style ) { var output = {}; // Guard against the case where the map's style has been set to null while // this bucket has been parsing. if (!style) { return output; } var loop = function () { var bucket = list$1[i$1]; var layers = bucket.layerIds .map(function (id) { return style.getLayer(id); }) .filter(Boolean); if (layers.length === 0) { return; } // look up StyleLayer objects from layer ids (since we don't // want to waste time serializing/copying them from the worker) (bucket ).layers = layers; if ((bucket ).stateDependentLayerIds) { (bucket ).stateDependentLayers = (bucket ).stateDependentLayerIds.map(function (lId) { return layers.filter(function (l) { return l.id === lId; })[0]; }); } for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; output[layer.id] = bucket; } }; for (var i$1 = 0, list$1 = input; i$1 < list$1.length; i$1 += 1) loop(); return output; } // strict var DictionaryCoder = function DictionaryCoder(strings ) { this._stringToNumber = {}; this._numberToString = []; for (var i = 0; i < strings.length; i++) { var string = strings[i]; this._stringToNumber[string] = i; this._numberToString[i] = string; } }; DictionaryCoder.prototype.encode = function encode (string ) { assert_1(string in this._stringToNumber); return this._stringToNumber[string]; }; DictionaryCoder.prototype.decode = function decode (n ) { assert_1(n < this._numberToString.length); return this._numberToString[n]; }; // var Feature = function Feature(vectorTileFeature , z , x , y , id ) { this.type = 'Feature'; this._vectorTileFeature = vectorTileFeature; (vectorTileFeature )._z = z; (vectorTileFeature )._x = x; (vectorTileFeature )._y = y; this.properties = vectorTileFeature.properties; this.id = id; }; var prototypeAccessors$1 = { geometry: { configurable: true } }; prototypeAccessors$1.geometry.get = function () { if (this._geometry === undefined) { this._geometry = this._vectorTileFeature.toGeoJSON( (this._vectorTileFeature )._x, (this._vectorTileFeature )._y, (this._vectorTileFeature )._z, Feature.toLngLat).geometry; } return this._geometry; }; prototypeAccessors$1.geometry.set = function (g ) { this._geometry = g; }; Feature.prototype.toJSON = function toJSON () { var json = { geometry: this.geometry }; for (var i in this) { if (i === '_geometry' || i === '_vectorTileFeature') { continue; } json[i] = (this )[i]; } return json; }; Object.defineProperties( Feature.prototype, prototypeAccessors$1 ); // /** * SourceFeatureState manages the state and pending changes * to features in a source, separated by source layer. * stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively) * between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's * list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations. * In deletedStates, all null's denote complete removal of state at that scope * @private */ var SourceFeatureState = function SourceFeatureState() { this.state = {}; this.stateChanges = {}; this.deletedStates = {}; }; SourceFeatureState.prototype.updateState = function updateState (sourceLayer , featureId , newState ) { var feature = String(featureId); this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {}; this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {}; extend(this.stateChanges[sourceLayer][feature], newState); if (this.deletedStates[sourceLayer] === null) { this.deletedStates[sourceLayer] = {}; for (var ft in this.state[sourceLayer]) { if (ft !== feature) { this.deletedStates[sourceLayer][ft] = null; } } } else { var featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null; if (featureDeletionQueued) { this.deletedStates[sourceLayer][feature] = {}; for (var prop in this.state[sourceLayer][feature]) { if (!newState[prop]) { this.deletedStates[sourceLayer][feature][prop] = null; } } } else { for (var key in newState) { var deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null; if (deletionInQueue) { delete this.deletedStates[sourceLayer][feature][key]; } } } } }; SourceFeatureState.prototype.removeFeatureState = function removeFeatureState (sourceLayer , featureId , key ) { var sourceLayerDeleted = this.deletedStates[sourceLayer] === null; if (sourceLayerDeleted) { return; } var feature = String(featureId); this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {}; if (key && featureId !== undefined) { if (this.deletedStates[sourceLayer][feature] !== null) { this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {}; this.deletedStates[sourceLayer][feature][key] = null; } } else if (featureId !== undefined) { var updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature]; if (updateInQueue) { this.deletedStates[sourceLayer][feature] = {}; for (key in this.stateChanges[sourceLayer][feature]) { this.deletedStates[sourceLayer][feature][key] = null; } } else { this.deletedStates[sourceLayer][feature] = null; } } else { this.deletedStates[sourceLayer] = null; } }; SourceFeatureState.prototype.getState = function getState (sourceLayer , featureId ) { var feature = String(featureId); var base = this.state[sourceLayer] || {}; var changes = this.stateChanges[sourceLayer] || {}; var reconciledState = extend({}, base[feature], changes[feature]); //return empty object if the whole source layer is awaiting deletion if (this.deletedStates[sourceLayer] === null) { return {}; } else if (this.deletedStates[sourceLayer]) { var featureDeletions = this.deletedStates[sourceLayer][featureId]; if (featureDeletions === null) { return {}; } for (var prop in featureDeletions) { delete reconciledState[prop]; } } return reconciledState; }; SourceFeatureState.prototype.initializeTileState = function initializeTileState (tile , painter ) { tile.setFeatureState(this.state, painter); }; SourceFeatureState.prototype.coalesceChanges = function coalesceChanges (tiles , painter ) { //track changes with full state objects, but only for features that got modified var featuresChanged = {}; for (var sourceLayer in this.stateChanges) { this.state[sourceLayer] = this.state[sourceLayer] || {}; var layerStates = {}; for (var feature in this.stateChanges[sourceLayer]) { if (!this.state[sourceLayer][feature]) { this.state[sourceLayer][feature] = {}; } extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]); layerStates[feature] = this.state[sourceLayer][feature]; } featuresChanged[sourceLayer] = layerStates; } for (var sourceLayer$1 in this.deletedStates) { this.state[sourceLayer$1] = this.state[sourceLayer$1] || {}; var layerStates$1 = {}; if (this.deletedStates[sourceLayer$1] === null) { for (var ft in this.state[sourceLayer$1]) { layerStates$1[ft] = {}; this.state[sourceLayer$1][ft] = {}; } } else { for (var feature$1 in this.deletedStates[sourceLayer$1]) { var deleteWholeFeatureState = this.deletedStates[sourceLayer$1][feature$1] === null; if (deleteWholeFeatureState) { this.state[sourceLayer$1][feature$1] = {}; } else { for (var i = 0, list = Object.keys(this.deletedStates[sourceLayer$1][feature$1]); i < list.length; i += 1) { var key = list[i]; delete this.state[sourceLayer$1][feature$1][key]; } } layerStates$1[feature$1] = this.state[sourceLayer$1][feature$1]; } } featuresChanged[sourceLayer$1] = featuresChanged[sourceLayer$1] || {}; extend(featuresChanged[sourceLayer$1], layerStates$1); } this.stateChanges = {}; this.deletedStates = {}; if (Object.keys(featuresChanged).length === 0) { return; } for (var id in tiles) { var tile = tiles[id]; tile.setFeatureState(featuresChanged, painter); } }; // var FeatureIndex = function FeatureIndex(tileID , promoteId ) { this.tileID = tileID; this.x = tileID.canonical.x; this.y = tileID.canonical.y; this.z = tileID.canonical.z; this.grid = new gridIndex(EXTENT$1, 16, 0); this.grid3D = new gridIndex(EXTENT$1, 16, 0); this.featureIndexArray = new FeatureIndexArray(); this.promoteId = promoteId; }; FeatureIndex.prototype.insert = function insert (feature , geometry , featureIndex , sourceLayerIndex , bucketIndex , is3D ) { var key = this.featureIndexArray.length; this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex); var grid = is3D ? this.grid3D : this.grid; for (var r = 0; r < geometry.length; r++) { var ring = geometry[r]; var bbox = [Infinity, Infinity, -Infinity, -Infinity]; for (var i = 0; i < ring.length; i++) { var p = ring[i]; bbox[0] = Math.min(bbox[0], p.x); bbox[1] = Math.min(bbox[1], p.y); bbox[2] = Math.max(bbox[2], p.x); bbox[3] = Math.max(bbox[3], p.y); } if (bbox[0] < EXTENT$1 && bbox[1] < EXTENT$1 && bbox[2] >= 0 && bbox[3] >= 0) { grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); } } }; FeatureIndex.prototype.loadVTLayers = function loadVTLayers () { if (!this.vtLayers) { this.vtLayers = new vectorTile.VectorTile(new pbf(this.rawTileData)).layers; this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']); } return this.vtLayers; }; // Finds non-symbol features in this tile at a particular position. FeatureIndex.prototype.query = function query (args , styleLayers , serializedLayers , sourceFeatureState ) { var this$1 = this; this.loadVTLayers(); var params = args.params || {}, pixelsToTileUnits = EXTENT$1 / args.tileSize / args.scale, filter = createFilter(params.filter); var queryGeometry = args.queryGeometry; var queryPadding = args.queryPadding * pixelsToTileUnits; var bounds = getBounds(queryGeometry); var matching = this.grid.query(bounds.minX - queryPadding, bounds.minY - queryPadding, bounds.maxX + queryPadding, bounds.maxY + queryPadding); var cameraBounds = getBounds(args.cameraQueryGeometry); var matching3D = this.grid3D.query( cameraBounds.minX - queryPadding, cameraBounds.minY - queryPadding, cameraBounds.maxX + queryPadding, cameraBounds.maxY + queryPadding, function (bx1, by1, bx2, by2) { return polygonIntersectsBox(args.cameraQueryGeometry, bx1 - queryPadding, by1 - queryPadding, bx2 + queryPadding, by2 + queryPadding); }); for (var i = 0, list = matching3D; i < list.length; i += 1) { var key = list[i]; matching.push(key); } matching.sort(topDownFeatureComparator); var result = {}; var previousIndex; var loop = function ( k ) { var index = matching[k]; // don't check the same feature more than once if (index === previousIndex) { return; } previousIndex = index; var match = this$1.featureIndexArray.get(index); var featureGeometry = null; this$1.loadMatchingFeature( result, match.bucketIndex, match.sourceLayerIndex, match.featureIndex, filter, params.layers, params.availableImages, styleLayers, serializedLayers, sourceFeatureState, function (feature , styleLayer , featureState ) { if (!featureGeometry) { featureGeometry = loadGeometry(feature); } return styleLayer.queryIntersectsFeature(queryGeometry, feature, featureState, featureGeometry, this$1.z, args.transform, pixelsToTileUnits, args.pixelPosMatrix); } ); }; for (var k = 0; k < matching.length; k++) loop( k ); return result; }; FeatureIndex.prototype.loadMatchingFeature = function loadMatchingFeature ( result , bucketIndex , sourceLayerIndex , featureIndex , filter , filterLayerIDs , availableImages , styleLayers , serializedLayers , sourceFeatureState , intersectionTest ) { var layerIDs = this.bucketLayerIDs[bucketIndex]; if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) { return; } var sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); var sourceLayer = this.vtLayers[sourceLayerName]; var feature = sourceLayer.feature(featureIndex); if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { return; } var id = this.getId(feature, sourceLayerName); for (var l = 0; l < layerIDs.length; l++) { var layerID = layerIDs[l]; if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { continue; } var styleLayer = styleLayers[layerID]; if (!styleLayer) { continue; } var featureState = {}; if (id !== undefined && sourceFeatureState) { // `feature-state` expression evaluation requires feature state to be available featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id); } var serializedLayer = serializedLayers[layerID]; serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages); serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages); var intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState); if (!intersectionZ) { // Only applied for non-symbol features continue; } var geojsonFeature = new Feature(feature, this.z, this.x, this.y, id); (geojsonFeature ).layer = serializedLayer; var layerResult = result[layerID]; if (layerResult === undefined) { layerResult = result[layerID] = []; } layerResult.push({featureIndex: featureIndex, feature: geojsonFeature, intersectionZ: intersectionZ}); } }; // Given a set of symbol indexes that have already been looked up, // return a matching set of GeoJSONFeatures FeatureIndex.prototype.lookupSymbolFeatures = function lookupSymbolFeatures (symbolFeatureIndexes , serializedLayers , bucketIndex , sourceLayerIndex , filterSpec , filterLayerIDs , availableImages , styleLayers ) { var result = {}; this.loadVTLayers(); var filter = createFilter(filterSpec); for (var i = 0, list = symbolFeatureIndexes; i < list.length; i += 1) { var symbolFeatureIndex = list[i]; this.loadMatchingFeature( result, bucketIndex, sourceLayerIndex, symbolFeatureIndex, filter, filterLayerIDs, availableImages, styleLayers, serializedLayers ); } return result; }; FeatureIndex.prototype.hasLayer = function hasLayer (id ) { for (var i$1 = 0, list$1 = this.bucketLayerIDs; i$1 < list$1.length; i$1 += 1) { var layerIDs = list$1[i$1]; for (var i = 0, list = layerIDs; i < list.length; i += 1) { var layerID = list[i]; if (id === layerID) { return true; } } } return false; }; FeatureIndex.prototype.getId = function getId (feature , sourceLayerId ) { var id = feature.id; if (this.promoteId) { var propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId]; id = feature.properties[propName]; if (typeof id === 'boolean') { id = Number(id); } } return id; }; register( 'FeatureIndex', FeatureIndex, {omit: ['rawTileData', 'sourceLayerCoder']} ); function evaluateProperties(serializedProperties, styleLayerProperties, feature, featureState, availableImages) { return mapObject(serializedProperties, function (property, key) { var prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null; return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop; }); } function getBounds(geometry ) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = geometry; i < list.length; i += 1) { var p = list[i]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } return {minX: minX, minY: minY, maxX: maxX, maxY: maxY}; } function topDownFeatureComparator(a, b) { return b - a; } // var CLOCK_SKEW_RETRY_TIMEOUT = 30000; /* Tile data was previously loaded, but has expired per its * HTTP headers and is in the process of refreshing. */ /** * A tile object is the combination of a Coordinate, which defines * its place, as well as a unique ID and data tracking for its content * * @private */ var Tile = function Tile(tileID , size ) { this.tileID = tileID; this.uid = uniqueId(); this.uses = 0; this.tileSize = size; this.buckets = {}; this.expirationTime = null; this.queryPadding = 0; this.hasSymbolBuckets = false; this.hasRTLText = false; this.dependencies = {}; // Counts the number of times a response was already expired when // received. We're using this to add a delay when making a new request // so we don't have to keep retrying immediately in case of a server // serving expired tiles. this.expiredRequestCount = 0; this.state = 'loading'; }; Tile.prototype.registerFadeDuration = function registerFadeDuration (duration ) { var fadeEndTime = duration + this.timeAdded; if (fadeEndTime < exported.now()) { return; } if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) { return; } this.fadeEndTime = fadeEndTime; }; Tile.prototype.wasRequested = function wasRequested () { return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading'; }; /** * Given a data object with a 'buffers' property, load it into * this tile's elementGroups and buffers properties and set loaded * to true. If the data is null, like in the case of an empty * GeoJSON tile, no-op but still set loaded to true. * @param {Object} data * @param painter * @returns {undefined} * @private */ Tile.prototype.loadVectorData = function loadVectorData (data , painter , justReloaded ) { if (this.hasData()) { this.unloadVectorData(); } this.state = 'loaded'; // empty GeoJSON tile if (!data) { this.collisionBoxArray = new CollisionBoxArray(); return; } if (data.featureIndex) { this.latestFeatureIndex = data.featureIndex; if (data.rawTileData) { // Only vector tiles have rawTileData, and they won't update it for // 'reloadTile' this.latestRawTileData = data.rawTileData; this.latestFeatureIndex.rawTileData = data.rawTileData; } else if (this.latestRawTileData) { // If rawTileData hasn't updated, hold onto a pointer to the last // one we received this.latestFeatureIndex.rawTileData = this.latestRawTileData; } } this.collisionBoxArray = data.collisionBoxArray; this.buckets = deserialize$1(data.buckets, painter.style); this.hasSymbolBuckets = false; for (var id in this.buckets) { var bucket = this.buckets[id]; if (bucket instanceof SymbolBucket) { this.hasSymbolBuckets = true; if (justReloaded) { bucket.justReloaded = true; } else { break; } } } this.hasRTLText = false; if (this.hasSymbolBuckets) { for (var id$1 in this.buckets) { var bucket$1 = this.buckets[id$1]; if (bucket$1 instanceof SymbolBucket) { if (bucket$1.hasRTLText) { this.hasRTLText = true; lazyLoadRTLTextPlugin(); break; } } } } this.queryPadding = 0; for (var id$2 in this.buckets) { var bucket$2 = this.buckets[id$2]; this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id$2).queryRadius(bucket$2)); } if (data.imageAtlas) { this.imageAtlas = data.imageAtlas; } if (data.glyphAtlasImage) { this.glyphAtlasImage = data.glyphAtlasImage; } }; /** * Release any data or WebGL resources referenced by this tile. * @returns {undefined} * @private */ Tile.prototype.unloadVectorData = function unloadVectorData () { for (var id in this.buckets) { this.buckets[id].destroy(); } this.buckets = {}; if (this.imageAtlasTexture) { this.imageAtlasTexture.destroy(); } if (this.imageAtlas) { this.imageAtlas = null; } if (this.glyphAtlasTexture) { this.glyphAtlasTexture.destroy(); } this.latestFeatureIndex = null; this.state = 'unloaded'; }; Tile.prototype.getBucket = function getBucket (layer ) { return this.buckets[layer.id]; }; Tile.prototype.upload = function upload (context ) { for (var id in this.buckets) { var bucket = this.buckets[id]; if (bucket.uploadPending()) { bucket.upload(context); } } var gl = context.gl; if (this.imageAtlas && !this.imageAtlas.uploaded) { this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA); this.imageAtlas.uploaded = true; } if (this.glyphAtlasImage) { this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA); this.glyphAtlasImage = null; } }; Tile.prototype.prepare = function prepare (imageManager ) { if (this.imageAtlas) { this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture); } }; // Queries non-symbol features rendered for this tile. // Symbol features are queried globally Tile.prototype.queryRenderedFeatures = function queryRenderedFeatures (layers , serializedLayers , sourceFeatureState , queryGeometry , cameraQueryGeometry , scale , params , transform , maxPitchScaleFactor , pixelPosMatrix ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) { return {}; } return this.latestFeatureIndex.query({ queryGeometry: queryGeometry, cameraQueryGeometry: cameraQueryGeometry, scale: scale, tileSize: this.tileSize, pixelPosMatrix: pixelPosMatrix, transform: transform, params: params, queryPadding: this.queryPadding * maxPitchScaleFactor }, layers, serializedLayers, sourceFeatureState); }; Tile.prototype.querySourceFeatures = function querySourceFeatures (result , params ) { var featureIndex = this.latestFeatureIndex; if (!featureIndex || !featureIndex.rawTileData) { return; } var vtLayers = featureIndex.loadVTLayers(); var sourceLayer = params ? params.sourceLayer : ''; var layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer]; if (!layer) { return; } var filter = createFilter(params && params.filter); var ref = this.tileID.canonical; var z = ref.z; var x = ref.x; var y = ref.y; var coord = {z: z, x: x, y: y}; for (var i = 0; i < layer.length; i++) { var feature = layer.feature(i); if (filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { var id = featureIndex.getId(feature, sourceLayer); var geojsonFeature = new Feature(feature, z, x, y, id); (geojsonFeature ).tile = coord; result.push(geojsonFeature); } } }; Tile.prototype.hasData = function hasData () { return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; }; Tile.prototype.patternsLoaded = function patternsLoaded () { return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length; }; Tile.prototype.setExpiryData = function setExpiryData (data ) { var prior = this.expirationTime; if (data.cacheControl) { var parsedCC = parseCacheControl(data.cacheControl); if (parsedCC['max-age']) { this.expirationTime = Date.now() + parsedCC['max-age'] * 1000; } } else if (data.expires) { this.expirationTime = new Date(data.expires).getTime(); } if (this.expirationTime) { var now = Date.now(); var isExpired = false; if (this.expirationTime > now) { isExpired = false; } else if (!prior) { isExpired = true; } else if (this.expirationTime < prior) { // Expiring date is going backwards: // fall back to exponential backoff isExpired = true; } else { var delta = this.expirationTime - prior; if (!delta) { // Server is serving the same expired resource over and over: fall // back to exponential backoff. isExpired = true; } else { // Assume that either the client or the server clock is wrong and // try to interpolate a valid expiration date (from the client POV) // observing a minimum timeout. this.expirationTime = now + Math.max(delta, CLOCK_SKEW_RETRY_TIMEOUT); } } if (isExpired) { this.expiredRequestCount++; this.state = 'expired'; } else { this.expiredRequestCount = 0; } } }; Tile.prototype.getExpiryTimeout = function getExpiryTimeout () { if (this.expirationTime) { if (this.expiredRequestCount) { return 1000 * (1 << Math.min(this.expiredRequestCount - 1, 31)); } else { // Max value for `setTimeout` implementations is a 32 bit integer; cap this accordingly return Math.min(this.expirationTime - new Date().getTime(), Math.pow(2, 31) - 1); } } }; Tile.prototype.setFeatureState = function setFeatureState (states , painter ) { if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData || Object.keys(states).length === 0) { return; } var vtLayers = this.latestFeatureIndex.loadVTLayers(); for (var id in this.buckets) { if (!painter.style.hasLayer(id)) { continue; } var bucket = this.buckets[id]; // Buckets are grouped by common source-layer var sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer'; var sourceLayer = vtLayers[sourceLayerId]; var sourceLayerStates = states[sourceLayerId]; if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) { continue; } bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas && this.imageAtlas.patternPositions || {}); var layer = painter && painter.style && painter.style.getLayer(id); if (layer) { this.queryPadding = Math.max(this.queryPadding, layer.queryRadius(bucket)); } } }; Tile.prototype.holdingForFade = function holdingForFade () { return this.symbolFadeHoldUntil !== undefined; }; Tile.prototype.symbolFadeFinished = function symbolFadeFinished () { return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < exported.now(); }; Tile.prototype.clearFadeHold = function clearFadeHold () { this.symbolFadeHoldUntil = undefined; }; Tile.prototype.setHoldDuration = function setHoldDuration (duration ) { this.symbolFadeHoldUntil = exported.now() + duration; }; Tile.prototype.setDependencies = function setDependencies (namespace , dependencies ) { var index = {}; for (var i = 0, list = dependencies; i < list.length; i += 1) { var dep = list[i]; index[dep] = true; } this.dependencies[namespace] = index; }; Tile.prototype.hasDependency = function hasDependency (namespaces , keys ) { for (var i$1 = 0, list$1 = namespaces; i$1 < list$1.length; i$1 += 1) { var namespace = list$1[i$1]; var dependencies = this.dependencies[namespace]; if (dependencies) { for (var i = 0, list = keys; i < list.length; i += 1) { var key = list[i]; if (dependencies[key]) { return true; } } } } return false; }; var refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout']; // var performance = window$1.performance; var PerformanceMarkers = { create: 'create', load: 'load', fullLoad: 'fullLoad' }; var lastFrameTime = null; var frameTimes = []; var minFramerateTarget = 30; var frameTimeTarget = 1000 / minFramerateTarget; var PerformanceUtils = { mark: function mark(marker ) { performance.mark(marker); }, frame: function frame(timestamp ) { var currTimestamp = timestamp; if (lastFrameTime != null) { var frameTime = currTimestamp - lastFrameTime; frameTimes.push(frameTime); } lastFrameTime = currTimestamp; }, clearMetrics: function clearMetrics() { lastFrameTime = null; frameTimes = []; performance.clearMeasures('loadTime'); performance.clearMeasures('fullLoadTime'); for (var marker in PerformanceMarkers) { performance.clearMarks(PerformanceMarkers[marker]); } }, getPerformanceMetrics: function getPerformanceMetrics() { var loadTime = performance.measure('loadTime', PerformanceMarkers.create, PerformanceMarkers.load).duration; var fullLoadTime = performance.measure('fullLoadTime', PerformanceMarkers.create, PerformanceMarkers.fullLoad).duration; var totalFrames = frameTimes.length; var avgFrameTime = frameTimes.reduce(function (prev, curr) { return prev + curr; }, 0) / totalFrames / 1000; var fps = 1 / avgFrameTime; // count frames that missed our framerate target var droppedFrames = frameTimes .filter(function (frameTime) { return frameTime > frameTimeTarget; }) .reduce(function (acc, curr) { return acc + (curr - frameTimeTarget) / frameTimeTarget; }, 0); var percentDroppedFrames = (droppedFrames / (totalFrames + droppedFrames)) * 100; return { loadTime: loadTime, fullLoadTime: fullLoadTime, fps: fps, percentDroppedFrames: percentDroppedFrames }; } }; /** * Safe wrapper for the performance resource timing API in web workers with graceful degradation * * @param {RequestParameters} request * @private */ var RequestPerformance = function RequestPerformance (request ) { this._marks = { start: [request.url, 'start'].join('#'), end: [request.url, 'end'].join('#'), measure: request.url.toString() }; performance.mark(this._marks.start); }; RequestPerformance.prototype.finish = function finish () { performance.mark(this._marks.end); var resourceTimingData = performance.getEntriesByName(this._marks.measure); // fallback if web worker implementation of perf.getEntriesByName returns empty if (resourceTimingData.length === 0) { performance.measure(this._marks.measure, this._marks.start, this._marks.end); resourceTimingData = performance.getEntriesByName(this._marks.measure); // cleanup performance.clearMarks(this._marks.start); performance.clearMarks(this._marks.end); performance.clearMeasures(this._marks.measure); } return resourceTimingData; }; exports.Actor = Actor; exports.AlphaImage = AlphaImage; exports.CanonicalTileID = CanonicalTileID; exports.CollisionBoxArray = CollisionBoxArray; exports.Color = Color; exports.DEMData = DEMData; exports.DataConstantProperty = DataConstantProperty; exports.DictionaryCoder = DictionaryCoder; exports.EXTENT = EXTENT$1; exports.ErrorEvent = ErrorEvent; exports.EvaluationParameters = EvaluationParameters; exports.Event = Event; exports.Evented = Evented; exports.Feature = Feature; exports.FeatureIndex = FeatureIndex; exports.FillBucket = FillBucket; exports.FillExtrusionBucket = FillExtrusionBucket; exports.ImageAtlas = ImageAtlas; exports.ImagePosition = ImagePosition; exports.LineBucket = LineBucket; exports.LngLat = LngLat; exports.LngLatBounds = LngLatBounds; exports.MercatorCoordinate = MercatorCoordinate; exports.ONE_EM = ONE_EM; exports.OverscaledTileID = OverscaledTileID; exports.PerformanceMarkers = PerformanceMarkers; exports.PerformanceUtils = PerformanceUtils; exports.Point = pointGeometry; exports.Point$1 = pointGeometry; exports.Properties = Properties; exports.Protobuf = pbf; exports.RGBAImage = RGBAImage; exports.RequestManager = RequestManager; exports.RequestPerformance = RequestPerformance; exports.ResourceType = ResourceType; exports.SegmentVector = SegmentVector; exports.SourceFeatureState = SourceFeatureState; exports.StructArrayLayout1ui2 = StructArrayLayout1ui2; exports.StructArrayLayout2f1f2i16 = StructArrayLayout2f1f2i16; exports.StructArrayLayout2i4 = StructArrayLayout2i4; exports.StructArrayLayout3ui6 = StructArrayLayout3ui6; exports.StructArrayLayout4i8 = StructArrayLayout4i8; exports.SymbolBucket = SymbolBucket; exports.Texture = Texture; exports.Tile = Tile; exports.Transitionable = Transitionable; exports.Uniform1f = Uniform1f; exports.Uniform1i = Uniform1i; exports.Uniform2f = Uniform2f; exports.Uniform3f = Uniform3f; exports.Uniform4f = Uniform4f; exports.UniformColor = UniformColor; exports.UniformMatrix4f = UniformMatrix4f; exports.UnwrappedTileID = UnwrappedTileID; exports.ValidationError = ValidationError; exports.WritingMode = WritingMode; exports.ZoomHistory = ZoomHistory; exports.add = add$5; exports.addDynamicAttributes = addDynamicAttributes; exports.aea = aea; exports.aeqd = aeqd; exports.assert = assert_1; exports.asyncAll = asyncAll; exports.bezier = bezier; exports.bindAll = bindAll; exports.browser = exported; exports.cacheEntryPossiblyAdded = cacheEntryPossiblyAdded; exports.cass = cass; exports.cea = cea; exports.clamp = clamp; exports.clearTileCache = clearTileCache; exports.clipLine = clipLine; exports.clone = clone$4; exports.clone$1 = clone; exports.clone$2 = clone$5; exports.collisionCircleLayout = collisionCircleLayout; exports.config = config; exports.create = create$3; exports.create$1 = create$2; exports.create$2 = create; exports.createCommonjsModule = createCommonjsModule; exports.createExpression = createExpression; exports.createLayout = createLayout; exports.createStyleLayer = createStyleLayer; exports.cross = cross; exports.deepEqual = deepEqual; exports.dot = dot; exports.dot$1 = dot$1; exports.ease = ease; exports.emitValidationErrors = emitValidationErrors; exports.endsWith = endsWith; exports.enforceCacheSizeLimit = enforceCacheSizeLimit; exports.eqc = eqc; exports.eqdc = eqdc; exports.etmerc = etmerc; exports.evaluateSizeForFeature = evaluateSizeForFeature; exports.evaluateSizeForZoom = evaluateSizeForZoom; exports.evaluateVariableOffset = evaluateVariableOffset; exports.evented = evented; exports.extend = extend; exports.featureFilter = createFilter; exports.filterObject = filterObject; exports.fromRotation = fromRotation$2; exports.geocent = geocent; exports.geos = geos; exports.getAnchorAlignment = getAnchorAlignment; exports.getAnchorJustification = getAnchorJustification; exports.getArrayBuffer = getArrayBuffer; exports.getImage = getImage; exports.getJSON = getJSON; exports.getRTLTextPluginStatus = getRTLTextPluginStatus; exports.getReferrer = getReferrer; exports.getVideo = getVideo; exports.gnom = gnom; exports.identity = identity$4; exports.invert = invert$3; exports.isChar = unicodeBlockLookup; exports.isMapboxURL = isMapboxURL; exports.isSafari = isSafari; exports.keysDifference = keysDifference; exports.krovak = krovak; exports.laea = laea; exports.lcc = lcc; exports.makeRequest = makeRequest; exports.mapObject = mapObject; exports.mercatorZfromAltitude = mercatorZfromAltitude; exports.mill = mill; exports.moll = moll; exports.mul = mul$3; exports.multiply = multiply$3; exports.mvt = vectorTile; exports.nextPowerOfTwo = nextPowerOfTwo; exports.normalize = normalize; exports.number = number; exports.nzmg = nzmg; exports.offscreenCanvasSupported = offscreenCanvasSupported; exports.omerc = omerc; exports.ortho = ortho$1; exports.ortho$1 = ortho; exports.parseCode = parse; exports.parseGlyphPBF = parseGlyphPBF; exports.pbf = pbf; exports.performSymbolLayout = performSymbolLayout; exports.perspective = perspective; exports.pick = pick; exports.plugin = plugin; exports.poly = poly; exports.polygonIntersectsPolygon = polygonIntersectsPolygon; exports.postMapLoadEvent = postMapLoadEvent; exports.postTurnstileEvent = postTurnstileEvent; exports.potpack = potpack; exports.proj4 = proj4; exports.qsc = qsc; exports.refProperties = refProperties; exports.register = register; exports.registerForPluginStateChange = registerForPluginStateChange; exports.renderColorRamp = renderColorRamp; exports.robin = robin; exports.rotate = rotate; exports.rotateX = rotateX; exports.rotateZ = rotateZ; exports.scale = scale$3; exports.scale$1 = scale$5; exports.scale$2 = scale$4; exports.setCacheLimits = setCacheLimits; exports.setRTLTextPlugin = setRTLTextPlugin; exports.sinu = sinu; exports.somerc = somerc; exports.sphericalToCartesian = sphericalToCartesian; exports.sqrLen = sqrLen$4; exports.stere = stere; exports.sterea = sterea; exports.styleSpec = spec; exports.sub = sub$4; exports.symbolSize = symbolSize; exports.tmerc = tmerc; exports.tpers = tpers; exports.transformMat3 = transformMat3; exports.transformMat4 = transformMat4$1; exports.translate = translate$3; exports.triggerPluginCompletionEvent = triggerPluginCompletionEvent; exports.uniqueId = uniqueId; exports.utm = utm; exports.validateCustomStyleLayer = validateCustomStyleLayer; exports.validateLight = validateLight$1; exports.validateStyle = validateStyle; exports.values = values; exports.vandg = vandg; exports.version = version; exports.warnOnce = warnOnce; exports.webpSupported = exported$1; exports.window = window$1; exports.wrap = wrap; }); define(['./shared'], function (performance) { 'use strict'; function stringify(obj) { var type = typeof obj; if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null) { return JSON.stringify(obj); } if (Array.isArray(obj)) { var str$1 = '['; for (var i$1 = 0, list = obj; i$1 < list.length; i$1 += 1) { var val = list[i$1]; str$1 += (stringify(val)) + ","; } return (str$1 + "]"); } var keys = Object.keys(obj).sort(); var str = '{'; for (var i = 0; i < keys.length; i++) { str += (JSON.stringify(keys[i])) + ":" + (stringify(obj[keys[i]])) + ","; } return (str + "}"); } function getKey(layer) { var key = ''; for (var i = 0, list = performance.refProperties; i < list.length; i += 1) { var k = list[i]; key += "/" + (stringify(layer[k])); } return key; } /** * Given an array of layers, return an array of arrays of layers where all * layers in each group have identical layout-affecting properties. These * are the properties that were formerly used by explicit `ref` mechanism * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom', * 'filter', and 'layout'. * * The input is not modified. The output layers are references to the * input layers. * * @private * @param {Array} layers * @param {Object} [cachedKeys] - an object to keep already calculated keys. * @returns {Array>} */ function groupByLayout(layers, cachedKeys) { var groups = {}; for (var i = 0; i < layers.length; i++) { var k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]); // update the cache if there is one if (cachedKeys) { cachedKeys[layers[i].id] = k; } var group = groups[k]; if (!group) { group = groups[k] = []; } group.push(layers[i]); } var result = []; for (var k$1 in groups) { result.push(groups[k$1]); } return result; } // var StyleLayerIndex = function StyleLayerIndex(layerConfigs ) { this.keyCache = {}; if (layerConfigs) { this.replace(layerConfigs); } }; StyleLayerIndex.prototype.replace = function replace (layerConfigs ) { this._layerConfigs = {}; this._layers = {}; this.update(layerConfigs, []); }; StyleLayerIndex.prototype.update = function update (layerConfigs , removedIds ) { var this$1 = this; for (var i = 0, list = layerConfigs; i < list.length; i += 1) { var layerConfig = list[i]; this._layerConfigs[layerConfig.id] = layerConfig; var layer = this._layers[layerConfig.id] = performance.createStyleLayer(layerConfig); layer._featureFilter = performance.featureFilter(layer.filter); if (this.keyCache[layerConfig.id]) { delete this.keyCache[layerConfig.id]; } } for (var i$1 = 0, list$1 = removedIds; i$1 < list$1.length; i$1 += 1) { var id = list$1[i$1]; delete this.keyCache[id]; delete this._layerConfigs[id]; delete this._layers[id]; } this.familiesBySource = {}; var groups = groupByLayout(performance.values(this._layerConfigs), this.keyCache); for (var i$2 = 0, list$2 = groups; i$2 < list$2.length; i$2 += 1) { var layerConfigs$1 = list$2[i$2]; var layers = layerConfigs$1.map(function (layerConfig) { return this$1._layers[layerConfig.id]; }); var layer$1 = layers[0]; if (layer$1.visibility === 'none') { continue; } var sourceId = layer$1.source || ''; var sourceGroup = this.familiesBySource[sourceId]; if (!sourceGroup) { sourceGroup = this.familiesBySource[sourceId] = {}; } var sourceLayerId = layer$1.sourceLayer || '_geojsonTileLayer'; var sourceLayerFamilies = sourceGroup[sourceLayerId]; if (!sourceLayerFamilies) { sourceLayerFamilies = sourceGroup[sourceLayerId] = []; } sourceLayerFamilies.push(layers); } }; // var padding = 1; var GlyphAtlas = function GlyphAtlas(stacks ) { var positions = {}; var bins = []; for (var stack in stacks) { var glyphs = stacks[stack]; var stackPositions = positions[stack] = {}; for (var id in glyphs) { var src = glyphs[+id]; if (!src || src.bitmap.width === 0 || src.bitmap.height === 0) { continue; } var bin = { x: 0, y: 0, w: src.bitmap.width + 2 * padding, h: src.bitmap.height + 2 * padding }; bins.push(bin); stackPositions[id] = {rect: bin, metrics: src.metrics}; } } var ref = performance.potpack(bins); var w = ref.w; var h = ref.h; var image = new performance.AlphaImage({width: w || 1, height: h || 1}); for (var stack$1 in stacks) { var glyphs$1 = stacks[stack$1]; for (var id$1 in glyphs$1) { var src$1 = glyphs$1[+id$1]; if (!src$1 || src$1.bitmap.width === 0 || src$1.bitmap.height === 0) { continue; } var bin$1 = positions[stack$1][id$1].rect; performance.AlphaImage.copy(src$1.bitmap, image, {x: 0, y: 0}, {x: bin$1.x + padding, y: bin$1.y + padding}, src$1.bitmap); } } this.image = image; this.positions = positions; }; performance.register('GlyphAtlas', GlyphAtlas); // var WorkerTile = function WorkerTile(params ) { this.tileID = new performance.OverscaledTileID(params.tileID.overscaledZ, params.tileID.wrap, params.tileID.canonical.z, params.tileID.canonical.x, params.tileID.canonical.y, params.tileID.canonical.indexExtent); this.uid = params.uid; this.zoom = params.zoom; this.pixelRatio = params.pixelRatio; this.tileSize = params.tileSize; this.source = params.source; this.overscaling = this.tileID.overscaleFactor(); this.showCollisionBoxes = params.showCollisionBoxes; this.collectResourceTiming = !!params.collectResourceTiming; this.returnDependencies = !!params.returnDependencies; this.promoteId = params.promoteId; }; WorkerTile.prototype.parse = function parse (data , layerIndex , availableImages , actor , callback ) { var this$1 = this; this.status = 'parsing'; this.data = data; this.collisionBoxArray = new performance.CollisionBoxArray(); var sourceLayerCoder = new performance.DictionaryCoder(Object.keys(data.layers).sort()); var featureIndex = new performance.FeatureIndex(this.tileID, this.promoteId); featureIndex.bucketLayerIDs = []; var buckets = {}; var options = { featureIndex: featureIndex, iconDependencies: {}, patternDependencies: {}, glyphDependencies: {}, availableImages: availableImages }; var layerFamilies = layerIndex.familiesBySource[this.source]; for (var sourceLayerId in layerFamilies) { var sourceLayer = data.layers[sourceLayerId]; if (!sourceLayer) { continue; } if (sourceLayer.version === 1) { performance.warnOnce("Vector tile source \"" + (this.source) + "\" layer \"" + sourceLayerId + "\" " + "does not use vector tile spec v2 and therefore may have some rendering errors."); } var sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId); var features = []; for (var index = 0; index < sourceLayer.length; index++) { var feature = sourceLayer.feature(index); var id = featureIndex.getId(feature, sourceLayerId); features.push({feature: feature, id: id, index: index, sourceLayerIndex: sourceLayerIndex}); } for (var i = 0, list = layerFamilies[sourceLayerId]; i < list.length; i += 1) { var family = list[i]; var layer = family[0]; performance.assert(layer.source === this.source); if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) { continue; } if (layer.maxzoom && this.zoom >= layer.maxzoom) { continue; } if (layer.visibility === 'none') { continue; } recalculateLayers(family, this.zoom, availableImages); var bucket = buckets[layer.id] = layer.createBucket({ index: featureIndex.bucketLayerIDs.length, layers: family, zoom: this.zoom, pixelRatio: this.pixelRatio, overscaling: this.overscaling, collisionBoxArray: this.collisionBoxArray, sourceLayerIndex: sourceLayerIndex, sourceID: this.source }); bucket.populate(features, options, this.tileID.canonical); featureIndex.bucketLayerIDs.push(family.map(function (l) { return l.id; })); } } var error ; var glyphMap ; var iconMap ; var patternMap ; var stacks = performance.mapObject(options.glyphDependencies, function (glyphs) { return Object.keys(glyphs).map(Number); }); if (Object.keys(stacks).length) { actor.send('getGlyphs', {uid: this.uid, stacks: stacks}, function (err, result) { if (!error) { error = err; glyphMap = result; maybePrepare.call(this$1); } }, false, this.source); } else { glyphMap = {}; } var icons = Object.keys(options.iconDependencies); if (icons.length) { actor.send('getImages', {icons: icons, source: this.source, tileID: this.tileID, type: 'icons'}, function (err, result) { if (!error) { error = err; iconMap = result; maybePrepare.call(this$1); } }, false, this.source); } else { iconMap = {}; } var patterns = Object.keys(options.patternDependencies); if (patterns.length) { actor.send('getImages', {icons: patterns, source: this.source, tileID: this.tileID, type: 'patterns'}, function (err, result) { if (!error) { error = err; patternMap = result; maybePrepare.call(this$1); } }, false, this.source); } else { patternMap = {}; } maybePrepare.call(this); function maybePrepare() { if (error) { return callback(error); } else if (glyphMap && iconMap && patternMap) { var glyphAtlas = new GlyphAtlas(glyphMap); var imageAtlas = new performance.ImageAtlas(iconMap, patternMap); for (var key in buckets) { var bucket = buckets[key]; if (bucket instanceof performance.SymbolBucket) { recalculateLayers(bucket.layers, this.zoom, availableImages); performance.performSymbolLayout(bucket, glyphMap, glyphAtlas.positions, iconMap, imageAtlas.iconPositions, this.showCollisionBoxes, this.tileID.canonical); } else if (bucket.hasPattern && (bucket instanceof performance.LineBucket || bucket instanceof performance.FillBucket || bucket instanceof performance.FillExtrusionBucket)) { recalculateLayers(bucket.layers, this.zoom, availableImages); bucket.addFeatures(options, this.tileID.canonical, imageAtlas.patternPositions); } } this.status = 'done'; callback(null, { buckets: performance.values(buckets).filter(function (b) { return !b.isEmpty(); }), featureIndex: featureIndex, collisionBoxArray: this.collisionBoxArray, glyphAtlasImage: glyphAtlas.image, imageAtlas: imageAtlas, // Only used for benchmarking: glyphMap: this.returnDependencies ? glyphMap : null, iconMap: this.returnDependencies ? iconMap : null, glyphPositions: this.returnDependencies ? glyphAtlas.positions : null }); } } }; function recalculateLayers(layers , zoom , availableImages ) { // Layers are shared and may have been used by a WorkerTile with a different zoom. var parameters = new performance.EvaluationParameters(zoom); for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer.recalculate(parameters, availableImages); } } // /** * @callback LoadVectorDataCallback * @param error * @param vectorTile * @private */ /** * @private */ function loadVectorTile(params , callback ) { var request = performance.getArrayBuffer(params.request, function (err , data , cacheControl , expires ) { if (err) { callback(err); } else if (data) { callback(null, { vectorTile: new performance.mvt.VectorTile(new performance.pbf(data)), rawData: data, cacheControl: cacheControl, expires: expires }); } }); return function () { request.cancel(); callback(); }; } /** * The {@link WorkerSource} implementation that supports {@link VectorTileSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory VectorTile * representation. To do so, create it with * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`. * * @private */ var VectorTileWorkerSource = function VectorTileWorkerSource(actor , layerIndex , availableImages , loadVectorData ) { this.actor = actor; this.layerIndex = layerIndex; this.availableImages = availableImages; this.loadVectorData = loadVectorData || loadVectorTile; this.loading = {}; this.loaded = {}; }; /** * Implements {@link WorkerSource#loadTile}. Delegates to * {@link VectorTileWorkerSource#loadVectorData} (which by default expects * a `params.url` property) for fetching and producing a VectorTile object. * @private */ VectorTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var this$1 = this; var uid = params.uid; if (!this.loading) { this.loading = {}; } var perf = (params && params.request && params.request.collectResourceTiming) ? new performance.RequestPerformance(params.request) : false; var workerTile = this.loading[uid] = new WorkerTile(params); workerTile.abort = this.loadVectorData(params, function (err, response) { delete this$1.loading[uid]; if (err || !response) { workerTile.status = 'done'; this$1.loaded[uid] = workerTile; return callback(err); } var rawTileData = response.rawData; var cacheControl = {}; if (response.expires) { cacheControl.expires = response.expires; } if (response.cacheControl) { cacheControl.cacheControl = response.cacheControl; } var resourceTiming = {}; if (perf) { var resourceTimingData = perf.finish(); // it's necessary to eval the result of getEntriesByName() here via parse/stringify // late evaluation in the main thread causes TypeError: illegal invocation if (resourceTimingData) { resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData)); } } workerTile.vectorTile = response.vectorTile; workerTile.parse(response.vectorTile, this$1.layerIndex, this$1.availableImages, this$1.actor, function (err, result) { if (err || !result) { return callback(err); } // Transferring a copy of rawTileData because the worker needs to retain its copy. callback(null, performance.extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming)); }); this$1.loaded = this$1.loaded || {}; this$1.loaded[uid] = workerTile; }); }; /** * Implements {@link WorkerSource#reloadTile}. * @private */ VectorTileWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var this$1 = this; var loaded = this.loaded, uid = params.uid, vtSource = this; if (loaded && loaded[uid]) { var workerTile = loaded[uid]; workerTile.showCollisionBoxes = params.showCollisionBoxes; var done = function (err, data) { var reloadCallback = workerTile.reloadCallback; if (reloadCallback) { delete workerTile.reloadCallback; workerTile.parse(workerTile.vectorTile, vtSource.layerIndex, this$1.availableImages, vtSource.actor, reloadCallback); } callback(err, data); }; if (workerTile.status === 'parsing') { workerTile.reloadCallback = done; } else if (workerTile.status === 'done') { // if there was no vector tile data on the initial load, don't try and re-parse tile if (workerTile.vectorTile) { workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, done); } else { done(); } } } }; /** * Implements {@link WorkerSource#abortTile}. * * @param params * @param params.uid The UID for this tile. * @private */ VectorTileWorkerSource.prototype.abortTile = function abortTile (params , callback ) { var loading = this.loading, uid = params.uid; if (loading && loading[uid] && loading[uid].abort) { loading[uid].abort(); delete loading[uid]; } callback(); }; /** * Implements {@link WorkerSource#removeTile}. * * @param params * @param params.uid The UID for this tile. * @private */ VectorTileWorkerSource.prototype.removeTile = function removeTile (params , callback ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } callback(); }; // var ImageBitmap = performance.window.ImageBitmap; var RasterDEMTileWorkerSource = function RasterDEMTileWorkerSource() { this.loaded = {}; }; RasterDEMTileWorkerSource.prototype.loadTile = function loadTile (params , callback ) { var uid = params.uid; var encoding = params.encoding; var rawImageData = params.rawImageData; // Main thread will transfer ImageBitmap if offscreen decode with OffscreenCanvas is supported, else it will transfer an already decoded image. var imagePixels = (ImageBitmap && rawImageData instanceof ImageBitmap) ? this.getImageData(rawImageData) : rawImageData; var dem = new performance.DEMData(uid, imagePixels, encoding); this.loaded = this.loaded || {}; this.loaded[uid] = dem; callback(null, dem); }; RasterDEMTileWorkerSource.prototype.getImageData = function getImageData (imgBitmap ) { // Lazily initialize OffscreenCanvas if (!this.offscreenCanvas || !this.offscreenCanvasContext) { // Dem tiles are typically 256x256 this.offscreenCanvas = new OffscreenCanvas(imgBitmap.width, imgBitmap.height); this.offscreenCanvasContext = this.offscreenCanvas.getContext('2d'); } this.offscreenCanvas.width = imgBitmap.width; this.offscreenCanvas.height = imgBitmap.height; this.offscreenCanvasContext.drawImage(imgBitmap, 0, 0, imgBitmap.width, imgBitmap.height); // Insert an additional 1px padding around the image to allow backfilling for neighboring data. var imgData = this.offscreenCanvasContext.getImageData(-1, -1, imgBitmap.width + 2, imgBitmap.height + 2); this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height); return new performance.RGBAImage({width: imgData.width, height: imgData.height}, imgData.data); }; RasterDEMTileWorkerSource.prototype.removeTile = function removeTile (params ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { delete loaded[uid]; } }; var geojsonRewind = rewind; function rewind(gj, outer) { var type = gj && gj.type, i; if (type === 'FeatureCollection') { for (i = 0; i < gj.features.length; i++) { rewind(gj.features[i], outer); } } else if (type === 'GeometryCollection') { for (i = 0; i < gj.geometries.length; i++) { rewind(gj.geometries[i], outer); } } else if (type === 'Feature') { rewind(gj.geometry, outer); } else if (type === 'Polygon') { rewindRings(gj.coordinates, outer); } else if (type === 'MultiPolygon') { for (i = 0; i < gj.coordinates.length; i++) { rewindRings(gj.coordinates[i], outer); } } return gj; } function rewindRings(rings, outer) { if (rings.length === 0) { return; } rewindRing(rings[0], outer); for (var i = 1; i < rings.length; i++) { rewindRing(rings[i], !outer); } } function rewindRing(ring, dir) { var area = 0; for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { area += (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]); } if (area >= 0 !== !!dir) { ring.reverse(); } } // var toGeoJSON = performance.mvt.VectorTileFeature.prototype.toGeoJSON; // The feature type used by geojson-vt and supercluster. Should be extracted to // global type and used in module definitions for those two modules. var FeatureWrapper = function FeatureWrapper(feature ) { this._feature = feature; this.extent = performance.EXTENT; this.type = feature.type; this.properties = feature.tags; // If the feature has a top-level `id` property, copy it over, but only // if it can be coerced to an integer, because this wrapper is used for // serializing geojson feature data into vector tile PBF data, and the // vector tile spec only supports integer values for feature ids -- // allowing non-integer values here results in a non-compliant PBF // that causes an exception when it is parsed with vector-tile-js if ('id' in feature && !isNaN(feature.id)) { this.id = parseInt(feature.id, 10); } }; FeatureWrapper.prototype.loadGeometry = function loadGeometry () { if (this._feature.type === 1) { var geometry = []; for (var i = 0, list = this._feature.geometry; i < list.length; i += 1) { var point = list[i]; geometry.push([new performance.Point$1(point[0], point[1])]); } return geometry; } else { var geometry$1 = []; for (var i$2 = 0, list$2 = this._feature.geometry; i$2 < list$2.length; i$2 += 1) { var ring = list$2[i$2]; var newRing = []; for (var i$1 = 0, list$1 = ring; i$1 < list$1.length; i$1 += 1) { var point$1 = list$1[i$1]; newRing.push(new performance.Point$1(point$1[0], point$1[1])); } geometry$1.push(newRing); } return geometry$1; } }; FeatureWrapper.prototype.toGeoJSON = function toGeoJSON$1 (x , y , z ) { return toGeoJSON.call(this, x, y, z); }; var GeoJSONWrapper = function GeoJSONWrapper(features ) { this.layers = {'_geojsonTileLayer': this}; this.name = '_geojsonTileLayer'; this.extent = performance.EXTENT; this.length = features.length; this._features = features; }; GeoJSONWrapper.prototype.feature = function feature (i ) { return new FeatureWrapper(this._features[i]); }; 'use strict'; var vectortilefeature = VectorTileFeature; function VectorTileFeature(pbf, end, extent, keys, values) { // Public this.properties = {}; this.extent = extent; this.type = 0; // Private this._pbf = pbf; this._geometry = -1; this._keys = keys; this._values = values; pbf.readFields(readFeature, this, end); } function readFeature(tag, feature, pbf) { if (tag == 1) { feature.id = pbf.readVarint(); } else if (tag == 2) { readTag(pbf, feature); } else if (tag == 3) { feature.type = pbf.readVarint(); } else if (tag == 4) { feature._geometry = pbf.pos; } } function readTag(pbf, feature) { var end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var key = feature._keys[pbf.readVarint()], value = feature._values[pbf.readVarint()]; feature.properties[key] = value; } } VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; VectorTileFeature.prototype.loadGeometry = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, lines = [], line; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (cmd === 1) { // moveTo if (line) { lines.push(line); } line = []; } line.push(new performance.Point$1(x, y)); } else if (cmd === 7) { // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 if (line) { line.push(line[0].clone()); // closePolygon } } else { throw new Error('unknown command ' + cmd); } } if (line) { lines.push(line); } return lines; }; VectorTileFeature.prototype.bbox = function() { var pbf = this._pbf; pbf.pos = this._geometry; var end = pbf.readVarint() + pbf.pos, cmd = 1, length = 0, x = 0, y = 0, x1 = Infinity, x2 = -Infinity, y1 = Infinity, y2 = -Infinity; while (pbf.pos < end) { if (length <= 0) { var cmdLen = pbf.readVarint(); cmd = cmdLen & 0x7; length = cmdLen >> 3; } length--; if (cmd === 1 || cmd === 2) { x += pbf.readSVarint(); y += pbf.readSVarint(); if (x < x1) { x1 = x; } if (x > x2) { x2 = x; } if (y < y1) { y1 = y; } if (y > y2) { y2 = y; } } else if (cmd !== 7) { throw new Error('unknown command ' + cmd); } } return [x1, y1, x2, y2]; }; VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { var size = this.extent * Math.pow(2, z), x0 = this.extent * x, y0 = this.extent * y, coords = this.loadGeometry(), type = VectorTileFeature.types[this.type], i, j; function project(line) { for (var j = 0; j < line.length; j++) { var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; var yTemp = yLat && yLat(p.y + y0,size);//iclient line[j] = [ (p.x + x0) * 360 / size - 180, yTemp? yTemp : 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 //iclient ]; } } switch (this.type) { case 1: var points = []; for (i = 0; i < coords.length; i++) { points[i] = coords[i][0]; } coords = points; project(coords); break; case 2: for (i = 0; i < coords.length; i++) { project(coords[i]); } break; case 3: coords = classifyRings(coords); for (i = 0; i < coords.length; i++) { for (j = 0; j < coords[i].length; j++) { project(coords[i][j]); } } break; } if (coords.length === 1) { coords = coords[0]; } else { type = 'Multi' + type; } var result = { type: "Feature", geometry: { type: type, coordinates: coords }, properties: this.properties }; if ('id' in this) { result.id = this.id; } return result; }; // classifies an array of rings into polygons with outer rings and holes function classifyRings(rings) { var len = rings.length; if (len <= 1) { return [rings]; } var polygons = [], polygon, ccw; for (var i = 0; i < len; i++) { var area = signedArea(rings[i]); if (area === 0) { continue; } if (ccw === undefined) { ccw = area < 0; } if (ccw === area < 0) { if (polygon) { polygons.push(polygon); } polygon = [rings[i]]; } else { polygon.push(rings[i]); } } if (polygon) { polygons.push(polygon); } return polygons; } function signedArea(ring) { var sum = 0; for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { p1 = ring[i]; p2 = ring[j]; sum += (p2.x - p1.x) * (p1.y + p2.y); } return sum; } 'use strict'; var vectortilelayer = VectorTileLayer; function VectorTileLayer(pbf, end) { // Public this.version = 1; this.name = null; this.extent = 4096; this.length = 0; // Private this._pbf = pbf; this._keys = []; this._values = []; this._features = []; pbf.readFields(readLayer, this, end); this.length = this._features.length; } function readLayer(tag, layer, pbf) { if (tag === 15) { layer.version = pbf.readVarint(); } else if (tag === 1) { layer.name = pbf.readString(); } else if (tag === 5) { layer.extent = pbf.readVarint(); } else if (tag === 2) { layer._features.push(pbf.pos); } else if (tag === 3) { layer._keys.push(pbf.readString()); } else if (tag === 4) { layer._values.push(readValueMessage(pbf)); } } function readValueMessage(pbf) { var value = null, end = pbf.readVarint() + pbf.pos; while (pbf.pos < end) { var tag = pbf.readVarint() >> 3; value = tag === 1 ? pbf.readString() : tag === 2 ? pbf.readFloat() : tag === 3 ? pbf.readDouble() : tag === 4 ? pbf.readVarint64() : tag === 5 ? pbf.readVarint() : tag === 6 ? pbf.readSVarint() : tag === 7 ? pbf.readBoolean() : null; } return value; } // return feature `i` from this layer as a `VectorTileFeature` VectorTileLayer.prototype.feature = function(i) { if (i < 0 || i >= this._features.length) { throw new Error('feature index out of bounds'); } this._pbf.pos = this._features[i]; var end = this._pbf.readVarint() + this._pbf.pos; return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values); }; 'use strict'; var vectortile = VectorTile; function VectorTile(pbf, end) { this.layers = pbf.readFields(readTile, {}, end); } function readTile(tag, layers, pbf) { if (tag === 3) { var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos); if (layer.length) { layers[layer.name] = layer; } } } var VectorTile$1 = vectortile; var VectorTileFeature$1 = vectortilefeature; var VectorTileLayer$1 = vectortilelayer; var vectorTile = { VectorTile: VectorTile$1, VectorTileFeature: VectorTileFeature$1, VectorTileLayer: VectorTileLayer$1 }; 'use strict'; var VectorTileFeature$2 = vectorTile.VectorTileFeature; var geojson_wrapper = GeoJSONWrapper$1; // conform to vectortile api function GeoJSONWrapper$1 (features, options) { this.options = options || {}; this.features = features; this.length = features.length; } GeoJSONWrapper$1.prototype.feature = function (i) { return new FeatureWrapper$1(this.features[i], this.options.extent) }; function FeatureWrapper$1 (feature, extent) { this.id = typeof feature.id === 'number' ? feature.id : undefined; this.type = feature.type; this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry; this.properties = feature.tags; this.extent = extent || 4096; } FeatureWrapper$1.prototype.loadGeometry = function () { var rings = this.rawGeometry; this.geometry = []; for (var i = 0; i < rings.length; i++) { var ring = rings[i]; var newRing = []; for (var j = 0; j < ring.length; j++) { newRing.push(new performance.Point$1(ring[j][0], ring[j][1])); } this.geometry.push(newRing); } return this.geometry }; FeatureWrapper$1.prototype.bbox = function () { if (!this.geometry) { this.loadGeometry(); } var rings = this.geometry; var x1 = Infinity; var x2 = -Infinity; var y1 = Infinity; var y2 = -Infinity; for (var i = 0; i < rings.length; i++) { var ring = rings[i]; for (var j = 0; j < ring.length; j++) { var coord = ring[j]; x1 = Math.min(x1, coord.x); x2 = Math.max(x2, coord.x); y1 = Math.min(y1, coord.y); y2 = Math.max(y2, coord.y); } } return [x1, y1, x2, y2] }; FeatureWrapper$1.prototype.toGeoJSON = VectorTileFeature$2.prototype.toGeoJSON; var vtPbf = fromVectorTileJs; var fromVectorTileJs_1 = fromVectorTileJs; var fromGeojsonVt_1 = fromGeojsonVt; var GeoJSONWrapper_1 = geojson_wrapper; /** * Serialize a vector-tile-js-created tile to pbf * * @param {Object} tile * @return {Buffer} uncompressed, pbf-serialized tile data */ function fromVectorTileJs (tile) { var out = new performance.pbf(); writeTile(tile, out); return out.finish() } /** * Serialized a geojson-vt-created tile to pbf. * * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects * @param {Object} [options] - An object specifying the vector-tile specification version and extent that were used to create `layers`. * @param {Number} [options.version=1] - Version of vector-tile spec used * @param {Number} [options.extent=4096] - Extent of the vector tile * @return {Buffer} uncompressed, pbf-serialized tile data */ function fromGeojsonVt (layers, options) { options = options || {}; var l = {}; for (var k in layers) { l[k] = new geojson_wrapper(layers[k].features, options); l[k].name = k; l[k].version = options.version; l[k].extent = options.extent; } return fromVectorTileJs({layers: l}) } function writeTile (tile, pbf) { for (var key in tile.layers) { pbf.writeMessage(3, writeLayer, tile.layers[key]); } } function writeLayer (layer, pbf) { pbf.writeVarintField(15, layer.version || 1); pbf.writeStringField(1, layer.name || ''); pbf.writeVarintField(5, layer.extent || 4096); var i; var context = { keys: [], values: [], keycache: {}, valuecache: {} }; for (i = 0; i < layer.length; i++) { context.feature = layer.feature(i); pbf.writeMessage(2, writeFeature, context); } var keys = context.keys; for (i = 0; i < keys.length; i++) { pbf.writeStringField(3, keys[i]); } var values = context.values; for (i = 0; i < values.length; i++) { pbf.writeMessage(4, writeValue, values[i]); } } function writeFeature (context, pbf) { var feature = context.feature; if (feature.id !== undefined) { pbf.writeVarintField(1, feature.id); } pbf.writeMessage(2, writeProperties, context); pbf.writeVarintField(3, feature.type); pbf.writeMessage(4, writeGeometry, feature); } function writeProperties (context, pbf) { var feature = context.feature; var keys = context.keys; var values = context.values; var keycache = context.keycache; var valuecache = context.valuecache; for (var key in feature.properties) { var keyIndex = keycache[key]; if (typeof keyIndex === 'undefined') { keys.push(key); keyIndex = keys.length - 1; keycache[key] = keyIndex; } pbf.writeVarint(keyIndex); var value = feature.properties[key]; var type = typeof value; if (type !== 'string' && type !== 'boolean' && type !== 'number') { value = JSON.stringify(value); } var valueKey = type + ':' + value; var valueIndex = valuecache[valueKey]; if (typeof valueIndex === 'undefined') { values.push(value); valueIndex = values.length - 1; valuecache[valueKey] = valueIndex; } pbf.writeVarint(valueIndex); } } function command (cmd, length) { return (length << 3) + (cmd & 0x7) } function zigzag (num) { return (num << 1) ^ (num >> 31) } function writeGeometry (feature, pbf) { var geometry = feature.loadGeometry(); var type = feature.type; var x = 0; var y = 0; var rings = geometry.length; for (var r = 0; r < rings; r++) { var ring = geometry[r]; var count = 1; if (type === 1) { count = ring.length; } pbf.writeVarint(command(1, count)); // moveto // do not write polygon closing path as lineto var lineCount = type === 3 ? ring.length - 1 : ring.length; for (var i = 0; i < lineCount; i++) { if (i === 1 && type !== 1) { pbf.writeVarint(command(2, lineCount - 1)); // lineto } var dx = ring[i].x - x; var dy = ring[i].y - y; pbf.writeVarint(zigzag(dx)); pbf.writeVarint(zigzag(dy)); x += dx; y += dy; } if (type === 3) { pbf.writeVarint(command(7, 1)); // closepath } } } function writeValue (value, pbf) { var type = typeof value; if (type === 'string') { pbf.writeStringField(1, value); } else if (type === 'boolean') { pbf.writeBooleanField(7, value); } else if (type === 'number') { if (value % 1 !== 0) { pbf.writeDoubleField(3, value); } else if (value < 0) { pbf.writeSVarintField(6, value); } else { pbf.writeVarintField(5, value); } } } vtPbf.fromVectorTileJs = fromVectorTileJs_1; vtPbf.fromGeojsonVt = fromGeojsonVt_1; vtPbf.GeoJSONWrapper = GeoJSONWrapper_1; function sortKD(ids, coords, nodeSize, left, right, depth) { if (right - left <= nodeSize) { return; } var m = (left + right) >> 1; select(ids, coords, m, left, right, depth % 2); sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); } function select(ids, coords, k, left, right, inc) { while (right > left) { if (right - left > 600) { var n = right - left + 1; var m = k - left + 1; var z = Math.log(n); var s = 0.5 * Math.exp(2 * z / 3); var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); select(ids, coords, k, newLeft, newRight, inc); } var t = coords[2 * k + inc]; var i = left; var j = right; swapItem(ids, coords, left, k); if (coords[2 * right + inc] > t) { swapItem(ids, coords, left, right); } while (i < j) { swapItem(ids, coords, i, j); i++; j--; while (coords[2 * i + inc] < t) { i++; } while (coords[2 * j + inc] > t) { j--; } } if (coords[2 * left + inc] === t) { swapItem(ids, coords, left, j); } else { j++; swapItem(ids, coords, j, right); } if (j <= k) { left = j + 1; } if (k <= j) { right = j - 1; } } } function swapItem(ids, coords, i, j) { swap(ids, i, j); swap(coords, 2 * i, 2 * j); swap(coords, 2 * i + 1, 2 * j + 1); } function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var x, y; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { x = coords[2 * i]; y = coords[2 * i + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) { result.push(ids[i]); } } continue; } var m = Math.floor((left + right) / 2); x = coords[2 * m]; y = coords[2 * m + 1]; if (x >= minX && x <= maxX && y >= minY && y <= maxY) { result.push(ids[m]); } var nextAxis = (axis + 1) % 2; if (axis === 0 ? minX <= x : minY <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? maxX >= x : maxY >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } function within(ids, coords, qx, qy, r, nodeSize) { var stack = [0, ids.length - 1, 0]; var result = []; var r2 = r * r; while (stack.length) { var axis = stack.pop(); var right = stack.pop(); var left = stack.pop(); if (right - left <= nodeSize) { for (var i = left; i <= right; i++) { if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) { result.push(ids[i]); } } continue; } var m = Math.floor((left + right) / 2); var x = coords[2 * m]; var y = coords[2 * m + 1]; if (sqDist(x, y, qx, qy) <= r2) { result.push(ids[m]); } var nextAxis = (axis + 1) % 2; if (axis === 0 ? qx - r <= x : qy - r <= y) { stack.push(left); stack.push(m - 1); stack.push(nextAxis); } if (axis === 0 ? qx + r >= x : qy + r >= y) { stack.push(m + 1); stack.push(right); stack.push(nextAxis); } } return result; } function sqDist(ax, ay, bx, by) { var dx = ax - bx; var dy = ay - by; return dx * dx + dy * dy; } var defaultGetX = function (p) { return p[0]; }; var defaultGetY = function (p) { return p[1]; }; var KDBush = function KDBush(points, getX, getY, nodeSize, ArrayType) { if ( getX === void 0 ) getX = defaultGetX; if ( getY === void 0 ) getY = defaultGetY; if ( nodeSize === void 0 ) nodeSize = 64; if ( ArrayType === void 0 ) ArrayType = Float64Array; this.nodeSize = nodeSize; this.points = points; var IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array; var ids = this.ids = new IndexArrayType(points.length); var coords = this.coords = new ArrayType(points.length * 2); for (var i = 0; i < points.length; i++) { ids[i] = i; coords[2 * i] = getX(points[i]); coords[2 * i + 1] = getY(points[i]); } sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0); }; KDBush.prototype.range = function range$1 (minX, minY, maxX, maxY) { return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); }; KDBush.prototype.within = function within$1 (x, y, r) { return within(this.ids, this.coords, x, y, r, this.nodeSize); }; var defaultOptions = { minZoom: 0, // min zoom to generate clusters on maxZoom: 16, // max zoom level to cluster the points on minPoints: 2, // minimum points to form a cluster radius: 40, // cluster radius in pixels extent: 512, // tile extent (radius is calculated relative to it) nodeSize: 64, // size of the KD-tree leaf node, affects performance log: false, // whether to log timing info // whether to generate numeric ids for input features (in vector tiles) generateId: false, // a reduce function for calculating custom cluster properties reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; } // properties to use for individual points when running the reducer map: function (props) { return props; } // props => ({sum: props.my_value}) }; var Supercluster = function Supercluster(options) { this.options = extend(Object.create(defaultOptions), options); this.trees = new Array(this.options.maxZoom + 1); }; Supercluster.prototype.load = function load (points) { var ref = this.options; var log = ref.log; var minZoom = ref.minZoom; var maxZoom = ref.maxZoom; var nodeSize = ref.nodeSize; if (log) { console.time('total time'); } var timerId = "prepare " + (points.length) + " points"; if (log) { console.time(timerId); } this.points = points; // generate a cluster object for each point and index input points into a KD-tree var clusters = []; for (var i = 0; i < points.length; i++) { if (!points[i].geometry) { continue; } clusters.push(createPointCluster(points[i], i, this.options.proj4Projection)); } console.log(clusters); this.trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); if (log) { console.timeEnd(timerId); } // cluster points on max zoom, then cluster the results on previous zoom, etc.; // results in a cluster hierarchy across zoom levels for (var z = maxZoom; z >= minZoom; z--) { var now = +Date.now(); // create a new set of clusters for the zoom and index them with a KD-tree clusters = this._cluster(clusters, z); this.trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); if (log) { console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); } } if (log) { console.timeEnd('total time'); } return this; }; Supercluster.prototype.getClusters = function getClusters (bbox, zoom) { var minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180; var minLat = Math.max(-90, Math.min(90, bbox[1])); var maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180; var maxLat = Math.max(-90, Math.min(90, bbox[3])); if (bbox[2] - bbox[0] >= 360) { minLng = -180; maxLng = 180; } else if (minLng > maxLng) { var easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom); var westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom); return easternHem.concat(westernHem); } var tree = this.trees[this._limitZoom(zoom)]; var minxy = lngLatXY(minLng, minLat); var maxxy = lngLatXY(minLng, maxLng); var ids = tree.range(minxy[0], maxxy[1], maxxy[0], minxy[1]); var clusters = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var c = tree.points[id]; clusters.push(c.numPoints ? getClusterJSON(c, this.options.proj4Projection) : this.points[c.index]); } return clusters; }; Supercluster.prototype.getChildren = function getChildren (clusterId) { var originId = this._getOriginId(clusterId); var originZoom = this._getOriginZoom(clusterId); var errorMsg = 'No cluster with the specified id.'; var index = this.trees[originZoom]; if (!index) { throw new Error(errorMsg); } var origin = index.points[originId]; if (!origin) { throw new Error(errorMsg); } var r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1)); var ids = index.within(origin.x, origin.y, r); var children = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var c = index.points[id]; if (c.parentId === clusterId) { children.push(c.numPoints ? getClusterJSON(c, this.options.proj4Projection) : this.points[c.index]); } } if (children.length === 0) { throw new Error(errorMsg); } return children; }; Supercluster.prototype.getLeaves = function getLeaves (clusterId, limit, offset) { limit = limit || 10; offset = offset || 0; var leaves = []; this._appendLeaves(leaves, clusterId, limit, offset, 0); return leaves; }; Supercluster.prototype.getTile = function getTile (z, x, y) { var tree = this.trees[this._limitZoom(z)]; var z2 = Math.pow(2, z); var ref = this.options; var extent = ref.extent; var radius = ref.radius; var p = radius / extent; var top = (y - p) / z2; var bottom = (y + 1 + p) / z2; var tile = { features: [] }; this._addTileFeatures( tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom), tree.points, x, y, z2, tile); if (x === 0) { this._addTileFeatures( tree.range(1 - p / z2, top, 1, bottom), tree.points, z2, y, z2, tile); } if (x === z2 - 1) { this._addTileFeatures( tree.range(0, top, p / z2, bottom), tree.points, -1, y, z2, tile); } return tile.features.length ? tile : null; }; Supercluster.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (clusterId) { var expansionZoom = this._getOriginZoom(clusterId) - 1; while (expansionZoom <= this.options.maxZoom) { var children = this.getChildren(clusterId); expansionZoom++; if (children.length !== 1) { break; } clusterId = children[0].properties.cluster_id; } return expansionZoom; }; Supercluster.prototype._appendLeaves = function _appendLeaves (result, clusterId, limit, offset, skipped) { var children = this.getChildren(clusterId); for (var i = 0, list = children; i < list.length; i += 1) { var child = list[i]; var props = child.properties; if (props && props.cluster) { if (skipped + props.point_count <= offset) { // skip the whole cluster skipped += props.point_count; } else { // enter the cluster skipped = this._appendLeaves(result, props.cluster_id, limit, offset, skipped); // exit the cluster } } else if (skipped < offset) { // skip a single point skipped++; } else { // add a single point result.push(child); } if (result.length === limit) { break; } } return skipped; }; Supercluster.prototype._addTileFeatures = function _addTileFeatures (ids, points, x, y, z2, tile) { for (var i$1 = 0, list = ids; i$1 < list.length; i$1 += 1) { var i = list[i$1]; var c = points[i]; var isCluster = c.numPoints; var f = { type: 1, geometry: [[ Math.round(this.options.extent * (c.x * z2 - x)), Math.round(this.options.extent * (c.y * z2 - y)) ]], tags: isCluster ? getClusterProperties(c) : this.points[c.index].properties }; // assign id var id = (void 0); if (isCluster) { id = c.id; } else if (this.options.generateId) { // optionally generate id id = c.index; } else if (this.points[c.index].id) { // keep id if already assigned id = this.points[c.index].id; } if (id !== undefined) { f.id = id; } tile.features.push(f); } }; Supercluster.prototype._limitZoom = function _limitZoom (z) { return Math.max(this.options.minZoom, Math.min(+z, this.options.maxZoom + 1)); }; Supercluster.prototype._cluster = function _cluster (points, zoom) { var clusters = []; var ref = this.options; var radius = ref.radius; var extent = ref.extent; var reduce = ref.reduce; var minPoints = ref.minPoints; var r = radius / (extent * Math.pow(2, zoom)); // loop through each point for (var i = 0; i < points.length; i++) { var p = points[i]; // if we've already visited the point at this zoom level, skip it if (p.zoom <= zoom) { continue; } p.zoom = zoom; // find all nearby points var tree = this.trees[zoom + 1]; var neighborIds = tree.within(p.x, p.y, r); var numPointsOrigin = p.numPoints || 1; var numPoints = numPointsOrigin; // count the number of points in a potential cluster for (var i$1 = 0, list = neighborIds; i$1 < list.length; i$1 += 1) { var neighborId = list[i$1]; var b = tree.points[neighborId]; // filter out neighbors that are already processed if (b.zoom > zoom) { numPoints += b.numPoints || 1; } } if (numPoints >= minPoints) { // enough points to form a cluster var wx = p.x * numPointsOrigin; var wy = p.y * numPointsOrigin; var clusterProperties = reduce && numPointsOrigin > 1 ? this._map(p, true) : null; // encode both zoom and point index on which the cluster originated -- offset by total length of features var id = (i << 5) + (zoom + 1) + this.points.length; for (var i$2 = 0, list$1 = neighborIds; i$2 < list$1.length; i$2 += 1) { var neighborId$1 = list$1[i$2]; var b$1 = tree.points[neighborId$1]; if (b$1.zoom <= zoom) { continue; } b$1.zoom = zoom; // save the zoom (so it doesn't get processed twice) var numPoints2 = b$1.numPoints || 1; wx += b$1.x * numPoints2; // accumulate coordinates for calculating weighted center wy += b$1.y * numPoints2; b$1.parentId = id; if (reduce) { if (!clusterProperties) { clusterProperties = this._map(p, true); } reduce(clusterProperties, this._map(b$1)); } } p.parentId = id; clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties)); } else { // left points as unclustered clusters.push(p); if (numPoints > 1) { for (var i$3 = 0, list$2 = neighborIds; i$3 < list$2.length; i$3 += 1) { var neighborId$2 = list$2[i$3]; var b$2 = tree.points[neighborId$2]; if (b$2.zoom <= zoom) { continue; } b$2.zoom = zoom; clusters.push(b$2); } } } } return clusters; }; // get index of the point from which the cluster originated Supercluster.prototype._getOriginId = function _getOriginId (clusterId) { return (clusterId - this.points.length) >> 5; }; // get zoom of the point from which the cluster originated Supercluster.prototype._getOriginZoom = function _getOriginZoom (clusterId) { return (clusterId - this.points.length) % 32; }; Supercluster.prototype._map = function _map (point, clone) { if (point.numPoints) { return clone ? extend({}, point.properties) : point.properties; } var original = this.points[point.index].properties; var result = this.options.map(original); return clone && result === original ? extend({}, result) : result; }; function createCluster(x, y, id, numPoints, properties) { return { x: x, // weighted cluster center y: y, zoom: Infinity, // the last zoom the cluster was processed at id: id, // encodes index of the first child of the cluster and its zoom level parentId: -1, // parent cluster id numPoints: numPoints, properties: properties }; } function createPointCluster(p, id, proj4Projection) { var ref = p.geometry.coordinates; var x = ref[0]; var y = ref[1]; var result = [x, y]; if(typeof customConvertPoint === 'object' ){ result = customConvertPoint.projectXY(x, y, proj4Projection); }else { result = [lngX(x),latY(y)]; } return { x: result[0], // projected point coordinates y: result[1], zoom: Infinity, // the last zoom the point was processed at index: id, // index of the source feature in the original input array, parentId: -1 // parent cluster id }; } function getClusterJSON(cluster, proj4Projection) { var result = [cluster.x, cluster.y]; if(typeof customConvertPoint === 'object' ){ result = customConvertPoint.toLngLat(cluster.x, cluster.y, proj4Projection); }else { result = [xLng(x),yLat$1(y)]; } return { type: 'Feature', id: cluster.id, properties: getClusterProperties(cluster), geometry: { type: 'Point', coordinates: result } }; } function getClusterProperties(cluster) { var count = cluster.numPoints; var abbrev = count >= 10000 ? ((Math.round(count / 1000)) + "k") : count >= 1000 ? ((Math.round(count / 100) / 10) + "k") : count; return extend(extend({}, cluster.properties), { cluster: true, cluster_id: cluster.id, point_count: count, point_count_abbreviated: abbrev }); } // longitude/latitude to spherical mercator in [0..1] range function lngX(lng) { return lng / 360 + 0.5; } function latY(lat) { var sin = Math.sin(lat * Math.PI / 180); var y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); return y < 0 ? 0 : y > 1 ? 1 : y; } // spherical mercator to longitude/latitude function xLng(x) { return (x - 0.5) * 360; } function yLat$1(y) { var y2 = (180 - y * 360) * Math.PI / 180; return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; } function extend(dest, src) { for (var id in src) { dest[id] = src[id]; } return dest; } function getX(p) { return p.x; } function getY(p) { return p.y; } // calculate simplification data using optimized Douglas-Peucker algorithm function simplify(coords, first, last, sqTolerance) { var maxSqDist = sqTolerance; var mid = (last - first) >> 1; var minPosToMid = last - first; var index; var ax = coords[first]; var ay = coords[first + 1]; var bx = coords[last]; var by = coords[last + 1]; for (var i = first + 3; i < last; i += 3) { var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by); if (d > maxSqDist) { index = i; maxSqDist = d; } else if (d === maxSqDist) { // a workaround to ensure we choose a pivot close to the middle of the list, // reducing recursion depth, for certain degenerate inputs // https://github.com/mapbox/geojson-vt/issues/104 var posToMid = Math.abs(i - mid); if (posToMid < minPosToMid) { index = i; minPosToMid = posToMid; } } } if (maxSqDist > sqTolerance) { if (index - first > 3) { simplify(coords, first, index, sqTolerance); } coords[index + 2] = maxSqDist; if (last - index > 3) { simplify(coords, index, last, sqTolerance); } } } // square distance from a point to a segment function getSqSegDist(px, py, x, y, bx, by) { var dx = bx - x; var dy = by - y; if (dx !== 0 || dy !== 0) { var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); if (t > 1) { x = bx; y = by; } else if (t > 0) { x += dx * t; y += dy * t; } } dx = px - x; dy = py - y; return dx * dx + dy * dy; } function createFeature(id, type, geom, tags) { var feature = { id: typeof id === 'undefined' ? null : id, type: type, geometry: geom, tags: tags, minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; calcBBox(feature); return feature; } function calcBBox(feature) { var geom = feature.geometry; var type = feature.type; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { calcLineBBox(feature, geom); } else if (type === 'Polygon' || type === 'MultiLineString') { for (var i = 0; i < geom.length; i++) { calcLineBBox(feature, geom[i]); } } else if (type === 'MultiPolygon') { for (i = 0; i < geom.length; i++) { for (var j = 0; j < geom[i].length; j++) { calcLineBBox(feature, geom[i][j]); } } } } function calcLineBBox(feature, geom) { for (var i = 0; i < geom.length; i += 3) { feature.minX = Math.min(feature.minX, geom[i]); feature.minY = Math.min(feature.minY, geom[i + 1]); feature.maxX = Math.max(feature.maxX, geom[i]); feature.maxY = Math.max(feature.maxY, geom[i + 1]); } } var maxValidLatitude = 85.051129; // converts GeoJSON feature into an intermediate projected JSON vector format with simplification data function convert(data, options) { // importScripts('https://iclient.supermap.io/web/libs/proj4/2.8.0/proj4.js'); // proj4.defs('EPSG:4547', 'PROJCS["CGCS2000 / 3-degree Gauss-Kruger CM 114E",GEOGCS["China Geodetic Coordinate System 2000",DATUM["China_2000",SPHEROID["CGCS2000",6378137,298.257222101,AUTHORITY["EPSG","1024"]],AUTHORITY["EPSG","1043"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4490"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",114],PARAMETER["scale_factor",1],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","4547"]]'); // const proj4Projection = proj4('EPSG:4547'); // options.proj4Projection = proj4Projection; if (options.customprj && typeof customConvertPoint === 'undefined'){ try { importScripts(options.customprj); } catch (e) { console.log(e); } } if (!options.customprj && typeof customConvertPoint !== 'undefined'){ try { customConvertPoint = undefined; } catch (e) { console.log(e); } } var features = []; if (data.type === 'FeatureCollection') { for (var i = 0; i < data.features.length; i++) { convertFeature(features, data.features[i], options, i); } } else if (data.type === 'Feature') { convertFeature(features, data, options); } else { // single geometry or a geometry collection convertFeature(features, {geometry: data}, options); } return features; } function convertFeature(features, geojson, options, index) { if (!geojson.geometry) { return; } var coords = geojson.geometry.coordinates; var type = geojson.geometry.type; var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2); var geometry = []; var id = geojson.id; if (options.promoteId) { id = geojson.properties[options.promoteId]; } else if (options.generateId) { id = index || 0; } if (type === 'Point') { convertPoint(coords, geometry, options.proj4Projection); } else if (type === 'MultiPoint') { for (var i = 0; i < coords.length; i++) { convertPoint(coords[i], geometry, options.proj4Projection); } } else if (type === 'LineString') { convertLine(coords, geometry, tolerance, false, options.proj4Projection); } else if (type === 'MultiLineString') { if (options.lineMetrics) { // explode into linestrings to be able to track metrics for (i = 0; i < coords.length; i++) { geometry = []; convertLine(coords[i], geometry, tolerance, false, options.proj4Projection); features.push(createFeature(id, 'LineString', geometry, geojson.properties)); } return; } else { convertLines(coords, geometry, tolerance, false,options.proj4Projection); } } else if (type === 'Polygon') { convertLines(coords, geometry, tolerance, true, options.proj4Projection); } else if (type === 'MultiPolygon') { for (i = 0; i < coords.length; i++) { var polygon = []; convertLines(coords[i], polygon, tolerance, true, options.proj4Projection); geometry.push(polygon); } } else if (type === 'GeometryCollection') { for (i = 0; i < geojson.geometry.geometries.length; i++) { convertFeature(features, { id: id, geometry: geojson.geometry.geometries[i], properties: geojson.properties }, options, index); } return; } else { throw new Error('Input data is not a valid GeoJSON object.'); } features.push(createFeature(id, type, geometry, geojson.properties)); } function convertPoint(coords, out, proj4Projection) { var lat = Math.min(maxValidLatitude, Math.max(-maxValidLatitude, coords[1])); var xy = typeof customConvertPoint === "object"?customConvertPoint.projectXY(coords[0], lat, proj4Projection):coords; out.push(xy[0]); out.push(xy[1]); out.push(0); } function convertLine(ring, out, tolerance, isPolygon, proj4Projection) { var x0, y0; var size = 0; for (var j = 0; j < ring.length; j++) { var out1 = []; convertPoint(ring[j], out1, proj4Projection); var x = out1[0]; var y = out1[1]; out.push(x); out.push(y); out.push(0); if (j > 0) { if (isPolygon) { size += (x0 * y - x * y0) / 2; // area } else { size += Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)); // length } } x0 = x; y0 = y; } var last = out.length - 3; out[2] = 1; simplify(out, 0, last, tolerance); out[last + 2] = 1; out.size = Math.abs(size); out.start = 0; out.end = out.size; } function convertLines(rings, out, tolerance, isPolygon, proj4Projection) { for (var i = 0; i < rings.length; i++) { var geom = []; convertLine(rings[i], geom, tolerance, isPolygon, proj4Projection); out.push(geom); } } function projectX(x) { return x / 360 + 0.5; } function projectY(y) { var sin = Math.sin(y * Math.PI / 180); var y2 = 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI; return y2 < 0 ? 0 : y2 > 1 ? 1 : y2; } /* clip features between two axis-parallel lines: * | | * ___|___ | / * / | \____|____/ * | | */ function clip(features, scale, k1, k2, axis, minAll, maxAll, options) { k1 /= scale; k2 /= scale; if (minAll >= k1 && maxAll < k2) { return features; } // trivial accept else if (maxAll < k1 || minAll >= k2) { return null; } // trivial reject var clipped = []; for (var i = 0; i < features.length; i++) { var feature = features[i]; var geometry = feature.geometry; var type = feature.type; var min = axis === 0 ? feature.minX : feature.minY; var max = axis === 0 ? feature.maxX : feature.maxY; if (min >= k1 && max < k2) { // trivial accept clipped.push(feature); continue; } else if (max < k1 || min >= k2) { // trivial reject continue; } var newGeometry = []; if (type === 'Point' || type === 'MultiPoint') { clipPoints(geometry, newGeometry, k1, k2, axis); } else if (type === 'LineString') { clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics); } else if (type === 'MultiLineString') { clipLines(geometry, newGeometry, k1, k2, axis, false); } else if (type === 'Polygon') { clipLines(geometry, newGeometry, k1, k2, axis, true); } else if (type === 'MultiPolygon') { for (var j = 0; j < geometry.length; j++) { var polygon = []; clipLines(geometry[j], polygon, k1, k2, axis, true); if (polygon.length) { newGeometry.push(polygon); } } } if (newGeometry.length) { if (options.lineMetrics && type === 'LineString') { for (j = 0; j < newGeometry.length; j++) { clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags)); } continue; } if (type === 'LineString' || type === 'MultiLineString') { if (newGeometry.length === 1) { type = 'LineString'; newGeometry = newGeometry[0]; } else { type = 'MultiLineString'; } } if (type === 'Point' || type === 'MultiPoint') { type = newGeometry.length === 3 ? 'Point' : 'MultiPoint'; } clipped.push(createFeature(feature.id, type, newGeometry, feature.tags)); } } return clipped.length ? clipped : null; } function clipPoints(geom, newGeom, k1, k2, axis) { for (var i = 0; i < geom.length; i += 3) { var a = geom[i + axis]; if (a >= k1 && a <= k2) { newGeom.push(geom[i]); newGeom.push(geom[i + 1]); newGeom.push(geom[i + 2]); } } } function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) { var slice = newSlice(geom); var intersect = axis === 0 ? intersectX : intersectY; var len = geom.start; var segLen, t; for (var i = 0; i < geom.length - 3; i += 3) { var ax = geom[i]; var ay = geom[i + 1]; var az = geom[i + 2]; var bx = geom[i + 3]; var by = geom[i + 4]; var a = axis === 0 ? ax : ay; var b = axis === 0 ? bx : by; var exited = false; if (trackMetrics) { segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2)); } if (a < k1) { // ---|--> | (line enters the clip region from the left) if (b > k1) { t = intersect(slice, ax, ay, bx, by, k1); if (trackMetrics) { slice.start = len + segLen * t; } } } else if (a > k2) { // | <--|--- (line enters the clip region from the right) if (b < k2) { t = intersect(slice, ax, ay, bx, by, k2); if (trackMetrics) { slice.start = len + segLen * t; } } } else { addPoint(slice, ax, ay, az); } if (b < k1 && a >= k1) { // <--|--- | or <--|-----|--- (line exits the clip region on the left) t = intersect(slice, ax, ay, bx, by, k1); exited = true; } if (b > k2 && a <= k2) { // | ---|--> or ---|-----|--> (line exits the clip region on the right) t = intersect(slice, ax, ay, bx, by, k2); exited = true; } if (!isPolygon && exited) { if (trackMetrics) { slice.end = len + segLen * t; } newGeom.push(slice); slice = newSlice(geom); } if (trackMetrics) { len += segLen; } } // add the last point var last = geom.length - 3; ax = geom[last]; ay = geom[last + 1]; az = geom[last + 2]; a = axis === 0 ? ax : ay; if (a >= k1 && a <= k2) { addPoint(slice, ax, ay, az); } // close the polygon if its endpoints are not the same after clipping last = slice.length - 3; if (isPolygon && last >= 3 && (slice[last] !== slice[0] || slice[last + 1] !== slice[1])) { addPoint(slice, slice[0], slice[1], slice[2]); } // add the final slice if (slice.length) { newGeom.push(slice); } } function newSlice(line) { var slice = []; slice.size = line.size; slice.start = line.start; slice.end = line.end; return slice; } function clipLines(geom, newGeom, k1, k2, axis, isPolygon) { for (var i = 0; i < geom.length; i++) { clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false); } } function addPoint(out, x, y, z) { out.push(x); out.push(y); out.push(z); } function intersectX(out, ax, ay, bx, by, x) { var t = (x - ax) / (bx - ax); out.push(x); out.push(ay + (by - ay) * t); out.push(1); return t; } function intersectY(out, ax, ay, bx, by, y) { var t = (y - ay) / (by - ay); out.push(ax + (bx - ax) * t); out.push(y); out.push(1); return t; } function wrap(features, options) { var buffer = options.buffer / options.extent; var merged = features; var left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2, options); // left world copy var right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2, options); // right world copy if (left || right) { merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy if (left) { merged = shiftFeatureCoords(left, 1).concat(merged); } // merge left into center if (right) { merged = merged.concat(shiftFeatureCoords(right, -1)); } // merge right into center } return merged; } function shiftFeatureCoords(features, offset) { var newFeatures = []; for (var i = 0; i < features.length; i++) { var feature = features[i], type = feature.type; var newGeometry; if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { newGeometry = shiftCoords(feature.geometry, offset); } else if (type === 'MultiLineString' || type === 'Polygon') { newGeometry = []; for (var j = 0; j < feature.geometry.length; j++) { newGeometry.push(shiftCoords(feature.geometry[j], offset)); } } else if (type === 'MultiPolygon') { newGeometry = []; for (j = 0; j < feature.geometry.length; j++) { var newPolygon = []; for (var k = 0; k < feature.geometry[j].length; k++) { newPolygon.push(shiftCoords(feature.geometry[j][k], offset)); } newGeometry.push(newPolygon); } } newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags)); } return newFeatures; } function shiftCoords(points, offset) { var newPoints = []; newPoints.size = points.size; if (points.start !== undefined) { newPoints.start = points.start; newPoints.end = points.end; } for (var i = 0; i < points.length; i += 3) { newPoints.push(points[i] + offset, points[i + 1], points[i + 2]); } return newPoints; } // Transforms the coordinates of each feature in the given tile from // mercator-projected space into (extent x extent) tile space. function transformTile(tile, extent) { if (tile.transformed) { return tile; } var z2 = 1 << tile.z, tx = tile.x, ty = tile.y, i, j, k; for (i = 0; i < tile.features.length; i++) { var feature = tile.features[i], geom = feature.geometry, type = feature.type; feature.geometry = []; if (type === 1) { for (j = 0; j < geom.length; j += 2) { feature.geometry.push(transformPoint(geom[j], geom[j + 1], extent, z2, tx, ty)); } } else { for (j = 0; j < geom.length; j++) { var ring = []; for (k = 0; k < geom[j].length; k += 2) { ring.push(transformPoint(geom[j][k], geom[j][k + 1], extent, z2, tx, ty)); } feature.geometry.push(ring); } } } tile.transformed = true; return tile; } function transformPoint(x, y, extent, z2, tx, ty) { return [ Math.round(extent * (x * z2 - tx)), Math.round(extent * (y * z2 - ty))]; } function createTile(features, z, tx, ty, options) { var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent); var tile = { features: [], numPoints: 0, numSimplified: 0, numFeatures: 0, source: null, x: tx, y: ty, z: z, transformed: false, minX: 2, minY: 1, maxX: -1, maxY: 0 }; for (var i = 0; i < features.length; i++) { tile.numFeatures++; addFeature(tile, features[i], tolerance, options); var minX = features[i].minX; var minY = features[i].minY; var maxX = features[i].maxX; var maxY = features[i].maxY; if (minX < tile.minX) { tile.minX = minX; } if (minY < tile.minY) { tile.minY = minY; } if (maxX > tile.maxX) { tile.maxX = maxX; } if (maxY > tile.maxY) { tile.maxY = maxY; } } return tile; } function addFeature(tile, feature, tolerance, options) { var geom = feature.geometry, type = feature.type, simplified = []; if (type === 'Point' || type === 'MultiPoint') { for (var i = 0; i < geom.length; i += 3) { simplified.push(geom[i]); simplified.push(geom[i + 1]); tile.numPoints++; tile.numSimplified++; } } else if (type === 'LineString') { addLine(simplified, geom, tile, tolerance, false, false); } else if (type === 'MultiLineString' || type === 'Polygon') { for (i = 0; i < geom.length; i++) { addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0); } } else if (type === 'MultiPolygon') { for (var k = 0; k < geom.length; k++) { var polygon = geom[k]; for (i = 0; i < polygon.length; i++) { addLine(simplified, polygon[i], tile, tolerance, true, i === 0); } } } if (simplified.length) { var tags = feature.tags || null; if (type === 'LineString' && options.lineMetrics) { tags = {}; for (var key in feature.tags) { tags[key] = feature.tags[key]; } tags['mapbox_clip_start'] = geom.start / geom.size; tags['mapbox_clip_end'] = geom.end / geom.size; } var tileFeature = { geometry: simplified, type: type === 'Polygon' || type === 'MultiPolygon' ? 3 : type === 'LineString' || type === 'MultiLineString' ? 2 : 1, tags: tags }; if (feature.id !== null) { tileFeature.id = feature.id; } tile.features.push(tileFeature); } } function addLine(result, geom, tile, tolerance, isPolygon, isOuter) { var sqTolerance = tolerance * tolerance; if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) { tile.numPoints += geom.length / 3; return; } var ring = []; for (var i = 0; i < geom.length; i += 3) { if (tolerance === 0 || geom[i + 2] > sqTolerance) { tile.numSimplified++; ring.push(geom[i]); ring.push(geom[i + 1]); } tile.numPoints++; } if (isPolygon) { rewind$1(ring, isOuter); } result.push(ring); } function rewind$1(ring, clockwise) { var area = 0; for (var i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) { area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]); } if (area > 0 === clockwise) { for (i = 0, len = ring.length; i < len / 2; i += 2) { var x = ring[i]; var y = ring[i + 1]; ring[i] = ring[len - 2 - i]; ring[i + 1] = ring[len - 1 - i]; ring[len - 2 - i] = x; ring[len - 1 - i] = y; } } } function geojsonvt(data, options) { return new GeoJSONVT(data, options); } function GeoJSONVT(data, options) { options = this.options = extend$1(Object.create(this.options), options); var debug = options.debug; if (debug) { console.time('preprocess data'); } if (options.maxZoom < 0 || options.maxZoom > 24) { throw new Error('maxZoom should be in the 0-24 range'); } if (options.promoteId && options.generateId) { throw new Error('promoteId and generateId cannot be used together.'); } var features = convert(data, options); this.tiles = {}; this.tileCoords = []; if (debug) { console.timeEnd('preprocess data'); console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); console.time('generate tiles'); this.stats = {}; this.total = 0; } features = wrap(features, options); // start slicing from the top tile down if (features.length) { this.splitTile(features, 0, 0, 0); } if (debug) { if (features.length) { console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); } console.timeEnd('generate tiles'); console.log('tiles generated:', this.total, JSON.stringify(this.stats)); } } GeoJSONVT.prototype.options = { maxZoom: 14, // max zoom to preserve detail on indexMaxZoom: 5, // max zoom in the tile index indexMaxPoints: 100000, // max number of points per tile in the tile index tolerance: 3, // simplification tolerance (higher means simpler) extent: 4096, // tile extent buffer: 64, // tile buffer on each side lineMetrics: false, // whether to calculate line metrics promoteId: null, // name of a feature property to be promoted to feature.id generateId: false, // whether to generate feature ids. Cannot be used with promoteId debug: 0 // logging level (0, 1 or 2) }; GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { var stack = [features, z, x, y], options = this.options, debug = options.debug; // avoid recursion by using a processing queue while (stack.length) { y = stack.pop(); x = stack.pop(); z = stack.pop(); features = stack.pop(); var z2 = 1 << z, id = toID(z, x, y), tile = this.tiles[id]; if (!tile) { if (debug > 1) { console.time('creation'); } tile = this.tiles[id] = createTile(features, z, x, y, options); this.tileCoords.push({z: z, x: x, y: y}); if (debug) { if (debug > 1) { console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)', z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified); console.timeEnd('creation'); } var key = 'z' + z; this.stats[key] = (this.stats[key] || 0) + 1; this.total++; } } // save reference to original geometry in tile so that we can drill down later if we stop now tile.source = features; // if it's the first-pass tiling if (!cz) { // stop tiling if we reached max zoom, or if the tile is too simple if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) { continue; } // if a drilldown to a specific tile } else { // stop tiling if we reached base zoom or our target tile zoom if (z === options.maxZoom || z === cz) { continue; } // stop tiling if it's not an ancestor of the target tile var m = 1 << (cz - z); if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) { continue; } } // if we slice further down, no need to keep source geometry tile.source = null; if (features.length === 0) { continue; } if (debug > 1) { console.time('clipping'); } // values we'll use for clipping var k1 = 0.5 * options.buffer / options.extent, k2 = 0.5 - k1, k3 = 0.5 + k1, k4 = 1 + k1, tl, bl, tr, br, left, right; tl = bl = tr = br = null; left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, options); right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options); features = null; if (left) { tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); left = null; } if (right) { tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); right = null; } if (debug > 1) { console.timeEnd('clipping'); } stack.push(tl || [], z + 1, x * 2, y * 2); stack.push(bl || [], z + 1, x * 2, y * 2 + 1); stack.push(tr || [], z + 1, x * 2 + 1, y * 2); stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1); } }; GeoJSONVT.prototype.getTile = function (z, x, y) { var options = this.options, extent = options.extent, debug = options.debug; if (z < 0 || z > 24) { return null; } var z2 = 1 << z; x = ((x % z2) + z2) % z2; // wrap tile x coordinate var id = toID(z, x, y); if (this.tiles[id]) { return transformTile(this.tiles[id], extent); } if (debug > 1) { console.log('drilling down to z%d-%d-%d', z, x, y); } var z0 = z, x0 = x, y0 = y, parent; while (!parent && z0 > 0) { z0--; x0 = Math.floor(x0 / 2); y0 = Math.floor(y0 / 2); parent = this.tiles[toID(z0, x0, y0)]; } if (!parent || !parent.source) { return null; } // if we found a parent tile containing the original geometry, we can drill down from it if (debug > 1) { console.log('found parent tile z%d-%d-%d', z0, x0, y0); } if (debug > 1) { console.time('drilling down'); } this.splitTile(parent.source, z0, x0, y0, z, x, y); if (debug > 1) { console.timeEnd('drilling down'); } return this.tiles[id] ? transformTile(this.tiles[id], extent) : null; }; function toID(z, x, y) { return (((1 << z) * y + x) * 32) + z; } function extend$1(dest, src) { for (var i in src) { dest[i] = src[i]; } return dest; } // function loadGeoJSONTile(params , callback ) { var canonical = params.tileID.canonical; if (!this._geoJSONIndex) { return callback(null, null); // we couldn't load the file } var geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y); if (!geoJSONTile) { return callback(null, null); // nothing in the given tile } var geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); // Encode the geojson-vt tile into binary vector tile form. This // is a convenience that allows `FeatureIndex` to operate the same way // across `VectorTileSource` and `GeoJSONSource` data. var pbf = vtPbf(geojsonWrapper); if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) { // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35) pbf = new Uint8Array(pbf); } callback(null, { vectorTile: geojsonWrapper, rawData: pbf.buffer }); } // 'loadData' received while coalescing, trigger one more 'loadData' on receiving 'coalesced' /** * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}. * This class is designed to be easily reused to support custom source types * for data formats that can be parsed/converted into an in-memory GeoJSON * representation. To do so, create it with * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`. * For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson). * * @private */ var GeoJSONWorkerSource = /*@__PURE__*/(function (VectorTileWorkerSource) { function GeoJSONWorkerSource(actor , layerIndex , availableImages , loadGeoJSON , projction) { VectorTileWorkerSource.call(this, actor, layerIndex, availableImages, loadGeoJSONTile); if (loadGeoJSON) { this.loadGeoJSON = loadGeoJSON; } this.projction = projction; } if ( VectorTileWorkerSource ) GeoJSONWorkerSource.__proto__ = VectorTileWorkerSource; GeoJSONWorkerSource.prototype = Object.create( VectorTileWorkerSource && VectorTileWorkerSource.prototype ); GeoJSONWorkerSource.prototype.constructor = GeoJSONWorkerSource; /** * Fetches (if appropriate), parses, and index geojson data into tiles. This * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile} * can correctly serve up tiles. * * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing, * expecting `callback(error, data)` to be called with either an error or a * parsed GeoJSON object. * * When `loadData` requests come in faster than they can be processed, * they are coalesced into a single request using the latest data. * See {@link GeoJSONWorkerSource#coalesce} * * @param params * @param callback * @private */ GeoJSONWorkerSource.prototype.loadData = function loadData (params , callback ) { if (this._pendingCallback) { // Tell the foreground the previous call has been abandoned this._pendingCallback(null, {abandoned: true}); } this._pendingCallback = callback; this._pendingLoadDataParams = params; if (this._state && this._state !== 'Idle') { this._state = 'NeedsLoadData'; } else { this._state = 'Coalescing'; this._loadData(); } }; /** * Internal implementation: called directly by `loadData` * or by `coalesce` using stored parameters. */ GeoJSONWorkerSource.prototype._loadData = function _loadData () { var this$1 = this; if (!this._pendingCallback || !this._pendingLoadDataParams) { performance.assert(false); return; } var callback = this._pendingCallback; var params = this._pendingLoadDataParams; delete this._pendingCallback; delete this._pendingLoadDataParams; var perf = (params && params.request && params.request.collectResourceTiming) ? new performance.RequestPerformance(params.request) : false; this.loadGeoJSON(params, function (err , data ) { if (err || !data) { return callback(err); } else if (typeof data !== 'object') { return callback(new Error(("Input data given to '" + (params.source) + "' is not a valid GeoJSON object."))); } else { geojsonRewind(data, true); try { if (params.superclusterOptions.customprj) { try { importScripts(params.superclusterOptions.customprj); } catch (e) { console.log(params); } } if (params.filter) { var compiled = performance.createExpression(params.filter, {type: 'boolean', 'property-type': 'data-driven', overridable: false, transition: false}); if (compiled.result === 'error') { throw new Error(compiled.value.map(function (err) { return ((err.key) + ": " + (err.message)); }).join(', ')); } var features = data.features.filter(function (feature) { return compiled.value.evaluate({zoom: 0}, feature); }); data = {type: 'FeatureCollection', features: features}; } var op = params.geojsonVtOptions; op.proj4Projection = this$1.projction; var superclusterop = params.superclusterOptions; superclusterop.proj4Projection = this$1.projction; this$1._geoJSONIndex = params.cluster ? new Supercluster(getSuperclusterOptions(params)).load(data.features) : geojsonvt(data, op); } catch (err) { return callback(err); } this$1.loaded = {}; var result = {}; result.data = data; if (perf) { var resourceTimingData = perf.finish(); // it's necessary to eval the result of getEntriesByName() here via parse/stringify // late evaluation in the main thread causes TypeError: illegal invocation if (resourceTimingData) { result.resourceTiming = {}; result.resourceTiming[params.source] = JSON.parse(JSON.stringify(resourceTimingData)); } } callback(null, result); } }); }; /** * While processing `loadData`, we coalesce all further * `loadData` messages into a single call to _loadData * that will happen once we've finished processing the * first message. {@link GeoJSONSource#_updateWorkerData} * is responsible for sending us the `coalesce` message * at the time it receives a response from `loadData` * * State: Idle * ↑ | * 'coalesce' 'loadData' * | (triggers load) * | ↓ * State: Coalescing * ↑ | * (triggers load) | * 'coalesce' 'loadData' * | ↓ * State: NeedsLoadData */ GeoJSONWorkerSource.prototype.coalesce = function coalesce () { if (this._state === 'Coalescing') { this._state = 'Idle'; } else if (this._state === 'NeedsLoadData') { this._state = 'Coalescing'; this._loadData(); } }; /** * Implements {@link WorkerSource#reloadTile}. * * If the tile is loaded, uses the implementation in VectorTileWorkerSource. * Otherwise, such as after a setData() call, we load the tile fresh. * * @param params * @param params.uid The UID for this tile. * @private */ GeoJSONWorkerSource.prototype.reloadTile = function reloadTile (params , callback ) { var loaded = this.loaded, uid = params.uid; if (loaded && loaded[uid]) { return VectorTileWorkerSource.prototype.reloadTile.call(this, params, callback); } else { return this.loadTile(params, callback); } }; /** * Fetch and parse GeoJSON according to the given params. Calls `callback` * with `(err, data)`, where `data` is a parsed GeoJSON object. * * GeoJSON is loaded and parsed from `params.url` if it exists, or else * expected as a literal (string or object) `params.data`. * * @param params * @param [params.url] A URL to the remote GeoJSON data. * @param [params.data] Literal GeoJSON data. Must be provided if `params.url` is not. * @private */ GeoJSONWorkerSource.prototype.loadGeoJSON = function loadGeoJSON (params , callback ) { // Because of same origin issues, urls must either include an explicit // origin or absolute path. // ie: /foo/bar.json or http://example.com/bar.json // but not ../foo/bar.json if (params.request) { performance.getJSON(params.request, callback); } else if (typeof params.data === 'string') { try { return callback(null, JSON.parse(params.data)); } catch (e) { return callback(new Error(("Input data given to '" + (params.source) + "' is not a valid GeoJSON object."))); } } else { return callback(new Error(("Input data given to '" + (params.source) + "' is not a valid GeoJSON object."))); } }; GeoJSONWorkerSource.prototype.removeSource = function removeSource (params , callback ) { if (this._pendingCallback) { // Don't leak callbacks this._pendingCallback(null, {abandoned: true}); } callback(); }; GeoJSONWorkerSource.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (params , callback ) { try { callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId)); } catch (e) { callback(e); } }; GeoJSONWorkerSource.prototype.getClusterChildren = function getClusterChildren (params , callback ) { try { callback(null, this._geoJSONIndex.getChildren(params.clusterId)); } catch (e) { callback(e); } }; GeoJSONWorkerSource.prototype.getClusterLeaves = function getClusterLeaves (params , callback ) { try { callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset)); } catch (e) { callback(e); } }; return GeoJSONWorkerSource; }(VectorTileWorkerSource)); function getSuperclusterOptions(ref) { var superclusterOptions = ref.superclusterOptions; var clusterProperties = ref.clusterProperties; if (!clusterProperties || !superclusterOptions) { return superclusterOptions; } var mapExpressions = {}; var reduceExpressions = {}; var globals = {accumulated: null, zoom: 0}; var feature = {properties: null}; var propertyNames = Object.keys(clusterProperties); for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; var ref$1 = clusterProperties[key]; var operator = ref$1[0]; var mapExpression = ref$1[1]; var mapExpressionParsed = performance.createExpression(mapExpression); var reduceExpressionParsed = performance.createExpression( typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator); performance.assert(mapExpressionParsed.result === 'success'); performance.assert(reduceExpressionParsed.result === 'success'); mapExpressions[key] = mapExpressionParsed.value; reduceExpressions[key] = reduceExpressionParsed.value; } superclusterOptions.map = function (pointProperties) { feature.properties = pointProperties; var properties = {}; for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; properties[key] = mapExpressions[key].evaluate(globals, feature); } return properties; }; superclusterOptions.reduce = function (accumulated, clusterProperties) { feature.properties = clusterProperties; for (var i = 0, list = propertyNames; i < list.length; i += 1) { var key = list[i]; globals.accumulated = accumulated[key]; accumulated[key] = reduceExpressions[key].evaluate(globals, feature); } }; return superclusterOptions; } // /** * @private */ var Worker = function Worker(self ) { var this$1 = this; this.self = self; this.actor = new performance.Actor(self, this); this.layerIndexes = {}; this.availableImages = {}; this.workerSourceTypes = { vector: VectorTileWorkerSource, geojson: GeoJSONWorkerSource }; // [mapId][sourceType][sourceName] => worker source instance this.workerSources = {}; this.demWorkerSources = {}; this.self.registerWorkerSource = function (name , WorkerSource ) { if (this$1.workerSourceTypes[name]) { throw new Error(("Worker source with name \"" + name + "\" already registered.")); } this$1.workerSourceTypes[name] = WorkerSource; }; // This is invoked by the RTL text plugin when the download via the `importScripts` call has finished, and the code has been parsed. this.self.registerRTLTextPlugin = function (rtlTextPlugin ) { if (performance.plugin.isParsed()) { throw new Error('RTL text plugin already registered.'); } performance.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; performance.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; performance.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText; }; }; Worker.prototype.setReferrer = function setReferrer (mapID , referrer ) { this.referrer = referrer; }; Worker.prototype.setImages = function setImages (mapId , images , callback ) { this.availableImages[mapId] = images; for (var workerSource in this.workerSources[mapId]) { var ws = this.workerSources[mapId][workerSource]; for (var source in ws) { ws[source].availableImages = images; } } callback(); }; Worker.prototype.setLayers = function setLayers (mapId , layers , callback ) { this.getLayerIndex(mapId).replace(layers); callback(); }; Worker.prototype.updateLayers = function updateLayers (mapId , params , callback ) { this.getLayerIndex(mapId).update(params.layers, params.removedIds); callback(); }; Worker.prototype.loadTile = function loadTile (mapId , params , callback ) { performance.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).loadTile(params, callback); }; Worker.prototype.loadDEMTile = function loadDEMTile (mapId , params , callback ) { this.getDEMWorkerSource(mapId, params.source).loadTile(params, callback); }; Worker.prototype.reloadTile = function reloadTile (mapId , params , callback ) { performance.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).reloadTile(params, callback); }; Worker.prototype.abortTile = function abortTile (mapId , params , callback ) { performance.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback); }; Worker.prototype.removeTile = function removeTile (mapId , params , callback ) { performance.assert(params.type); this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback); }; Worker.prototype.removeDEMTile = function removeDEMTile (mapId , params ) { this.getDEMWorkerSource(mapId, params.source).removeTile(params); }; Worker.prototype.removeSource = function removeSource (mapId , params , callback ) { performance.assert(params.type); performance.assert(params.source); if (!this.workerSources[mapId] || !this.workerSources[mapId][params.type] || !this.workerSources[mapId][params.type][params.source]) { return; } var worker = this.workerSources[mapId][params.type][params.source]; delete this.workerSources[mapId][params.type][params.source]; if (worker.removeSource !== undefined) { worker.removeSource(params, callback); } else { callback(); } }; /** * Load a {@link WorkerSource} script at params.url. The script is run * (using importScripts) with `registerWorkerSource` in scope, which is a * function taking `(name, workerSourceObject)`. * @private */ Worker.prototype.loadWorkerSource = function loadWorkerSource (map , params , callback ) { try { this.self.importScripts(params.url); callback(); } catch (e) { callback(e.toString()); } }; Worker.prototype.syncRTLPluginState = function syncRTLPluginState (map , state , callback ) { try { performance.plugin.setState(state); var pluginURL = performance.plugin.getPluginURL(); if ( performance.plugin.isLoaded() && !performance.plugin.isParsed() && pluginURL != null // Not possible when `isLoaded` is true, but keeps flow happy ) { this.self.importScripts(pluginURL); var complete = performance.plugin.isParsed(); var error = complete ? undefined : new Error(("RTL Text Plugin failed to import scripts from " + pluginURL)); callback(error, complete); } } catch (e) { callback(e.toString()); } }; Worker.prototype.getAvailableImages = function getAvailableImages (mapId ) { var availableImages = this.availableImages[mapId]; if (!availableImages) { availableImages = []; } return availableImages; }; Worker.prototype.getLayerIndex = function getLayerIndex (mapId ) { var layerIndexes = this.layerIndexes[mapId]; if (!layerIndexes) { layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); } return layerIndexes; }; Worker.prototype.getWorkerSource = function getWorkerSource (mapId , type , source , crs) { var this$1 = this; if (!this.workerSources[mapId]) { this.workerSources[mapId] = {}; } if (!this.workerSources[mapId][type]) { this.workerSources[mapId][type] = {}; } var crsChange = false; var projction; if (crs) { crsChange = crs._id !== this._lastCRSId; this._lastCRSId = crs._id; if (crs.WKT) { performance.proj4.defs(crs.epsgCode, crs.WKT); projction = performance.proj4(crs.epsgCode); } else { projction = performance.proj4(crs.epsgCode); } } if (!this.workerSources[mapId][type][source]) { // use a wrapped actor so that we can attach a target mapId param // to any messages invoked by the WorkerSource var actor = { send: function (type, data, callback, mustQueue, sourceId) { this$1.actor.send(type, data, callback, mapId, mustQueue, sourceId); } }; this.workerSources[mapId][type][source] = new (this.workerSourceTypes[type] )((actor ), this.getLayerIndex(mapId), this.getAvailableImages(mapId), null, projction); } else { if (crsChange) { this.workerSources[mapId][type][source].projction = projction; } } return this.workerSources[mapId][type][source]; }; Worker.prototype.getDEMWorkerSource = function getDEMWorkerSource (mapId , source ) { if (!this.demWorkerSources[mapId]) { this.demWorkerSources[mapId] = {}; } if (!this.demWorkerSources[mapId][source]) { this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource(); } return this.demWorkerSources[mapId][source]; }; Worker.prototype.enforceCacheSizeLimit = function enforceCacheSizeLimit$1 (mapId , limit ) { performance.enforceCacheSizeLimit(limit); }; /* global self, WorkerGlobalScope */ if (typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope) { self.worker = new Worker(self); } return Worker; }); define(['./shared'], function (performance) { 'use strict'; var mapboxGlSupported = performance.createCommonjsModule(function (module) { 'use strict'; if ('object' !== 'undefined' && module.exports) { module.exports = isSupported; } else if (window) { window.mapboxgl = window.mapboxgl || {}; window.mapboxgl.supported = isSupported; window.mapboxgl.notSupportedReason = notSupportedReason; } /** * Test whether the current browser supports Mapbox GL JS * @param {Object} options * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false` * if the performance of Mapbox GL JS would be dramatically worse than * expected (i.e. a software renderer is would be used) * @return {boolean} */ function isSupported(options) { return !notSupportedReason(options); } function notSupportedReason(options) { if (!isBrowser()) { return 'not a browser'; } if (!isArraySupported()) { return 'insufficent Array support'; } if (!isFunctionSupported()) { return 'insufficient Function support'; } if (!isObjectSupported()) { return 'insufficient Object support'; } if (!isJSONSupported()) { return 'insufficient JSON support'; } if (!isWorkerSupported()) { return 'insufficient worker support'; } if (!isUint8ClampedArraySupported()) { return 'insufficient Uint8ClampedArray support'; } if (!isArrayBufferSupported()) { return 'insufficient ArrayBuffer support'; } if (!isCanvasGetImageDataSupported()) { return 'insufficient Canvas/getImageData support'; } if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) { return 'insufficient WebGL support'; } } function isBrowser() { return typeof window !== 'undefined' && typeof document !== 'undefined'; } function isArraySupported() { return ( Array.prototype && Array.prototype.every && Array.prototype.filter && Array.prototype.forEach && Array.prototype.indexOf && Array.prototype.lastIndexOf && Array.prototype.map && Array.prototype.some && Array.prototype.reduce && Array.prototype.reduceRight && Array.isArray ); } function isFunctionSupported() { return Function.prototype && Function.prototype.bind; } function isObjectSupported() { return ( Object.keys && Object.create && Object.getPrototypeOf && Object.getOwnPropertyNames && Object.isSealed && Object.isFrozen && Object.isExtensible && Object.getOwnPropertyDescriptor && Object.defineProperty && Object.defineProperties && Object.seal && Object.freeze && Object.preventExtensions ); } function isJSONSupported() { return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; } function isWorkerSupported() { if (!('Worker' in window && 'Blob' in window && 'URL' in window)) { return false; } var blob = new Blob([''], { type: 'text/javascript' }); var workerURL = URL.createObjectURL(blob); var supported; var worker; try { worker = new Worker(workerURL); supported = true; } catch (e) { supported = false; } if (worker) { worker.terminate(); } URL.revokeObjectURL(workerURL); return supported; } // IE11 only supports `Uint8ClampedArray` as of version // [KB2929437](https://support.microsoft.com/en-us/kb/2929437) function isUint8ClampedArraySupported() { return 'Uint8ClampedArray' in window; } // https://github.com/mapbox/mapbox-gl-supported/issues/19 function isArrayBufferSupported() { return ArrayBuffer.isView; } // Some browsers or browser extensions block access to canvas data to prevent fingerprinting. // Mapbox GL uses this API to load sprites and images in general. function isCanvasGetImageDataSupported() { var canvas = document.createElement('canvas'); canvas.width = canvas.height = 1; var context = canvas.getContext('2d'); if (!context) { return false; } var imageData = context.getImageData(0, 0, 1, 1); return imageData && imageData.width === canvas.width; } var isWebGLSupportedCache = {}; function isWebGLSupportedCached(failIfMajorPerformanceCaveat) { if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) { isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat); } return isWebGLSupportedCache[failIfMajorPerformanceCaveat]; } isSupported.webGLContextAttributes = { antialias: false, alpha: true, stencil: true, depth: true }; function getWebGLContext(failIfMajorPerformanceCaveat) { var canvas = document.createElement('canvas'); var attributes = Object.create(isSupported.webGLContextAttributes); attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; if (canvas.probablySupportsContext) { return ( canvas.probablySupportsContext('webgl', attributes) || canvas.probablySupportsContext('experimental-webgl', attributes) ); } else if (canvas.supportsContext) { return ( canvas.supportsContext('webgl', attributes) || canvas.supportsContext('experimental-webgl', attributes) ); } else { return ( canvas.getContext('webgl', attributes) || canvas.getContext('experimental-webgl', attributes) ); } } function isWebGLSupported(failIfMajorPerformanceCaveat) { var gl = getWebGLContext(failIfMajorPerformanceCaveat); if (!gl) { return false; } // Try compiling a shader and get its compile status. Some browsers like Brave block this API // to prevent fingerprinting. Unfortunately, this also means that Mapbox GL won't work. var shader = gl.createShader(gl.VERTEX_SHADER); if (!shader || gl.isContextLost()) { return false; } gl.shaderSource(shader, 'void main() {}'); gl.compileShader(shader); return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true; } }); // strict var DOM = {}; DOM.create = function (tagName , className , container ) { var el = performance.window.document.createElement(tagName); if (className !== undefined) { el.className = className; } if (container) { container.appendChild(el); } return el; }; DOM.createNS = function (namespaceURI , tagName ) { var el = performance.window.document.createElementNS(namespaceURI, tagName); return el; }; var docStyle = performance.window.document && performance.window.document.documentElement.style; function testProp(props) { if (!docStyle) { return props[0]; } for (var i = 0; i < props.length; i++) { if (props[i] in docStyle) { return props[i]; } } return props[0]; } var selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']); var userSelect; DOM.disableDrag = function () { if (docStyle && selectProp) { userSelect = docStyle[selectProp]; docStyle[selectProp] = 'none'; } }; DOM.enableDrag = function () { if (docStyle && selectProp) { docStyle[selectProp] = userSelect; } }; var transformProp = testProp(['transform', 'WebkitTransform']); DOM.setTransform = function(el , value ) { // https://github.com/facebook/flow/issues/7754 // $FlowFixMe el.style[transformProp] = value; }; // Feature detection for {passive: false} support in add/removeEventListener. var passiveSupported = false; try { // https://github.com/facebook/flow/issues/285 // $FlowFixMe var options$1 = Object.defineProperty({}, "passive", { get: function get() { // eslint-disable-line passiveSupported = true; } }); performance.window.addEventListener("test", options$1, options$1); performance.window.removeEventListener("test", options$1, options$1); } catch (err) { passiveSupported = false; } DOM.addEventListener = function(target , type , callback , options) { if ( options === void 0 ) options = {}; if ('passive' in options && passiveSupported) { target.addEventListener(type, callback, options); } else { target.addEventListener(type, callback, options.capture); } }; DOM.removeEventListener = function(target , type , callback , options) { if ( options === void 0 ) options = {}; if ('passive' in options && passiveSupported) { target.removeEventListener(type, callback, options); } else { target.removeEventListener(type, callback, options.capture); } }; // Suppress the next click, but only if it's immediate. var suppressClick = function (e) { e.preventDefault(); e.stopPropagation(); performance.window.removeEventListener('click', suppressClick, true); }; DOM.suppressClick = function() { performance.window.addEventListener('click', suppressClick, true); performance.window.setTimeout(function () { performance.window.removeEventListener('click', suppressClick, true); }, 0); }; DOM.mousePos = function (el , e ) { var rect = el.getBoundingClientRect(); return new performance.Point( e.clientX - rect.left - el.clientLeft, e.clientY - rect.top - el.clientTop ); }; DOM.touchPos = function (el , touches ) { var rect = el.getBoundingClientRect(), points = []; for (var i = 0; i < touches.length; i++) { points.push(new performance.Point( touches[i].clientX - rect.left - el.clientLeft, touches[i].clientY - rect.top - el.clientTop )); } return points; }; DOM.mouseButton = function (e ) { performance.assert(e.type === 'mousedown' || e.type === 'mouseup'); if (typeof performance.window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && performance.window.navigator.platform.toUpperCase().indexOf('MAC') >= 0) { // Fix for https://github.com/mapbox/mapbox-gl-js/issues/3131: // Firefox (detected by InstallTrigger) on Mac determines e.button = 2 when // using Control + left click return 0; } return e.button; }; DOM.remove = function(node ) { if (node.parentNode) { node.parentNode.removeChild(node); } }; // function loadSprite(baseURL , requestManager , callback ) { var json , image, error; var format = performance.browser.devicePixelRatio > 1 ? '@2x' : ''; var jsonRequest = performance.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), performance.ResourceType.SpriteJSON), function (err , data ) { jsonRequest = null; if (!error) { error = err; json = data; maybeComplete(); } }); var imageRequest = performance.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), performance.ResourceType.SpriteImage), function (err, img) { imageRequest = null; if (!error) { error = err; image = img; maybeComplete(); } }); function maybeComplete() { if (error) { callback(error); } else if (json && image) { var imageData = performance.browser.getImageData(image); var result = {}; for (var id in json) { var ref = json[id]; var width = ref.width; var height = ref.height; var x = ref.x; var y = ref.y; var sdf = ref.sdf; var pixelRatio = ref.pixelRatio; var stretchX = ref.stretchX; var stretchY = ref.stretchY; var content = ref.content; var data = new performance.RGBAImage({width: width, height: height}); performance.RGBAImage.copy(imageData, data, {x: x, y: y}, {x: 0, y: 0}, {width: width, height: height}); result[id] = {data: data, pixelRatio: pixelRatio, sdf: sdf, stretchX: stretchX, stretchY: stretchY, content: content}; } callback(null, result); } } return { cancel: function cancel() { if (jsonRequest) { jsonRequest.cancel(); jsonRequest = null; } if (imageRequest) { imageRequest.cancel(); imageRequest = null; } } }; } // function renderStyleImage(image ) { var userImage = image.userImage; if (userImage && userImage.render) { var updated = userImage.render(); if (updated) { image.data.replace(new Uint8Array(userImage.data.buffer)); return true; } } return false; } /** * Interface for dynamically generated style images. This is a specification for * implementers to model: it is not an exported method or class. * * Images implementing this interface can be redrawn for every frame. They can be used to animate * icons and patterns or make them respond to user input. Style images can implement a * {@link StyleImageInterface#render} method. The method is called every frame and * can be used to update the image. * * @interface StyleImageInterface * @property {number} width * @property {number} height * @property {Uint8Array | Uint8ClampedArray} data * * @see [Add an animated icon to the map.](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/) * * @example * var flashingSquare = { * width: 64, * height: 64, * data: new Uint8Array(64 * 64 * 4), * * onAdd: function(map) { * this.map = map; * }, * * render: function() { * // keep repainting while the icon is on the map * this.map.triggerRepaint(); * * // alternate between black and white based on the time * var value = Math.round(Date.now() / 1000) % 2 === 0 ? 255 : 0; * * // check if image needs to be changed * if (value !== this.previousValue) { * this.previousValue = value; * * var bytesPerPixel = 4; * for (var x = 0; x < this.width; x++) { * for (var y = 0; y < this.height; y++) { * var offset = (y * this.width + x) * bytesPerPixel; * this.data[offset + 0] = value; * this.data[offset + 1] = value; * this.data[offset + 2] = value; * this.data[offset + 3] = 255; * } * } * * // return true to indicate that the image changed * return true; * } * } * } * * map.addImage('flashing_square', flashingSquare); */ /** * This method is called once before every frame where the icon will be used. * The method can optionally update the image's `data` member with a new image. * * If the method updates the image it must return `true` to commit the change. * If the method returns `false` or nothing the image is assumed to not have changed. * * If updates are infrequent it maybe easier to use {@link Map#updateImage} to update * the image instead of implementing this method. * * @function * @memberof StyleImageInterface * @instance * @name render * @return {boolean} `true` if this method updated the image. `false` if the image was not changed. */ /** * Optional method called when the layer has been added to the Map with {@link Map#addImage}. * * @function * @memberof StyleImageInterface * @instance * @name onAdd * @param {Map} map The Map this custom layer was just added to. */ /** * Optional method called when the icon is removed from the map with {@link Map#removeImage}. * This gives the image a chance to clean up resources and event listeners. * * @function * @memberof StyleImageInterface * @instance * @name onRemove */ // // When copied into the atlas texture, image data is padded by one pixel on each side. Icon // images are padded with fully transparent pixels, while pattern images are padded with a // copy of the image data wrapped from the opposite side. In both cases, this ensures the // correct behavior of GL_LINEAR texture sampling mode. var padding = 1; /* ImageManager does three things: 1. Tracks requests for icon images from tile workers and sends responses when the requests are fulfilled. 2. Builds a texture atlas for pattern images. 3. Rerenders renderable images once per frame These are disparate responsibilities and should eventually be handled by different classes. When we implement data-driven support for `*-pattern`, we'll likely use per-bucket pattern atlases, and that would be a good time to refactor this. */ var ImageManager = /*@__PURE__*/(function (Evented) { function ImageManager() { Evented.call(this); this.images = {}; this.updatedImages = {}; this.callbackDispatchedThisFrame = {}; this.loaded = false; this.requestors = []; this.patterns = {}; this.atlasImage = new performance.RGBAImage({width: 1, height: 1}); this.dirty = true; } if ( Evented ) ImageManager.__proto__ = Evented; ImageManager.prototype = Object.create( Evented && Evented.prototype ); ImageManager.prototype.constructor = ImageManager; ImageManager.prototype.isLoaded = function isLoaded () { return this.loaded; }; ImageManager.prototype.setLoaded = function setLoaded (loaded ) { if (this.loaded === loaded) { return; } this.loaded = loaded; if (loaded) { for (var i = 0, list = this.requestors; i < list.length; i += 1) { var ref = list[i]; var ids = ref.ids; var callback = ref.callback; this._notify(ids, callback); } this.requestors = []; } }; ImageManager.prototype.getImage = function getImage (id ) { return this.images[id]; }; ImageManager.prototype.addImage = function addImage (id , image ) { performance.assert(!this.images[id]); if (this._validate(id, image)) { this.images[id] = image; } }; ImageManager.prototype._validate = function _validate (id , image ) { var valid = true; if (!this._validateStretch(image.stretchX, image.data && image.data.width)) { this.fire(new performance.ErrorEvent(new Error(("Image \"" + id + "\" has invalid \"stretchX\" value")))); valid = false; } if (!this._validateStretch(image.stretchY, image.data && image.data.height)) { this.fire(new performance.ErrorEvent(new Error(("Image \"" + id + "\" has invalid \"stretchY\" value")))); valid = false; } if (!this._validateContent(image.content, image)) { this.fire(new performance.ErrorEvent(new Error(("Image \"" + id + "\" has invalid \"content\" value")))); valid = false; } return valid; }; ImageManager.prototype._validateStretch = function _validateStretch (stretch , size ) { if (!stretch) { return true; } var last = 0; for (var i = 0, list = stretch; i < list.length; i += 1) { var part = list[i]; if (part[0] < last || part[1] < part[0] || size < part[1]) { return false; } last = part[1]; } return true; }; ImageManager.prototype._validateContent = function _validateContent (content , image ) { if (!content) { return true; } if (content.length !== 4) { return false; } if (content[0] < 0 || image.data.width < content[0]) { return false; } if (content[1] < 0 || image.data.height < content[1]) { return false; } if (content[2] < 0 || image.data.width < content[2]) { return false; } if (content[3] < 0 || image.data.height < content[3]) { return false; } if (content[2] < content[0]) { return false; } if (content[3] < content[1]) { return false; } return true; }; ImageManager.prototype.updateImage = function updateImage (id , image ) { var oldImage = this.images[id]; performance.assert(oldImage); performance.assert(oldImage.data.width === image.data.width); performance.assert(oldImage.data.height === image.data.height); image.version = oldImage.version + 1; this.images[id] = image; this.updatedImages[id] = true; }; ImageManager.prototype.removeImage = function removeImage (id ) { performance.assert(this.images[id]); var image = this.images[id]; delete this.images[id]; delete this.patterns[id]; if (image.userImage && image.userImage.onRemove) { image.userImage.onRemove(); } }; ImageManager.prototype.listImages = function listImages () { return Object.keys(this.images); }; ImageManager.prototype.getImages = function getImages (ids , callback ) { // If the sprite has been loaded, or if all the icon dependencies are already present // (i.e. if they've been added via runtime styling), then notify the requestor immediately. // Otherwise, delay notification until the sprite is loaded. At that point, if any of the // dependencies are still unavailable, we'll just assume they are permanently missing. var hasAllDependencies = true; if (!this.isLoaded()) { for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; if (!this.images[id]) { hasAllDependencies = false; } } } if (this.isLoaded() || hasAllDependencies) { this._notify(ids, callback); } else { this.requestors.push({ids: ids, callback: callback}); } }; ImageManager.prototype._notify = function _notify (ids , callback ) { var response = {}; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var image = this.images[id]; if(!image && this.defaultImageManger){ image= this.defaultImageManger.getImage(id); } if (!image) { this.fire(new performance.Event('styleimagemissing', {id: id})); } if (image) { // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred. response[id] = { data: image.data.clone(), pixelRatio: image.pixelRatio, sdf: image.sdf, version: image.version, stretchX: image.stretchX, stretchY: image.stretchY, content: image.content, hasRenderCallback: Boolean(image.userImage && image.userImage.render) }; } else { performance.warnOnce(("Image \"" + id + "\" could not be loaded. Please make sure you have added the image with map.addImage() or a \"sprite\" property in your style. You can provide missing images by listening for the \"styleimagemissing\" map event.")); } } callback(null, response); }; // Pattern stuff ImageManager.prototype.getPixelSize = function getPixelSize () { var ref = this.atlasImage; var width = ref.width; var height = ref.height; return {width: width, height: height}; }; ImageManager.prototype.getPattern = function getPattern (id ) { var pattern = this.patterns[id]; var image = this.getImage(id); if (!image) { return null; } if (pattern && pattern.position.version === image.version) { return pattern.position; } if (!pattern) { var w = image.data.width + padding * 2; var h = image.data.height + padding * 2; var bin = {w: w, h: h, x: 0, y: 0}; var position = new performance.ImagePosition(bin, image); this.patterns[id] = {bin: bin, position: position}; } else { pattern.position.version = image.version; } this._updatePatternAtlas(); return this.patterns[id].position; }; ImageManager.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.atlasTexture) { this.atlasTexture = new performance.Texture(context, this.atlasImage, gl.RGBA); } else if (this.dirty) { this.atlasTexture.update(this.atlasImage); this.dirty = false; } this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); }; ImageManager.prototype._updatePatternAtlas = function _updatePatternAtlas () { var bins = []; for (var id in this.patterns) { bins.push(this.patterns[id].bin); } var ref = performance.potpack(bins); var w = ref.w; var h = ref.h; var dst = this.atlasImage; dst.resize({width: w || 1, height: h || 1}); for (var id$1 in this.patterns) { var ref$1 = this.patterns[id$1]; var bin = ref$1.bin; var x = bin.x + padding; var y = bin.y + padding; var src = this.images[id$1].data; var w$1 = src.width; var h$1 = src.height; performance.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x: x, y: y}, {width: w$1, height: h$1}); // Add 1 pixel wrapped padding on each side of the image. performance.RGBAImage.copy(src, dst, {x: 0, y: h$1 - 1}, {x: x, y: y - 1}, {width: w$1, height: 1}); // T performance.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x: x, y: y + h$1}, {width: w$1, height: 1}); // B performance.RGBAImage.copy(src, dst, {x: w$1 - 1, y: 0}, {x: x - 1, y: y}, {width: 1, height: h$1}); // L performance.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x: x + w$1, y: y}, {width: 1, height: h$1}); // R } this.dirty = true; }; ImageManager.prototype.beginFrame = function beginFrame () { this.callbackDispatchedThisFrame = {}; }; ImageManager.prototype.dispatchRenderCallbacks = function dispatchRenderCallbacks (ids ) { for (var i = 0, list = ids; i < list.length; i += 1) { // the callback for the image was already dispatched for a different frame var id = list[i]; if (this.callbackDispatchedThisFrame[id]) { continue; } this.callbackDispatchedThisFrame[id] = true; var image = this.images[id]; performance.assert(image); var updated = renderStyleImage(image); if (updated) { this.updateImage(id, image); } } }; return ImageManager; }(performance.Evented)); // var ImageManagerFactory = function ImageManagerFactory() { this.imageManagers = { image_manager_default: new ImageManager() }; this.imageManagers["image_manager_default"].setLoaded(true); //this.imageManagers = {}; }; ImageManagerFactory.prototype.getImage = function getImage (id , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; return this._getImageManager(sourceId).getImage(id); }; ImageManagerFactory.prototype.setEventedParent = function setEventedParent ( parent , data , sourceId ) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; this._getImageManager(sourceId).setEventedParent(parent, data); }; ImageManagerFactory.prototype.addImage = function addImage (id , image , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; if (!this.imageManagers[sourceId]) { this.imageManagers[sourceId] = new ImageManager(); if (sourceId !== "image_manager_default") { this.imageManagers[ sourceId ].defaultImageManger = this.imageManagers[ "image_manager_default" ]; } } this._getImageManager(sourceId).addImage(id, image); }; ImageManagerFactory.prototype.updateImage = function updateImage ( id , image , sourceId ) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; if (!sourceId) { for (var key in this.imageManagers) { var imageManager = this.imageManagers[key]; imageManager.updateImage(id, image); } } else { this._getImageManager(sourceId).updateImage(id, image); } }; ImageManagerFactory.prototype.removeImage = function removeImage (id , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; this._getImageManager(sourceId).removeImage(id); }; ImageManagerFactory.prototype.listImages = function listImages (sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; var images = []; for (var key in this.imageManagers) { var imageManager = this.imageManagers[key]; images.push.apply(images, imageManager.listImages()); } return images; }; ImageManagerFactory.prototype.getImages = function getImages ( ids , callback , sourceId ) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; this._getImageManager(sourceId).getImages(ids, callback); }; ImageManagerFactory.prototype.getPixelSize = function getPixelSize (sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; return this._getImageManager(sourceId).getPixelSize(); }; ImageManagerFactory.prototype.getPattern = function getPattern (id , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; return this._getImageManager(sourceId).getPattern(id); }; ImageManagerFactory.prototype.bind = function bind (context , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; this._getImageManager(sourceId).bind(context); }; ImageManagerFactory.prototype.isLoaded = function isLoaded (sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; return this._getImageManager(sourceId).isLoaded(); }; ImageManagerFactory.prototype.isAllLoaded = function isAllLoaded () { for (var key in this.imageManagers) { var imageManager = this.imageManagers[key]; if (!imageManager.isLoaded()) { return false; } } return true; }; ImageManagerFactory.prototype.beginFrame = function beginFrame (sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; return this._getImageManager(sourceId).beginFrame(); }; ImageManagerFactory.prototype.dispatchRenderCallbacks = function dispatchRenderCallbacks ( ids , sourceId ) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; return this._getImageManager(sourceId).dispatchRenderCallbacks(ids); }; ImageManagerFactory.prototype.setLoaded = function setLoaded (loaded , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; return this._getImageManager(sourceId).setLoaded(loaded); }; ImageManagerFactory.prototype._getImageManager = function _getImageManager (sourceId) { if (this.imageManagers[sourceId]) { return this.imageManagers[sourceId]; } return this.imageManagers["image_manager_default"]; }; // function loadGlyphRange (fontstack , range , urlTemplate , requestManager , callback ) { var begin = range * 256; var end = begin + 255; var request = requestManager.transformRequest( requestManager.normalizeGlyphsURL(urlTemplate) .replace('{fontstack}', fontstack) .replace('{range}', (begin + "-" + end)), performance.ResourceType.Glyphs); performance.getArrayBuffer(request, function (err , data ) { if (err) { callback(err); } else if (data) { var glyphs = {}; for (var i = 0, list = performance.parseGlyphPBF(data); i < list.length; i += 1) { var glyph = list[i]; glyphs[glyph.id] = glyph; } callback(null, glyphs); } }); } 'use strict'; var tinySdf = TinySDF; var default_1 = TinySDF; var INF = 1e20; function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) { this.fontSize = fontSize || 24; this.buffer = buffer === undefined ? 3 : buffer; this.cutoff = cutoff || 0.25; this.fontFamily = fontFamily || 'sans-serif'; this.fontWeight = fontWeight || 'normal'; this.radius = radius || 8; var size = this.size = this.fontSize + this.buffer * 2; this.canvas = document.createElement('canvas'); this.canvas.width = this.canvas.height = size; this.ctx = this.canvas.getContext('2d'); this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily; this.ctx.textBaseline = 'middle'; this.ctx.fillStyle = 'black'; // temporary arrays for the distance transform this.gridOuter = new Float64Array(size * size); this.gridInner = new Float64Array(size * size); this.f = new Float64Array(size); this.d = new Float64Array(size); this.z = new Float64Array(size + 1); this.v = new Int16Array(size); // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852 this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1)); } TinySDF.prototype.draw = function (char) { this.ctx.clearRect(0, 0, this.size, this.size); this.ctx.fillText(char, this.buffer, this.middle); var imgData = this.ctx.getImageData(0, 0, this.size, this.size); var alphaChannel = new Uint8ClampedArray(this.size * this.size); for (var i = 0; i < this.size * this.size; i++) { var a = imgData.data[i * 4 + 3] / 255; // alpha value this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2); this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2); } edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z); edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z); for (i = 0; i < this.size * this.size; i++) { var d = this.gridOuter[i] - this.gridInner[i]; alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff)))); } return alphaChannel; }; // 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf function edt(data, width, height, f, d, v, z) { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { f[y] = data[y * width + x]; } edt1d(f, d, v, z, height); for (y = 0; y < height; y++) { data[y * width + x] = d[y]; } } for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { f[x] = data[y * width + x]; } edt1d(f, d, v, z, width); for (x = 0; x < width; x++) { data[y * width + x] = Math.sqrt(d[x]); } } } // 1D squared distance transform function edt1d(f, d, v, z, n) { v[0] = 0; z[0] = -INF; z[1] = +INF; for (var q = 1, k = 0; q < n; q++) { var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); while (s <= z[k]) { k--; s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); } k++; v[k] = q; z[k] = s; z[k + 1] = +INF; } for (q = 0, k = 0; q < n; q++) { while (z[k + 1] < q) { k++; } d[q] = (q - v[k]) * (q - v[k]) + f[v[k]]; } } tinySdf.default = default_1; // var GlyphManager = function GlyphManager(requestManager , localIdeographFontFamily ) { this.requestManager = requestManager; this.localIdeographFontFamily = localIdeographFontFamily; this.entries = {}; }; GlyphManager.prototype.setURL = function setURL (url ) { this.url = url; }; GlyphManager.prototype.getGlyphs = function getGlyphs (glyphs , callback ) { var this$1 = this; var all = []; for (var stack in glyphs) { for (var i = 0, list = glyphs[stack]; i < list.length; i += 1) { var id = list[i]; all.push({stack: stack, id: id}); } } performance.asyncAll(all, function (ref, callback ) { var stack = ref.stack; var id = ref.id; var entry = this$1.entries[stack]; if (!entry) { entry = this$1.entries[stack] = { glyphs: {}, requests: {}, ranges: {} }; } var glyph = entry.glyphs[id]; if (glyph !== undefined) { callback(null, {stack: stack, id: id, glyph: glyph}); return; } glyph = this$1._tinySDF(entry, stack, id); if (glyph) { entry.glyphs[id] = glyph; callback(null, {stack: stack, id: id, glyph: glyph}); return; } var range = Math.floor(id / 256); if (range * 256 > 65535) { callback(new Error('glyphs > 65535 not supported')); return; } if (entry.ranges[range]) { callback(null, {stack: stack, id: id, glyph: glyph}); return; } var requests = entry.requests[range]; if (!requests) { requests = entry.requests[range] = []; GlyphManager.loadGlyphRange(stack, range, (this$1.url ), this$1.requestManager, function (err, response ) { if (response) { for (var id in response) { if (!this$1._doesCharSupportLocalGlyph(+id)) { entry.glyphs[+id] = response[+id]; } } entry.ranges[range] = true; } for (var i = 0, list = requests; i < list.length; i += 1) { var cb = list[i]; cb(err, response); } delete entry.requests[range]; }); } requests.push(function (err, result ) { if (err) { callback(err); } else if (result) { callback(null, {stack: stack, id: id, glyph: result[id] || null}); } }); }, function (err, glyphs ) { if (err) { callback(err); } else if (glyphs) { var result = {}; for (var i = 0, list = glyphs; i < list.length; i += 1) { // Clone the glyph so that our own copy of its ArrayBuffer doesn't get transferred. var ref = list[i]; var stack = ref.stack; var id = ref.id; var glyph = ref.glyph; (result[stack] || (result[stack] = {}))[id] = glyph && { id: glyph.id, bitmap: glyph.bitmap.clone(), metrics: glyph.metrics }; } callback(null, result); } }); }; GlyphManager.prototype._doesCharSupportLocalGlyph = function _doesCharSupportLocalGlyph (id ) { /* eslint-disable new-cap */ return !!this.localIdeographFontFamily && (performance.isChar['CJK Unified Ideographs'](id) || performance.isChar['Hangul Syllables'](id) || performance.isChar['Hiragana'](id) || performance.isChar['Katakana'](id)); /* eslint-enable new-cap */ }; GlyphManager.prototype._tinySDF = function _tinySDF (entry , stack , id ) { var family = this.localIdeographFontFamily || (this.url ? null : stack); if (!family) { return; } if (family.indexOf("'supermapol-icons'") < 0) { if (!this._doesCharSupportLocalGlyph(id)) { return; } } var tinySDF = entry.tinySDF; if (!tinySDF) { var fontWeight = '400'; if (/bold/i.test(stack)) { fontWeight = '900'; } else if (/medium/i.test(stack)) { fontWeight = '500'; } else if (/light/i.test(stack)) { fontWeight = '200'; } tinySDF = entry.tinySDF = new GlyphManager.TinySDF(24, 3, 8, .25, family, fontWeight); } return { id: id, bitmap: new performance.AlphaImage({width: 30, height: 30}, tinySDF.draw(String.fromCharCode(id))), metrics: { width: 24, height: 24, left: 0, top: -8, advance: 24 } }; }; GlyphManager.loadGlyphRange = loadGlyphRange; GlyphManager.TinySDF = tinySdf; // var GlyphManagerFactory = function GlyphManagerFactory(requestManager , localIdeographFontFamily ) { this.requestManager = requestManager; this.localIdeographFontFamily = localIdeographFontFamily; this.glyphManagers = {"image_manager_default":new GlyphManager(this.requestManager, this.localIdeographFontFamily)}; }; GlyphManagerFactory.prototype._getGlyphManager = function _getGlyphManager (sourceId) { if (this.glyphManagers[sourceId]) { return this.glyphManagers[sourceId]; } return this.glyphManagers["image_manager_default"]; }; GlyphManagerFactory.prototype.setURL = function setURL (url , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; if (!this.glyphManagers[sourceId]) { this.glyphManagers[sourceId] = new GlyphManager(this.requestManager, this.localIdeographFontFamily); } this._getGlyphManager(sourceId).setURL(url); }; GlyphManagerFactory.prototype.getGlyphs = function getGlyphs (glyphs , callback , sourceId) { if ( sourceId === void 0 ) sourceId = "image_manager_default"; this._getGlyphManager(sourceId).getGlyphs(glyphs, callback); }; // var LightPositionProperty = function LightPositionProperty() { this.specification = performance.styleSpec.light.position; }; LightPositionProperty.prototype.possiblyEvaluate = function possiblyEvaluate (value , parameters ) { return performance.sphericalToCartesian(value.expression.evaluate(parameters)); }; LightPositionProperty.prototype.interpolate = function interpolate$1 (a , b , t ) { return { x: performance.number(a.x, b.x, t), y: performance.number(a.y, b.y, t), z: performance.number(a.z, b.z, t), }; }; var properties = new performance.Properties({ "anchor": new performance.DataConstantProperty(performance.styleSpec.light.anchor), "position": new LightPositionProperty(), "color": new performance.DataConstantProperty(performance.styleSpec.light.color), "intensity": new performance.DataConstantProperty(performance.styleSpec.light.intensity), }); var TRANSITION_SUFFIX = '-transition'; /* * Represents the light used to light extruded features. */ var Light = /*@__PURE__*/(function (Evented) { function Light(lightOptions ) { Evented.call(this); this._transitionable = new performance.Transitionable(properties); this.setLight(lightOptions); this._transitioning = this._transitionable.untransitioned(); } if ( Evented ) Light.__proto__ = Evented; Light.prototype = Object.create( Evented && Evented.prototype ); Light.prototype.constructor = Light; Light.prototype.getLight = function getLight () { return this._transitionable.serialize(); }; Light.prototype.setLight = function setLight (light , options) { if ( options === void 0 ) options = {}; if (this._validate(performance.validateLight, light, options)) { return; } for (var name in light) { var value = light[name]; if (performance.endsWith(name, TRANSITION_SUFFIX)) { this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value); } else { this._transitionable.setValue(name, value); } } }; Light.prototype.updateTransitions = function updateTransitions (parameters ) { this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); }; Light.prototype.hasTransition = function hasTransition () { return this._transitioning.hasTransition(); }; Light.prototype.recalculate = function recalculate (parameters ) { this.properties = this._transitioning.possiblyEvaluate(parameters); }; Light.prototype._validate = function _validate (validate , value , options ) { if (options && options.validate === false) { return false; } return performance.emitValidationErrors(this, validate.call(performance.validateStyle, performance.extend({ value: value, // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 style: {glyphs: true, sprite: true}, styleSpec: performance.styleSpec }))); }; return Light; }(performance.Evented)); // /** * A LineAtlas lets us reuse rendered dashed lines * by writing many of them to a texture and then fetching their positions * using .getDash. * * @param {number} width * @param {number} height * @private */ var LineAtlas = function LineAtlas(width , height ) { this.width = width; this.height = height; this.nextRow = 0; this.data = new Uint8Array(this.width * this.height); this.dashEntry = {}; }; /** * Get or create a dash line pattern. * * @param {Array} dasharray * @param {boolean} round whether to add circle caps in between dash segments * @returns {Object} position of dash texture in { y, height, width } * @private */ LineAtlas.prototype.getDash = function getDash (dasharray , round ) { var key = dasharray.join(",") + String(round); if (!this.dashEntry[key]) { this.dashEntry[key] = this.addDash(dasharray, round); } return this.dashEntry[key]; }; LineAtlas.prototype.getDashRanges = function getDashRanges (dasharray , lineAtlasWidth , stretch ) { // If dasharray has an odd length, both the first and last parts // are dashes and should be joined seamlessly. var oddDashArray = dasharray.length % 2 === 1; var ranges = []; var left = oddDashArray ? -dasharray[dasharray.length - 1] * stretch : 0; var right = dasharray[0] * stretch; var isDash = true; ranges.push({left: left, right: right, isDash: isDash, zeroLength: dasharray[0] === 0}); var currentDashLength = dasharray[0]; for (var i = 1; i < dasharray.length; i++) { isDash = !isDash; var dashLength = dasharray[i]; left = currentDashLength * stretch; currentDashLength += dashLength; right = currentDashLength * stretch; ranges.push({left: left, right: right, isDash: isDash, zeroLength: dashLength === 0}); } return ranges; }; LineAtlas.prototype.addRoundDash = function addRoundDash (ranges , stretch , n ) { var halfStretch = stretch / 2; for (var y = -n; y <= n; y++) { var row = this.nextRow + n + y; var index = this.width * row; var currIndex = 0; var range = ranges[currIndex]; for (var x = 0; x < this.width; x++) { if (x / range.right > 1) { range = ranges[++currIndex]; } var distLeft = Math.abs(x - range.left); var distRight = Math.abs(x - range.right); var minDist = Math.min(distLeft, distRight); var signedDistance = (void 0); var distMiddle = y / n * (halfStretch + 1); if (range.isDash) { var distEdge = halfStretch - Math.abs(distMiddle); signedDistance = Math.sqrt(minDist * minDist + distEdge * distEdge); } else { signedDistance = halfStretch - Math.sqrt(minDist * minDist + distMiddle * distMiddle); } this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); } } }; LineAtlas.prototype.addRegularDash = function addRegularDash (ranges ) { // Collapse any zero-length range // Collapse neighbouring same-type parts into a single part for (var i = ranges.length - 1; i >= 0; --i) { var part = ranges[i]; var next = ranges[i + 1]; if (part.zeroLength) { ranges.splice(i, 1); } else if (next && next.isDash === part.isDash) { next.left = part.left; ranges.splice(i, 1); } } // Combine the first and last parts if possible var first = ranges[0]; var last = ranges[ranges.length - 1]; if (first.isDash === last.isDash) { first.left = last.left - this.width; last.right = first.right + this.width; } var index = this.width * this.nextRow; var currIndex = 0; var range = ranges[currIndex]; for (var x = 0; x < this.width; x++) { if (x / range.right > 1) { range = ranges[++currIndex]; } var distLeft = Math.abs(x - range.left); var distRight = Math.abs(x - range.right); var minDist = Math.min(distLeft, distRight); var signedDistance = range.isDash ? minDist : -minDist; this.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); } }; LineAtlas.prototype.addDash = function addDash (dasharray , round ) { var n = round ? 7 : 0; var height = 2 * n + 1; if (this.nextRow + height > this.height) { performance.warnOnce('LineAtlas out of space'); return null; } var length = 0; for (var i = 0; i < dasharray.length; i++) { length += dasharray[i]; } if (length !== 0) { var stretch = this.width / length; var ranges = this.getDashRanges(dasharray, this.width, stretch); if (round) { this.addRoundDash(ranges, stretch, n); } else { this.addRegularDash(ranges); } } var dashEntry = { y: (this.nextRow + n + 0.5) / this.height, height: 2 * n / this.height, width: length }; this.nextRow += height; this.dirty = true; return dashEntry; }; LineAtlas.prototype.bind = function bind (context ) { var gl = context.gl; if (!this.texture) { this.texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.data); } else { gl.bindTexture(gl.TEXTURE_2D, this.texture); if (this.dirty) { this.dirty = false; gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data); } } }; // /** * Responsible for sending messages from a {@link Source} to an associated * {@link WorkerSource}. * * @private */ var Dispatcher = function Dispatcher(workerPool , parent ) { this.workerPool = workerPool; this.actors = []; this.currentActor = 0; this.id = performance.uniqueId(); var workers = this.workerPool.acquire(this.id); for (var i = 0; i < workers.length; i++) { var worker = workers[i]; var actor = new Dispatcher.Actor(worker, parent, this.id); actor.name = "Worker " + i; this.actors.push(actor); } performance.assert(this.actors.length); }; /** * Broadcast a message to all Workers. * @private */ Dispatcher.prototype.broadcast = function broadcast (type , data , cb ) { performance.assert(this.actors.length); cb = cb || function () {}; performance.asyncAll(this.actors, function (actor, done) { actor.send(type, data, done); }, cb); }; /** * Acquires an actor to dispatch messages to. The actors are distributed in round-robin fashion. * @returns An actor object backed by a web worker for processing messages. */ Dispatcher.prototype.getActor = function getActor () { performance.assert(this.actors.length); this.currentActor = (this.currentActor + 1) % this.actors.length; return this.actors[this.currentActor]; }; Dispatcher.prototype.remove = function remove () { this.actors.forEach(function (actor) { actor.remove(); }); this.actors = []; this.workerPool.release(this.id); }; Dispatcher.Actor = performance.Actor; // function loadTileJSON(options , requestManager , callback ) { var loaded = function(err , tileJSON ) { if (err) { return callback(err); } else if (tileJSON) { var result = performance.pick( // explicit source options take precedence over TileJSON performance.extend(tileJSON, options), ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo', 'bounds', 'scheme', 'tileSize', 'encoding'] ); if (tileJSON.vector_layers) { result.vectorLayers = tileJSON.vector_layers; result.vectorLayerIds = result.vectorLayers.map(function (layer) { return layer.id; }); } result.tiles = requestManager.canonicalizeTileset(result, options.url); callback(null, result); } }; if (options.url) { return performance.getJSON(requestManager.transformRequest(requestManager.normalizeSourceURL(options.url), performance.ResourceType.Source), loaded); } else { return performance.browser.frame(function () { return loaded(null, options); }); } } // var TileBounds = function TileBounds(bounds , minzoom , maxzoom ) { this.bounds = performance.LngLatBounds.convert(this.validateBounds(bounds)); this.minzoom = minzoom || 0; this.maxzoom = maxzoom || 24; }; TileBounds.prototype.validateBounds = function validateBounds (bounds ) { // make sure the bounds property contains valid longitude and latitudes if (!Array.isArray(bounds) || bounds.length !== 4) { return [-180, -90, 180, 90]; } return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])]; }; TileBounds.prototype.contains = function contains (tileID , originX, originY, width, height, crs) { var worldSize = Math.pow(2, tileID.z); var west = this.bounds.getWest(); var north = this.bounds.getNorth(); var east = this.bounds.getEast(); var south = this.bounds.getSouth(); var center = this.bounds.getCenter(); if (crs) { var maxLat = crs.lngLatExtent[3]; var minLat = crs.lngLatExtent[1]; var maxLng = crs.lngLatExtent[2]; var minLng = crs.lngLatExtent[0]; north = Math.min(Math.max(minLat, north), maxLat); south = Math.min(Math.max(minLat, south), maxLat); west = Math.min(Math.max(minLng, west), maxLng); east = Math.min(Math.max(minLng, east), maxLng); center.lat = (north + south) / 2.0; center.lng = (west + east) / 2.0; west = crs.fromWGS84([west, center.lat])[0]; north = crs.fromWGS84([center.lng, north])[1]; east = crs.fromWGS84([east, center.lat])[0]; south = crs.fromWGS84([center.lng, south])[1]; } var level = { minX: Math.floor( ((west - originX) * worldSize) / width ), minY: Math.floor( ((originY - north) * worldSize) / height ), maxX: Math.ceil( ((east - originX) * worldSize) / width ), maxY: Math.ceil( ((originY - south) * worldSize) / height ), }; var hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY; return hit; }; // /** * A source containing vector tiles in [Mapbox Vector Tile format](https://docs.mapbox.com/vector-tiles/reference/). * (See the [Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector) for detailed documentation of options.) * * @example * map.addSource('some id', { * type: 'vector', * url: 'mapbox://mapbox.mapbox-streets-v6' * }); * * @example * map.addSource('some id', { * type: 'vector', * tiles: ['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt'], * minzoom: 6, * maxzoom: 14 * }); * * @example * map.getSource('some id').setUrl("mapbox://mapbox.mapbox-streets-v6"); * * @example * map.getSource('some id').setTiles(['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt']); * @see [Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/) * @see [Add a third party vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/third-party/) */ var VectorTileSource = /*@__PURE__*/(function (Evented) { function VectorTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.type = 'vector'; this.minzoom = 0; this.maxzoom = 22; this.scheme = 'xyz'; this.tileSize = 512; this._scales = []; this._resolutions = []; this.reparseOverscaled = true; this.isTileClipped = true; this._loaded = false; performance.extend(this, performance.pick(options, ['url', 'scheme', 'tileSize', 'promoteId'])); this._options = performance.extend({type: 'vector'}, options); this._collectResourceTiming = options.collectResourceTiming; if (this.tileSize !== 512) { throw new Error('vector tile sources must have a tileSize of 512'); } this.setEventedParent(eventedParent); } if ( Evented ) VectorTileSource.__proto__ = Evented; VectorTileSource.prototype = Object.create( Evented && Evented.prototype ); VectorTileSource.prototype.constructor = VectorTileSource; VectorTileSource.prototype.load = function load () { var this$1 = this; this._loaded = false; this.fire(new performance.Event('dataloading', {dataType: 'source'})); this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, function (err, tileJSON) { this$1._tileJSONRequest = null; this$1._loaded = true; if (err) { this$1.fire(new performance.ErrorEvent(err)); } else if (tileJSON) { performance.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } performance.postTurnstileEvent(tileJSON.tiles, this$1.map._requestManager._customAccessToken); performance.postMapLoadEvent(tileJSON.tiles, this$1.map._getMapId(), this$1.map._requestManager._skuToken, this$1.map._requestManager._customAccessToken); // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire(new performance.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); this$1.fire(new performance.Event('data', {dataType: 'source', sourceDataType: 'content'})); } }); }; VectorTileSource.prototype.loaded = function loaded () { return this._loaded; }; VectorTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical, this.originX, this.originY, this.worldWidth, this.worldHeight, this.map.getCRS()); }; VectorTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; var crs = map.getCRS(); this.worldWidth = crs.getWidth(); this.worldHeight = crs.getHeight(); this.originX = crs.getOriginX(); this.originY = crs.getOriginY(); this.load(); }; VectorTileSource.prototype.setSourceProperty = function setSourceProperty (callback ) { if (this._tileJSONRequest) { this._tileJSONRequest.cancel(); } callback(); var sourceCache = this.map.style.sourceCaches[this.id]; sourceCache.clearTiles(); this.load(); }; /** * Sets the source `tiles` property and re-renders the map. * * @param {string[]} tiles An array of one or more tile source URLs, as in the TileJSON spec. * @returns {VectorTileSource} this */ VectorTileSource.prototype.setTiles = function setTiles (tiles ) { var this$1 = this; this.setSourceProperty(function () { this$1._options.tiles = tiles; }); return this; }; /** * Sets the source `url` property and re-renders the map. * * @param {string} url A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`. * @returns {VectorTileSource} this */ VectorTileSource.prototype.setUrl = function setUrl (url ) { var this$1 = this; this.setSourceProperty(function () { this$1.url = url; this$1._options.url = url; }); return this; }; VectorTileSource.prototype.onRemove = function onRemove () { if (this._tileJSONRequest) { this._tileJSONRequest.cancel(); this._tileJSONRequest = null; } }; VectorTileSource.prototype.serialize = function serialize () { return performance.extend({}, this._options); }; VectorTileSource.prototype.loadTile = function loadTile (tile , callback ) { var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme,0,this.tileSize,this.getScale?this.getScale(tile.tileID.canonical.z, this.tileSize):undefined), this.url, null); var params = { request: this.map._requestManager.transformRequest(url, performance.ResourceType.Tile), uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, tileSize: this.tileSize * tile.tileID.overscaleFactor(), type: this.type, source: this.id, pixelRatio: performance.browser.devicePixelRatio, showCollisionBoxes: this.map.showCollisionBoxes, promoteId: this.promoteId }; params.request.collectResourceTiming = this._collectResourceTiming; if (!tile.actor || tile.state === 'expired') { tile.actor = this.dispatcher.getActor(); tile.request = tile.actor.send('loadTile', params, done.bind(this)); } else if (tile.state === 'loading') { // schedule tile reloading after it has been loaded tile.reloadCallback = callback; } else { tile.request = tile.actor.send('reloadTile', params, done.bind(this)); } function done(err, data) { delete tile.request; if (tile.aborted) { return callback(null); } if (err && err.status !== 404) { return callback(err); } if (data && data.resourceTiming) { tile.resourceTiming = data.resourceTiming; } if (this.map._refreshExpiredTiles && data) { tile.setExpiryData(data); } tile.loadVectorData(data, this.map.painter); performance.cacheEntryPossiblyAdded(this.dispatcher); callback(null); if (tile.reloadCallback) { this.loadTile(tile, tile.reloadCallback); tile.reloadCallback = null; } } }; VectorTileSource.prototype.abortTile = function abortTile (tile ) { if (tile.request) { tile.request.cancel(); delete tile.request; } if (tile.actor) { tile.actor.send('abortTile', {uid: tile.uid, type: this.type, source: this.id}, undefined); } }; VectorTileSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); if (tile.actor) { tile.actor.send('removeTile', {uid: tile.uid, type: this.type, source: this.id}, undefined); } }; VectorTileSource.prototype.hasTransition = function hasTransition () { return false; }; VectorTileSource.prototype.getMeterPerMapUnit = function getMeterPerMapUnit (unit) { var earchRadiusInMeters = 6378137; var meterPerMapUnit = 1; if (unit === "degree" || unit === "degrees" || unit === "d") { // 每度表示多少米。 meterPerMapUnit = (Math.PI * 2 * earchRadiusInMeters) / 360; } else if (unit === "kilometer" || unit === "km") { meterPerMapUnit = 1.0e-3; } else if (unit === "inch") { meterPerMapUnit = 1 / 2.5399999918e-2; } else if (unit === "foot") { meterPerMapUnit = 0.3048; } return meterPerMapUnit; }; VectorTileSource.prototype.getResolution = function getResolution (z, tileSize) { if (!this._resolutions[z]) { this._resolutions[z] = this.worldWidth / Math.pow(2, z) / tileSize; } return this._resolutions[z]; }; VectorTileSource.prototype.getScale = function getScale (z, tileSize) { if (!this._scales[z]) { var res = this.getResolution(z, tileSize); var inchPerMeter = 1 / 0.0254; // 地球半径。 var meterPerMapUnit = this.getMeterPerMapUnit(this.map.getCRS().getUnit()); var scale = res * 96 * inchPerMeter * meterPerMapUnit; this._scales[z] = 1.0 / scale; } return this._scales[z]; }; return VectorTileSource; }(performance.Evented)); // var RasterTileSource = /*@__PURE__*/(function (Evented) { function RasterTileSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.setEventedParent(eventedParent); this.type = 'raster'; this.minzoom = 0; this.maxzoom = 22; this.roundZoom = true; this.scheme = 'xyz'; this.tileSize = 512; this._loaded = false; this._scales = []; this._resolutions = []; this.transparent = true; this.rasterSource = ''; this.cacheEnabled = true; this.redirect = false; this.layersID = null; this.proxy = null; this.tileversion = null; this.rasterfunction = null; this.prjCoordSys = null; this.format = 'png'; this._options = performance.extend({type: 'raster'}, options); performance.extend(this, performance.pick(options, ['url', 'scheme', 'tileSize', 'rasterSource', 'transparent', 'cacheEnabled', 'redirect', 'layersID', 'proxy', 'tileversion', 'rasterfunction', 'format', 'prjCoordSys'])); } if ( Evented ) RasterTileSource.__proto__ = Evented; RasterTileSource.prototype = Object.create( Evented && Evented.prototype ); RasterTileSource.prototype.constructor = RasterTileSource; RasterTileSource.prototype.load = function load () { var this$1 = this; this._loaded = false; this.fire(new performance.Event('dataloading', {dataType: 'source'})); this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, function (err, tileJSON) { this$1._tileJSONRequest = null; this$1._loaded = true; if (err) { this$1.fire(new performance.ErrorEvent(err)); } else if (tileJSON) { performance.extend(this$1, tileJSON); if (tileJSON.bounds) { this$1.tileBounds = new TileBounds(tileJSON.bounds, this$1.minzoom, this$1.maxzoom); } performance.postTurnstileEvent(tileJSON.tiles); performance.postMapLoadEvent(tileJSON.tiles, this$1.map._getMapId(), this$1.map._requestManager._skuToken); // `content` is included here to prevent a race condition where `Style#_updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this$1.fire(new performance.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); this$1.fire(new performance.Event('data', {dataType: 'source', sourceDataType: 'content'})); } }); }; RasterTileSource.prototype.loaded = function loaded () { return this._loaded; }; RasterTileSource.prototype.onAdd = function onAdd (map ) { this.map = map; var crs = map.getCRS(); this.worldWidth = crs.getWidth(); this.worldHeight = crs.getHeight(); this.originX = crs.getOriginX(); this.originY = crs.getOriginY(); this.load(); }; RasterTileSource.prototype.onRemove = function onRemove () { if (this._tileJSONRequest) { this._tileJSONRequest.cancel(); this._tileJSONRequest = null; } }; RasterTileSource.prototype.serialize = function serialize () { return performance.extend({}, this._options); }; RasterTileSource.prototype.hasTile = function hasTile (tileID ) { return !this.tileBounds || this.tileBounds.contains(tileID.canonical, this.originX, this.originY, this.worldWidth, this.worldHeight, this.map.getCRS()); }; RasterTileSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var url = null; if (this.rasterSource === "iserver" && this.getScale) { var scale = this.getScale(tile.tileID.canonical.z, this.tileSize); var origin = this.map._mapCRS.getOrigin(); var mapUrls = ("" + (this.tiles[ (tile.tileID.canonical.x + tile.tileID.canonical.y) % this.tiles.length ])).split("?"); url = (mapUrls[0]) + "/tileimage." + (this.format) + "?scale=" + scale + "&x=" + (tile.tileID.canonical.x) + "&y=" + (tile.tileID.canonical.y) + "&width=" + (this.tileSize) + "&height=" + (this.tileSize) + "&transparent=" + (this.transparent) + "&redirect=" + (this.redirect) + "&cacheEnabled=" + (this.cacheEnabled) + "&origin=" + (encodeURIComponent( JSON.stringify({ x: origin[0], y: origin[1] }) )); if (this.layersID) { url = url + "&layersID=" + (this.layersID); } if (this.tileversion) { url = url + "&tileversion=" + (this.tileversion); } if (this.rasterfunction) { url = url + "&rasterfunction=" + (encodeURIComponent( JSON.stringify(this.rasterfunction) )); } if (this.prjCoordSys) { url = url + "&prjCoordSys=" + (encodeURIComponent( JSON.stringify(this.prjCoordSys) )); } if (mapUrls[1]) { url = url + "&" + (mapUrls[1]); } } else { var a = parseInt(this._options.zoomOffset) ? parseInt(this._options.zoomOffset) : 0; url = this.map._requestManager.normalizeTileURL( tile.tileID.canonical.url( this.tiles, this.scheme, a, this.tileSize, this.getScale ? this.getScale(tile.tileID.canonical.z, this.tileSize) : undefined ), this.url, this.tileSize ); } // const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); // iclient if (this.proxy) { url = "" + (this.proxy) + (encodeURIComponent(url)); } tile.request = performance.getImage(this.map._requestManager.transformRequest(url, performance.ResourceType.Tile), function (err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this$1.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var context = this$1.map.painter.context; var gl = context.gl; tile.texture = this$1.map.painter.getTileTexture(img.width); if (tile.texture) { tile.texture.update(img, {useMipmap: true}); } else { tile.texture = new performance.Texture(context, img, gl.RGBA, {useMipmap: true}); tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); if (context.extTextureFilterAnisotropic) { gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); } } tile.state = 'loaded'; performance.cacheEntryPossiblyAdded(this$1.dispatcher); callback(null); } }); }; RasterTileSource.prototype.abortTile = function abortTile (tile , callback ) { if (tile.request) { tile.request.cancel(); delete tile.request; } callback(); }; RasterTileSource.prototype.unloadTile = function unloadTile (tile , callback ) { if (tile.texture) { this.map.painter.saveTileTexture(tile.texture); } callback(); }; RasterTileSource.prototype.hasTransition = function hasTransition () { return false; }; RasterTileSource.prototype.getMeterPerMapUnit = function getMeterPerMapUnit (unit) { var earchRadiusInMeters = 6378137; var meterPerMapUnit = 1; if (unit === "degree" || unit === "degrees" || unit === "d") { // 每度表示多少米。 meterPerMapUnit = (Math.PI * 2 * earchRadiusInMeters) / 360; } else if (unit === "kilometer" || unit === "km") { meterPerMapUnit = 1.0e-3; } else if (unit === "inch") { meterPerMapUnit = 1 / 2.5399999918e-2; } else if (unit === "foot") { meterPerMapUnit = 0.3048; } return meterPerMapUnit; }; RasterTileSource.prototype.getResolution = function getResolution (z, tileSize) { if (!this._resolutions[z]) { this._resolutions[z] = this.worldWidth / Math.pow(2, z) / tileSize; } return this._resolutions[z]; }; RasterTileSource.prototype.getScale = function getScale (z, tileSize) { if (!this._scales[z]) { var res = this.getResolution(z, tileSize); var inchPerMeter = 1 / 0.0254; // 地球半径。 var meterPerMapUnit = this.getMeterPerMapUnit(this.map.getCRS().getUnit()); var scale = res * 96 * inchPerMeter * meterPerMapUnit; this._scales[z] = 1.0 / scale; } return this._scales[z]; }; return RasterTileSource; }(performance.Evented)); // var RasterDEMTileSource = /*@__PURE__*/(function (RasterTileSource) { function RasterDEMTileSource(id , options , dispatcher , eventedParent ) { RasterTileSource.call(this, id, options, dispatcher, eventedParent); this.type = 'raster-dem'; this.maxzoom = 22; this._options = performance.extend({type: 'raster-dem'}, options); this.encoding = options.encoding || "mapbox"; } if ( RasterTileSource ) RasterDEMTileSource.__proto__ = RasterTileSource; RasterDEMTileSource.prototype = Object.create( RasterTileSource && RasterTileSource.prototype ); RasterDEMTileSource.prototype.constructor = RasterDEMTileSource; RasterDEMTileSource.prototype.serialize = function serialize () { return { type: 'raster-dem', url: this.url, tileSize: this.tileSize, tiles: this.tiles, bounds: this.bounds, encoding: this.encoding }; }; RasterDEMTileSource.prototype.loadTile = function loadTile (tile , callback ) { var url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.tileSize); tile.request = performance.getImage(this.map._requestManager.transformRequest(url, performance.ResourceType.Tile), imageLoaded.bind(this)); tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); function imageLoaded(err, img) { delete tile.request; if (tile.aborted) { tile.state = 'unloaded'; callback(null); } else if (err) { tile.state = 'errored'; callback(err); } else if (img) { if (this.map._refreshExpiredTiles) { tile.setExpiryData(img); } delete (img ).cacheControl; delete (img ).expires; var transfer = performance.window.ImageBitmap && img instanceof performance.window.ImageBitmap && performance.offscreenCanvasSupported(); var rawImageData = transfer ? img : performance.browser.getImageData(img, 1); var params = { uid: tile.uid, coord: tile.tileID, source: this.id, rawImageData: rawImageData, encoding: this.encoding }; if (!tile.actor || tile.state === 'expired') { tile.actor = this.dispatcher.getActor(); tile.actor.send('loadDEMTile', params, done.bind(this)); } } } function done(err, dem) { if (err) { tile.state = 'errored'; callback(err); } if (dem) { tile.dem = dem; tile.needsHillshadePrepare = true; tile.state = 'loaded'; callback(null); } } }; RasterDEMTileSource.prototype._getNeighboringTiles = function _getNeighboringTiles (tileID ) { var canonical = tileID.canonical; var dim = Math.pow(2, canonical.z); var px = (canonical.x - 1 + dim) % dim; var pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap; var nx = (canonical.x + 1 + dim) % dim; var nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap; var neighboringTiles = {}; // add adjacent tiles neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = {backfilled: false}; neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = {backfilled: false}; // Add upper neighboringTiles if (canonical.y > 0) { neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = {backfilled: false}; neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = {backfilled: false}; } // Add lower neighboringTiles if (canonical.y + 1 < dim) { neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = {backfilled: false}; neighboringTiles[new performance.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = {backfilled: false}; } return neighboringTiles; }; RasterDEMTileSource.prototype.unloadTile = function unloadTile (tile ) { if (tile.demTexture) { this.map.painter.saveTileTexture(tile.demTexture); } if (tile.fbo) { tile.fbo.destroy(); delete tile.fbo; } if (tile.dem) { delete tile.dem; } delete tile.neighboringTiles; tile.state = 'unloaded'; if (tile.actor) { tile.actor.send('removeDEMTile', {uid: tile.uid, source: this.id}); } }; return RasterDEMTileSource; }(RasterTileSource)); // /** * A source containing GeoJSON. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options.) * * @example * map.addSource('some id', { * type: 'geojson', * data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson' * }); * * @example * map.addSource('some id', { * type: 'geojson', * data: { * "type": "FeatureCollection", * "features": [{ * "type": "Feature", * "properties": {}, * "geometry": { * "type": "Point", * "coordinates": [ * -76.53063297271729, * 39.18174077994108 * ] * } * }] * } * }); * * @example * map.getSource('some id').setData({ * "type": "FeatureCollection", * "features": [{ * "type": "Feature", * "properties": { "name": "Null Island" }, * "geometry": { * "type": "Point", * "coordinates": [ 0, 0 ] * } * }] * }); * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) * @see [Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) * @see [Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/) * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) */ var GeoJSONSource = /*@__PURE__*/(function (Evented) { function GeoJSONSource( id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; // `type` is a property rather than a constant to make it easy for 3rd // parties to use GeoJSONSource to build their own source types. this.type = "geojson"; this.minzoom = 0; this.maxzoom = 18; this.tileSize = 512; this.isTileClipped = true; this.reparseOverscaled = true; this._removed = false; this._loaded = false; this.actor = dispatcher.getActor(); this.setEventedParent(eventedParent); this._data = (options.data ); this._options = performance.extend({}, options); this._collectResourceTiming = options.collectResourceTiming; this._resourceTiming = []; if (options.maxzoom !== undefined) { this.maxzoom = options.maxzoom; } if (options.type) { this.type = options.type; } if (options.attribution) { this.attribution = options.attribution; } this.promoteId = options.promoteId; var scale = performance.EXTENT / this.tileSize; // sent to the worker, along with `url: ...` or `data: literal geojson`, // so that it can load/parse/index the geojson data // extending with `options.workerOptions` helps to make it easy for // third-party sources to hack/reuse GeoJSONSource. this.workerOptions = performance.extend( { source: this.id, cluster: options.cluster || false, geojsonVtOptions: { buffer: (options.buffer !== undefined ? options.buffer : 128) * scale, tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale, extent: performance.EXTENT, customprj: options.customprj, // proj4Projection : this.map.proj4Projection, maxZoom: this.maxzoom, lineMetrics: options.lineMetrics || false, generateId: options.generateId || false, }, superclusterOptions: { maxZoom: options.clusterMaxZoom !== undefined ? Math.min(options.clusterMaxZoom, this.maxzoom - 1) : this.maxzoom - 1, minPoints: Math.max(2, options.clusterMinPoints || 2), extent: performance.EXTENT, customprj: options.customprj, radius: (options.clusterRadius || 50) * scale, log: false, generateId: options.generateId || false, }, clusterProperties: options.clusterProperties, filter: options.filter, }, options.workerOptions ); } if ( Evented ) GeoJSONSource.__proto__ = Evented; GeoJSONSource.prototype = Object.create( Evented && Evented.prototype ); GeoJSONSource.prototype.constructor = GeoJSONSource; GeoJSONSource.prototype.load = function load () { var this$1 = this; this.fire(new performance.Event("dataloading", { dataType: "source" })); this._updateWorkerData(function (err) { if (err) { this$1.fire(new performance.ErrorEvent(err)); return; } var data = { dataType: "source", sourceDataType: "metadata", }; if ( this$1._collectResourceTiming && this$1._resourceTiming && this$1._resourceTiming.length > 0 ) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } // although GeoJSON sources contain no metadata, we fire this event to let the SourceCache // know its ok to start requesting tiles. this$1.fire(new performance.Event("data", data)); }); }; GeoJSONSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.workerOptions.crs = {epsgCode:this.map.getCRS().epsgCode, WKT: this.map.getCRS().getWKT(), _id: this.map.getCRS()._id}; this.load(); }; GeoJSONSource.prototype.setCustomprj = function setCustomprj (customprj) { this._options.customprj = customprj; // this._options.proj4Projection = this.map.proj4Projection; this.workerOptions.superclusterOptions.customprj = customprj; this.workerOptions.geojsonVtOptions.customprj = customprj; this.workerOptions.crs = {epsgCode:this.map.getCRS().epsgCode, WKT: this.map.getCRS().getWKT(), _id: this.map.getCRS()._id}; this.load(); }; /** * Sets the GeoJSON data and re-renders the map. * * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files. * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.setData = function setData (data ) { var this$1 = this; this._data = data; this.fire(new performance.Event("dataloading", { dataType: "source" })); this._updateWorkerData(function (err) { if (err) { this$1.fire(new performance.ErrorEvent(err)); return; } var data = { dataType: "source", sourceDataType: "content", }; if ( this$1._collectResourceTiming && this$1._resourceTiming && this$1._resourceTiming.length > 0 ) { data.resourceTiming = this$1._resourceTiming; this$1._resourceTiming = []; } this$1.fire(new performance.Event("data", data)); }); return this; }; GeoJSONSource.prototype.getData = function getData () { if (this._originData) { return this._originData; } if (typeof this._data !== "string") { return this._data; } return undefined; }; /** * For clustered sources, fetches the zoom at which the given cluster expands. * * @param clusterId The value of the cluster's `cluster_id` property. * @param callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterExpansionZoom = function getClusterExpansionZoom (clusterId , callback ) { this.actor.send( "geojson.getClusterExpansionZoom", { clusterId: clusterId, source: this.id }, callback ); return this; }; /** * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features). * * @param clusterId The value of the cluster's `cluster_id` property. * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). * @returns {GeoJSONSource} this */ GeoJSONSource.prototype.getClusterChildren = function getClusterChildren ( clusterId , callback ) { this.actor.send( "geojson.getClusterChildren", { clusterId: clusterId, source: this.id }, callback ); return this; }; /** * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features). * * @param clusterId The value of the cluster's `cluster_id` property. * @param limit The maximum number of features to return. * @param offset The number of features to skip (e.g. for pagination). * @param callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). * @returns {GeoJSONSource} this * @example * // Retrieve cluster leaves on click * map.on('click', 'clusters', function(e) { * var features = map.queryRenderedFeatures(e.point, { * layers: ['clusters'] * }); * * var clusterId = features[0].properties.cluster_id; * var pointCount = features[0].properties.point_count; * var clusterSource = map.getSource('clusters'); * * clusterSource.getClusterLeaves(clusterId, pointCount, 0, function(error, features) { * // Print cluster leaves in the console * console.log('Cluster leaves:', error, features); * }) * }); */ GeoJSONSource.prototype.getClusterLeaves = function getClusterLeaves ( clusterId , limit , offset , callback ) { this.actor.send( "geojson.getClusterLeaves", { source: this.id, clusterId: clusterId, limit: limit, offset: offset, }, callback ); return this; }; /* * Responsible for invoking WorkerSource's geojson.loadData target, which * handles loading the geojson data and preparing to serve it up as tiles, * using geojson-vt or supercluster as appropriate. */ GeoJSONSource.prototype._updateWorkerData = function _updateWorkerData (callback ) { var this$1 = this; this._loaded = false; var options = performance.extend({}, this.workerOptions); var data = this._data; if (typeof data === "string") { options.request = this.map._requestManager.transformRequest( performance.browser.resolveURL(data), performance.ResourceType.Source ); options.request.collectResourceTiming = this._collectResourceTiming; } else { options.data = JSON.stringify(data); } // target {this.type}.loadData rather than literally geojson.loadData, // so that other geojson-like source types can easily reuse this // implementation this.actor.send(((this.type) + ".loadData"), options, function (err, result) { this$1._originData = result.data || null; if (this$1._removed || (result && result.abandoned)) { return; } this$1._loaded = true; if ( result && result.resourceTiming && result.resourceTiming[this$1.id] ) { this$1._resourceTiming = result.resourceTiming[this$1.id].slice(0); } // Any `loadData` calls that piled up while we were processing // this one will get coalesced into a single call when this // 'coalesce' message is processed. // We would self-send from the worker if we had access to its // message queue. Waiting instead for the 'coalesce' to round-trip // through the foreground just means we're throttling the worker // to run at a little less than full-throttle. this$1.actor.send( ((this$1.type) + ".coalesce"), { source: options.source }, null ); callback(err); }); }; GeoJSONSource.prototype.loaded = function loaded () { return this._loaded; }; GeoJSONSource.prototype.loadTile = function loadTile (tile , callback ) { var this$1 = this; var message = !tile.actor ? "loadTile" : "reloadTile"; tile.actor = this.actor; var params = { type: this.type, uid: tile.uid, tileID: tile.tileID, zoom: tile.tileID.overscaledZ, maxZoom: this.maxzoom, tileSize: this.tileSize, source: this.id, pixelRatio: performance.browser.devicePixelRatio, showCollisionBoxes: this.map.showCollisionBoxes, promoteId: this.promoteId, }; tile.request = this.actor.send(message, params, function (err, data) { delete tile.request; tile.unloadVectorData(); if (tile.aborted) { return callback(null); } if (err) { return callback(err); } tile.loadVectorData( data, this$1.map.painter, message === "reloadTile" ); return callback(null); }); }; GeoJSONSource.prototype.abortTile = function abortTile (tile ) { if (tile.request) { tile.request.cancel(); delete tile.request; } tile.aborted = true; }; GeoJSONSource.prototype.unloadTile = function unloadTile (tile ) { tile.unloadVectorData(); this.actor.send("removeTile", { uid: tile.uid, type: this.type, source: this.id, }); }; GeoJSONSource.prototype.onRemove = function onRemove () { this._removed = true; this.actor.send("removeSource", { type: this.type, source: this.id }); }; GeoJSONSource.prototype.serialize = function serialize () { return performance.extend({}, this._options, { type: this.type, data: this._data, }); }; GeoJSONSource.prototype.hasTransition = function hasTransition () { return false; }; return GeoJSONSource; }(performance.Evented)); // var rasterBoundsAttributes = performance.createLayout([ {name: 'a_pos', type: 'Int16', components: 2}, {name: 'a_texture_pos', type: 'Int16', components: 2} ]); // /** * A data source containing an image. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.) * * @example * // add to map * map.addSource('some id', { * type: 'image', * url: 'https://www.mapbox.com/images/foo.png', * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update coordinates * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * // update url and coordinates simultaneously * mySource.updateImage({ * url: 'https://www.mapbox.com/images/bar.png', * coordinates: [ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ] * }) * * map.removeSource('some id'); // remove * @see [Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/) */ var ImageSource = /*@__PURE__*/(function (Evented) { function ImageSource(id , options , dispatcher , eventedParent ) { Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.coordinates = options.coordinates; this.type = 'image'; this.minzoom = 0; this.maxzoom = 22; this.tileSize = 512; this.tiles = {}; this._loaded = false; this.setEventedParent(eventedParent); this.options = options; } if ( Evented ) ImageSource.__proto__ = Evented; ImageSource.prototype = Object.create( Evented && Evented.prototype ); ImageSource.prototype.constructor = ImageSource; ImageSource.prototype.load = function load (newCoordinates , successCallback ) { var this$1 = this; this._loaded = false; this.fire(new performance.Event('dataloading', {dataType: 'source'})); this.url = this.options.url; performance.getImage(this.map._requestManager.transformRequest(this.url, performance.ResourceType.Image), function (err, image) { this$1._loaded = true; if (err) { this$1.fire(new performance.ErrorEvent(err)); } else if (image) { this$1.image = image; if (newCoordinates) { this$1.coordinates = newCoordinates; } if (successCallback) { successCallback(); } this$1._finishLoading(); } }); }; ImageSource.prototype.loaded = function loaded () { return this._loaded; }; /** * Updates the image URL and, optionally, the coordinates. To avoid having the image flash after changing, * set the `raster-fade-duration` paint property on the raster layer to 0. * * @param {Object} options Options object. * @param {string} [options.url] Required image URL. * @param {Array>} [options.coordinates] Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the image. * The coordinates start at the top left corner of the image and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {ImageSource} this */ ImageSource.prototype.updateImage = function updateImage (options ) { var this$1 = this; if (!this.image || !options.url) { return this; } this.options.url = options.url; this.load(options.coordinates, function () { this$1.texture = null; }); return this; }; ImageSource.prototype._finishLoading = function _finishLoading () { if (this.map) { this.setCoordinates(this.coordinates); this.fire(new performance.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); } }; ImageSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); }; /** * Sets the image's coordinates and re-renders the map. * * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the image. * The coordinates start at the top left corner of the image and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {ImageSource} this */ ImageSource.prototype.setCoordinates = function setCoordinates (coordinates ) { var this$1 = this; this.coordinates = coordinates; // Calculate which mercator tile is suitable for rendering the video in // and create a buffer with the corner coordinates. These coordinates // may be outside the tile, because raster tiles aren't clipped when rendering. // transform the geo coordinates into (zoom 0) tile space coordinates var cornerCoords = coordinates.map(function (coor) { return this$1.map.getCRS().fromLngLat(coor); }); // Compute the coordinates of the tile we'll use to hold this image's // render data this.tileID = getCoordinatesCenterTileID(cornerCoords, this.map.getCRS().getExtent()); // Constrain min/max zoom to our tile's zoom level in order to force // SourceCache to request this tile (no matter what the map's zoom // level) this.minzoom = this.maxzoom = this.tileID.z; // Transform the corner coordinates into the coordinate space of our // tile. var tileCoords = cornerCoords.map(function (coord) { return this$1.tileID.getTilePoint(coord)._round(); }); this._boundsArray = new performance.StructArrayLayout4i8(); this._boundsArray.emplaceBack(tileCoords[0].x, tileCoords[0].y, 0, 0); this._boundsArray.emplaceBack(tileCoords[1].x, tileCoords[1].y, performance.EXTENT, 0); this._boundsArray.emplaceBack(tileCoords[3].x, tileCoords[3].y, 0, performance.EXTENT); this._boundsArray.emplaceBack(tileCoords[2].x, tileCoords[2].y, performance.EXTENT, performance.EXTENT); if (this.boundsBuffer) { this.boundsBuffer.destroy(); delete this.boundsBuffer; } this.fire(new performance.Event('data', {dataType:'source', sourceDataType: 'content'})); return this; }; ImageSource.prototype.prepare = function prepare () { if (Object.keys(this.tiles).length === 0 || !this.image) { return; } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new performance.Texture(context, this.image, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; ImageSource.prototype.loadTile = function loadTile (tile , callback ) { // We have a single tile -- whoose coordinates are this.tileID -- that // covers the image we want to render. If that's the one being // requested, set it up with the image; otherwise, mark the tile as // `errored` to indicate that we have no data for it. // If the world wraps, we may have multiple "wrapped" copies of the // single tile. if (this.tileID && this.tileID.equals(tile.tileID.canonical)) { this.tiles[String(tile.tileID.wrap)] = tile; tile.buckets = {}; callback(null); } else { tile.state = 'errored'; callback(null); } }; ImageSource.prototype.serialize = function serialize () { return { type: 'image', url: this.options.url, coordinates: this.coordinates }; }; ImageSource.prototype.hasTransition = function hasTransition () { return false; }; return ImageSource; }(performance.Evented)); /** * Given a list of coordinates, get their center as a coordinate. * * @returns centerpoint * @private */ function getCoordinatesCenterTileID(coords , indexExtent ) { var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; minX = Math.min(minX, coord.x); minY = Math.min(minY, coord.y); maxX = Math.max(maxX, coord.x); maxY = Math.max(maxY, coord.y); } var dx = maxX - minX; var dy = maxY - minY; var dMax = Math.max(dx, dy); var zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2)); var tilesAtZoom = Math.pow(2, zoom); return new performance.CanonicalTileID( zoom, Math.floor((minX + maxX) / 2 * tilesAtZoom), Math.floor((minY + maxY) / 2 * tilesAtZoom), indexExtent); } // /** * A data source containing video. * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.) * * @example * // add to map * map.addSource('some id', { * type: 'video', * url: [ * 'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4', * 'https://www.mapbox.com/blog/assets/baltimore-smoke.webm' * ], * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove * @see [Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/) */ var VideoSource = /*@__PURE__*/(function (ImageSource) { function VideoSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); this.roundZoom = true; this.type = 'video'; this.options = options; } if ( ImageSource ) VideoSource.__proto__ = ImageSource; VideoSource.prototype = Object.create( ImageSource && ImageSource.prototype ); VideoSource.prototype.constructor = VideoSource; VideoSource.prototype.load = function load () { this._loaded = false; this._acceptedVideo = false; var options = this.options; this.urls = []; for (var i = 0, list = options.urls; i < list.length; i += 1) { var url = list[i]; this.urls.push(this.map._requestManager.transformRequest(url, performance.ResourceType.Source).url); } if (/^(http|https):\/\/.*/.test(this.urls[0])) { performance.getVideo(this.urls, this.initVideo.bind(this)); } else { this._acceptedVideo = true; var videoId = this.urls[0]; var video = document.getElementById(videoId); this.initVideo(!video && new performance.ValidationError(("sources." + (this.id)), null, 'video is not found'), video); } }; VideoSource.prototype.initVideo = function initVideo (err, video) { var this$1 = this; this$1._manualFakePlay = true; this._loaded = true; if (err) { this.fire(new performance.ErrorEvent(err)); } else if (video) { this.video = video; if (!this._acceptedVideo || this.video.loop !== false) { this.video.loop = true; } // Start repainting when video starts playing. hasTransition() will then return // true to trigger additional frames as long as the videos continues playing. this.video.addEventListener('playing', function () { this$1.map.triggerRepaint(); }); this.video.addEventListener('timeupdate', function () { if(this$1._firstFrameRendered && this$1._manualFakePlay) { if (!this$1.video.autoplay) { this$1.video.currentTime = 0; this$1.video.pause(); } this$1._manualFakePlay = false; this$1.fire(new Event('videoloaded')); } }); if (this.map) { if (!this._acceptedVideo) { this.video.autoplay = true; } this.video.muted = true; this.video.play(); } this._finishLoading(); } }; /** * Pauses the video. */ VideoSource.prototype.pause = function pause () { if (this.video) { this.video.pause(); } }; /** * Plays the video. */ VideoSource.prototype.play = function play () { if (this.video) { this.video.play(); } }; /** * Sets playback to a timestamp, in seconds. * @private */ VideoSource.prototype.seek = function seek (seconds ) { if (this.video) { var seekableRange = this.video.seekable; if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) { this.fire(new performance.ErrorEvent(new performance.ValidationError(("sources." + (this.id)), null, ("Playback for this video can be set only between the " + (seekableRange.start(0)) + " and " + (seekableRange.end(0)) + "-second mark.")))); } else { this.video.currentTime = seconds; } } }; /** * Returns the HTML `video` element. * * @returns {HTMLVideoElement} The HTML `video` element. */ VideoSource.prototype.getVideo = function getVideo () { return this.video; }; VideoSource.prototype.onAdd = function onAdd (map ) { if (this.map) { return; } this.map = map; this.load(); if (this.video) { this.video.play(); this.setCoordinates(this.coordinates); } }; /** * Sets the video's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof VideoSource * @returns {VideoSource} this */ // setCoordinates inherited from ImageSource VideoSource.prototype.prepare = function prepare () { if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) { return; // not enough data for current position } var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new performance.Texture(context, this.video, gl.RGBA); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } else if (!this.video.paused) { this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); this._firstFrameRendered = true; } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; VideoSource.prototype.serialize = function serialize () { return { type: 'video', urls: this.urls, coordinates: this.coordinates }; }; VideoSource.prototype.hasTransition = function hasTransition () { return this.video && !this.video.paused; }; return VideoSource; }(ImageSource)); // /** * Options to add a canvas source type to the map. * * @typedef {Object} CanvasSourceOptions * @property {string} type Source type. Must be `"canvas"`. * @property {string|HTMLCanvasElement} canvas Canvas source from which to read pixels. Can be a string representing the ID of the canvas element, or the `HTMLCanvasElement` itself. * @property {Array>} coordinates Four geographical coordinates denoting where to place the corners of the canvas, specified in `[longitude, latitude]` pairs. * @property {boolean} [animate=true] Whether the canvas source is animated. If the canvas is static (i.e. pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance. */ /** * A data source containing the contents of an HTML canvas. See {@link CanvasSourceOptions} for detailed documentation of options. * * @example * // add to map * map.addSource('some id', { * type: 'canvas', * canvas: 'idOfMyHTMLCanvas', * animate: true, * coordinates: [ * [-76.54, 39.18], * [-76.52, 39.18], * [-76.52, 39.17], * [-76.54, 39.17] * ] * }); * * // update * var mySource = map.getSource('some id'); * mySource.setCoordinates([ * [-76.54335737228394, 39.18579907229748], * [-76.52803659439087, 39.1838364847587], * [-76.5295386314392, 39.17683392507606], * [-76.54520273208618, 39.17876344106642] * ]); * * map.removeSource('some id'); // remove */ var CanvasSource = /*@__PURE__*/(function (ImageSource) { function CanvasSource(id , options , dispatcher , eventedParent ) { ImageSource.call(this, id, options, dispatcher, eventedParent); // We build in some validation here, since canvas sources aren't included in the style spec: if (!options.coordinates) { this.fire(new performance.ErrorEvent(new performance.ValidationError(("sources." + id), null, 'missing required property "coordinates"'))); } else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 || options.coordinates.some(function (c) { return !Array.isArray(c) || c.length !== 2 || c.some(function (l) { return typeof l !== 'number'; }); })) { this.fire(new performance.ErrorEvent(new performance.ValidationError(("sources." + id), null, '"coordinates" property must be an array of 4 longitude/latitude array pairs'))); } if (options.animate && typeof options.animate !== 'boolean') { this.fire(new performance.ErrorEvent(new performance.ValidationError(("sources." + id), null, 'optional "animate" property must be a boolean value'))); } if (!options.canvas) { this.fire(new performance.ErrorEvent(new performance.ValidationError(("sources." + id), null, 'missing required property "canvas"'))); } else if (typeof options.canvas !== 'string' && !(options.canvas instanceof performance.window.HTMLCanvasElement)) { this.fire(new performance.ErrorEvent(new performance.ValidationError(("sources." + id), null, '"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))); } this.options = options; this.animate = options.animate !== undefined ? options.animate : true; } if ( ImageSource ) CanvasSource.__proto__ = ImageSource; CanvasSource.prototype = Object.create( ImageSource && ImageSource.prototype ); CanvasSource.prototype.constructor = CanvasSource; /** * Enables animation. The image will be copied from the canvas to the map on each frame. * @method play * @instance * @memberof CanvasSource */ /** * Disables animation. The map will display a static copy of the canvas image. * @method pause * @instance * @memberof CanvasSource */ CanvasSource.prototype.load = function load () { this._loaded = true; if (!this.canvas) { this.canvas = (this.options.canvas instanceof performance.window.HTMLCanvasElement) ? this.options.canvas : performance.window.document.getElementById(this.options.canvas); } this.width = this.canvas.width; this.height = this.canvas.height; if (this._hasInvalidDimensions()) { this.fire(new performance.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.'))); return; } this.play = function() { this._playing = true; this.map.triggerRepaint(); }; this.pause = function() { if (this._playing) { this.prepare(); this._playing = false; } }; this._finishLoading(); }; /** * Returns the HTML `canvas` element. * * @returns {HTMLCanvasElement} The HTML `canvas` element. */ CanvasSource.prototype.getCanvas = function getCanvas () { return this.canvas; }; CanvasSource.prototype.onAdd = function onAdd (map ) { this.map = map; this.load(); if (this.canvas) { if (this.animate) { this.play(); } } }; CanvasSource.prototype.onRemove = function onRemove () { this.pause(); }; /** * Sets the canvas's coordinates and re-renders the map. * * @method setCoordinates * @instance * @memberof CanvasSource * @param {Array>} coordinates Four geographical coordinates, * represented as arrays of longitude and latitude numbers, which define the corners of the canvas. * The coordinates start at the top left corner of the canvas and proceed in clockwise order. * They do not have to represent a rectangle. * @returns {CanvasSource} this */ // setCoordinates inherited from ImageSource CanvasSource.prototype.prepare = function prepare () { var resize = false; if (this.canvas.width !== this.width) { this.width = this.canvas.width; resize = true; } if (this.canvas.height !== this.height) { this.height = this.canvas.height; resize = true; } if (this._hasInvalidDimensions()) { return; } if (Object.keys(this.tiles).length === 0) { return; } // not enough data for current position var context = this.map.painter.context; var gl = context.gl; if (!this.boundsBuffer) { this.boundsBuffer = context.createVertexBuffer(this._boundsArray, rasterBoundsAttributes.members); } if (!this.boundsSegments) { this.boundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2); } if (!this.texture) { this.texture = new performance.Texture(context, this.canvas, gl.RGBA, {premultiply: true}); } else if (resize || this._playing) { this.texture.update(this.canvas, {premultiply: true}); } for (var w in this.tiles) { var tile = this.tiles[w]; if (tile.state !== 'loaded') { tile.state = 'loaded'; tile.texture = this.texture; } } }; CanvasSource.prototype.serialize = function serialize () { return { type: 'canvas', coordinates: this.coordinates }; }; CanvasSource.prototype.hasTransition = function hasTransition () { return this._playing; }; CanvasSource.prototype._hasInvalidDimensions = function _hasInvalidDimensions () { for (var i = 0, list = [this.canvas.width, this.canvas.height]; i < list.length; i += 1) { var x = list[i]; if (isNaN(x) || x <= 0) { return true; } } return false; }; return CanvasSource; }(ImageSource)); // var sourceTypes = { vector: VectorTileSource, raster: RasterTileSource, 'raster-dem': RasterDEMTileSource, geojson: GeoJSONSource, video: VideoSource, image: ImageSource, canvas: CanvasSource }; /* * Creates a tiled data source instance given an options object. * * @param id * @param {Object} source A source definition object compliant with * [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type, * with that type's requirements. * @param {Dispatcher} dispatcher * @returns {Source} */ var create = function(id , specification , dispatcher , eventedParent ) { var source = new sourceTypes[specification.type](id, (specification ), dispatcher, eventedParent); if (source.id !== id) { throw new Error(("Expected Source id to be " + id + " instead of " + (source.id))); } performance.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source); return source; }; var getType = function (name ) { return sourceTypes[name]; }; var setType = function (name , type ) { sourceTypes[name] = type; }; // /* * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates. */ function getPixelPosMatrix(transform, tileID) { var t = performance.identity([]); performance.translate(t, t, [1, 1, 0]); performance.scale(t, t, [transform.width * 0.5, transform.height * 0.5, 1]); return performance.multiply(t, t, transform.calculatePosMatrix(tileID.toUnwrapped())); } function queryIncludes3DLayer(layers , styleLayers , sourceID ) { if (layers) { for (var i = 0, list = layers; i < list.length; i += 1) { var layerID = list[i]; var layer = styleLayers[layerID]; if (layer && layer.source === sourceID && layer.type === 'fill-extrusion') { return true; } } } else { for (var key in styleLayers) { var layer$1 = styleLayers[key]; if (layer$1.source === sourceID && layer$1.type === 'fill-extrusion') { return true; } } } return false; } function queryRenderedFeatures(sourceCache , styleLayers , serializedLayers , queryGeometry , params , transform ) { var has3DLayer = queryIncludes3DLayer(params && params.layers, styleLayers, sourceCache.id); var maxPitchScaleFactor = transform.maxPitchScaleFactor(); var tilesIn = sourceCache.tilesIn(queryGeometry, maxPitchScaleFactor, has3DLayer); tilesIn.sort(sortTilesIn); var renderedFeatureLayers = []; for (var i = 0, list = tilesIn; i < list.length; i += 1) { var tileIn = list[i]; renderedFeatureLayers.push({ wrappedTileID: tileIn.tileID.wrapped().key, queryResults: tileIn.tile.queryRenderedFeatures( styleLayers, serializedLayers, sourceCache._state, tileIn.queryGeometry, tileIn.cameraQueryGeometry, tileIn.scale, params, transform, maxPitchScaleFactor, getPixelPosMatrix(sourceCache.transform, tileIn.tileID)) }); } var result = mergeRenderedFeatureLayers(renderedFeatureLayers); // Merge state from SourceCache into the results for (var layerID in result) { result[layerID].forEach(function (featureWrapper) { var feature = featureWrapper.feature; var state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); feature.source = feature.layer.source; if (feature.layer['source-layer']) { feature.sourceLayer = feature.layer['source-layer']; } feature.state = state; }); } return result; } function queryRenderedSymbols(styleLayers , serializedLayers , sourceCaches , queryGeometry , params , collisionIndex , retainedQueryData ) { var result = {}; var renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry); var bucketQueryData = []; for (var i = 0, list = Object.keys(renderedSymbols).map(Number); i < list.length; i += 1) { var bucketInstanceId = list[i]; bucketQueryData.push(retainedQueryData[bucketInstanceId]); } bucketQueryData.sort(sortTilesIn); var loop = function () { var queryData = list$2[i$2]; var bucketSymbols = queryData.featureIndex.lookupSymbolFeatures( renderedSymbols[queryData.bucketInstanceId], serializedLayers, queryData.bucketIndex, queryData.sourceLayerIndex, params.filter, params.layers, params.availableImages, styleLayers); for (var layerID in bucketSymbols) { var resultFeatures = result[layerID] = result[layerID] || []; var layerSymbols = bucketSymbols[layerID]; layerSymbols.sort(function (a, b) { // Match topDownFeatureComparator from FeatureIndex, but using // most recent sorting of features from bucket.sortFeatures var featureSortOrder = queryData.featureSortOrder; if (featureSortOrder) { // queryRenderedSymbols documentation says we'll return features in // "top-to-bottom" rendering order (aka last-to-first). // Actually there can be multiple symbol instances per feature, so // we sort each feature based on the first matching symbol instance. var sortedA = featureSortOrder.indexOf(a.featureIndex); var sortedB = featureSortOrder.indexOf(b.featureIndex); performance.assert(sortedA >= 0); performance.assert(sortedB >= 0); return sortedB - sortedA; } else { // Bucket hasn't been re-sorted based on angle, so use the // reverse of the order the features appeared in the data. return b.featureIndex - a.featureIndex; } }); for (var i$1 = 0, list$1 = layerSymbols; i$1 < list$1.length; i$1 += 1) { var symbolFeature = list$1[i$1]; resultFeatures.push(symbolFeature); } } }; for (var i$2 = 0, list$2 = bucketQueryData; i$2 < list$2.length; i$2 += 1) loop(); // Merge state from SourceCache into the results var loop$1 = function ( layerName ) { result[layerName].forEach(function (featureWrapper) { var feature = featureWrapper.feature; var layer = styleLayers[layerName]; var sourceCache = sourceCaches[layer.source]; var state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); feature.source = feature.layer.source; if (feature.layer['source-layer']) { feature.sourceLayer = feature.layer['source-layer']; } feature.state = state; }); }; for (var layerName in result) loop$1( layerName ); return result; } function querySourceFeatures(sourceCache , params ) { var tiles = sourceCache.getRenderableIds().map(function (id) { return sourceCache.getTileByID(id); }); var result = []; var dataTiles = {}; for (var i = 0; i < tiles.length; i++) { var tile = tiles[i]; var dataID = tile.tileID.canonical.key; if (!dataTiles[dataID]) { dataTiles[dataID] = true; tile.querySourceFeatures(result, params); } } return result; } function sortTilesIn(a, b) { var idA = a.tileID; var idB = b.tileID; return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x); } function mergeRenderedFeatureLayers(tiles) { // Merge results from all tiles, but if two tiles share the same // wrapped ID, don't duplicate features between the two tiles var result = {}; var wrappedIDLayerMap = {}; for (var i$1 = 0, list$1 = tiles; i$1 < list$1.length; i$1 += 1) { var tile = list$1[i$1]; var queryResults = tile.queryResults; var wrappedID = tile.wrappedTileID; var wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; for (var layerID in queryResults) { var tileFeatures = queryResults[layerID]; var wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; var resultFeatures = result[layerID] = result[layerID] || []; for (var i = 0, list = tileFeatures; i < list.length; i += 1) { var tileFeature = list[i]; if (!wrappedIDFeatures[tileFeature.featureIndex]) { wrappedIDFeatures[tileFeature.featureIndex] = true; resultFeatures.push(tileFeature); } } } } return result; } // /** * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms) * with hash lookup made possible by keeping a list of keys in parallel to * an array of dictionary of values * * @private */ var TileCache = function TileCache(max , onRemove ) { this.max = max; this.onRemove = onRemove; this.reset(); }; /** * Clear the cache * * @returns {TileCache} this cache * @private */ TileCache.prototype.reset = function reset () { for (var key in this.data) { for (var i = 0, list = this.data[key]; i < list.length; i += 1) { var removedData = list[i]; if (removedData.timeout) { clearTimeout(removedData.timeout); } this.onRemove(removedData.value); } } this.data = {}; this.order = []; return this; }; /** * Add a key, value combination to the cache, trimming its size if this pushes * it over max length. * * @param {OverscaledTileID} tileID lookup key for the item * @param {*} data any value * * @returns {TileCache} this cache * @private */ TileCache.prototype.add = function add (tileID , data , expiryTimeout ) { var this$1 = this; var key = tileID.wrapped().key; if (this.data[key] === undefined) { this.data[key] = []; } var dataWrapper = { value: data, timeout: undefined }; if (expiryTimeout !== undefined) { dataWrapper.timeout = setTimeout(function () { this$1.remove(tileID, dataWrapper); }, expiryTimeout); } this.data[key].push(dataWrapper); this.order.push(key); if (this.order.length > this.max) { var removedData = this._getAndRemoveByKey(this.order[0]); if (removedData) { this.onRemove(removedData); } } return this; }; /** * Determine whether the value attached to `key` is present * * @param {OverscaledTileID} tileID the key to be looked-up * @returns {boolean} whether the cache has this value * @private */ TileCache.prototype.has = function has (tileID ) { return tileID.wrapped().key in this.data; }; /** * Get the value attached to a specific key and remove data from cache. * If the key is not found, returns `null` * * @param {OverscaledTileID} tileID the key to look up * @returns {*} the data, or null if it isn't found * @private */ TileCache.prototype.getAndRemove = function getAndRemove (tileID ) { if (!this.has(tileID)) { return null; } return this._getAndRemoveByKey(tileID.wrapped().key); }; /* * Get and remove the value with the specified key. */ TileCache.prototype._getAndRemoveByKey = function _getAndRemoveByKey (key ) { var data = this.data[key].shift(); if (data.timeout) { clearTimeout(data.timeout); } if (this.data[key].length === 0) { delete this.data[key]; } this.order.splice(this.order.indexOf(key), 1); return data.value; }; /* * Get the value with the specified (wrapped tile) key. */ TileCache.prototype.getByKey = function getByKey (key ) { var data = this.data[key]; return data ? data[0].value : null; }; /** * Get the value attached to a specific key without removing data * from the cache. If the key is not found, returns `null` * * @param {OverscaledTileID} tileID the key to look up * @returns {*} the data, or null if it isn't found * @private */ TileCache.prototype.get = function get (tileID ) { if (!this.has(tileID)) { return null; } var data = this.data[tileID.wrapped().key][0]; return data.value; }; /** * Remove a key/value combination from the cache. * * @param {OverscaledTileID} tileID the key for the pair to delete * @param {Tile} value If a value is provided, remove that exact version of the value. * @returns {TileCache} this cache * @private */ TileCache.prototype.remove = function remove (tileID , value ) { if (!this.has(tileID)) { return this; } var key = tileID.wrapped().key; var dataIndex = value === undefined ? 0 : this.data[key].indexOf(value); var data = this.data[key][dataIndex]; this.data[key].splice(dataIndex, 1); if (data.timeout) { clearTimeout(data.timeout); } if (this.data[key].length === 0) { delete this.data[key]; } this.onRemove(data.value); this.order.splice(this.order.indexOf(key), 1); return this; }; /** * Change the max size of the cache. * * @param {number} max the max size of the cache * @returns {TileCache} this cache * @private */ TileCache.prototype.setMaxSize = function setMaxSize (max ) { this.max = max; while (this.order.length > this.max) { var removedData = this._getAndRemoveByKey(this.order[0]); if (removedData) { this.onRemove(removedData); } } return this; }; /** * Remove entries that do not pass a filter function. Used for removing * stale tiles from the cache. * * @param {function} filterFn Determines whether the tile is filtered. If the supplied function returns false, the tile will be filtered out. */ TileCache.prototype.filter = function filter (filterFn ) { var removed = []; for (var key in this.data) { for (var i = 0, list = this.data[key]; i < list.length; i += 1) { var entry = list[i]; if (!filterFn(entry.value)) { removed.push(entry); } } } for (var i$1 = 0, list$1 = removed; i$1 < list$1.length; i$1 += 1) { var r = list$1[i$1]; this.remove(r.value.tileID, r); } }; // var IndexBuffer = function IndexBuffer(context , array , dynamicDraw ) { this.context = context; var gl = context.gl; this.buffer = gl.createBuffer(); this.dynamicDraw = Boolean(dynamicDraw); // The bound index buffer is part of vertex array object state. We don't want to // modify whatever VAO happens to be currently bound, so make sure the default // vertex array provided by the context is bound instead. this.context.unbindVAO(); context.bindElementBuffer.set(this.buffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); if (!this.dynamicDraw) { delete array.arrayBuffer; } }; IndexBuffer.prototype.bind = function bind () { this.context.bindElementBuffer.set(this.buffer); }; IndexBuffer.prototype.updateData = function updateData (array ) { var gl = this.context.gl; performance.assert(this.dynamicDraw); // The right VAO will get this buffer re-bound later in VertexArrayObject#bind // See https://github.com/mapbox/mapbox-gl-js/issues/5620 this.context.unbindVAO(); this.bind(); gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer); }; IndexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; // /** * @enum {string} AttributeType * @private * @readonly */ var AttributeType = { Int8: 'BYTE', Uint8: 'UNSIGNED_BYTE', Int16: 'SHORT', Uint16: 'UNSIGNED_SHORT', Int32: 'INT', Uint32: 'UNSIGNED_INT', Float32: 'FLOAT' }; /** * The `VertexBuffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's * Struct type is converted to a WebGL atribute. * @private */ var VertexBuffer = function VertexBuffer(context , array , attributes , dynamicDraw ) { this.length = array.length; this.attributes = attributes; this.itemSize = array.bytesPerElement; this.dynamicDraw = dynamicDraw; this.context = context; var gl = context.gl; this.buffer = gl.createBuffer(); context.bindVertexBuffer.set(this.buffer); gl.bufferData(gl.ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); if (!this.dynamicDraw) { delete array.arrayBuffer; } }; VertexBuffer.prototype.bind = function bind () { this.context.bindVertexBuffer.set(this.buffer); }; VertexBuffer.prototype.updateData = function updateData (array ) { performance.assert(array.length === this.length); var gl = this.context.gl; this.bind(); gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer); }; VertexBuffer.prototype.enableAttributes = function enableAttributes (gl , program ) { for (var j = 0; j < this.attributes.length; j++) { var member = this.attributes[j]; var attribIndex = program.attributes[member.name]; if (attribIndex !== undefined) { gl.enableVertexAttribArray(attribIndex); } } }; /** * Set the attribute pointers in a WebGL context * @param gl The WebGL context * @param program The active WebGL program * @param vertexOffset Index of the starting vertex of the segment */ VertexBuffer.prototype.setVertexAttribPointers = function setVertexAttribPointers (gl , program , vertexOffset ) { for (var j = 0; j < this.attributes.length; j++) { var member = this.attributes[j]; var attribIndex = program.attributes[member.name]; if (attribIndex !== undefined) { gl.vertexAttribPointer( attribIndex, member.components, (gl )[AttributeType[member.type]], false, this.itemSize, member.offset + (this.itemSize * (vertexOffset || 0)) ); } } }; /** * Destroy the GL buffer bound to the given WebGL context */ VertexBuffer.prototype.destroy = function destroy () { var gl = this.context.gl; if (this.buffer) { gl.deleteBuffer(this.buffer); delete this.buffer; } }; // var BaseValue = function BaseValue(context ) { this.gl = context.gl; this.default = this.getDefault(); this.current = this.default; this.dirty = false; }; BaseValue.prototype.get = function get (){ return this.current; }; BaseValue.prototype.set = function set (value ) { // eslint-disable-line // overridden in child classes; }; BaseValue.prototype.getDefault = function getDefault (){ return this.default; // overriden in child classes }; BaseValue.prototype.setDefault = function setDefault () { this.set(this.default); }; var ClearColor = /*@__PURE__*/(function (BaseValue) { function ClearColor () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearColor.__proto__ = BaseValue; ClearColor.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearColor.prototype.constructor = ClearColor; ClearColor.prototype.getDefault = function getDefault () { return performance.Color.transparent; }; ClearColor.prototype.set = function set (v ) { var c = this.current; if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) { return; } this.gl.clearColor(v.r, v.g, v.b, v.a); this.current = v; this.dirty = false; }; return ClearColor; }(BaseValue)); var ClearDepth = /*@__PURE__*/(function (BaseValue) { function ClearDepth () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearDepth.__proto__ = BaseValue; ClearDepth.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearDepth.prototype.constructor = ClearDepth; ClearDepth.prototype.getDefault = function getDefault () { return 1; }; ClearDepth.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.clearDepth(v); this.current = v; this.dirty = false; }; return ClearDepth; }(BaseValue)); var ClearStencil = /*@__PURE__*/(function (BaseValue) { function ClearStencil () { BaseValue.apply(this, arguments); } if ( BaseValue ) ClearStencil.__proto__ = BaseValue; ClearStencil.prototype = Object.create( BaseValue && BaseValue.prototype ); ClearStencil.prototype.constructor = ClearStencil; ClearStencil.prototype.getDefault = function getDefault () { return 0; }; ClearStencil.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.clearStencil(v); this.current = v; this.dirty = false; }; return ClearStencil; }(BaseValue)); var ColorMask = /*@__PURE__*/(function (BaseValue) { function ColorMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) ColorMask.__proto__ = BaseValue; ColorMask.prototype = Object.create( BaseValue && BaseValue.prototype ); ColorMask.prototype.constructor = ColorMask; ColorMask.prototype.getDefault = function getDefault () { return [true, true, true, true]; }; ColorMask.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) { return; } this.gl.colorMask(v[0], v[1], v[2], v[3]); this.current = v; this.dirty = false; }; return ColorMask; }(BaseValue)); var DepthMask = /*@__PURE__*/(function (BaseValue) { function DepthMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthMask.__proto__ = BaseValue; DepthMask.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthMask.prototype.constructor = DepthMask; DepthMask.prototype.getDefault = function getDefault () { return true; }; DepthMask.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.depthMask(v); this.current = v; this.dirty = false; }; return DepthMask; }(BaseValue)); var StencilMask = /*@__PURE__*/(function (BaseValue) { function StencilMask () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilMask.__proto__ = BaseValue; StencilMask.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilMask.prototype.constructor = StencilMask; StencilMask.prototype.getDefault = function getDefault () { return 0xFF; }; StencilMask.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.stencilMask(v); this.current = v; this.dirty = false; }; return StencilMask; }(BaseValue)); var StencilFunc = /*@__PURE__*/(function (BaseValue) { function StencilFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilFunc.__proto__ = BaseValue; StencilFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilFunc.prototype.constructor = StencilFunc; StencilFunc.prototype.getDefault = function getDefault () { return { func: this.gl.ALWAYS, ref: 0, mask: 0xFF }; }; StencilFunc.prototype.set = function set (v ) { var c = this.current; if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty) { return; } this.gl.stencilFunc(v.func, v.ref, v.mask); this.current = v; this.dirty = false; }; return StencilFunc; }(BaseValue)); var StencilOp = /*@__PURE__*/(function (BaseValue) { function StencilOp () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilOp.__proto__ = BaseValue; StencilOp.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilOp.prototype.constructor = StencilOp; StencilOp.prototype.getDefault = function getDefault () { var gl = this.gl; return [gl.KEEP, gl.KEEP, gl.KEEP]; }; StencilOp.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty) { return; } this.gl.stencilOp(v[0], v[1], v[2]); this.current = v; this.dirty = false; }; return StencilOp; }(BaseValue)); var StencilTest = /*@__PURE__*/(function (BaseValue) { function StencilTest () { BaseValue.apply(this, arguments); } if ( BaseValue ) StencilTest.__proto__ = BaseValue; StencilTest.prototype = Object.create( BaseValue && BaseValue.prototype ); StencilTest.prototype.constructor = StencilTest; StencilTest.prototype.getDefault = function getDefault () { return false; }; StencilTest.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.STENCIL_TEST); } else { gl.disable(gl.STENCIL_TEST); } this.current = v; this.dirty = false; }; return StencilTest; }(BaseValue)); var DepthRange = /*@__PURE__*/(function (BaseValue) { function DepthRange () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthRange.__proto__ = BaseValue; DepthRange.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthRange.prototype.constructor = DepthRange; DepthRange.prototype.getDefault = function getDefault () { return [0, 1]; }; DepthRange.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && !this.dirty) { return; } this.gl.depthRange(v[0], v[1]); this.current = v; this.dirty = false; }; return DepthRange; }(BaseValue)); var DepthTest = /*@__PURE__*/(function (BaseValue) { function DepthTest () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthTest.__proto__ = BaseValue; DepthTest.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthTest.prototype.constructor = DepthTest; DepthTest.prototype.getDefault = function getDefault () { return false; }; DepthTest.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.DEPTH_TEST); } else { gl.disable(gl.DEPTH_TEST); } this.current = v; this.dirty = false; }; return DepthTest; }(BaseValue)); var DepthFunc = /*@__PURE__*/(function (BaseValue) { function DepthFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) DepthFunc.__proto__ = BaseValue; DepthFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); DepthFunc.prototype.constructor = DepthFunc; DepthFunc.prototype.getDefault = function getDefault () { return this.gl.LESS; }; DepthFunc.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.depthFunc(v); this.current = v; this.dirty = false; }; return DepthFunc; }(BaseValue)); var Blend = /*@__PURE__*/(function (BaseValue) { function Blend () { BaseValue.apply(this, arguments); } if ( BaseValue ) Blend.__proto__ = BaseValue; Blend.prototype = Object.create( BaseValue && BaseValue.prototype ); Blend.prototype.constructor = Blend; Blend.prototype.getDefault = function getDefault () { return false; }; Blend.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.BLEND); } else { gl.disable(gl.BLEND); } this.current = v; this.dirty = false; }; return Blend; }(BaseValue)); var BlendFunc = /*@__PURE__*/(function (BaseValue) { function BlendFunc () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendFunc.__proto__ = BaseValue; BlendFunc.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendFunc.prototype.constructor = BlendFunc; BlendFunc.prototype.getDefault = function getDefault () { var gl = this.gl; return [gl.ONE, gl.ZERO]; }; BlendFunc.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && !this.dirty) { return; } this.gl.blendFunc(v[0], v[1]); this.current = v; this.dirty = false; }; return BlendFunc; }(BaseValue)); var BlendColor = /*@__PURE__*/(function (BaseValue) { function BlendColor () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendColor.__proto__ = BaseValue; BlendColor.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendColor.prototype.constructor = BlendColor; BlendColor.prototype.getDefault = function getDefault () { return performance.Color.transparent; }; BlendColor.prototype.set = function set (v ) { var c = this.current; if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) { return; } this.gl.blendColor(v.r, v.g, v.b, v.a); this.current = v; this.dirty = false; }; return BlendColor; }(BaseValue)); var BlendEquation = /*@__PURE__*/(function (BaseValue) { function BlendEquation () { BaseValue.apply(this, arguments); } if ( BaseValue ) BlendEquation.__proto__ = BaseValue; BlendEquation.prototype = Object.create( BaseValue && BaseValue.prototype ); BlendEquation.prototype.constructor = BlendEquation; BlendEquation.prototype.getDefault = function getDefault () { return this.gl.FUNC_ADD; }; BlendEquation.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.blendEquation(v); this.current = v; this.dirty = false; }; return BlendEquation; }(BaseValue)); var CullFace = /*@__PURE__*/(function (BaseValue) { function CullFace () { BaseValue.apply(this, arguments); } if ( BaseValue ) CullFace.__proto__ = BaseValue; CullFace.prototype = Object.create( BaseValue && BaseValue.prototype ); CullFace.prototype.constructor = CullFace; CullFace.prototype.getDefault = function getDefault () { return false; }; CullFace.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; if (v) { gl.enable(gl.CULL_FACE); } else { gl.disable(gl.CULL_FACE); } this.current = v; this.dirty = false; }; return CullFace; }(BaseValue)); var CullFaceSide = /*@__PURE__*/(function (BaseValue) { function CullFaceSide () { BaseValue.apply(this, arguments); } if ( BaseValue ) CullFaceSide.__proto__ = BaseValue; CullFaceSide.prototype = Object.create( BaseValue && BaseValue.prototype ); CullFaceSide.prototype.constructor = CullFaceSide; CullFaceSide.prototype.getDefault = function getDefault () { return this.gl.BACK; }; CullFaceSide.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.cullFace(v); this.current = v; this.dirty = false; }; return CullFaceSide; }(BaseValue)); var FrontFace = /*@__PURE__*/(function (BaseValue) { function FrontFace () { BaseValue.apply(this, arguments); } if ( BaseValue ) FrontFace.__proto__ = BaseValue; FrontFace.prototype = Object.create( BaseValue && BaseValue.prototype ); FrontFace.prototype.constructor = FrontFace; FrontFace.prototype.getDefault = function getDefault () { return this.gl.CCW; }; FrontFace.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.frontFace(v); this.current = v; this.dirty = false; }; return FrontFace; }(BaseValue)); var Program = /*@__PURE__*/(function (BaseValue) { function Program () { BaseValue.apply(this, arguments); } if ( BaseValue ) Program.__proto__ = BaseValue; Program.prototype = Object.create( BaseValue && BaseValue.prototype ); Program.prototype.constructor = Program; Program.prototype.getDefault = function getDefault () { return null; }; Program.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.useProgram(v); this.current = v; this.dirty = false; }; return Program; }(BaseValue)); var ActiveTextureUnit = /*@__PURE__*/(function (BaseValue) { function ActiveTextureUnit () { BaseValue.apply(this, arguments); } if ( BaseValue ) ActiveTextureUnit.__proto__ = BaseValue; ActiveTextureUnit.prototype = Object.create( BaseValue && BaseValue.prototype ); ActiveTextureUnit.prototype.constructor = ActiveTextureUnit; ActiveTextureUnit.prototype.getDefault = function getDefault () { return this.gl.TEXTURE0; }; ActiveTextureUnit.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.gl.activeTexture(v); this.current = v; this.dirty = false; }; return ActiveTextureUnit; }(BaseValue)); var Viewport = /*@__PURE__*/(function (BaseValue) { function Viewport () { BaseValue.apply(this, arguments); } if ( BaseValue ) Viewport.__proto__ = BaseValue; Viewport.prototype = Object.create( BaseValue && BaseValue.prototype ); Viewport.prototype.constructor = Viewport; Viewport.prototype.getDefault = function getDefault () { var gl = this.gl; return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight]; }; Viewport.prototype.set = function set (v ) { var c = this.current; if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) { return; } this.gl.viewport(v[0], v[1], v[2], v[3]); this.current = v; this.dirty = false; }; return Viewport; }(BaseValue)); var BindFramebuffer = /*@__PURE__*/(function (BaseValue) { function BindFramebuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindFramebuffer.__proto__ = BaseValue; BindFramebuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindFramebuffer.prototype.constructor = BindFramebuffer; BindFramebuffer.prototype.getDefault = function getDefault () { return null; }; BindFramebuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindFramebuffer(gl.FRAMEBUFFER, v); this.current = v; this.dirty = false; }; return BindFramebuffer; }(BaseValue)); var BindRenderbuffer = /*@__PURE__*/(function (BaseValue) { function BindRenderbuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindRenderbuffer.__proto__ = BaseValue; BindRenderbuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindRenderbuffer.prototype.constructor = BindRenderbuffer; BindRenderbuffer.prototype.getDefault = function getDefault () { return null; }; BindRenderbuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindRenderbuffer(gl.RENDERBUFFER, v); this.current = v; this.dirty = false; }; return BindRenderbuffer; }(BaseValue)); var BindTexture = /*@__PURE__*/(function (BaseValue) { function BindTexture () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindTexture.__proto__ = BaseValue; BindTexture.prototype = Object.create( BaseValue && BaseValue.prototype ); BindTexture.prototype.constructor = BindTexture; BindTexture.prototype.getDefault = function getDefault () { return null; }; BindTexture.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindTexture(gl.TEXTURE_2D, v); this.current = v; this.dirty = false; }; return BindTexture; }(BaseValue)); var BindVertexBuffer = /*@__PURE__*/(function (BaseValue) { function BindVertexBuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindVertexBuffer.__proto__ = BaseValue; BindVertexBuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindVertexBuffer.prototype.constructor = BindVertexBuffer; BindVertexBuffer.prototype.getDefault = function getDefault () { return null; }; BindVertexBuffer.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.bindBuffer(gl.ARRAY_BUFFER, v); this.current = v; this.dirty = false; }; return BindVertexBuffer; }(BaseValue)); var BindElementBuffer = /*@__PURE__*/(function (BaseValue) { function BindElementBuffer () { BaseValue.apply(this, arguments); } if ( BaseValue ) BindElementBuffer.__proto__ = BaseValue; BindElementBuffer.prototype = Object.create( BaseValue && BaseValue.prototype ); BindElementBuffer.prototype.constructor = BindElementBuffer; BindElementBuffer.prototype.getDefault = function getDefault () { return null; }; BindElementBuffer.prototype.set = function set (v ) { // Always rebind var gl = this.gl; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v); this.current = v; this.dirty = false; }; return BindElementBuffer; }(BaseValue)); var BindVertexArrayOES = /*@__PURE__*/(function (BaseValue) { function BindVertexArrayOES(context ) { BaseValue.call(this, context); this.vao = context.extVertexArrayObject; } if ( BaseValue ) BindVertexArrayOES.__proto__ = BaseValue; BindVertexArrayOES.prototype = Object.create( BaseValue && BaseValue.prototype ); BindVertexArrayOES.prototype.constructor = BindVertexArrayOES; BindVertexArrayOES.prototype.getDefault = function getDefault () { return null; }; BindVertexArrayOES.prototype.set = function set (v ) { if (!this.vao || v === this.current && !this.dirty) { return; } this.vao.bindVertexArrayOES(v); this.current = v; this.dirty = false; }; return BindVertexArrayOES; }(BaseValue)); var PixelStoreUnpack = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpack () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpack.__proto__ = BaseValue; PixelStoreUnpack.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpack.prototype.constructor = PixelStoreUnpack; PixelStoreUnpack.prototype.getDefault = function getDefault () { return 4; }; PixelStoreUnpack.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_ALIGNMENT, v); this.current = v; this.dirty = false; }; return PixelStoreUnpack; }(BaseValue)); var PixelStoreUnpackPremultiplyAlpha = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpackPremultiplyAlpha () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpackPremultiplyAlpha.__proto__ = BaseValue; PixelStoreUnpackPremultiplyAlpha.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpackPremultiplyAlpha.prototype.constructor = PixelStoreUnpackPremultiplyAlpha; PixelStoreUnpackPremultiplyAlpha.prototype.getDefault = function getDefault () { return false; }; PixelStoreUnpackPremultiplyAlpha.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, (v )); this.current = v; this.dirty = false; }; return PixelStoreUnpackPremultiplyAlpha; }(BaseValue)); var PixelStoreUnpackFlipY = /*@__PURE__*/(function (BaseValue) { function PixelStoreUnpackFlipY () { BaseValue.apply(this, arguments); } if ( BaseValue ) PixelStoreUnpackFlipY.__proto__ = BaseValue; PixelStoreUnpackFlipY.prototype = Object.create( BaseValue && BaseValue.prototype ); PixelStoreUnpackFlipY.prototype.constructor = PixelStoreUnpackFlipY; PixelStoreUnpackFlipY.prototype.getDefault = function getDefault () { return false; }; PixelStoreUnpackFlipY.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } var gl = this.gl; gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, (v )); this.current = v; this.dirty = false; }; return PixelStoreUnpackFlipY; }(BaseValue)); var FramebufferAttachment = /*@__PURE__*/(function (BaseValue) { function FramebufferAttachment(context , parent ) { BaseValue.call(this, context); this.context = context; this.parent = parent; } if ( BaseValue ) FramebufferAttachment.__proto__ = BaseValue; FramebufferAttachment.prototype = Object.create( BaseValue && BaseValue.prototype ); FramebufferAttachment.prototype.constructor = FramebufferAttachment; FramebufferAttachment.prototype.getDefault = function getDefault () { return null; }; return FramebufferAttachment; }(BaseValue)); var ColorAttachment = /*@__PURE__*/(function (FramebufferAttachment) { function ColorAttachment () { FramebufferAttachment.apply(this, arguments); } if ( FramebufferAttachment ) ColorAttachment.__proto__ = FramebufferAttachment; ColorAttachment.prototype = Object.create( FramebufferAttachment && FramebufferAttachment.prototype ); ColorAttachment.prototype.constructor = ColorAttachment; ColorAttachment.prototype.setDirty = function setDirty () { this.dirty = true; }; ColorAttachment.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.context.bindFramebuffer.set(this.parent); // note: it's possible to attach a renderbuffer to the color // attachment point, but thus far MBGL only uses textures for color var gl = this.gl; gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0); this.current = v; this.dirty = false; }; return ColorAttachment; }(FramebufferAttachment)); var DepthAttachment = /*@__PURE__*/(function (FramebufferAttachment) { function DepthAttachment () { FramebufferAttachment.apply(this, arguments); } if ( FramebufferAttachment ) DepthAttachment.__proto__ = FramebufferAttachment; DepthAttachment.prototype = Object.create( FramebufferAttachment && FramebufferAttachment.prototype ); DepthAttachment.prototype.constructor = DepthAttachment; DepthAttachment.prototype.set = function set (v ) { if (v === this.current && !this.dirty) { return; } this.context.bindFramebuffer.set(this.parent); // note: it's possible to attach a texture to the depth attachment // point, but thus far MBGL only uses renderbuffers for depth var gl = this.gl; gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, v); this.current = v; this.dirty = false; }; return DepthAttachment; }(FramebufferAttachment)); // var Framebuffer = function Framebuffer(context , width , height , hasDepth ) { this.context = context; this.width = width; this.height = height; var gl = context.gl; var fbo = this.framebuffer = gl.createFramebuffer(); this.colorAttachment = new ColorAttachment(context, fbo); if (hasDepth) { this.depthAttachment = new DepthAttachment(context, fbo); } performance.assert(gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE); }; Framebuffer.prototype.destroy = function destroy () { var gl = this.context.gl; var texture = this.colorAttachment.get(); if (texture) { gl.deleteTexture(texture); } if (this.depthAttachment) { var renderbuffer = this.depthAttachment.get(); if (renderbuffer) { gl.deleteRenderbuffer(renderbuffer); } } gl.deleteFramebuffer(this.framebuffer); }; // var ALWAYS = 0x0207; var DepthMode = function DepthMode(depthFunc , depthMask , depthRange ) { this.func = depthFunc; this.mask = depthMask; this.range = depthRange; }; DepthMode.ReadOnly = false; DepthMode.ReadWrite = true; DepthMode.disabled = new DepthMode(ALWAYS, DepthMode.ReadOnly, [0, 1]); // var ALWAYS$1 = 0x0207; var KEEP = 0x1E00; var StencilMode = function StencilMode(test , ref , mask , fail , depthFail , pass ) { this.test = test; this.ref = ref; this.mask = mask; this.fail = fail; this.depthFail = depthFail; this.pass = pass; }; StencilMode.disabled = new StencilMode({func: ALWAYS$1, mask: 0}, 0, 0, KEEP, KEEP, KEEP); // var ZERO = 0x0000; var ONE = 0x0001; var ONE_MINUS_SRC_ALPHA = 0x0303; var ColorMode = function ColorMode(blendFunction , blendColor , mask ) { this.blendFunction = blendFunction; this.blendColor = blendColor; this.mask = mask; }; ColorMode.Replace = [ONE, ZERO]; ColorMode.disabled = new ColorMode(ColorMode.Replace, performance.Color.transparent, [false, false, false, false]); ColorMode.unblended = new ColorMode(ColorMode.Replace, performance.Color.transparent, [true, true, true, true]); ColorMode.alphaBlended = new ColorMode([ONE, ONE_MINUS_SRC_ALPHA], performance.Color.transparent, [true, true, true, true]); // var BACK = 0x0405; var CCW = 0x0901; var CullFaceMode = function CullFaceMode(enable , mode , frontFace ) { this.enable = enable; this.mode = mode; this.frontFace = frontFace; }; CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW); CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW); // var Context = function Context(gl ) { this.gl = gl; this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object'); this.clearColor = new ClearColor(this); this.clearDepth = new ClearDepth(this); this.clearStencil = new ClearStencil(this); this.colorMask = new ColorMask(this); this.depthMask = new DepthMask(this); this.stencilMask = new StencilMask(this); this.stencilFunc = new StencilFunc(this); this.stencilOp = new StencilOp(this); this.stencilTest = new StencilTest(this); this.depthRange = new DepthRange(this); this.depthTest = new DepthTest(this); this.depthFunc = new DepthFunc(this); this.blend = new Blend(this); this.blendFunc = new BlendFunc(this); this.blendColor = new BlendColor(this); this.blendEquation = new BlendEquation(this); this.cullFace = new CullFace(this); this.cullFaceSide = new CullFaceSide(this); this.frontFace = new FrontFace(this); this.program = new Program(this); this.activeTexture = new ActiveTextureUnit(this); this.viewport = new Viewport(this); this.bindFramebuffer = new BindFramebuffer(this); this.bindRenderbuffer = new BindRenderbuffer(this); this.bindTexture = new BindTexture(this); this.bindVertexBuffer = new BindVertexBuffer(this); this.bindElementBuffer = new BindElementBuffer(this); this.bindVertexArrayOES = this.extVertexArrayObject && new BindVertexArrayOES(this); this.pixelStoreUnpack = new PixelStoreUnpack(this); this.pixelStoreUnpackPremultiplyAlpha = new PixelStoreUnpackPremultiplyAlpha(this); this.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(this); this.extTextureFilterAnisotropic = ( gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('MOZ_EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') ); if (this.extTextureFilterAnisotropic) { this.extTextureFilterAnisotropicMax = gl.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT); } this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float'); if (this.extTextureHalfFloat) { gl.getExtension('OES_texture_half_float_linear'); this.extRenderToTextureHalfFloat = gl.getExtension('EXT_color_buffer_half_float'); } this.extTimerQuery = gl.getExtension('EXT_disjoint_timer_query'); this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); }; Context.prototype.setDefault = function setDefault () { this.unbindVAO(); this.clearColor.setDefault(); this.clearDepth.setDefault(); this.clearStencil.setDefault(); this.colorMask.setDefault(); this.depthMask.setDefault(); this.stencilMask.setDefault(); this.stencilFunc.setDefault(); this.stencilOp.setDefault(); this.stencilTest.setDefault(); this.depthRange.setDefault(); this.depthTest.setDefault(); this.depthFunc.setDefault(); this.blend.setDefault(); this.blendFunc.setDefault(); this.blendColor.setDefault(); this.blendEquation.setDefault(); this.cullFace.setDefault(); this.cullFaceSide.setDefault(); this.frontFace.setDefault(); this.program.setDefault(); this.activeTexture.setDefault(); this.bindFramebuffer.setDefault(); this.pixelStoreUnpack.setDefault(); this.pixelStoreUnpackPremultiplyAlpha.setDefault(); this.pixelStoreUnpackFlipY.setDefault(); }; Context.prototype.setDirty = function setDirty () { this.clearColor.dirty = true; this.clearDepth.dirty = true; this.clearStencil.dirty = true; this.colorMask.dirty = true; this.depthMask.dirty = true; this.stencilMask.dirty = true; this.stencilFunc.dirty = true; this.stencilOp.dirty = true; this.stencilTest.dirty = true; this.depthRange.dirty = true; this.depthTest.dirty = true; this.depthFunc.dirty = true; this.blend.dirty = true; this.blendFunc.dirty = true; this.blendColor.dirty = true; this.blendEquation.dirty = true; this.cullFace.dirty = true; this.cullFaceSide.dirty = true; this.frontFace.dirty = true; this.program.dirty = true; this.activeTexture.dirty = true; this.viewport.dirty = true; this.bindFramebuffer.dirty = true; this.bindRenderbuffer.dirty = true; this.bindTexture.dirty = true; this.bindVertexBuffer.dirty = true; this.bindElementBuffer.dirty = true; if (this.extVertexArrayObject) { this.bindVertexArrayOES.dirty = true; } this.pixelStoreUnpack.dirty = true; this.pixelStoreUnpackPremultiplyAlpha.dirty = true; this.pixelStoreUnpackFlipY.dirty = true; }; Context.prototype.createIndexBuffer = function createIndexBuffer (array , dynamicDraw ) { return new IndexBuffer(this, array, dynamicDraw); }; Context.prototype.createVertexBuffer = function createVertexBuffer (array , attributes , dynamicDraw ) { return new VertexBuffer(this, array, attributes, dynamicDraw); }; Context.prototype.createRenderbuffer = function createRenderbuffer (storageFormat , width , height ) { var gl = this.gl; var rbo = gl.createRenderbuffer(); this.bindRenderbuffer.set(rbo); gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height); this.bindRenderbuffer.set(null); return rbo; }; Context.prototype.createFramebuffer = function createFramebuffer (width , height , hasDepth ) { return new Framebuffer(this, width, height, hasDepth); }; Context.prototype.clear = function clear (ref ) { var color = ref.color; var depth = ref.depth; var gl = this.gl; var mask = 0; if (color) { mask |= gl.COLOR_BUFFER_BIT; this.clearColor.set(color); this.colorMask.set([true, true, true, true]); } if (typeof depth !== 'undefined') { mask |= gl.DEPTH_BUFFER_BIT; // Workaround for platforms where clearDepth doesn't seem to work // without reseting the depthRange. See https://github.com/mapbox/mapbox-gl-js/issues/3437 this.depthRange.set([0, 1]); this.clearDepth.set(depth); this.depthMask.set(true); } // See note in Painter#clearStencil: implement this the easy way once GPU bug/workaround is fixed upstream // if (typeof stencil !== 'undefined') { // mask |= gl.STENCIL_BUFFER_BIT; // this.clearStencil.set(stencil); // this.stencilMask.set(0xFF); // } gl.clear(mask); }; Context.prototype.setCullFace = function setCullFace (cullFaceMode ) { if (cullFaceMode.enable === false) { this.cullFace.set(false); } else { this.cullFace.set(true); this.cullFaceSide.set(cullFaceMode.mode); this.frontFace.set(cullFaceMode.frontFace); } }; Context.prototype.setDepthMode = function setDepthMode (depthMode ) { if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) { this.depthTest.set(false); } else { this.depthTest.set(true); this.depthFunc.set(depthMode.func); this.depthMask.set(depthMode.mask); this.depthRange.set(depthMode.range); } }; Context.prototype.setStencilMode = function setStencilMode (stencilMode ) { if (stencilMode.test.func === this.gl.ALWAYS && !stencilMode.mask) { this.stencilTest.set(false); } else { this.stencilTest.set(true); this.stencilMask.set(stencilMode.mask); this.stencilOp.set([stencilMode.fail, stencilMode.depthFail, stencilMode.pass]); this.stencilFunc.set({ func: stencilMode.test.func, ref: stencilMode.ref, mask: stencilMode.test.mask }); } }; Context.prototype.setColorMode = function setColorMode (colorMode ) { if (performance.deepEqual(colorMode.blendFunction, ColorMode.Replace)) { this.blend.set(false); } else { this.blend.set(true); this.blendFunc.set(colorMode.blendFunction); this.blendColor.set(colorMode.blendColor); } this.colorMask.set(colorMode.mask); }; Context.prototype.unbindVAO = function unbindVAO () { // Unbinding the VAO prevents other things (custom layers, new buffer creation) from // unintentionally changing the state of the last VAO used. if (this.extVertexArrayObject) { this.bindVertexArrayOES.set(null); } }; // /** * `SourceCache` is responsible for * * - creating an instance of `Source` * - forwarding events from `Source` * - caching tiles loaded from an instance of `Source` * - loading the tiles needed to render a given viewport * - unloading the cached tiles not needed to render a given viewport * * @private */ var SourceCache = /*@__PURE__*/(function (Evented) { function SourceCache(id , options , dispatcher ) { var this$1 = this; Evented.call(this); this.id = id; this.dispatcher = dispatcher; this.on('data', function (e) { // this._sourceLoaded signifies that the TileJSON is loaded if applicable. // if the source type does not come with a TileJSON, the flag signifies the // source data has loaded (i.e geojson has been tiled on the worker and is ready) if (e.dataType === 'source' && e.sourceDataType === 'metadata') { this$1._sourceLoaded = true; } // for sources with mutable data, this event fires when the underlying data // to a source is changed. (i.e. GeoJSONSource#setData and ImageSource#serCoordinates) if (this$1._sourceLoaded && !this$1._paused && e.dataType === "source" && e.sourceDataType === 'content') { this$1.reload(); if (this$1.transform) { this$1.update(this$1.transform); } } }); this.on('error', function () { this$1._sourceErrored = true; }); this._source = create(id, options, dispatcher, this); this._tiles = {}; this._cache = new TileCache(0, this._unloadTile.bind(this)); this._timers = {}; this._cacheTimers = {}; this._maxTileCacheSize = null; this._loadedParentTiles = {}; this._coveredTiles = {}; this._state = new performance.SourceFeatureState(); } if ( Evented ) SourceCache.__proto__ = Evented; SourceCache.prototype = Object.create( Evented && Evented.prototype ); SourceCache.prototype.constructor = SourceCache; SourceCache.prototype.onAdd = function onAdd (map ) { this.map = map; this._maxTileCacheSize = map ? map._maxTileCacheSize : null; if (this._source && this._source.onAdd) { this._source.onAdd(map); } }; SourceCache.prototype.onRemove = function onRemove (map ) { if (this._source && this._source.onRemove) { this._source.onRemove(map); } }; /** * Return true if no tile data is pending, tiles will not change unless * an additional API call is received. * @private */ SourceCache.prototype.loaded = function loaded () { if (this._sourceErrored) { return true; } if (!this._sourceLoaded) { return false; } if (!this._source.loaded()) { return false; } for (var t in this._tiles) { var tile = this._tiles[t]; if (tile.state !== 'loaded' && tile.state !== 'errored') { return false; } } return true; }; SourceCache.prototype.getSource = function getSource () { return this._source; }; SourceCache.prototype.pause = function pause () { this._paused = true; }; SourceCache.prototype.resume = function resume () { if (!this._paused) { return; } var shouldReload = this._shouldReloadOnResume; this._paused = false; this._shouldReloadOnResume = false; if (shouldReload) { this.reload(); } if (this.transform) { this.update(this.transform); } }; SourceCache.prototype._loadTile = function _loadTile (tile , callback ) { return this._source.loadTile(tile, callback); }; SourceCache.prototype._unloadTile = function _unloadTile (tile ) { if (this._source.unloadTile) { return this._source.unloadTile(tile, function () {}); } }; SourceCache.prototype._abortTile = function _abortTile (tile ) { if (this._source.abortTile) { return this._source.abortTile(tile, function () {}); } }; SourceCache.prototype.serialize = function serialize () { return this._source.serialize(); }; SourceCache.prototype.prepare = function prepare (context ) { if (this._source.prepare) { this._source.prepare(); } this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null); for (var i in this._tiles) { var tile = this._tiles[i]; tile.upload(context); tile.prepare(this.map.style.imageManagerFactory._getImageManager(this.id)); } }; /** * Return all tile ids ordered with z-order, and cast to numbers * @private */ SourceCache.prototype.getIds = function getIds () { return (performance.values(this._tiles) ).map(function (tile ) { return tile.tileID; }).sort(compareTileId).map(function (id) { return id.key; }); }; SourceCache.prototype.getRenderableIds = function getRenderableIds (symbolLayer ) { var this$1 = this; var renderables = []; for (var id in this._tiles) { if (this._isIdRenderable(id, symbolLayer)) { renderables.push(this._tiles[id]); } } if (symbolLayer) { return renderables.sort(function (a_ , b_ ) { var a = a_.tileID; var b = b_.tileID; var rotatedA = (new performance.Point(a.canonical.x, a.canonical.y))._rotate(this$1.transform.angle); var rotatedB = (new performance.Point(b.canonical.x, b.canonical.y))._rotate(this$1.transform.angle); return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; }).map(function (tile) { return tile.tileID.key; }); } return renderables.map(function (tile) { return tile.tileID; }).sort(compareTileId).map(function (id) { return id.key; }); }; SourceCache.prototype.hasRenderableParent = function hasRenderableParent (tileID ) { var parentTile = this.findLoadedParent(tileID, 0); if (parentTile) { return this._isIdRenderable(parentTile.tileID.key); } return false; }; SourceCache.prototype._isIdRenderable = function _isIdRenderable (id , symbolLayer ) { return this._tiles[id] && this._tiles[id].hasData() && !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()); }; SourceCache.prototype.reload = function reload () { if (this._paused) { this._shouldReloadOnResume = true; return; } this._cache.reset(); for (var i in this._tiles) { if (this._tiles[i].state !== "errored") { this._reloadTile(i, 'reloading'); } } }; SourceCache.prototype._reloadTile = function _reloadTile (id , state ) { var tile = this._tiles[id]; // this potentially does not address all underlying // issues https://github.com/mapbox/mapbox-gl-js/issues/4252 // - hard to tell without repro steps if (!tile) { return; } // The difference between "loading" tiles and "reloading" or "expired" // tiles is that "reloading"/"expired" tiles are "renderable". // Therefore, a "loading" tile cannot become a "reloading" tile without // first becoming a "loaded" tile. if (tile.state !== 'loading') { tile.state = state; } this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); }; SourceCache.prototype._tileLoaded = function _tileLoaded (tile , id , previousState , err ) { if (err) { tile.state = 'errored'; if ((err ).status !== 404) { this._source.fire(new performance.ErrorEvent(err, {tile: tile})); } // continue to try loading parent/children tiles if a tile doesn't exist (404) else { this.update(this.transform); } return; } tile.timeAdded = performance.browser.now(); if (previousState === 'expired') { tile.refreshedUponExpiration = true; } this._setTileReloadTimer(id, tile); if (this.getSource().type === 'raster-dem' && tile.dem) { this._backfillDEM(tile); } this._state.initializeTileState(tile, this.map ? this.map.painter : null); this._source.fire(new performance.Event('data', {dataType: 'source', tile: tile, coord: tile.tileID})); }; /** * For raster terrain source, backfill DEM to eliminate visible tile boundaries * @private */ SourceCache.prototype._backfillDEM = function _backfillDEM (tile ) { var renderables = this.getRenderableIds(); for (var i = 0; i < renderables.length; i++) { var borderId = renderables[i]; if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { var borderTile = this.getTileByID(borderId); fillBorder(tile, borderTile); fillBorder(borderTile, tile); } } function fillBorder(tile, borderTile) { tile.needsHillshadePrepare = true; var dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x; var dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y; var dim = Math.pow(2, tile.tileID.canonical.z); var borderId = borderTile.tileID.key; if (dx === 0 && dy === 0) { return; } if (Math.abs(dy) > 1) { return; } if (Math.abs(dx) > 1) { // Adjust the delta coordinate for world wraparound. if (Math.abs(dx + dim) === 1) { dx += dim; } else if (Math.abs(dx - dim) === 1) { dx -= dim; } } if (!borderTile.dem || !tile.dem) { return; } tile.dem.backfillBorder(borderTile.dem, dx, dy); if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { tile.neighboringTiles[borderId].backfilled = true; } } }; /** * Get a specific tile by TileID * @private */ SourceCache.prototype.getTile = function getTile (tileID ) { return this.getTileByID(tileID.key); }; /** * Get a specific tile by id * @private */ SourceCache.prototype.getTileByID = function getTileByID (id ) { return this._tiles[id]; }; /** * For a given set of tiles, retain children that are loaded and have a zoom * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive) * @private */ SourceCache.prototype._retainLoadedChildren = function _retainLoadedChildren ( idealTiles , zoom , maxCoveringZoom , retain ) { for (var id in this._tiles) { var tile = this._tiles[id]; // only consider renderable tiles up to maxCoveringZoom if (retain[id] || !tile.hasData() || tile.tileID.overscaledZ <= zoom || tile.tileID.overscaledZ > maxCoveringZoom ) { continue; } // loop through parents and retain the topmost loaded one if found var topmostLoadedID = tile.tileID; while (tile && tile.tileID.overscaledZ > zoom + 1) { var parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1); tile = this._tiles[parentID.key]; if (tile && tile.hasData()) { topmostLoadedID = parentID; } } // loop through ancestors of the topmost loaded child to see if there's one that needed it var tileID = topmostLoadedID; while (tileID.overscaledZ > zoom) { tileID = tileID.scaledTo(tileID.overscaledZ - 1); if (idealTiles[tileID.key]) { // found a parent that needed a loaded child; retain that child retain[topmostLoadedID.key] = topmostLoadedID; break; } } } }; /** * Find a loaded parent of the given tile (up to minCoveringZoom) * @private */ SourceCache.prototype.findLoadedParent = function findLoadedParent (tileID , minCoveringZoom ) { if (tileID.key in this._loadedParentTiles) { var parent = this._loadedParentTiles[tileID.key]; if (parent && parent.tileID.overscaledZ >= minCoveringZoom) { return parent; } else { return null; } } for (var z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) { var parentTileID = tileID.scaledTo(z); var tile = this._getLoadedTile(parentTileID); if (tile) { return tile; } } }; SourceCache.prototype._getLoadedTile = function _getLoadedTile (tileID ) { var tile = this._tiles[tileID.key]; if (tile && tile.hasData()) { return tile; } // TileCache ignores wrap in lookup. var cachedTile = this._cache.getByKey(tileID.wrapped().key); return cachedTile; }; /** * Resizes the tile cache based on the current viewport's size * or the maxTileCacheSize option passed during map creation * * Larger viewports use more tiles and need larger caches. Larger viewports * are more likely to be found on devices with more memory and on pages where * the map is more important. * @private */ SourceCache.prototype.updateCacheSize = function updateCacheSize (transform ) { var widthInTiles = Math.ceil(transform.width / this._source.tileSize) + 1; var heightInTiles = Math.ceil(transform.height / this._source.tileSize) + 1; var approxTilesInView = widthInTiles * heightInTiles; var commonZoomRange = 5; var viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange); var maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize; this._cache.setMaxSize(maxSize); }; SourceCache.prototype.handleWrapJump = function handleWrapJump (lng ) { // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify // which cppy of the world the tile belongs to. For example, at `lng: 10` you // might render z/x/y/0 while at `lng: 370` you would render z/x/y/1. // // When lng values get wrapped (going from `lng: 370` to `long: 10`) you expect // to see the same thing on the screen (370 degrees and 10 degrees is the same // place in the world) but all the TileIDs will have different wrap values. // // In order to make this transition seamless, we calculate the rounded difference of // "worlds" between the last frame and the current frame. If the map panned by // a world, then we can assign all the tiles new TileIDs with updated wrap values. // For example, assign z/x/y/1 a new id: z/x/y/0. It is the same tile, just rendered // in a different position. // // This enables us to reuse the tiles at more ideal locations and prevent flickering. var prevLng = this._prevLng === undefined ? lng : this._prevLng; var lngDifference = lng - prevLng; var worldDifference = lngDifference / 360; var wrapDelta = Math.round(worldDifference); this._prevLng = lng; if (wrapDelta) { var tiles = {}; for (var key in this._tiles) { var tile = this._tiles[key]; tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta); tiles[tile.tileID.key] = tile; } this._tiles = tiles; // Reset tile reload timers for (var id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; } for (var id$1 in this._tiles) { var tile$1 = this._tiles[id$1]; this._setTileReloadTimer(id$1, tile$1); } } }; /** * Removes tiles that are outside the viewport and adds new tiles that * are inside the viewport. * @private */ SourceCache.prototype.update = function update (transform ) { var this$1 = this; this.transform = transform; if (!this._sourceLoaded || this._paused) { return; } this.updateCacheSize(transform); this.handleWrapJump(this.transform.center.lng); // Covered is a list of retained tiles who's areas are fully covered by other, // better, retained tiles. They are not drawn separately. this._coveredTiles = {}; var idealTileIDs; if (!this.used) { idealTileIDs = []; } else if (this._source.tileID) { idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID) .map(function (unwrapped) { return new performance.OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y, this$1.indexExtent); }); } else { idealTileIDs = transform.coveringTiles({ tileSize: this._source.tileSize, minzoom: this._source.minzoom, maxzoom: this._source.maxzoom, roundZoom: this._source.roundZoom, reparseOverscaled: this._source.reparseOverscaled }); if (this._source.hasTile) { idealTileIDs = idealTileIDs.filter(function (coord) { return (this$1._source.hasTile )(coord); }); } } // Determine the overzooming/underzooming amounts. var zoom = transform.coveringZoomLevel(this._source); var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); // Retain is a list of tiles that we shouldn't delete, even if they are not // the most ideal tile for the current viewport. This may include tiles like // parent or child tiles that are *already* loaded. var retain = this._updateRetainedTiles(idealTileIDs, zoom); if (isRasterType(this._source.type)) { var parentsForFading = {}; var fadingTiles = {}; var ids = Object.keys(retain); for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var tileID = retain[id]; performance.assert(tileID.key === id); var tile = this._tiles[id]; if (!tile || tile.fadeEndTime && tile.fadeEndTime <= performance.browser.now()) { continue; } // if the tile is loaded but still fading in, find parents to cross-fade with it var parentTile = this.findLoadedParent(tileID, minCoveringZoom); if (parentTile) { this._addTile(parentTile.tileID); parentsForFading[parentTile.tileID.key] = parentTile.tileID; } fadingTiles[id] = tileID; } // for tiles that are still fading in, also find children to cross-fade with this._retainLoadedChildren(fadingTiles, zoom, maxCoveringZoom, retain); for (var id$1 in parentsForFading) { if (!retain[id$1]) { // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own. this._coveredTiles[id$1] = true; retain[id$1] = parentsForFading[id$1]; } } } for (var retainedId in retain) { // Make sure retained tiles always clear any existing fade holds // so that if they're removed again their fade timer starts fresh. this._tiles[retainedId].clearFadeHold(); } // Remove the tiles we don't need anymore. var remove = performance.keysDifference(this._tiles, retain); for (var i$1 = 0, list$1 = remove; i$1 < list$1.length; i$1 += 1) { var tileID$1 = list$1[i$1]; var tile$1 = this._tiles[tileID$1]; if (tile$1.hasSymbolBuckets && !tile$1.holdingForFade()) { tile$1.setHoldDuration(this.map._fadeDuration); } else if (!tile$1.hasSymbolBuckets || tile$1.symbolFadeFinished()) { this._removeTile(tileID$1); } } // Construct a cache of loaded parents this._updateLoadedParentTileCache(); }; SourceCache.prototype.releaseSymbolFadeTiles = function releaseSymbolFadeTiles () { for (var id in this._tiles) { if (this._tiles[id].holdingForFade()) { this._removeTile(id); } } }; SourceCache.prototype._updateRetainedTiles = function _updateRetainedTiles (idealTileIDs , zoom ) { var retain = {}; var checked = {}; var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); var missingTiles = {}; for (var i = 0, list = idealTileIDs; i < list.length; i += 1) { var tileID = list[i]; var tile = this._addTile(tileID); // retain the tile even if it's not loaded because it's an ideal tile. retain[tileID.key] = tileID; if (tile.hasData()) { continue; } if (zoom < this._source.maxzoom) { // save missing tiles that potentially have loaded children missingTiles[tileID.key] = tileID; } } // retain any loaded children of ideal tiles up to maxCoveringZoom this._retainLoadedChildren(missingTiles, zoom, maxCoveringZoom, retain); for (var i$1 = 0, list$1 = idealTileIDs; i$1 < list$1.length; i$1 += 1) { var tileID$1 = list$1[i$1]; var tile$1 = this._tiles[tileID$1.key]; if (tile$1.hasData()) { continue; } // The tile we require is not yet loaded or does not exist; // Attempt to find children that fully cover it. if (zoom + 1 > this._source.maxzoom) { // We're looking for an overzoomed child tile. var childCoord = tileID$1.children(this._source.maxzoom)[0]; var childTile = this.getTile(childCoord); if (!!childTile && childTile.hasData()) { retain[childCoord.key] = childCoord; continue; // tile is covered by overzoomed child } } else { // check if all 4 immediate children are loaded (i.e. the missing ideal tile is covered) var children = tileID$1.children(this._source.maxzoom); if (retain[children[0].key] && retain[children[1].key] && retain[children[2].key] && retain[children[3].key]) { continue; } // tile is covered by children } // We couldn't find child tiles that entirely cover the ideal tile; look for parents now. // As we ascend up the tile pyramid of the ideal tile, we check whether the parent // tile has been previously requested (and errored because we only loop over tiles with no data) // in order to determine if we need to request its parent. var parentWasRequested = tile$1.wasRequested(); for (var overscaledZ = tileID$1.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) { var parentId = tileID$1.scaledTo(overscaledZ); // Break parent tile ascent if this route has been previously checked by another child. if (checked[parentId.key]) { break; } checked[parentId.key] = true; tile$1 = this.getTile(parentId); if (!tile$1 && parentWasRequested) { tile$1 = this._addTile(parentId); } if (tile$1) { retain[parentId.key] = parentId; // Save the current values, since they're the parent of the next iteration // of the parent tile ascent loop. parentWasRequested = tile$1.wasRequested(); if (tile$1.hasData()) { break; } } } } return retain; }; SourceCache.prototype._updateLoadedParentTileCache = function _updateLoadedParentTileCache () { this._loadedParentTiles = {}; for (var tileKey in this._tiles) { var path = []; var parentTile = (void 0) ; var currentId = this._tiles[tileKey].tileID; // Find the closest loaded ancestor by traversing the tile tree towards the root and // caching results along the way while (currentId.overscaledZ > 0) { // Do we have a cached result from previous traversals? if (currentId.key in this._loadedParentTiles) { parentTile = this._loadedParentTiles[currentId.key]; break; } path.push(currentId.key); // Is the parent loaded? var parentId = currentId.scaledTo(currentId.overscaledZ - 1); parentTile = this._getLoadedTile(parentId); if (parentTile) { break; } currentId = parentId; } // Cache the result of this traversal to all newly visited tiles for (var i = 0, list = path; i < list.length; i += 1) { var key = list[i]; this._loadedParentTiles[key] = parentTile; } } }; /** * Add a tile, given its coordinate, to the pyramid. * @private */ SourceCache.prototype._addTile = function _addTile (tileID ) { var tile = this._tiles[tileID.key]; if (tile) { return tile; } tile = this._cache.getAndRemove(tileID); if (tile) { this._setTileReloadTimer(tileID.key, tile); // set the tileID because the cached tile could have had a different wrap value tile.tileID = tileID; this._state.initializeTileState(tile, this.map ? this.map.painter : null); if (this._cacheTimers[tileID.key]) { clearTimeout(this._cacheTimers[tileID.key]); delete this._cacheTimers[tileID.key]; this._setTileReloadTimer(tileID.key, tile); } } var cached = Boolean(tile); if (!cached) { tile = new performance.Tile(tileID, this._source.tileSize * tileID.overscaleFactor()); this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); } // Impossible, but silence flow. if (!tile) { return (null ); } tile.uses++; this._tiles[tileID.key] = tile; if (!cached) { this._source.fire(new performance.Event('dataloading', {tile: tile, coord: tile.tileID, dataType: 'source'})); } return tile; }; SourceCache.prototype._setTileReloadTimer = function _setTileReloadTimer (id , tile ) { var this$1 = this; if (id in this._timers) { clearTimeout(this._timers[id]); delete this._timers[id]; } var expiryTimeout = tile.getExpiryTimeout(); if (expiryTimeout) { this._timers[id] = setTimeout(function () { this$1._reloadTile(id, 'expired'); delete this$1._timers[id]; }, expiryTimeout); } }; /** * Remove a tile, given its id, from the pyramid * @private */ SourceCache.prototype._removeTile = function _removeTile (id ) { var tile = this._tiles[id]; if (!tile) { return; } tile.uses--; delete this._tiles[id]; if (this._timers[id]) { clearTimeout(this._timers[id]); delete this._timers[id]; } if (tile.uses > 0) { return; } if (tile.hasData() && tile.state !== 'reloading') { this._cache.add(tile.tileID, tile, tile.getExpiryTimeout()); } else { tile.aborted = true; this._abortTile(tile); this._unloadTile(tile); } }; /** * Remove all tiles from this pyramid */ SourceCache.prototype.clearTiles = function clearTiles () { this._shouldReloadOnResume = false; this._paused = false; for (var id in this._tiles) { this._removeTile(id); } this._cache.reset(); }; /** * Search through our current tiles and attempt to find the tiles that * cover the given bounds. * @param pointQueryGeometry coordinates of the corners of bounding rectangle * @returns {Array} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile. * @private */ SourceCache.prototype.tilesIn = function tilesIn (pointQueryGeometry , maxPitchScaleFactor , has3DLayer ) { var this$1 = this; var tileResults = []; var transform = this.transform; if (!transform) { return tileResults; } var cameraPointQueryGeometry = has3DLayer ? transform.getCameraQueryGeometry(pointQueryGeometry) : pointQueryGeometry; var queryGeometry = pointQueryGeometry.map(function (p) { return transform.pointCoordinate(p); }); var cameraQueryGeometry = cameraPointQueryGeometry.map(function (p) { return transform.pointCoordinate(p); }); var ids = this.getIds(); var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i$1 = 0, list = cameraQueryGeometry; i$1 < list.length; i$1 += 1) { var p = list[i$1]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } var loop = function ( i ) { var tile = this$1._tiles[ids[i]]; if (tile.holdingForFade()) { // Tiles held for fading are covered by tiles that are closer to ideal return; } var tileID = tile.tileID; var scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ); var queryPadding = maxPitchScaleFactor * tile.queryPadding * performance.EXTENT / tile.tileSize / scale; var tileSpaceBounds = [ tileID.getTilePoint(new performance.MercatorCoordinate(minX, minY)), tileID.getTilePoint(new performance.MercatorCoordinate(maxX, maxY)) ]; if (tileSpaceBounds[0].x - queryPadding < performance.EXTENT && tileSpaceBounds[0].y - queryPadding < performance.EXTENT && tileSpaceBounds[1].x + queryPadding >= 0 && tileSpaceBounds[1].y + queryPadding >= 0) { var tileSpaceQueryGeometry = queryGeometry.map(function (c) { return tileID.getTilePoint(c); }); var tileSpaceCameraQueryGeometry = cameraQueryGeometry.map(function (c) { return tileID.getTilePoint(c); }); tileResults.push({ tile: tile, tileID: tileID, queryGeometry: tileSpaceQueryGeometry, cameraQueryGeometry: tileSpaceCameraQueryGeometry, scale: scale }); } }; for (var i = 0; i < ids.length; i++) loop( i ); return tileResults; }; SourceCache.prototype.getVisibleCoordinates = function getVisibleCoordinates (symbolLayer ) { var this$1 = this; var coords = this.getRenderableIds(symbolLayer).map(function (id) { return this$1._tiles[id].tileID; }); for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; coord.posMatrix = this.transform.calculatePosMatrix(coord.toUnwrapped()); } return coords; }; SourceCache.prototype.hasTransition = function hasTransition () { if (this._source.hasTransition()) { return true; } if (isRasterType(this._source.type)) { for (var id in this._tiles) { var tile = this._tiles[id]; if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= performance.browser.now()) { return true; } } } return false; }; /** * Set the value of a particular state for a feature * @private */ SourceCache.prototype.setFeatureState = function setFeatureState (sourceLayer , featureId , state ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; this._state.updateState(sourceLayer, featureId, state); }; /** * Resets the value of a particular state key for a feature * @private */ SourceCache.prototype.removeFeatureState = function removeFeatureState (sourceLayer , featureId , key ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; this._state.removeFeatureState(sourceLayer, featureId, key); }; /** * Get the entire state object for a feature * @private */ SourceCache.prototype.getFeatureState = function getFeatureState (sourceLayer , featureId ) { sourceLayer = sourceLayer || '_geojsonTileLayer'; return this._state.getState(sourceLayer, featureId); }; /** * Sets the set of keys that the tile depends on. This allows tiles to * be reloaded when their dependencies change. * @private */ SourceCache.prototype.setDependencies = function setDependencies (tileKey , namespace , dependencies ) { var tile = this._tiles[tileKey]; if (tile) { tile.setDependencies(namespace, dependencies); } }; /** * Reloads all tiles that depend on the given keys. * @private */ SourceCache.prototype.reloadTilesForDependencies = function reloadTilesForDependencies (namespaces , keys ) { for (var id in this._tiles) { var tile = this._tiles[id]; if (tile.hasDependency(namespaces, keys)) { this._reloadTile(id, 'reloading'); } } this._cache.filter(function (tile) { return !tile.hasDependency(namespaces, keys); }); }; return SourceCache; }(performance.Evented)); SourceCache.maxOverzooming = 10; SourceCache.maxUnderzooming = 3; function compareTileId(a , b ) { // Different copies of the world are sorted based on their distance to the center. // Wrap values are converted to unsigned distances by reserving odd number for copies // with negative wrap and even numbers for copies with positive wrap. var aWrap = Math.abs(a.wrap * 2) - +(a.wrap < 0); var bWrap = Math.abs(b.wrap * 2) - +(b.wrap < 0); return a.overscaledZ - b.overscaledZ || bWrap - aWrap || b.canonical.y - a.canonical.y || b.canonical.x - a.canonical.x; } function isRasterType(type) { return type === 'raster' || type === 'image' || type === 'video'; } // function WebWorker () { return (new performance.window.Worker(exported.workerUrl) ); } // var PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool'; /** * Constructs a worker pool. * @private */ var WorkerPool = function WorkerPool() { this.active = {}; }; WorkerPool.prototype.acquire = function acquire (mapId ) { if (!this.workers) { // Lazily look up the value of mapboxgl.workerCount so that // client code has had a chance to set it. this.workers = []; while (this.workers.length < WorkerPool.workerCount) { this.workers.push(new WebWorker()); } } this.active[mapId] = true; return this.workers.slice(); }; WorkerPool.prototype.release = function release (mapId ) { delete this.active[mapId]; if (this.numActive() === 0) { this.workers.forEach(function (w) { w.terminate(); }); this.workers = (null ); } }; WorkerPool.prototype.isPreloaded = function isPreloaded () { return !!this.active[PRELOAD_POOL_ID]; }; WorkerPool.prototype.numActive = function numActive () { return Object.keys(this.active).length; }; var availableLogicalProcessors = Math.floor(performance.browser.hardwareConcurrency / 2); WorkerPool.workerCount = Math.max(Math.min(availableLogicalProcessors, 6), 1); // var globalWorkerPool; /** * Creates (if necessary) and returns the single, global WorkerPool instance * to be shared across each Map * @private */ function getGlobalWorkerPool () { if (!globalWorkerPool) { globalWorkerPool = new WorkerPool(); } return globalWorkerPool; } function prewarm() { var workerPool = getGlobalWorkerPool(); workerPool.acquire(PRELOAD_POOL_ID); } function clearPrewarmedResources() { var pool = globalWorkerPool; if (pool) { // Remove the pool only if all maps that referenced the preloaded global worker pool have been removed. if (pool.isPreloaded() && pool.numActive() === 1) { pool.release(PRELOAD_POOL_ID); globalWorkerPool = null; } else { console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()'); } } } function deref(layer, parent) { var result = {}; for (var k in layer) { if (k !== 'ref') { result[k] = layer[k]; } } performance.refProperties.forEach(function (k) { if (k in parent) { result[k] = parent[k]; } }); return result; } /** * Given an array of layers, some of which may contain `ref` properties * whose value is the `id` of another property, return a new array where * such layers have been augmented with the 'type', 'source', etc. properties * from the parent layer, and the `ref` property has been removed. * * The input is not modified. The output may contain references to portions * of the input. * * @private * @param {Array} layers * @returns {Array} */ function derefLayers(layers) { layers = layers.slice(); var map = Object.create(null); for (var i = 0; i < layers.length; i++) { map[layers[i].id] = layers[i]; } for (var i$1 = 0; i$1 < layers.length; i$1++) { if ('ref' in layers[i$1]) { layers[i$1] = deref(layers[i$1], map[layers[i$1].ref]); } } return layers; } function emptyStyle() { var style = {}; var version = performance.styleSpec['$version']; for (var styleKey in performance.styleSpec['$root']) { var spec = performance.styleSpec['$root'][styleKey]; if (spec.required) { var value = null; if (styleKey === 'version') { value = version; } else { if (spec.type === 'array') { value = []; } else { value = {}; } } if (value != null) { style[styleKey] = value; } } } return style; } var operations = { /* * { command: 'setStyle', args: [stylesheet] } */ setStyle: 'setStyle', /* * { command: 'addLayer', args: [layer, 'beforeLayerId'] } */ addLayer: 'addLayer', /* * { command: 'removeLayer', args: ['layerId'] } */ removeLayer: 'removeLayer', /* * { command: 'setPaintProperty', args: ['layerId', 'prop', value] } */ setPaintProperty: 'setPaintProperty', /* * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] } */ setLayoutProperty: 'setLayoutProperty', /* * { command: 'setFilter', args: ['layerId', filter] } */ setFilter: 'setFilter', /* * { command: 'addSource', args: ['sourceId', source] } */ addSource: 'addSource', /* * { command: 'removeSource', args: ['sourceId'] } */ removeSource: 'removeSource', /* * { command: 'setGeoJSONSourceData', args: ['sourceId', data] } */ setGeoJSONSourceData: 'setGeoJSONSourceData', /* * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] } */ setLayerZoomRange: 'setLayerZoomRange', /* * { command: 'setLayerProperty', args: ['layerId', 'prop', value] } */ setLayerProperty: 'setLayerProperty', /* * { command: 'setCenter', args: [[lon, lat]] } */ setCenter: 'setCenter', /* * { command: 'setZoom', args: [zoom] } */ setZoom: 'setZoom', /* * { command: 'setBearing', args: [bearing] } */ setBearing: 'setBearing', /* * { command: 'setPitch', args: [pitch] } */ setPitch: 'setPitch', /* * { command: 'setSprite', args: ['spriteUrl'] } */ setSprite: 'setSprite', /* * { command: 'setGlyphs', args: ['glyphsUrl'] } */ setGlyphs: 'setGlyphs', /* * { command: 'setTransition', args: [transition] } */ setTransition: 'setTransition', /* * { command: 'setLighting', args: [lightProperties] } */ setLight: 'setLight' }; function addSource(sourceId, after, commands) { commands.push({command: operations.addSource, args: [sourceId, after[sourceId]]}); } function removeSource(sourceId, commands, sourcesRemoved) { commands.push({command: operations.removeSource, args: [sourceId]}); sourcesRemoved[sourceId] = true; } function updateSource(sourceId, after, commands, sourcesRemoved) { removeSource(sourceId, commands, sourcesRemoved); addSource(sourceId, after, commands); } function canUpdateGeoJSON(before, after, sourceId) { var prop; for (prop in before[sourceId]) { if (!before[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !performance.deepEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } for (prop in after[sourceId]) { if (!after[sourceId].hasOwnProperty(prop)) { continue; } if (prop !== 'data' && !performance.deepEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } } return true; } function diffSources(before, after, commands, sourcesRemoved) { before = before || {}; after = after || {}; var sourceId; // look for sources to remove for (sourceId in before) { if (!before.hasOwnProperty(sourceId)) { continue; } if (!after.hasOwnProperty(sourceId)) { removeSource(sourceId, commands, sourcesRemoved); } } // look for sources to add/update for (sourceId in after) { if (!after.hasOwnProperty(sourceId)) { continue; } if (!before.hasOwnProperty(sourceId)) { addSource(sourceId, after, commands); } else if (!performance.deepEqual(before[sourceId], after[sourceId])) { if (before[sourceId].type === 'geojson' && after[sourceId].type === 'geojson' && canUpdateGeoJSON(before, after, sourceId)) { commands.push({command: operations.setGeoJSONSourceData, args: [sourceId, after[sourceId].data]}); } else { // no update command, must remove then add updateSource(sourceId, after, commands, sourcesRemoved); } } } } function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { before = before || {}; after = after || {}; var prop; for (prop in before) { if (!before.hasOwnProperty(prop)) { continue; } if (!performance.deepEqual(before[prop], after[prop])) { commands.push({command: command, args: [layerId, prop, after[prop], klass]}); } } for (prop in after) { if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) { continue; } if (!performance.deepEqual(before[prop], after[prop])) { commands.push({command: command, args: [layerId, prop, after[prop], klass]}); } } } function pluckId(layer) { return layer.id; } function indexById(group, layer) { group[layer.id] = layer; return group; } function diffLayers(before, after, commands) { before = before || []; after = after || []; // order of layers by id var beforeOrder = before.map(pluckId); var afterOrder = after.map(pluckId); // index of layer by id var beforeIndex = before.reduce(indexById, {}); var afterIndex = after.reduce(indexById, {}); // track order of layers as if they have been mutated var tracker = beforeOrder.slice(); // layers that have been added do not need to be diffed var clean = Object.create(null); var i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop; // remove layers for (i = 0, d = 0; i < beforeOrder.length; i++) { layerId = beforeOrder[i]; if (!afterIndex.hasOwnProperty(layerId)) { commands.push({command: operations.removeLayer, args: [layerId]}); tracker.splice(tracker.indexOf(layerId, d), 1); } else { // limit where in tracker we need to look for a match d++; } } // add/reorder layers for (i = 0, d = 0; i < afterOrder.length; i++) { // work backwards as insert is before an existing layer layerId = afterOrder[afterOrder.length - 1 - i]; if (tracker[tracker.length - 1 - i] === layerId) { continue; } if (beforeIndex.hasOwnProperty(layerId)) { // remove the layer before we insert at the correct position commands.push({command: operations.removeLayer, args: [layerId]}); tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1); } else { // limit where in tracker we need to look for a match d++; } // add layer at correct position insertBeforeLayerId = tracker[tracker.length - i]; commands.push({command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId]}); tracker.splice(tracker.length - i, 0, layerId); clean[layerId] = true; } // update layers for (i = 0; i < afterOrder.length; i++) { layerId = afterOrder[i]; beforeLayer = beforeIndex[layerId]; afterLayer = afterIndex[layerId]; // no need to update if previously added (new or moved) if (clean[layerId] || performance.deepEqual(beforeLayer, afterLayer)) { continue; } // If source, source-layer, or type have changes, then remove the layer // and add it back 'from scratch'. if (!performance.deepEqual(beforeLayer.source, afterLayer.source) || !performance.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !performance.deepEqual(beforeLayer.type, afterLayer.type)) { commands.push({command: operations.removeLayer, args: [layerId]}); // we add the layer back at the same position it was already in, so // there's no need to update the `tracker` insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1]; commands.push({command: operations.addLayer, args: [afterLayer, insertBeforeLayerId]}); continue; } // layout, paint, filter, minzoom, maxzoom diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty); diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty); if (!performance.deepEqual(beforeLayer.filter, afterLayer.filter)) { commands.push({command: operations.setFilter, args: [layerId, afterLayer.filter]}); } if (!performance.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !performance.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { commands.push({command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom]}); } // handle all other layer props, including paint.* for (prop in beforeLayer) { if (!beforeLayer.hasOwnProperty(prop)) { continue; } if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') { continue; } if (prop.indexOf('paint.') === 0) { diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); } else if (!performance.deepEqual(beforeLayer[prop], afterLayer[prop])) { commands.push({command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]]}); } } for (prop in afterLayer) { if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) { continue; } if (prop === 'layout' || prop === 'paint' || prop === 'filter' || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') { continue; } if (prop.indexOf('paint.') === 0) { diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); } else if (!performance.deepEqual(beforeLayer[prop], afterLayer[prop])) { commands.push({command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]]}); } } } } /** * Diff two stylesheet * * Creates semanticly aware diffs that can easily be applied at runtime. * Operations produced by the diff closely resemble the mapbox-gl-js API. Any * error creating the diff will fall back to the 'setStyle' operation. * * Example diff: * [ * { command: 'setConstant', args: ['@water', '#0000FF'] }, * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] } * ] * * @private * @param {*} [before] stylesheet to compare from * @param {*} after stylesheet to compare to * @returns Array list of changes */ function diffStyles(before, after) { if (!before) { return [{command: operations.setStyle, args: [after]}]; } var commands = []; try { // Handle changes to top-level properties if (!performance.deepEqual(before.version, after.version)) { return [{command: operations.setStyle, args: [after]}]; } if (!performance.deepEqual(before.center, after.center)) { commands.push({command: operations.setCenter, args: [after.center]}); } if (!performance.deepEqual(before.zoom, after.zoom)) { commands.push({command: operations.setZoom, args: [after.zoom]}); } if (!performance.deepEqual(before.bearing, after.bearing)) { commands.push({command: operations.setBearing, args: [after.bearing]}); } if (!performance.deepEqual(before.pitch, after.pitch)) { commands.push({command: operations.setPitch, args: [after.pitch]}); } if (!performance.deepEqual(before.sprite, after.sprite)) { commands.push({command: operations.setSprite, args: [after.sprite]}); } if (!performance.deepEqual(before.glyphs, after.glyphs)) { commands.push({command: operations.setGlyphs, args: [after.glyphs]}); } if (!performance.deepEqual(before.transition, after.transition)) { commands.push({command: operations.setTransition, args: [after.transition]}); } if (!performance.deepEqual(before.light, after.light)) { commands.push({command: operations.setLight, args: [after.light]}); } // Handle changes to `sources` // If a source is to be removed, we also--before the removeSource // command--need to remove all the style layers that depend on it. var sourcesRemoved = {}; // First collect the {add,remove}Source commands var removeOrAddSourceCommands = []; diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved); // Push a removeLayer command for each style layer that depends on a // source that's being removed. // Also, exclude any such layers them from the input to `diffLayers` // below, so that diffLayers produces the appropriate `addLayers` // command var beforeLayers = []; if (before.layers) { before.layers.forEach(function (layer) { if (sourcesRemoved[layer.source]) { commands.push({command: operations.removeLayer, args: [layer.id]}); } else { beforeLayers.push(layer); } }); } commands = commands.concat(removeOrAddSourceCommands); // Handle changes to `layers` diffLayers(beforeLayers, after.layers, commands); } catch (e) { // fall back to setStyle console.warn('Unable to compute style diff:', e); commands = [{command: operations.setStyle, args: [after]}]; } return commands; } // var PathInterpolator = function PathInterpolator(points_ , padding_ ) { this.reset(points_, padding_); }; PathInterpolator.prototype.reset = function reset (points_ , padding_ ) { this.points = points_ || []; // Compute cumulative distance from first point to every other point in the segment. // Last entry in the array is total length of the path this._distances = [0.0]; for (var i = 1; i < this.points.length; i++) { this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]); } this.length = this._distances[this._distances.length - 1]; this.padding = Math.min(padding_ || 0, this.length * 0.5); this.paddedLength = this.length - this.padding * 2.0; }; PathInterpolator.prototype.lerp = function lerp (t ) { performance.assert(this.points.length > 0); if (this.points.length === 1) { return this.points[0]; } t = performance.clamp(t, 0, 1); // Find the correct segment [p0, p1] where p0 <= x < p1 var currentIndex = 1; var distOfCurrentIdx = this._distances[currentIndex]; var distToTarget = t * this.paddedLength + this.padding; while (distOfCurrentIdx < distToTarget && currentIndex < this._distances.length) { distOfCurrentIdx = this._distances[++currentIndex]; } // Interpolate between the two points of the segment var idxOfPrevPoint = currentIndex - 1; var distOfPrevIdx = this._distances[idxOfPrevPoint]; var segmentLength = distOfCurrentIdx - distOfPrevIdx; var segmentT = segmentLength > 0 ? (distToTarget - distOfPrevIdx) / segmentLength : 0; return this.points[idxOfPrevPoint].mult(1.0 - segmentT).add(this.points[currentIndex].mult(segmentT)); }; // /** * GridIndex is a data structure for testing the intersection of * circles and rectangles in a 2d plane. * It is optimized for rapid insertion and querying. * GridIndex splits the plane into a set of "cells" and keeps track * of which geometries intersect with each cell. At query time, * full geometry comparisons are only done for items that share * at least one cell. As long as the geometries are relatively * uniformly distributed across the plane, this greatly reduces * the number of comparisons necessary. * * @private */ var GridIndex = function GridIndex (width , height , cellSize ) { var boxCells = this.boxCells = []; var circleCells = this.circleCells = []; // More cells -> fewer geometries to check per cell, but items tend // to be split across more cells. // Sweet spot allows most small items to fit in one cell this.xCellCount = Math.ceil(width / cellSize); this.yCellCount = Math.ceil(height / cellSize); for (var i = 0; i < this.xCellCount * this.yCellCount; i++) { boxCells.push([]); circleCells.push([]); } this.circleKeys = []; this.boxKeys = []; this.bboxes = []; this.circles = []; this.width = width; this.height = height; this.xScale = this.xCellCount / width; this.yScale = this.yCellCount / height; this.boxUid = 0; this.circleUid = 0; }; GridIndex.prototype.keysLength = function keysLength () { return this.boxKeys.length + this.circleKeys.length; }; GridIndex.prototype.insert = function insert (key , x1 , y1 , x2 , y2 ) { this._forEachCell(x1, y1, x2, y2, this._insertBoxCell, this.boxUid++); this.boxKeys.push(key); this.bboxes.push(x1); this.bboxes.push(y1); this.bboxes.push(x2); this.bboxes.push(y2); }; GridIndex.prototype.insertCircle = function insertCircle (key , x , y , radius ) { // Insert circle into grid for all cells in the circumscribing square // It's more than necessary (by a factor of 4/PI), but fast to insert this._forEachCell(x - radius, y - radius, x + radius, y + radius, this._insertCircleCell, this.circleUid++); this.circleKeys.push(key); this.circles.push(x); this.circles.push(y); this.circles.push(radius); }; GridIndex.prototype._insertBoxCell = function _insertBoxCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.boxCells[cellIndex].push(uid); }; GridIndex.prototype._insertCircleCell = function _insertCircleCell (x1 , y1 , x2 , y2 , cellIndex , uid ) { this.circleCells[cellIndex].push(uid); }; GridIndex.prototype._query = function _query (x1 , y1 , x2 , y2 , hitTest , predicate ) { if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } var result = []; if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) { if (hitTest) { return true; } for (var boxUid = 0; boxUid < this.boxKeys.length; boxUid++) { result.push({ key: this.boxKeys[boxUid], x1: this.bboxes[boxUid * 4], y1: this.bboxes[boxUid * 4 + 1], x2: this.bboxes[boxUid * 4 + 2], y2: this.bboxes[boxUid * 4 + 3] }); } for (var circleUid = 0; circleUid < this.circleKeys.length; circleUid++) { var x = this.circles[circleUid * 3]; var y = this.circles[circleUid * 3 + 1]; var radius = this.circles[circleUid * 3 + 2]; result.push({ key: this.circleKeys[circleUid], x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius }); } return predicate ? result.filter(predicate) : result; } else { var queryArgs = { hitTest: hitTest, seenUids: {box: {}, circle: {}} }; this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate); return hitTest ? result.length > 0 : result; } }; GridIndex.prototype._queryCircle = function _queryCircle (x , y , radius , hitTest , predicate ) { // Insert circle into grid for all cells in the circumscribing square // It's more than necessary (by a factor of 4/PI), but fast to insert var x1 = x - radius; var x2 = x + radius; var y1 = y - radius; var y2 = y + radius; if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { return hitTest ? false : []; } // Box query early exits if the bounding box is larger than the grid, but we don't do // the equivalent calculation for circle queries because early exit is less likely // and the calculation is more expensive var result = []; var queryArgs = { hitTest: hitTest, circle: {x: x, y: y, radius: radius}, seenUids: {box: {}, circle: {}} }; this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate); return hitTest ? result.length > 0 : result; }; GridIndex.prototype.query = function query (x1 , y1 , x2 , y2 , predicate ) { return (this._query(x1, y1, x2, y2, false, predicate) ); }; GridIndex.prototype.hitTest = function hitTest (x1 , y1 , x2 , y2 , predicate ) { return (this._query(x1, y1, x2, y2, true, predicate) ); }; GridIndex.prototype.hitTestCircle = function hitTestCircle (x , y , radius , predicate ) { return (this._queryCircle(x, y, radius, true, predicate) ); }; GridIndex.prototype._queryCell = function _queryCell (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if ((x1 <= bboxes[offset + 2]) && (y1 <= bboxes[offset + 3]) && (x2 >= bboxes[offset + 0]) && (y2 >= bboxes[offset + 1]) && (!predicate || predicate(this.boxKeys[boxUid]))) { if (queryArgs.hitTest) { result.push(true); return true; } else { result.push({ key: this.boxKeys[boxUid], x1: bboxes[offset], y1: bboxes[offset + 1], x2: bboxes[offset + 2], y2: bboxes[offset + 3] }); } } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this._circleAndRectCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], x1, y1, x2, y2) && (!predicate || predicate(this.circleKeys[circleUid]))) { if (queryArgs.hitTest) { result.push(true); return true; } else { var x = circles[offset$1]; var y = circles[offset$1 + 1]; var radius = circles[offset$1 + 2]; result.push({ key: this.circleKeys[circleUid], x1: x - radius, y1: y - radius, x2: x + radius, y2: y + radius }); } } } } } }; GridIndex.prototype._queryCellCircle = function _queryCellCircle (x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { var circle = queryArgs.circle; var seenUids = queryArgs.seenUids; var boxCell = this.boxCells[cellIndex]; if (boxCell !== null) { var bboxes = this.bboxes; for (var i = 0, list = boxCell; i < list.length; i += 1) { var boxUid = list[i]; if (!seenUids.box[boxUid]) { seenUids.box[boxUid] = true; var offset = boxUid * 4; if (this._circleAndRectCollide( circle.x, circle.y, circle.radius, bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) && (!predicate || predicate(this.boxKeys[boxUid]))) { result.push(true); return true; } } } } var circleCell = this.circleCells[cellIndex]; if (circleCell !== null) { var circles = this.circles; for (var i$1 = 0, list$1 = circleCell; i$1 < list$1.length; i$1 += 1) { var circleUid = list$1[i$1]; if (!seenUids.circle[circleUid]) { seenUids.circle[circleUid] = true; var offset$1 = circleUid * 3; if (this._circlesCollide( circles[offset$1], circles[offset$1 + 1], circles[offset$1 + 2], circle.x, circle.y, circle.radius) && (!predicate || predicate(this.circleKeys[circleUid]))) { result.push(true); return true; } } } } }; GridIndex.prototype._forEachCell = function _forEachCell (x1 , y1 , x2 , y2 , fn , arg1 , arg2 , predicate ) { var cx1 = this._convertToXCellCoord(x1); var cy1 = this._convertToYCellCoord(y1); var cx2 = this._convertToXCellCoord(x2); var cy2 = this._convertToYCellCoord(y2); for (var x = cx1; x <= cx2; x++) { for (var y = cy1; y <= cy2; y++) { var cellIndex = this.xCellCount * y + x; if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate)) { return; } } } }; GridIndex.prototype._convertToXCellCoord = function _convertToXCellCoord (x ) { return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale))); }; GridIndex.prototype._convertToYCellCoord = function _convertToYCellCoord (y ) { return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale))); }; GridIndex.prototype._circlesCollide = function _circlesCollide (x1 , y1 , r1 , x2 , y2 , r2 ) { var dx = x2 - x1; var dy = y2 - y1; var bothRadii = r1 + r2; return (bothRadii * bothRadii) > (dx * dx + dy * dy); }; GridIndex.prototype._circleAndRectCollide = function _circleAndRectCollide (circleX , circleY , radius , x1 , y1 , x2 , y2 ) { var halfRectWidth = (x2 - x1) / 2; var distX = Math.abs(circleX - (x1 + halfRectWidth)); if (distX > (halfRectWidth + radius)) { return false; } var halfRectHeight = (y2 - y1) / 2; var distY = Math.abs(circleY - (y1 + halfRectHeight)); if (distY > (halfRectHeight + radius)) { return false; } if (distX <= halfRectWidth || distY <= halfRectHeight) { return true; } var dx = distX - halfRectWidth; var dy = distY - halfRectHeight; return (dx * dx + dy * dy <= (radius * radius)); }; // /* * # Overview of coordinate spaces * * ## Tile coordinate spaces * Each label has an anchor. Some labels have corresponding line geometries. * The points for both anchors and lines are stored in tile units. Each tile has it's own * coordinate space going from (0, 0) at the top left to (EXTENT, EXTENT) at the bottom right. * * ## GL coordinate space * At the end of everything, the vertex shader needs to produce a position in GL coordinate space, * which is (-1, 1) at the top left and (1, -1) in the bottom right. * * ## Map pixel coordinate spaces * Each tile has a pixel coordinate space. It's just the tile units scaled so that one unit is * whatever counts as 1 pixel at the current zoom. * This space is used for pitch-alignment=map, rotation-alignment=map * * ## Rotated map pixel coordinate spaces * Like the above, but rotated so axis of the space are aligned with the viewport instead of the tile. * This space is used for pitch-alignment=map, rotation-alignment=viewport * * ## Viewport pixel coordinate space * (0, 0) is at the top left of the canvas and (pixelWidth, pixelHeight) is at the bottom right corner * of the canvas. This space is used for pitch-alignment=viewport * * * # Vertex projection * It goes roughly like this: * 1. project the anchor and line from tile units into the correct label coordinate space * - map pixel space pitch-alignment=map rotation-alignment=map * - rotated map pixel space pitch-alignment=map rotation-alignment=viewport * - viewport pixel space pitch-alignment=viewport rotation-alignment=* * 2. if the label follows a line, find the point along the line that is the correct distance from the anchor. * 3. add the glyph's corner offset to the point from step 3 * 4. convert from the label coordinate space to gl coordinates * * For horizontal labels we want to do step 1 in the shader for performance reasons (no cpu work). * This is what `u_label_plane_matrix` is used for. * For labels aligned with lines we have to steps 1 and 2 on the cpu since we need access to the line geometry. * This is what `updateLineLabels(...)` does. * Since the conversion is handled on the cpu we just set `u_label_plane_matrix` to an identity matrix. * * Steps 3 and 4 are done in the shaders for all labels. */ /* * Returns a matrix for converting from tile units to the correct label coordinate space. */ function getLabelPlaneMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { var m = performance.create(); if (pitchWithMap) { performance.scale(m, m, [1 / pixelsToTileUnits, 1 / pixelsToTileUnits, 1]); if (!rotateWithMap) { performance.rotateZ(m, m, transform.angle); } } else { performance.multiply(m, transform.labelPlaneMatrix, posMatrix); } return m; } /* * Returns a matrix for converting from the correct label coordinate space to gl coords. */ function getGlCoordMatrix(posMatrix , pitchWithMap , rotateWithMap , transform , pixelsToTileUnits ) { if (pitchWithMap) { var m = performance.clone(posMatrix); performance.scale(m, m, [pixelsToTileUnits, pixelsToTileUnits, 1]); if (!rotateWithMap) { performance.rotateZ(m, m, -transform.angle); } return m; } else { return transform.glCoordMatrix; } } function project(point , matrix ) { var pos = [point.x, point.y, 0, 1]; xyTransformMat4(pos, pos, matrix); var w = pos[3]; return { point: new performance.Point(pos[0] / w, pos[1] / w), signedDistanceFromCamera: w }; } function getPerspectiveRatio(cameraToCenterDistance , signedDistanceFromCamera ) { return 0.5 + 0.5 * (cameraToCenterDistance / signedDistanceFromCamera); } function isVisible(anchorPos , clippingBuffer ) { var x = anchorPos[0] / anchorPos[3]; var y = anchorPos[1] / anchorPos[3]; var inPaddedViewport = ( x >= -clippingBuffer[0] && x <= clippingBuffer[0] && y >= -clippingBuffer[1] && y <= clippingBuffer[1]); return inPaddedViewport; } /* * Update the `dynamicLayoutVertexBuffer` for the buffer with the correct glyph positions for the current map view. * This is only run on labels that are aligned with lines. Horizontal labels are handled entirely in the shader. */ function updateLineLabels(bucket , posMatrix , painter , isText , labelPlaneMatrix , glCoordMatrix , pitchWithMap , keepUpright ) { var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; var partiallyEvaluatedSize = performance.evaluateSizeForZoom(sizeData, painter.transform.zoom); var clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1]; var dynamicLayoutVertexArray = isText ? bucket.text.dynamicLayoutVertexArray : bucket.icon.dynamicLayoutVertexArray; dynamicLayoutVertexArray.clear(); var lineVertexArray = bucket.lineVertexArray; var placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray; var aspectRatio = painter.transform.width / painter.transform.height; var useVertical = false; for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); // Don't do calculations for vertical glyphs unless the previous symbol was horizontal // and we determined that vertical glyphs were necessary. // Also don't do calculations for symbols that are collided and fully faded out if (symbol.hidden || symbol.writingMode === performance.WritingMode.vertical && !useVertical) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } // Awkward... but we're counting on the paired "vertical" symbol coming immediately after its horizontal counterpart useVertical = false; var anchorPos = [symbol.anchorX, symbol.anchorY, 0, 1]; performance.transformMat4(anchorPos, anchorPos, posMatrix); // Don't bother calculating the correct point for invisible labels. if (!isVisible(anchorPos, clippingBuffer)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); continue; } var cameraToAnchorDistance = anchorPos[3]; var perspectiveRatio = getPerspectiveRatio(painter.transform.cameraToCenterDistance, cameraToAnchorDistance); var fontSize = performance.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol); var pitchScaledFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; var tileAnchorPoint = new performance.Point(symbol.anchorX, symbol.anchorY); var anchorPoint = project(tileAnchorPoint, labelPlaneMatrix).point; var projectionCache = {}; var placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio); useVertical = placeUnflipped.useVertical; if (placeUnflipped.notEnoughRoom || useVertical || (placeUnflipped.needsFlipping && placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio).notEnoughRoom)) { hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); } } if (isText) { bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } else { bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); } } function placeFirstAndLastGlyph(fontScale , glyphOffsetArray , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , symbol , lineVertexArray , labelPlaneMatrix , projectionCache ) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; var firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex); var lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1); var firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache); if (!firstPlacedGlyph) { return null; } var lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache); if (!lastPlacedGlyph) { return null; } return {first: firstPlacedGlyph, last: lastPlacedGlyph}; } function requiresOrientationChange(writingMode, firstPoint, lastPoint, aspectRatio) { if (writingMode === performance.WritingMode.horizontal) { // On top of choosing whether to flip, choose whether to render this version of the glyphs or the alternate // vertical glyphs. We can't just filter out vertical glyphs in the horizontal range because the horizontal // and vertical versions can have slightly different projections which could lead to angles where both or // neither showed. var rise = Math.abs(lastPoint.y - firstPoint.y); var run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio; if (rise > run) { return {useVertical: true}; } } if (writingMode === performance.WritingMode.vertical ? firstPoint.y < lastPoint.y : firstPoint.x > lastPoint.x) { // Includes "horizontalOnly" case for labels without vertical glyphs return {needsFlipping: true}; } return null; } function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio) { var fontScale = fontSize / 24; var lineOffsetX = symbol.lineOffsetX * fontScale; var lineOffsetY = symbol.lineOffsetY * fontScale; var placedGlyphs; if (symbol.numGlyphs > 1) { var glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; var lineStartIndex = symbol.lineStartIndex; var lineEndIndex = symbol.lineStartIndex + symbol.lineLength; // Place the first and the last glyph in the label first, so we can figure out // the overall orientation of the label and determine whether it needs to be flipped in keepUpright mode var firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache); if (!firstAndLastGlyph) { return {notEnoughRoom: true}; } var firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point; var lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point; if (keepUpright && !flip) { var orientationChange = requiresOrientationChange(symbol.writingMode, firstPoint, lastPoint, aspectRatio); if (orientationChange) { return orientationChange; } } placedGlyphs = [firstAndLastGlyph.first]; for (var glyphIndex = symbol.glyphStartIndex + 1; glyphIndex < glyphEndIndex - 1; glyphIndex++) { // Since first and last glyph fit on the line, we're sure that the rest of the glyphs can be placed // $FlowFixMe placedGlyphs.push(placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(glyphIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache)); } placedGlyphs.push(firstAndLastGlyph.last); } else { // Only a single glyph to place // So, determine whether to flip based on projected angle of the line segment it's on if (keepUpright && !flip) { var a = project(tileAnchorPoint, posMatrix).point; var tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1); // $FlowFixMe var tileSegmentEnd = new performance.Point(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex)); var projectedVertex = project(tileSegmentEnd, posMatrix); // We know the anchor will be in the viewport, but the end of the line segment may be // behind the plane of the camera, in which case we can use a point at any arbitrary (closer) // point on the segment. var b = (projectedVertex.signedDistanceFromCamera > 0) ? projectedVertex.point : projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix); var orientationChange$1 = requiresOrientationChange(symbol.writingMode, a, b, aspectRatio); if (orientationChange$1) { return orientationChange$1; } } // $FlowFixMe var singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache); if (!singleGlyph) { return {notEnoughRoom: true}; } placedGlyphs = [singleGlyph]; } for (var i = 0, list = placedGlyphs; i < list.length; i += 1) { var glyph = list[i]; performance.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle); } return {}; } function projectTruncatedLineSegment(previousTilePoint , currentTilePoint , previousProjectedPoint , minimumLength , projectionMatrix ) { // We are assuming "previousTilePoint" won't project to a point within one unit of the camera plane // If it did, that would mean our label extended all the way out from within the viewport to a (very distant) // point near the plane of the camera. We wouldn't be able to render the label anyway once it crossed the // plane of the camera. var projectedUnitVertex = project(previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()), projectionMatrix).point; var projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex); return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag())); } function placeGlyphAlongLine(offsetX , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , anchorSegment , lineStartIndex , lineEndIndex , lineVertexArray , labelPlaneMatrix , projectionCache ) { var combinedOffsetX = flip ? offsetX - lineOffsetX : offsetX + lineOffsetX; var dir = combinedOffsetX > 0 ? 1 : -1; var angle = 0; if (flip) { // The label needs to be flipped to keep text upright. // Iterate in the reverse direction. dir *= -1; angle = Math.PI; } if (dir < 0) { angle += Math.PI; } var currentIndex = dir > 0 ? lineStartIndex + anchorSegment : lineStartIndex + anchorSegment + 1; var current = anchorPoint; var prev = anchorPoint; var distanceToPrev = 0; var currentSegmentDistance = 0; var absOffsetX = Math.abs(combinedOffsetX); var pathVertices = []; while (distanceToPrev + currentSegmentDistance <= absOffsetX) { currentIndex += dir; // offset does not fit on the projected line if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) { return null; } prev = current; pathVertices.push(current); current = projectionCache[currentIndex]; if (current === undefined) { var currentVertex = new performance.Point(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); var projection = project(currentVertex, labelPlaneMatrix); if (projection.signedDistanceFromCamera > 0) { current = projectionCache[currentIndex] = projection.point; } else { // The vertex is behind the plane of the camera, so we can't project it // Instead, we'll create a vertex along the line that's far enough to include the glyph var previousLineVertexIndex = currentIndex - dir; var previousTilePoint = distanceToPrev === 0 ? tileAnchorPoint : new performance.Point(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex)); // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment current = projectTruncatedLineSegment(previousTilePoint, currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix); } } distanceToPrev += currentSegmentDistance; currentSegmentDistance = prev.dist(current); } // The point is on the current segment. Interpolate to find it. var segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance; var prevToCurrent = current.sub(prev); var p = prevToCurrent.mult(segmentInterpolationT)._add(prev); // offset the point from the line to text-offset and icon-offset p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir)); var segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x); pathVertices.push(p); return { point: p, angle: segmentAngle, path: pathVertices }; } var hiddenGlyphAttributes = new Float32Array([-Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0]); // Hide them by moving them offscreen. We still need to add them to the buffer // because the dynamic buffer is paired with a static buffer that doesn't get updated. function hideGlyphs(num , dynamicLayoutVertexArray ) { for (var i = 0; i < num; i++) { var offset = dynamicLayoutVertexArray.length; dynamicLayoutVertexArray.resize(offset + 4); // Since all hidden glyphs have the same attributes, we can build up the array faster with a single call to Float32Array.set // for each set of four vertices, instead of calling addDynamicAttributes for each vertex. dynamicLayoutVertexArray.float32.set(hiddenGlyphAttributes, offset * 3); } } // For line label layout, we're not using z output and our w input is always 1 // This custom matrix transformation ignores those components to make projection faster function xyTransformMat4(out , a , m ) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; out[3] = m[3] * x + m[7] * y + m[15]; return out; } // // When a symbol crosses the edge that causes it to be included in // collision detection, it will cause changes in the symbols around // it. This constant specifies how many pixels to pad the edge of // the viewport for collision detection so that the bulk of the changes // occur offscreen. Making this constant greater increases label // stability, but it's expensive. var viewportPadding = 100; /** * A collision index used to prevent symbols from overlapping. It keep tracks of * where previous symbols have been placed and is used to check if a new * symbol overlaps with any previously added symbols. * * There are two steps to insertion: first placeCollisionBox/Circles checks if * there's room for a symbol, then insertCollisionBox/Circles actually puts the * symbol in the index. The two step process allows paired symbols to be inserted * together even if they overlap. * * @private */ var CollisionIndex = function CollisionIndex( transform , grid, ignoredGrid ) { if ( grid === void 0 ) grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); if ( ignoredGrid === void 0 ) ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25); this.transform = transform; this.grid = grid; this.ignoredGrid = ignoredGrid; this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance; this.screenRightBoundary = transform.width + viewportPadding; this.screenBottomBoundary = transform.height + viewportPadding; this.gridRightBoundary = transform.width + 2 * viewportPadding; this.gridBottomBoundary = transform.height + 2 * viewportPadding; }; CollisionIndex.prototype.placeCollisionBox = function placeCollisionBox (collisionBox , allowOverlap , textPixelRatio , posMatrix , collisionGroupPredicate ) { var projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY); var tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; var tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x; var tlY = collisionBox.y1 * tileToViewport + projectedPoint.point.y; var brX = collisionBox.x2 * tileToViewport + projectedPoint.point.x; var brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y; if (!this.isInsideGrid(tlX, tlY, brX, brY) || (!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate))) { return { box: [], offscreen: false }; } return { box: [tlX, tlY, brX, brY], offscreen: this.isOffscreen(tlX, tlY, brX, brY) }; }; CollisionIndex.prototype.placeCollisionCircles = function placeCollisionCircles (allowOverlap , symbol , lineVertexArray , glyphOffsetArray , fontSize , posMatrix , labelPlaneMatrix , labelToScreenMatrix , showCollisionCircles , pitchWithMap , collisionGroupPredicate , circlePixelDiameter , textPixelPadding ) { var placedCollisionCircles = []; var tileUnitAnchorPoint = new performance.Point(symbol.anchorX, symbol.anchorY); var screenAnchorPoint = project(tileUnitAnchorPoint, posMatrix); var perspectiveRatio = getPerspectiveRatio(this.transform.cameraToCenterDistance, screenAnchorPoint.signedDistanceFromCamera); var labelPlaneFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; var labelPlaneFontScale = labelPlaneFontSize / performance.ONE_EM; var labelPlaneAnchorPoint = project(tileUnitAnchorPoint, labelPlaneMatrix).point; var projectionCache = {}; var lineOffsetX = symbol.lineOffsetX * labelPlaneFontScale; var lineOffsetY = symbol.lineOffsetY * labelPlaneFontScale; var firstAndLastGlyph = placeFirstAndLastGlyph( labelPlaneFontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, /*flip*/ false, labelPlaneAnchorPoint, tileUnitAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache); var collisionDetected = false; var inGrid = false; var entirelyOffscreen = true; if (firstAndLastGlyph) { var radius = circlePixelDiameter * 0.5 * perspectiveRatio + textPixelPadding; var screenPlaneMin = new performance.Point(-viewportPadding, -viewportPadding); var screenPlaneMax = new performance.Point(this.screenRightBoundary, this.screenBottomBoundary); var interpolator = new PathInterpolator(); // Construct a projected path from projected line vertices. Anchor points are ignored and removed var first = firstAndLastGlyph.first; var last = firstAndLastGlyph.last; var projectedPath = []; for (var i = first.path.length - 1; i >= 1; i--) { projectedPath.push(first.path[i]); } for (var i$1 = 1; i$1 < last.path.length; i$1++) { projectedPath.push(last.path[i$1]); } performance.assert(projectedPath.length >= 2); // Tolerate a slightly longer distance than one diameter between two adjacent circles var circleDist = radius * 2.5; // The path might need to be converted into screen space if a pitched map is used as the label space if (labelToScreenMatrix) { var screenSpacePath = projectedPath.map(function (p) { return project(p, labelToScreenMatrix); }); // Do not try to place collision circles if even of the points is behind the camera. // This is a plausible scenario with big camera pitch angles if (screenSpacePath.some(function (point) { return point.signedDistanceFromCamera <= 0; })) { projectedPath = []; } else { projectedPath = screenSpacePath.map(function (p) { return p.point; }); } } var segments = []; if (projectedPath.length > 0) { // Quickly check if the path is fully inside or outside of the padded collision region. // For overlapping paths we'll only create collision circles for the visible segments var minPoint = projectedPath[0].clone(); var maxPoint = projectedPath[0].clone(); for (var i$2 = 1; i$2 < projectedPath.length; i$2++) { minPoint.x = Math.min(minPoint.x, projectedPath[i$2].x); minPoint.y = Math.min(minPoint.y, projectedPath[i$2].y); maxPoint.x = Math.max(maxPoint.x, projectedPath[i$2].x); maxPoint.y = Math.max(maxPoint.y, projectedPath[i$2].y); } if (minPoint.x >= screenPlaneMin.x && maxPoint.x <= screenPlaneMax.x && minPoint.y >= screenPlaneMin.y && maxPoint.y <= screenPlaneMax.y) { // Quad fully visible segments = [projectedPath]; } else if (maxPoint.x < screenPlaneMin.x || minPoint.x > screenPlaneMax.x || maxPoint.y < screenPlaneMin.y || minPoint.y > screenPlaneMax.y) { // Not visible segments = []; } else { segments = performance.clipLine([projectedPath], screenPlaneMin.x, screenPlaneMin.y, screenPlaneMax.x, screenPlaneMax.y); } } for (var i$4 = 0, list = segments; i$4 < list.length; i$4 += 1) { // interpolate positions for collision circles. Add a small padding to both ends of the segment var seg = list[i$4]; performance.assert(seg.length > 0); interpolator.reset(seg, radius * 0.25); var numCircles = 0; if (interpolator.length <= 0.5 * radius) { numCircles = 1; } else { numCircles = Math.ceil(interpolator.paddedLength / circleDist) + 1; } for (var i$3 = 0; i$3 < numCircles; i$3++) { var t = i$3 / Math.max(numCircles - 1, 1); var circlePosition = interpolator.lerp(t); // add viewport padding to the position and perform initial collision check var centerX = circlePosition.x + viewportPadding; var centerY = circlePosition.y + viewportPadding; placedCollisionCircles.push(centerX, centerY, radius, 0); var x1 = centerX - radius; var y1 = centerY - radius; var x2 = centerX + radius; var y2 = centerY + radius; entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2); inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2); if (!allowOverlap) { if (this.grid.hitTestCircle(centerX, centerY, radius, collisionGroupPredicate)) { // Don't early exit if we're showing the debug circles because we still want to calculate // which circles are in use collisionDetected = true; if (!showCollisionCircles) { return { circles: [], offscreen: false, collisionDetected: collisionDetected }; } } } } } } return { circles: ((!showCollisionCircles && collisionDetected) || !inGrid) ? [] : placedCollisionCircles, offscreen: entirelyOffscreen, collisionDetected: collisionDetected }; }; /** * Because the geometries in the CollisionIndex are an approximation of the shape of * symbols on the map, we use the CollisionIndex to look up the symbol part of * `queryRenderedFeatures`. * * @private */ CollisionIndex.prototype.queryRenderedSymbols = function queryRenderedSymbols (viewportQueryGeometry ) { if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) { return {}; } var query = []; var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; for (var i = 0, list = viewportQueryGeometry; i < list.length; i += 1) { var point = list[i]; var gridPoint = new performance.Point(point.x + viewportPadding, point.y + viewportPadding); minX = Math.min(minX, gridPoint.x); minY = Math.min(minY, gridPoint.y); maxX = Math.max(maxX, gridPoint.x); maxY = Math.max(maxY, gridPoint.y); query.push(gridPoint); } var features = this.grid.query(minX, minY, maxX, maxY) .concat(this.ignoredGrid.query(minX, minY, maxX, maxY)); var seenFeatures = {}; var result = {}; for (var i$1 = 0, list$1 = features; i$1 < list$1.length; i$1 += 1) { var feature = list$1[i$1]; var featureKey = feature.key; // Skip already seen features. if (seenFeatures[featureKey.bucketInstanceId] === undefined) { seenFeatures[featureKey.bucketInstanceId] = {}; } if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) { continue; } // Check if query intersects with the feature box // "Collision Circles" for line labels are treated as boxes here // Since there's no actual collision taking place, the circle vs. square // distinction doesn't matter as much, and box geometry is easier // to work with. var bbox = [ new performance.Point(feature.x1, feature.y1), new performance.Point(feature.x2, feature.y1), new performance.Point(feature.x2, feature.y2), new performance.Point(feature.x1, feature.y2) ]; if (!performance.polygonIntersectsPolygon(query, bbox)) { continue; } seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true; if (result[featureKey.bucketInstanceId] === undefined) { result[featureKey.bucketInstanceId] = []; } result[featureKey.bucketInstanceId].push(featureKey.featureIndex); } return result; }; CollisionIndex.prototype.insertCollisionBox = function insertCollisionBox (collisionBox , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; var key = {bucketInstanceId: bucketInstanceId, featureIndex: featureIndex, collisionGroupID: collisionGroupID}; grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]); }; CollisionIndex.prototype.insertCollisionCircles = function insertCollisionCircles (collisionCircles , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { var grid = ignorePlacement ? this.ignoredGrid : this.grid; var key = {bucketInstanceId: bucketInstanceId, featureIndex: featureIndex, collisionGroupID: collisionGroupID}; for (var k = 0; k < collisionCircles.length; k += 4) { grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]); } }; CollisionIndex.prototype.projectAndGetPerspectiveRatio = function projectAndGetPerspectiveRatio (posMatrix , x , y ) { var p = [x, y, 0, 1]; xyTransformMat4(p, p, posMatrix); var a = new performance.Point( (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding ); return { point: a, // See perspective ratio comment in symbol_sdf.vertex // We're doing collision detection in viewport space so we need // to scale down boxes in the distance perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]) }; }; CollisionIndex.prototype.isOffscreen = function isOffscreen (x1 , y1 , x2 , y2 ) { return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary; }; CollisionIndex.prototype.isInsideGrid = function isInsideGrid (x1 , y1 , x2 , y2 ) { return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary; }; /* * Returns a matrix for transforming collision shapes to viewport coordinate space. * Use this function to render e.g. collision circles on the screen. * example transformation: clipPos = glCoordMatrix * viewportMatrix * circle_pos */ CollisionIndex.prototype.getViewportMatrix = function getViewportMatrix () { var m = performance.identity([]); performance.translate(m, m, [-viewportPadding, -viewportPadding, 0.0]); return m; }; // /** * Converts a pixel value at a the given zoom level to tile units. * * The shaders mostly calculate everything in tile units so style * properties need to be converted from pixels to tile units using this. * * For example, a translation by 30 pixels at zoom 6.5 will be a * translation by pixelsToTileUnits(30, 6.5) tile units. * * @returns value in tile units * @private */ function pixelsToTileUnits(tile , pixelValue , z ) { return pixelValue * (performance.EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ))); } // var OpacityState = function OpacityState(prevState , increment , placed , skipFade ) { if (prevState) { this.opacity = Math.max(0, Math.min(1, prevState.opacity + (prevState.placed ? increment : -increment))); } else { this.opacity = (skipFade && placed) ? 1 : 0; } this.placed = placed; }; OpacityState.prototype.isHidden = function isHidden () { return this.opacity === 0 && !this.placed; }; var JointOpacityState = function JointOpacityState(prevState , increment , placedText , placedIcon , skipFade ) { this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade); this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade); }; JointOpacityState.prototype.isHidden = function isHidden () { return this.text.isHidden() && this.icon.isHidden(); }; var JointPlacement = function JointPlacement(text , icon , skipFade ) { this.text = text; this.icon = icon; this.skipFade = skipFade; }; var CollisionCircleArray = function CollisionCircleArray() { this.invProjMatrix = performance.create(); this.viewportMatrix = performance.create(); this.circles = []; }; var RetainedQueryData = function RetainedQueryData(bucketInstanceId , featureIndex , sourceLayerIndex , bucketIndex , tileID ) { this.bucketInstanceId = bucketInstanceId; this.featureIndex = featureIndex; this.sourceLayerIndex = sourceLayerIndex; this.bucketIndex = bucketIndex; this.tileID = tileID; }; var CollisionGroups = function CollisionGroups(crossSourceCollisions ) { this.crossSourceCollisions = crossSourceCollisions; this.maxGroupID = 0; this.collisionGroups = {}; }; CollisionGroups.prototype.get = function get (sourceID ) { // The predicate/groupID mechanism allows for arbitrary grouping, // but the current interface defines one source == one group when // crossSourceCollisions == true. if (!this.crossSourceCollisions) { if (!this.collisionGroups[sourceID]) { var nextGroupID = ++this.maxGroupID; this.collisionGroups[sourceID] = { ID: nextGroupID, predicate: function (key) { return key.collisionGroupID === nextGroupID; } }; } return this.collisionGroups[sourceID]; } else { return {ID: 0, predicate: null}; } }; function calculateVariableLayoutShift(anchor , width , height , textOffset , textBoxScale ) { var ref = performance.getAnchorAlignment(anchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var shiftX = -(horizontalAlign - 0.5) * width; var shiftY = -(verticalAlign - 0.5) * height; var offset = performance.evaluateVariableOffset(anchor, textOffset); return new performance.Point( shiftX + offset[0] * textBoxScale, shiftY + offset[1] * textBoxScale ); } function shiftVariableCollisionBox(collisionBox , shiftX , shiftY , rotateWithMap , pitchWithMap , angle ) { var x1 = collisionBox.x1; var x2 = collisionBox.x2; var y1 = collisionBox.y1; var y2 = collisionBox.y2; var anchorPointX = collisionBox.anchorPointX; var anchorPointY = collisionBox.anchorPointY; var rotatedOffset = new performance.Point(shiftX, shiftY); if (rotateWithMap) { rotatedOffset._rotate(pitchWithMap ? angle : -angle); } return { x1: x1 + rotatedOffset.x, y1: y1 + rotatedOffset.y, x2: x2 + rotatedOffset.x, y2: y2 + rotatedOffset.y, // symbol anchor point stays the same regardless of text-anchor anchorPointX: anchorPointX, anchorPointY: anchorPointY }; } var Placement = function Placement(transform , fadeDuration , crossSourceCollisions , prevPlacement ) { this.transform = transform.clone(); this.collisionIndex = new CollisionIndex(this.transform); this.placements = {}; this.opacities = {}; this.variableOffsets = {}; this.stale = false; this.commitTime = 0; this.fadeDuration = fadeDuration; this.retainedQueryData = {}; this.collisionGroups = new CollisionGroups(crossSourceCollisions); this.collisionCircleArrays = {}; this.prevPlacement = prevPlacement; if (prevPlacement) { prevPlacement.prevPlacement = undefined; // Only hold on to one placement back } this.placedOrientations = {}; }; Placement.prototype.getBucketParts = function getBucketParts (results , styleLayer , tile , sortAcrossTiles ) { var symbolBucket = ((tile.getBucket(styleLayer) ) ); var bucketFeatureIndex = tile.latestFeatureIndex; if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0]) { return; } var collisionBoxArray = tile.collisionBoxArray; var layout = symbolBucket.layers[0].layout; var scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ); var textPixelRatio = tile.tileSize / performance.EXTENT; var posMatrix = this.transform.calculatePosMatrix(tile.tileID.toUnwrapped()); var pitchWithMap = layout.get('text-pitch-alignment') === 'map'; var rotateWithMap = layout.get('text-rotation-alignment') === 'map'; var pixelsToTiles = pixelsToTileUnits(tile, 1, this.transform.zoom); var textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles); var labelToScreenMatrix = null; if (pitchWithMap) { var glMatrix = getGlCoordMatrix( posMatrix, pitchWithMap, rotateWithMap, this.transform, pixelsToTiles); labelToScreenMatrix = performance.multiply([], this.transform.labelPlaneMatrix, glMatrix); } // As long as this placement lives, we have to hold onto this bucket's // matching FeatureIndex/data for querying purposes this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData( symbolBucket.bucketInstanceId, bucketFeatureIndex, symbolBucket.sourceLayerIndex, symbolBucket.index, tile.tileID ); var parameters = { bucket: symbolBucket, layout: layout, posMatrix: posMatrix, textLabelPlaneMatrix: textLabelPlaneMatrix, labelToScreenMatrix: labelToScreenMatrix, scale: scale, textPixelRatio: textPixelRatio, holdingForFade: tile.holdingForFade(), collisionBoxArray: collisionBoxArray, partiallyEvaluatedTextSize: performance.evaluateSizeForZoom(symbolBucket.textSizeData, this.transform.zoom), collisionGroup: this.collisionGroups.get(symbolBucket.sourceID) }; if (sortAcrossTiles) { for (var i = 0, list = symbolBucket.sortKeyRanges; i < list.length; i += 1) { var range = list[i]; var sortKey = range.sortKey; var symbolInstanceStart = range.symbolInstanceStart; var symbolInstanceEnd = range.symbolInstanceEnd; results.push({sortKey: sortKey, symbolInstanceStart: symbolInstanceStart, symbolInstanceEnd: symbolInstanceEnd, parameters: parameters}); } } else { results.push({ symbolInstanceStart: 0, symbolInstanceEnd: symbolBucket.symbolInstances.length, parameters: parameters }); } }; Placement.prototype.attemptAnchorPlacement = function attemptAnchorPlacement (anchor , textBox , width , height , textBoxScale , rotateWithMap , pitchWithMap , textPixelRatio , posMatrix , collisionGroup , textAllowOverlap , symbolInstance , bucket , orientation , iconBox ) { var textOffset = [symbolInstance.textOffset0, symbolInstance.textOffset1]; var shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale); var placedGlyphBoxes = this.collisionIndex.placeCollisionBox( shiftVariableCollisionBox( textBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); if (iconBox) { var placedIconBoxes = this.collisionIndex.placeCollisionBox( shiftVariableCollisionBox( iconBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); if (placedIconBoxes.box.length === 0) { return; } } if (placedGlyphBoxes.box.length > 0) { var prevAnchor; // If this label was placed in the previous placement, record the anchor position // to allow us to animate the transition if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID] && this.prevPlacement.placements[symbolInstance.crossTileID] && this.prevPlacement.placements[symbolInstance.crossTileID].text) { prevAnchor = this.prevPlacement.variableOffsets[symbolInstance.crossTileID].anchor; } performance.assert(symbolInstance.crossTileID !== 0); this.variableOffsets[symbolInstance.crossTileID] = { textOffset: textOffset, width: width, height: height, anchor: anchor, textBoxScale: textBoxScale, prevAnchor: prevAnchor }; this.markUsedJustification(bucket, anchor, symbolInstance, orientation); if (bucket.allowVerticalPlacement) { this.markUsedOrientation(bucket, orientation, symbolInstance); this.placedOrientations[symbolInstance.crossTileID] = orientation; } return {shift: shift, placedGlyphBoxes: placedGlyphBoxes}; } }; Placement.prototype.placeLayerBucketPart = function placeLayerBucketPart (bucketPart , seenCrossTileIDs , showCollisionBoxes ) { var this$1 = this; var ref = bucketPart.parameters; var bucket = ref.bucket; var layout = ref.layout; var posMatrix = ref.posMatrix; var textLabelPlaneMatrix = ref.textLabelPlaneMatrix; var labelToScreenMatrix = ref.labelToScreenMatrix; var textPixelRatio = ref.textPixelRatio; var holdingForFade = ref.holdingForFade; var collisionBoxArray = ref.collisionBoxArray; var partiallyEvaluatedTextSize = ref.partiallyEvaluatedTextSize; var collisionGroup = ref.collisionGroup; var textOptional = layout.get('text-optional'); var iconOptional = layout.get('icon-optional'); var textAllowOverlap = layout.get('text-allow-overlap'); var iconAllowOverlap = layout.get('icon-allow-overlap'); var rotateWithMap = layout.get('text-rotation-alignment') === 'map'; var pitchWithMap = layout.get('text-pitch-alignment') === 'map'; var hasIconTextFit = layout.get('icon-text-fit') !== 'none'; var zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y'; // This logic is similar to the "defaultOpacityState" logic below in updateBucketOpacities // If we know a symbol is always supposed to show, force it to be marked visible even if // it wasn't placed into the collision index (because some or all of it was outside the range // of the collision grid). // There is a subtle edge case here we're accepting: //Symbol A has text-allow-overlap: true, icon-allow-overlap: true, icon-optional: false //A's icon is outside the grid, so doesn't get placed //A's text would be inside grid, but doesn't get placed because of icon-optional: false //We still show A because of the allow-overlap settings. //Symbol B has allow-overlap: false, and gets placed where A's text would be //On panning in, there is a short period when Symbol B and Symbol A will overlap //This is the reverse of our normal policy of "fade in on pan", but should look like any other //collision and hopefully not be too noticeable. // See https://github.com/mapbox/mapbox-gl-js/issues/7172 var alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional); var alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional); if (!bucket.collisionArrays && collisionBoxArray) { bucket.deserializeCollisionBoxes(collisionBoxArray); } var placeSymbol = function (symbolInstance , collisionArrays ) { if (seenCrossTileIDs[symbolInstance.crossTileID]) { return; } if (holdingForFade) { // Mark all symbols from this tile as "not placed", but don't add to seenCrossTileIDs, because we don't // know yet if we have a duplicate in a parent tile that _should_ be placed. this$1.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false); return; } var placeText = false; var placeIcon = false; var offscreen = true; var shift = null; var placed = {box: null, offscreen: null}; var placedVerticalText = {box: null, offscreen: null}; var placedGlyphBoxes = null; var placedGlyphCircles = null; var placedIconBoxes = null; var textFeatureIndex = 0; var verticalTextFeatureIndex = 0; var iconFeatureIndex = 0; if (collisionArrays.textFeatureIndex) { textFeatureIndex = collisionArrays.textFeatureIndex; } else if (symbolInstance.useRuntimeCollisionCircles) { textFeatureIndex = symbolInstance.featureIndex; } if (collisionArrays.verticalTextFeatureIndex) { verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex; } var textBox = collisionArrays.textBox; if (textBox) { var updatePreviousOrientationIfNotPlaced = function (isPlaced) { var previousOrientation = performance.WritingMode.horizontal; if (bucket.allowVerticalPlacement && !isPlaced && this$1.prevPlacement) { var prevPlacedOrientation = this$1.prevPlacement.placedOrientations[symbolInstance.crossTileID]; if (prevPlacedOrientation) { this$1.placedOrientations[symbolInstance.crossTileID] = prevPlacedOrientation; previousOrientation = prevPlacedOrientation; this$1.markUsedOrientation(bucket, previousOrientation, symbolInstance); } } return previousOrientation; }; var placeTextForPlacementModes = function (placeHorizontalFn, placeVerticalFn) { if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) { for (var i = 0, list = bucket.writingModes; i < list.length; i += 1) { var placementMode = list[i]; if (placementMode === performance.WritingMode.vertical) { placed = placeVerticalFn(); placedVerticalText = placed; } else { placed = placeHorizontalFn(); } if (placed && placed.box && placed.box.length) { break; } } } else { placed = placeHorizontalFn(); } }; if (!layout.get('text-variable-anchor')) { var placeBox = function (collisionTextBox, orientation) { var placedFeature = this$1.collisionIndex.placeCollisionBox(collisionTextBox, textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); if (placedFeature && placedFeature.box && placedFeature.box.length) { this$1.markUsedOrientation(bucket, orientation, symbolInstance); this$1.placedOrientations[symbolInstance.crossTileID] = orientation; } return placedFeature; }; var placeHorizontal = function () { return placeBox(textBox, performance.WritingMode.horizontal); }; var placeVertical = function () { var verticalTextBox = collisionArrays.verticalTextBox; if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { return placeBox(verticalTextBox, performance.WritingMode.vertical); } return {box: null, offscreen: null}; }; placeTextForPlacementModes(placeHorizontal, placeVertical); updatePreviousOrientationIfNotPlaced(placed && placed.box && placed.box.length); } else { var anchors = layout.get('text-variable-anchor'); // If this symbol was in the last placement, shift the previously used // anchor to the front of the anchor list, only if the previous anchor // is still in the anchor list if (this$1.prevPlacement && this$1.prevPlacement.variableOffsets[symbolInstance.crossTileID]) { var prevOffsets = this$1.prevPlacement.variableOffsets[symbolInstance.crossTileID]; if (anchors.indexOf(prevOffsets.anchor) > 0) { anchors = anchors.filter(function (anchor) { return anchor !== prevOffsets.anchor; }); anchors.unshift(prevOffsets.anchor); } } var placeBoxForVariableAnchors = function (collisionTextBox, collisionIconBox, orientation) { var width = collisionTextBox.x2 - collisionTextBox.x1; var height = collisionTextBox.y2 - collisionTextBox.y1; var textBoxScale = symbolInstance.textBoxScale; var variableIconBox = hasIconTextFit && !iconAllowOverlap ? collisionIconBox : null; var placedBox = {box: [], offscreen: false}; var placementAttempts = textAllowOverlap ? anchors.length * 2 : anchors.length; for (var i = 0; i < placementAttempts; ++i) { var anchor = anchors[i % anchors.length]; var allowOverlap = (i >= anchors.length); var result = this$1.attemptAnchorPlacement( anchor, collisionTextBox, width, height, textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix, collisionGroup, allowOverlap, symbolInstance, bucket, orientation, variableIconBox); if (result) { placedBox = result.placedGlyphBoxes; if (placedBox && placedBox.box && placedBox.box.length) { placeText = true; shift = result.shift; break; } } } return placedBox; }; var placeHorizontal$1 = function () { return placeBoxForVariableAnchors(textBox, collisionArrays.iconBox, performance.WritingMode.horizontal); }; var placeVertical$1 = function () { var verticalTextBox = collisionArrays.verticalTextBox; var wasPlaced = placed && placed.box && placed.box.length; if (bucket.allowVerticalPlacement && !wasPlaced && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { return placeBoxForVariableAnchors(verticalTextBox, collisionArrays.verticalIconBox, performance.WritingMode.vertical); } return {box: null, offscreen: null}; }; placeTextForPlacementModes(placeHorizontal$1, placeVertical$1); if (placed) { placeText = placed.box; offscreen = placed.offscreen; } var prevOrientation = updatePreviousOrientationIfNotPlaced(placed && placed.box); // If we didn't get placed, we still need to copy our position from the last placement for // fade animations if (!placeText && this$1.prevPlacement) { var prevOffset = this$1.prevPlacement.variableOffsets[symbolInstance.crossTileID]; if (prevOffset) { this$1.variableOffsets[symbolInstance.crossTileID] = prevOffset; this$1.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation); } } } } placedGlyphBoxes = placed; placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0; offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen; if (symbolInstance.useRuntimeCollisionCircles) { var placedSymbol = bucket.text.placedSymbolArray.get(symbolInstance.centerJustifiedTextSymbolIndex); var fontSize = performance.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol); var textPixelPadding = layout.get('text-padding'); var circlePixelDiameter = symbolInstance.collisionCircleDiameter; placedGlyphCircles = this$1.collisionIndex.placeCollisionCircles(textAllowOverlap, placedSymbol, bucket.lineVertexArray, bucket.glyphOffsetArray, fontSize, posMatrix, textLabelPlaneMatrix, labelToScreenMatrix, showCollisionBoxes, pitchWithMap, collisionGroup.predicate, circlePixelDiameter, textPixelPadding); performance.assert(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes)); // If text-allow-overlap is set, force "placedCircles" to true // In theory there should always be at least one circle placed // in this case, but for now quirks in text-anchor // and text-offset may prevent that from being true. placeText = textAllowOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected); offscreen = offscreen && placedGlyphCircles.offscreen; } if (collisionArrays.iconFeatureIndex) { iconFeatureIndex = collisionArrays.iconFeatureIndex; } if (collisionArrays.iconBox) { var placeIconFeature = function (iconBox) { var shiftedIconBox = hasIconTextFit && shift ? shiftVariableCollisionBox( iconBox, shift.x, shift.y, rotateWithMap, pitchWithMap, this$1.transform.angle) : iconBox; return this$1.collisionIndex.placeCollisionBox(shiftedIconBox, iconAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); }; if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) { placedIconBoxes = placeIconFeature(collisionArrays.verticalIconBox); placeIcon = placedIconBoxes.box.length > 0; } else { placedIconBoxes = placeIconFeature(collisionArrays.iconBox); placeIcon = placedIconBoxes.box.length > 0; } offscreen = offscreen && placedIconBoxes.offscreen; } var iconWithoutText = textOptional || (symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0); var textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0; // Combine the scales for icons and text. if (!iconWithoutText && !textWithoutIcon) { placeIcon = placeText = placeIcon && placeText; } else if (!textWithoutIcon) { placeText = placeIcon && placeText; } else if (!iconWithoutText) { placeIcon = placeIcon && placeText; } if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) { if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) { this$1.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID); } else { this$1.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); } } if (placeIcon && placedIconBoxes) { this$1.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'), bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID); } if (placedGlyphCircles) { if (placeText) { this$1.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'), bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); } if (showCollisionBoxes) { var id = bucket.bucketInstanceId; var circleArray = this$1.collisionCircleArrays[id]; // Group collision circles together by bucket. Circles can't be pushed forward for rendering yet as the symbol placement // for a bucket is not guaranteed to be complete before the commit-function has been called if (circleArray === undefined) { circleArray = this$1.collisionCircleArrays[id] = new CollisionCircleArray(); } for (var i = 0; i < placedGlyphCircles.circles.length; i += 4) { circleArray.circles.push(placedGlyphCircles.circles[i + 0]); // x circleArray.circles.push(placedGlyphCircles.circles[i + 1]); // y circleArray.circles.push(placedGlyphCircles.circles[i + 2]); // radius circleArray.circles.push(placedGlyphCircles.collisionDetected ? 1 : 0); // collisionDetected-flag } } } performance.assert(symbolInstance.crossTileID !== 0); performance.assert(bucket.bucketInstanceId !== 0); this$1.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded); seenCrossTileIDs[symbolInstance.crossTileID] = true; }; if (zOrderByViewportY) { performance.assert(bucketPart.symbolInstanceStart === 0); var symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle); for (var i = symbolIndexes.length - 1; i >= 0; --i) { var symbolIndex = symbolIndexes[i]; placeSymbol(bucket.symbolInstances.get(symbolIndex), bucket.collisionArrays[symbolIndex]); } } else { for (var i$1 = bucketPart.symbolInstanceStart; i$1 < bucketPart.symbolInstanceEnd; i$1++) { placeSymbol(bucket.symbolInstances.get(i$1), bucket.collisionArrays[i$1]); } } if (showCollisionBoxes && bucket.bucketInstanceId in this.collisionCircleArrays) { var circleArray = this.collisionCircleArrays[bucket.bucketInstanceId]; // Store viewport and inverse projection matrices per bucket performance.invert(circleArray.invProjMatrix, posMatrix); circleArray.viewportMatrix = this.collisionIndex.getViewportMatrix(); } bucket.justReloaded = false; }; Placement.prototype.markUsedJustification = function markUsedJustification (bucket , placedAnchor , symbolInstance , orientation ) { var justifications = { "left": symbolInstance.leftJustifiedTextSymbolIndex, "center": symbolInstance.centerJustifiedTextSymbolIndex, "right": symbolInstance.rightJustifiedTextSymbolIndex }; var autoIndex; if (orientation === performance.WritingMode.vertical) { autoIndex = symbolInstance.verticalPlacedTextSymbolIndex; } else { autoIndex = justifications[performance.getAnchorJustification(placedAnchor)]; } var indexes = [ symbolInstance.leftJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.rightJustifiedTextSymbolIndex, symbolInstance.verticalPlacedTextSymbolIndex ]; for (var i = 0, list = indexes; i < list.length; i += 1) { var index = list[i]; if (index >= 0) { if (autoIndex >= 0 && index !== autoIndex) { // There are multiple justifications and this one isn't it: shift offscreen bucket.text.placedSymbolArray.get(index).crossTileID = 0; } else { // Either this is the chosen justification or the justification is hardwired: use this one bucket.text.placedSymbolArray.get(index).crossTileID = symbolInstance.crossTileID; } } } }; Placement.prototype.markUsedOrientation = function markUsedOrientation (bucket , orientation , symbolInstance ) { var horizontal = (orientation === performance.WritingMode.horizontal || orientation === performance.WritingMode.horizontalOnly) ? orientation : 0; var vertical = orientation === performance.WritingMode.vertical ? orientation : 0; var horizontalIndexes = [ symbolInstance.leftJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.rightJustifiedTextSymbolIndex ]; for (var i = 0, list = horizontalIndexes; i < list.length; i += 1) { var index = list[i]; bucket.text.placedSymbolArray.get(index).placedOrientation = horizontal; } if (symbolInstance.verticalPlacedTextSymbolIndex) { bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).placedOrientation = vertical; } }; Placement.prototype.commit = function commit (now ) { this.commitTime = now; this.zoomAtLastRecencyCheck = this.transform.zoom; var prevPlacement = this.prevPlacement; var placementChanged = false; this.prevZoomAdjustment = prevPlacement ? prevPlacement.zoomAdjustment(this.transform.zoom) : 0; var increment = prevPlacement ? prevPlacement.symbolFadeChange(now) : 1; var prevOpacities = prevPlacement ? prevPlacement.opacities : {}; var prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {}; var prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {}; // add the opacities from the current placement, and copy their current values from the previous placement for (var crossTileID in this.placements) { var jointPlacement = this.placements[crossTileID]; var prevOpacity = prevOpacities[crossTileID]; if (prevOpacity) { this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon); placementChanged = placementChanged || jointPlacement.text !== prevOpacity.text.placed || jointPlacement.icon !== prevOpacity.icon.placed; } else { this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade); placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; } } // copy and update values from the previous placement that aren't in the current placement but haven't finished fading for (var crossTileID$1 in prevOpacities) { var prevOpacity$1 = prevOpacities[crossTileID$1]; if (!this.opacities[crossTileID$1]) { var jointOpacity = new JointOpacityState(prevOpacity$1, increment, false, false); if (!jointOpacity.isHidden()) { this.opacities[crossTileID$1] = jointOpacity; placementChanged = placementChanged || prevOpacity$1.text.placed || prevOpacity$1.icon.placed; } } } for (var crossTileID$2 in prevOffsets) { if (!this.variableOffsets[crossTileID$2] && this.opacities[crossTileID$2] && !this.opacities[crossTileID$2].isHidden()) { this.variableOffsets[crossTileID$2] = prevOffsets[crossTileID$2]; } } for (var crossTileID$3 in prevOrientations) { if (!this.placedOrientations[crossTileID$3] && this.opacities[crossTileID$3] && !this.opacities[crossTileID$3].isHidden()) { this.placedOrientations[crossTileID$3] = prevOrientations[crossTileID$3]; } } // this.lastPlacementChangeTime is the time of the last commit() that // resulted in a placement change -- in other words, the start time of // the last symbol fade animation performance.assert(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined); if (placementChanged) { this.lastPlacementChangeTime = now; } else if (typeof this.lastPlacementChangeTime !== 'number') { this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now; } }; Placement.prototype.updateLayerOpacities = function updateLayerOpacities (styleLayer , tiles ) { var seenCrossTileIDs = {}; for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) { this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray); } } }; Placement.prototype.updateBucketOpacities = function updateBucketOpacities (bucket , seenCrossTileIDs , collisionBoxArray ) { var this$1 = this; if (bucket.hasTextData()) { bucket.text.opacityVertexArray.clear(); } if (bucket.hasIconData()) { bucket.icon.opacityVertexArray.clear(); } if (bucket.hasIconCollisionBoxData()) { bucket.iconCollisionBox.collisionVertexArray.clear(); } if (bucket.hasTextCollisionBoxData()) { bucket.textCollisionBox.collisionVertexArray.clear(); } var layout = bucket.layers[0].layout; var duplicateOpacityState = new JointOpacityState(null, 0, false, false, true); var textAllowOverlap = layout.get('text-allow-overlap'); var iconAllowOverlap = layout.get('icon-allow-overlap'); var variablePlacement = layout.get('text-variable-anchor'); var rotateWithMap = layout.get('text-rotation-alignment') === 'map'; var pitchWithMap = layout.get('text-pitch-alignment') === 'map'; var hasIconTextFit = layout.get('icon-text-fit') !== 'none'; // If allow-overlap is true, we can show symbols before placement runs on them // But we have to wait for placement if we potentially depend on a paired icon/text // with allow-overlap: false. // See https://github.com/mapbox/mapbox-gl-js/issues/7032 var defaultOpacityState = new JointOpacityState(null, 0, textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), true); if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) { bucket.deserializeCollisionBoxes(collisionBoxArray); } var addOpacities = function (iconOrText, numVertices , opacity ) { for (var i = 0; i < numVertices / 4; i++) { iconOrText.opacityVertexArray.emplaceBack(opacity); } }; var loop = function ( s ) { var symbolInstance = bucket.symbolInstances.get(s); var numHorizontalGlyphVertices = symbolInstance.numHorizontalGlyphVertices; var numVerticalGlyphVertices = symbolInstance.numVerticalGlyphVertices; var crossTileID = symbolInstance.crossTileID; var isDuplicate = seenCrossTileIDs[crossTileID]; var opacityState = this$1.opacities[crossTileID]; if (isDuplicate) { opacityState = duplicateOpacityState; } else if (!opacityState) { opacityState = defaultOpacityState; // store the state so that future placements use it as a starting point this$1.opacities[crossTileID] = opacityState; } seenCrossTileIDs[crossTileID] = true; var hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0; var hasIcon = symbolInstance.numIconVertices > 0; var placedOrientation = this$1.placedOrientations[symbolInstance.crossTileID]; var horizontalHidden = placedOrientation === performance.WritingMode.vertical; var verticalHidden = placedOrientation === performance.WritingMode.horizontal || placedOrientation === performance.WritingMode.horizontalOnly; if (hasText) { var packedOpacity = packOpacity(opacityState.text); // Vertical text fades in/out on collision the same way as corresponding // horizontal text. Switch between vertical/horizontal should be instantaneous var horizontalOpacity = horizontalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; addOpacities(bucket.text, numHorizontalGlyphVertices, horizontalOpacity); var verticalOpacity = verticalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; addOpacities(bucket.text, numVerticalGlyphVertices, verticalOpacity); // If this label is completely faded, mark it so that we don't have to calculate // its position at render time. If this layer has variable placement, shift the various // symbol instances appropriately so that symbols from buckets that have yet to be placed // offset appropriately. var symbolHidden = opacityState.text.isHidden(); [ symbolInstance.rightJustifiedTextSymbolIndex, symbolInstance.centerJustifiedTextSymbolIndex, symbolInstance.leftJustifiedTextSymbolIndex ].forEach(function (index) { if (index >= 0) { bucket.text.placedSymbolArray.get(index).hidden = symbolHidden || horizontalHidden ? 1 : 0; } }); if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).hidden = symbolHidden || verticalHidden ? 1 : 0; } var prevOffset = this$1.variableOffsets[symbolInstance.crossTileID]; if (prevOffset) { this$1.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation); } var prevOrientation = this$1.placedOrientations[symbolInstance.crossTileID]; if (prevOrientation) { this$1.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation); this$1.markUsedOrientation(bucket, prevOrientation, symbolInstance); } } if (hasIcon) { var packedOpacity$1 = packOpacity(opacityState.icon); var useHorizontal = !(hasIconTextFit && symbolInstance.verticalPlacedIconSymbolIndex && horizontalHidden); if (symbolInstance.placedIconSymbolIndex >= 0) { var horizontalOpacity$1 = useHorizontal ? packedOpacity$1 : PACKED_HIDDEN_OPACITY; addOpacities(bucket.icon, symbolInstance.numIconVertices, horizontalOpacity$1); bucket.icon.placedSymbolArray.get(symbolInstance.placedIconSymbolIndex).hidden = (opacityState.icon.isHidden() ); } if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { var verticalOpacity$1 = !useHorizontal ? packedOpacity$1 : PACKED_HIDDEN_OPACITY; addOpacities(bucket.icon, symbolInstance.numVerticalIconVertices, verticalOpacity$1); bucket.icon.placedSymbolArray.get(symbolInstance.verticalPlacedIconSymbolIndex).hidden = (opacityState.icon.isHidden() ); } } if (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()) { var collisionArrays = bucket.collisionArrays[s]; if (collisionArrays) { var shift = new performance.Point(0, 0); if (collisionArrays.textBox || collisionArrays.verticalTextBox) { var used = true; if (variablePlacement) { var variableOffset = this$1.variableOffsets[crossTileID]; if (variableOffset) { // This will show either the currently placed position or the last // successfully placed position (so you can visualize what collision // just made the symbol disappear, and the most likely place for the // symbol to come back) shift = calculateVariableLayoutShift(variableOffset.anchor, variableOffset.width, variableOffset.height, variableOffset.textOffset, variableOffset.textBoxScale); if (rotateWithMap) { shift._rotate(pitchWithMap ? this$1.transform.angle : -this$1.transform.angle); } } else { // No offset -> this symbol hasn't been placed since coming on-screen // No single box is particularly meaningful and all of them would be too noisy // Use the center box just to show something's there, but mark it "not used" used = false; } } if (collisionArrays.textBox) { updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || horizontalHidden, shift.x, shift.y); } if (collisionArrays.verticalTextBox) { updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || verticalHidden, shift.x, shift.y); } } var verticalIconUsed = Boolean(!verticalHidden && collisionArrays.verticalIconBox); if (collisionArrays.iconBox) { updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0); } if (collisionArrays.verticalIconBox) { updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, !verticalIconUsed, hasIconTextFit ? shift.x : 0, hasIconTextFit ? shift.y : 0); } } } }; for (var s = 0; s < bucket.symbolInstances.length; s++) loop( s ); bucket.sortFeatures(this.transform.angle); if (this.retainedQueryData[bucket.bucketInstanceId]) { this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder; } if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) { bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray); } if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) { bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray); } if (bucket.hasIconCollisionBoxData() && bucket.iconCollisionBox.collisionVertexBuffer) { bucket.iconCollisionBox.collisionVertexBuffer.updateData(bucket.iconCollisionBox.collisionVertexArray); } if (bucket.hasTextCollisionBoxData() && bucket.textCollisionBox.collisionVertexBuffer) { bucket.textCollisionBox.collisionVertexBuffer.updateData(bucket.textCollisionBox.collisionVertexArray); } performance.assert(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4); performance.assert(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4); // Push generated collision circles to the bucket for debug rendering if (bucket.bucketInstanceId in this.collisionCircleArrays) { var instance = this.collisionCircleArrays[bucket.bucketInstanceId]; bucket.placementInvProjMatrix = instance.invProjMatrix; bucket.placementViewportMatrix = instance.viewportMatrix; bucket.collisionCircleArray = instance.circles; delete this.collisionCircleArrays[bucket.bucketInstanceId]; } }; Placement.prototype.symbolFadeChange = function symbolFadeChange (now ) { return this.fadeDuration === 0 ? 1 : ((now - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment); }; Placement.prototype.zoomAdjustment = function zoomAdjustment (zoom ) { // When zooming out quickly, labels can overlap each other. This // adjustment is used to reduce the interval between placement calculations // and to reduce the fade duration when zooming out quickly. Discovering the // collisions more quickly and fading them more quickly reduces the unwanted effect. return Math.max(0, (this.transform.zoom - zoom) / 1.5); }; Placement.prototype.hasTransitions = function hasTransitions (now ) { return this.stale || now - this.lastPlacementChangeTime < this.fadeDuration; }; Placement.prototype.stillRecent = function stillRecent (now , zoom ) { // The adjustment makes placement more frequent when zooming. // This condition applies the adjustment only after the map has // stopped zooming. This avoids adding extra jank while zooming. var durationAdjustment = this.zoomAtLastRecencyCheck === zoom ? (1 - this.zoomAdjustment(zoom)) : 1; this.zoomAtLastRecencyCheck = zoom; return this.commitTime + this.fadeDuration * durationAdjustment > now; }; Placement.prototype.setStale = function setStale () { this.stale = true; }; function updateCollisionVertices(collisionVertexArray , placed , notUsed , shiftX , shiftY ) { collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); } // All four vertices for a glyph will have the same opacity state // So we pack the opacity into a uint8, and then repeat it four times // to make a single uint32 that we can upload for each glyph in the // label. var shift25 = Math.pow(2, 25); var shift24 = Math.pow(2, 24); var shift17 = Math.pow(2, 17); var shift16 = Math.pow(2, 16); var shift9 = Math.pow(2, 9); var shift8 = Math.pow(2, 8); var shift1 = Math.pow(2, 1); function packOpacity(opacityState ) { if (opacityState.opacity === 0 && !opacityState.placed) { return 0; } else if (opacityState.opacity === 1 && opacityState.placed) { return 4294967295; } var targetBit = opacityState.placed ? 1 : 0; var opacityBits = Math.floor(opacityState.opacity * 127); return opacityBits * shift25 + targetBit * shift24 + opacityBits * shift17 + targetBit * shift16 + opacityBits * shift9 + targetBit * shift8 + opacityBits * shift1 + targetBit; } var PACKED_HIDDEN_OPACITY = 0; // var LayerPlacement = function LayerPlacement(styleLayer ) { this._sortAcrossTiles = styleLayer.layout.get('symbol-z-order') !== 'viewport-y' && styleLayer.layout.get('symbol-sort-key').constantOr(1) !== undefined; this._currentTileIndex = 0; this._currentPartIndex = 0; this._seenCrossTileIDs = {}; this._bucketParts = []; }; LayerPlacement.prototype.continuePlacement = function continuePlacement (tiles , placement , showCollisionBoxes , styleLayer , shouldPausePlacement ) { var bucketParts = this._bucketParts; while (this._currentTileIndex < tiles.length) { var tile = tiles[this._currentTileIndex]; placement.getBucketParts(bucketParts, styleLayer, tile, this._sortAcrossTiles); this._currentTileIndex++; if (shouldPausePlacement()) { return true; } } if (this._sortAcrossTiles) { this._sortAcrossTiles = false; bucketParts.sort(function (a, b) { return ((a.sortKey ) ) - ((b.sortKey ) ); }); } while (this._currentPartIndex < bucketParts.length) { var bucketPart = bucketParts[this._currentPartIndex]; placement.placeLayerBucketPart(bucketPart, this._seenCrossTileIDs, showCollisionBoxes); this._currentPartIndex++; if (shouldPausePlacement()) { return true; } } return false; }; var PauseablePlacement = function PauseablePlacement(transform , order , forceFullPlacement , showCollisionBoxes , fadeDuration , crossSourceCollisions , prevPlacement ) { this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement); this._currentPlacementIndex = order.length - 1; this._forceFullPlacement = forceFullPlacement; this._showCollisionBoxes = showCollisionBoxes; this._done = false; }; PauseablePlacement.prototype.isDone = function isDone () { return this._done; }; PauseablePlacement.prototype.continuePlacement = function continuePlacement (order , layers , layerTiles ) { var this$1 = this; var startTime = performance.browser.now(); var shouldPausePlacement = function () { var elapsedTime = performance.browser.now() - startTime; return this$1._forceFullPlacement ? false : elapsedTime > 2; }; while (this._currentPlacementIndex >= 0) { var layerId = order[this._currentPlacementIndex]; var layer = layers[layerId]; var placementZoom = this.placement.collisionIndex.transform.zoom; if (layer.type === 'symbol' && (!layer.minzoom || layer.minzoom <= placementZoom) && (!layer.maxzoom || layer.maxzoom > placementZoom)) { if (!this._inProgressLayer) { this._inProgressLayer = new LayerPlacement(((layer ) )); } var pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement); if (pausePlacement) { // We didn't finish placing all layers within 2ms, // but we can keep rendering with a partial placement // We'll resume here on the next frame return; } delete this._inProgressLayer; } this._currentPlacementIndex--; } this._done = true; }; PauseablePlacement.prototype.commit = function commit (now ) { this.placement.commit(now); return this.placement; }; // /* The CrossTileSymbolIndex generally works on the assumption that a conceptual "unique symbol" can be identified by the text of the label combined with the anchor point. The goal is to assign these conceptual "unique symbols" a shared crossTileID that can be used by Placement to keep fading opacity states consistent and to deduplicate labels. The CrossTileSymbolIndex indexes all the current symbol instances and their crossTileIDs. When a symbol bucket gets added or updated, the index assigns a crossTileID to each of it's symbol instances by either matching it with an existing id or assigning a new one. */ // Round anchor positions to roughly 4 pixel grid var roundingFactor = 512 / performance.EXTENT / 2; var TileLayerIndex = function TileLayerIndex(tileID , symbolInstances , bucketInstanceId ) { this.tileID = tileID; this.indexedSymbolInstances = {}; this.bucketInstanceId = bucketInstanceId; for (var i = 0; i < symbolInstances.length; i++) { var symbolInstance = symbolInstances.get(i); var key = symbolInstance.key; if (!this.indexedSymbolInstances[key]) { this.indexedSymbolInstances[key] = []; } // This tile may have multiple symbol instances with the same key // Store each one along with its coordinates this.indexedSymbolInstances[key].push({ crossTileID: symbolInstance.crossTileID, coord: this.getScaledCoordinates(symbolInstance, tileID) }); } }; // Converts the coordinates of the input symbol instance into coordinates that be can compared // against other symbols in this index. Coordinates are: // (1) world-based (so after conversion the source tile is irrelevant) // (2) converted to the z-scale of this TileLayerIndex // (3) down-sampled by "roundingFactor" from tile coordinate precision in order to be // more tolerant of small differences between tiles. TileLayerIndex.prototype.getScaledCoordinates = function getScaledCoordinates (symbolInstance , childTileID ) { var zDifference = childTileID.canonical.z - this.tileID.canonical.z; var scale = roundingFactor / Math.pow(2, zDifference); return { x: Math.floor((childTileID.canonical.x * performance.EXTENT + symbolInstance.anchorX) * scale), y: Math.floor((childTileID.canonical.y * performance.EXTENT + symbolInstance.anchorY) * scale) }; }; TileLayerIndex.prototype.findMatches = function findMatches (symbolInstances , newTileID , zoomCrossTileIDs ) { var tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z); for (var i = 0; i < symbolInstances.length; i++) { var symbolInstance = symbolInstances.get(i); if (symbolInstance.crossTileID) { // already has a match, skip continue; } var indexedInstances = this.indexedSymbolInstances[symbolInstance.key]; if (!indexedInstances) { // No symbol with this key in this bucket continue; } var scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID); for (var i$1 = 0, list = indexedInstances; i$1 < list.length; i$1 += 1) { // Return any symbol with the same keys whose coordinates are within 1 // grid unit. (with a 4px grid, this covers a 12px by 12px area) var thisTileSymbol = list[i$1]; if (Math.abs(thisTileSymbol.coord.x - scaledSymbolCoord.x) <= tolerance && Math.abs(thisTileSymbol.coord.y - scaledSymbolCoord.y) <= tolerance && !zoomCrossTileIDs[thisTileSymbol.crossTileID]) { // Once we've marked ourselves duplicate against this parent symbol, // don't let any other symbols at the same zoom level duplicate against // the same parent (see issue #5993) zoomCrossTileIDs[thisTileSymbol.crossTileID] = true; symbolInstance.crossTileID = thisTileSymbol.crossTileID; break; } } } }; var CrossTileIDs = function CrossTileIDs() { this.maxCrossTileID = 0; }; CrossTileIDs.prototype.generate = function generate () { return ++this.maxCrossTileID; }; var CrossTileSymbolLayerIndex = function CrossTileSymbolLayerIndex() { this.indexes = {}; this.usedCrossTileIDs = {}; this.lng = 0; }; /* * Sometimes when a user pans across the antimeridian the longitude value gets wrapped. * To prevent labels from flashing out and in we adjust the tileID values in the indexes * so that they match the new wrapped version of the map. */ CrossTileSymbolLayerIndex.prototype.handleWrapJump = function handleWrapJump (lng ) { var wrapDelta = Math.round((lng - this.lng) / 360); if (wrapDelta !== 0) { for (var zoom in this.indexes) { var zoomIndexes = this.indexes[zoom]; var newZoomIndex = {}; for (var key in zoomIndexes) { // change the tileID's wrap and add it to a new index var index = zoomIndexes[key]; index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta); newZoomIndex[index.tileID.key] = index; } this.indexes[zoom] = newZoomIndex; } } this.lng = lng; }; CrossTileSymbolLayerIndex.prototype.addBucket = function addBucket (tileID , bucket , crossTileIDs ) { if (this.indexes[tileID.overscaledZ] && this.indexes[tileID.overscaledZ][tileID.key]) { if (this.indexes[tileID.overscaledZ][tileID.key].bucketInstanceId === bucket.bucketInstanceId) { return false; } else { // We're replacing this bucket with an updated version // Remove the old bucket's "used crossTileIDs" now so that // the new bucket can claim them. // The old index entries themselves stick around until // 'removeStaleBuckets' is called. this.removeBucketCrossTileIDs(tileID.overscaledZ, this.indexes[tileID.overscaledZ][tileID.key]); } } for (var i = 0; i < bucket.symbolInstances.length; i++) { var symbolInstance = bucket.symbolInstances.get(i); symbolInstance.crossTileID = 0; } if (!this.usedCrossTileIDs[tileID.overscaledZ]) { this.usedCrossTileIDs[tileID.overscaledZ] = {}; } var zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; for (var zoom in this.indexes) { var zoomIndexes = this.indexes[zoom]; if (Number(zoom) > tileID.overscaledZ) { for (var id in zoomIndexes) { var childIndex = zoomIndexes[id]; if (childIndex.tileID.isChildOf(tileID)) { childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } else { var parentCoord = tileID.scaledTo(Number(zoom)); var parentIndex = zoomIndexes[parentCoord.key]; if (parentIndex) { parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } } for (var i$1 = 0; i$1 < bucket.symbolInstances.length; i$1++) { var symbolInstance$1 = bucket.symbolInstances.get(i$1); if (!symbolInstance$1.crossTileID) { // symbol did not match any known symbol, assign a new id symbolInstance$1.crossTileID = crossTileIDs.generate(); zoomCrossTileIDs[symbolInstance$1.crossTileID] = true; } } if (this.indexes[tileID.overscaledZ] === undefined) { this.indexes[tileID.overscaledZ] = {}; } this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId); return true; }; CrossTileSymbolLayerIndex.prototype.removeBucketCrossTileIDs = function removeBucketCrossTileIDs (zoom , removedBucket ) { for (var key in removedBucket.indexedSymbolInstances) { for (var i = 0, list = removedBucket.indexedSymbolInstances[(key )]; i < list.length; i += 1) { var symbolInstance = list[i]; delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID]; } } }; CrossTileSymbolLayerIndex.prototype.removeStaleBuckets = function removeStaleBuckets (currentIDs ) { var tilesChanged = false; for (var z in this.indexes) { var zoomIndexes = this.indexes[z]; for (var tileKey in zoomIndexes) { if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) { this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]); delete zoomIndexes[tileKey]; tilesChanged = true; } } } return tilesChanged; }; var CrossTileSymbolIndex = function CrossTileSymbolIndex() { this.layerIndexes = {}; this.crossTileIDs = new CrossTileIDs(); this.maxBucketInstanceId = 0; this.bucketsInCurrentPlacement = {}; }; CrossTileSymbolIndex.prototype.addLayer = function addLayer (styleLayer , tiles , lng ) { var layerIndex = this.layerIndexes[styleLayer.id]; if (layerIndex === undefined) { layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex(); } var symbolBucketsChanged = false; var currentBucketIDs = {}; layerIndex.handleWrapJump(lng); for (var i = 0, list = tiles; i < list.length; i += 1) { var tile = list[i]; var symbolBucket = ((tile.getBucket(styleLayer) ) ); if (!symbolBucket || styleLayer.id !== symbolBucket.layerIds[0]) { continue; } if (!symbolBucket.bucketInstanceId) { symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId; } if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) { symbolBucketsChanged = true; } currentBucketIDs[symbolBucket.bucketInstanceId] = true; } if (layerIndex.removeStaleBuckets(currentBucketIDs)) { symbolBucketsChanged = true; } return symbolBucketsChanged; }; CrossTileSymbolIndex.prototype.pruneUnusedLayers = function pruneUnusedLayers (usedLayers ) { var usedLayerMap = {}; usedLayers.forEach(function (usedLayer) { usedLayerMap[usedLayer] = true; }); for (var layerId in this.layerIndexes) { if (!usedLayerMap[layerId]) { delete this.layerIndexes[layerId]; } } }; // // We're skipping validation errors with the `source.canvas` identifier in order // to continue to allow canvas sources to be added at runtime/updated in // smart setStyle (see https://github.com/mapbox/mapbox-gl-js/pull/6424): var emitValidationErrors = function (evented , errors ) { return performance.emitValidationErrors(evented, errors && errors.filter(function (error) { return error.identifier !== 'source.canvas'; })); }; var supportedDiffOperations = performance.pick(operations, [ 'addLayer', 'removeLayer', 'setPaintProperty', 'setLayoutProperty', 'setFilter', 'addSource', 'removeSource', 'setLayerZoomRange', 'setLight', 'setTransition', 'setGeoJSONSourceData', 'setGlyphs', 'setSprite' ]); var ignoredDiffOperations = performance.pick(operations, [ 'setCenter', 'setZoom', 'setBearing', 'setPitch' ]); var empty = emptyStyle(); /** * @private */ var Style = /*@__PURE__*/(function (Evented) { function Style(map , options) { var this$1 = this; if ( options === void 0 ) options = {}; Evented.call(this); this.map = map; this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this); this._spriteRequests = {}; this.imageManagerFactory = new ImageManagerFactory(); this.imageManagerFactory.setEventedParent(this); this.glyphManagerFactory = new GlyphManagerFactory(map._requestManager, options.localIdeographFontFamily); this._sprites = {}; this._glyphs = {}; this.lineAtlas = new LineAtlas(256, 512); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); this._layers = {}; this._serializedLayers = {}; this._order = []; this.sourceCaches = {}; this.zoomHistory = new performance.ZoomHistory(); this._loaded = false; this._availableImages = []; this._resetUpdates(); this.dispatcher.broadcast('setReferrer', performance.getReferrer()); var self = this; this._rtlTextPluginCallback = Style.registerForPluginStateChange(function (event) { var state = { pluginStatus: event.pluginStatus, pluginURL: event.pluginURL }; self.dispatcher.broadcast('syncRTLPluginState', state, function (err, results) { performance.triggerPluginCompletionEvent(err); if (results) { var allComplete = results.every(function (elem) { return elem; }); if (allComplete) { for (var id in self.sourceCaches) { self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load } } } }); }); this.on('data', function (event) { if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') { return; } var sourceCache = this$1.sourceCaches[event.sourceId]; if (!sourceCache) { return; } var source = sourceCache.getSource(); if (!source || !source.vectorLayerIds) { return; } for (var layerId in this$1._layers) { var layer = this$1._layers[layerId]; if (layer.source === source.id) { this$1._validateLayer(layer); } } }); } if ( Evented ) Style.__proto__ = Evented; Style.prototype = Object.create( Evented && Evented.prototype ); Style.prototype.constructor = Style; Style.prototype.loadURL = function loadURL (url , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire(new performance.Event('dataloading', {dataType: 'style'})); var validate = typeof options.validate === 'boolean' ? options.validate : !performance.isMapboxURL(url); url = this.map._requestManager.normalizeStyleURL(url, options.accessToken); var request = this.map._requestManager.transformRequest(url, performance.ResourceType.Style); this._request = performance.getJSON(request, function (error , json ) { this$1._request = null; if (error) { this$1.fire(new performance.ErrorEvent(error)); } else if (json) { this$1._load(json, validate); } }); }; Style.prototype.loadJSON = function loadJSON (json , options) { var this$1 = this; if ( options === void 0 ) options = {}; this.fire(new performance.Event('dataloading', {dataType: 'style'})); this._request = performance.browser.frame(function () { this$1._request = null; this$1._load(JSON.parse(JSON.stringify(json)), options.validate !== false); }); }; Style.prototype.loadEmpty = function loadEmpty () { this.fire(new performance.Event('dataloading', {dataType: 'style'})); this._load(empty, false); }; Style.prototype._load = function _load (json , validate ) { if (validate && emitValidationErrors(this, performance.validateStyle(json))) { return; } this._loaded = true; this.stylesheet = json; for (var id in json.sources) { this.addSource(id, json.sources[id], {validate: false}); } if (json.sprite) { this._loadSprite(json); } else { this.imageManagerFactory.setLoaded(true); } if(typeof json.glyphs === "string"){ var glyphsObj = {}; for (var id$1 in json.sources) { glyphsObj[id$1] = json.glyphs; } glyphsObj['image_manager_default']=json.glyphs; json.glyphs = glyphsObj; } for (var sourceId in json.glyphs) { this.glyphManagerFactory.setURL(json.glyphs[sourceId], sourceId); this._glyphs[sourceId] = json.glyphs[sourceId]; } var layers = derefLayers(this.stylesheet.layers); this._order = layers.map(function (layer) { return layer.id; }); this._layers = {}; this._serializedLayers = {}; for (var i = 0, list = layers; i < list.length; i += 1) { var layer = list[i]; layer = performance.createStyleLayer(layer); layer.setEventedParent(this, {layer: {id: layer.id}}); this._layers[layer.id] = layer; this._serializedLayers[layer.id] = layer.serialize(); } this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); this.light = new Light(this.stylesheet.light); this.fire(new performance.Event('data', {dataType: 'style'})); this.fire(new performance.Event('style.load')); }; Style.prototype._loadSprite = function _loadSprite (json) { var this$1 = this; var cb = function (sourceId, images, err) { this$1._sprites[sourceId] = typeof json.sprite === "string" ? json.sprite : json.sprite[sourceId]; this$1._spriteRequests[sourceId] = null; delete this$1._spriteRequests[sourceId]; if (err) { this$1.fire(new performance.ErrorEvent(err)); } else if (images) { for (var id in images) { this$1.imageManagerFactory.addImage(id, images[id], sourceId); } } this$1.imageManagerFactory.setLoaded(true, sourceId); this$1._availableImages = this$1.imageManagerFactory.listImages(); this$1.dispatcher.broadcast("setImages", this$1._availableImages); this$1.fire(new performance.Event("data", { dataType: "style" })); }; if (typeof json.sprite === "string") { var spriteBak = json.sprite; var _spriteRequest = loadSprite(json.sprite, this.map._requestManager, function (err, images) { var spriteObj = {'image_manager_default':json.sprite}; cb('image_manager_default', images, err); for (var id in json.sources) { spriteObj[id] = spriteBak; cb(id, images, err); } json.sprite = spriteObj; }); this._spriteRequests['image_manager_default'] = _spriteRequest; return; } var loop = function ( sourceId ) { var _spriteRequest$1 = loadSprite(json.sprite[sourceId], this$1.map._requestManager, function (err, images) { cb(sourceId, images, err); }); this$1._spriteRequests[sourceId] = _spriteRequest$1; }; for (var sourceId in json.sprite) loop( sourceId ); }; Style.prototype.setSprite = function setSprite (sprites) { for (var key in sprites) { this.addSprite(key, sprites[key]); } }; Style.prototype.addSpriteObject = function addSpriteObject (sourceId, spriteImage , spriteJson) { var imageData = performance.browser.getImageData(spriteImage); var result = {}; for (var id in spriteJson) { var ref = spriteJson[id]; var width = ref.width; var height = ref.height; var x = ref.x; var y = ref.y; var sdf = ref.sdf; var pixelRatio = ref.pixelRatio; var data = new performance.RGBAImage({width: width, height: height}); performance.RGBAImage.copy(imageData, data, {x: x, y: y}, {x: 0, y: 0}, {width: width, height: height}); result[id] = {data: data, pixelRatio: pixelRatio, sdf: sdf}; } for (var id$1 in result) { this.imageManagerFactory.addImage(id$1, result[id$1], sourceId); } }; Style.prototype.addSprite = function addSprite (sourceId, sprite) { var this$1 = this; if (!this.imageManagerFactory.imageManagers[sourceId]) { this.imageManagerFactory.imageManagers[sourceId] = new ImageManager(); if (sourceId !== "image_manager_default") { this.imageManagerFactory.imageManagers[sourceId].defaultImageManger = this.imageManagerFactory.imageManagers["image_manager_default"]; } } var _spriteRequest = loadSprite(sprite, this.map._requestManager, function (err, images) { this$1._sprites[sourceId] = sprite; this$1._spriteRequests[sourceId] = null; delete this$1._spriteRequests[sourceId]; if (err) { this$1.fire(new performance.ErrorEvent(err)); } else if (images) { for (var id in images) { this$1.imageManagerFactory.addImage(id, images[id], sourceId); } } this$1.imageManagerFactory.setLoaded(true, sourceId); this$1.fire(new performance.Event("data", { dataType: "style" })); }); this._spriteRequests[sourceId] = _spriteRequest; }; Style.prototype.setGlyphs = function setGlyphs (glyphs) { for (var key in glyphs) { this.addGlyphs(key, glyphs[key]); } }; Style.prototype.addGlyphs = function addGlyphs (sourceId, glyphs) { this._glyphs[sourceId] = glyphs; this.glyphManagerFactory.setURL(glyphs, sourceId); }; Style.prototype._validateLayer = function _validateLayer (layer ) { var sourceCache = this.sourceCaches[layer.source]; if (!sourceCache) { return; } var sourceLayer = layer.sourceLayer; if (!sourceLayer) { return; } var source = sourceCache.getSource(); if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) { this.fire(new performance.ErrorEvent(new Error( "Source layer \"" + sourceLayer + "\" " + "does not exist on source \"" + (source.id) + "\" " + "as specified by style layer \"" + (layer.id) + "\"" ))); } }; Style.prototype.loaded = function loaded () { if (!this._loaded) { return false; } if (Object.keys(this._updatedSources).length) { return false; } for (var id in this.sourceCaches) { if (!this.sourceCaches[id].loaded()) { return false; } } if (!this.imageManagerFactory.isAllLoaded()) { return false; } return true; }; Style.prototype._serializeLayers = function _serializeLayers (ids ) { var serializedLayers = []; for (var i = 0, list = ids; i < list.length; i += 1) { var id = list[i]; var layer = this._layers[id]; if (layer.type !== 'custom') { serializedLayers.push(layer.serialize()); } } return serializedLayers; }; Style.prototype.hasTransitions = function hasTransitions () { if (this.light && this.light.hasTransition()) { return true; } for (var id in this.sourceCaches) { if (this.sourceCaches[id].hasTransition()) { return true; } } for (var id$1 in this._layers) { if (this._layers[id$1].hasTransition()) { return true; } } return false; }; Style.prototype._checkLoaded = function _checkLoaded () { if (!this._loaded) { throw new Error('Style is not done loading'); } }; /** * Apply queued style updates in a batch and recalculate zoom-dependent paint properties. * @private */ Style.prototype.update = function update (parameters ) { if (!this._loaded) { return; } var changed = this._changed; if (this._changed) { var updatedIds = Object.keys(this._updatedLayers); var removedIds = Object.keys(this._removedLayers); if (updatedIds.length || removedIds.length) { this._updateWorkerLayers(updatedIds, removedIds); } for (var id in this._updatedSources) { var action = this._updatedSources[id]; performance.assert(action === 'reload' || action === 'clear'); if (action === 'reload') { this._reloadSource(id); } else if (action === 'clear') { this._clearSource(id); } } this._updateTilesForChangedImages(); for (var id$1 in this._updatedPaintProps) { this._layers[id$1].updateTransitions(parameters); } this.light.updateTransitions(parameters); this._resetUpdates(); } for (var sourceId in this.sourceCaches) { this.sourceCaches[sourceId].used = false; } for (var i = 0, list = this._order; i < list.length; i += 1) { var layerId = list[i]; var layer = this._layers[layerId]; layer.recalculate(parameters, this._availableImages); if (!layer.isHidden(parameters.zoom) && layer.source) { this.sourceCaches[layer.source].used = true; } } this.light.recalculate(parameters); this.z = parameters.zoom; if (changed) { this.fire(new performance.Event('data', {dataType: 'style'})); } }; /* * Apply any queued image changes. */ Style.prototype._updateTilesForChangedImages = function _updateTilesForChangedImages () { var changedImages = Object.keys(this._changedImages); if (changedImages.length) { for (var name in this.sourceCaches) { this.sourceCaches[name].reloadTilesForDependencies(['icons', 'patterns'], changedImages); } this._changedImages = {}; } }; Style.prototype._updateWorkerLayers = function _updateWorkerLayers (updatedIds , removedIds ) { this.dispatcher.broadcast('updateLayers', { layers: this._serializeLayers(updatedIds), removedIds: removedIds }); }; Style.prototype._resetUpdates = function _resetUpdates () { this._changed = false; this._updatedLayers = {}; this._removedLayers = {}; this._updatedSources = {}; this._updatedPaintProps = {}; this._changedImages = {}; }; /** * Update this style's state to match the given style JSON, performing only * the necessary mutations. * * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec * diff algorithm produces an operation that is not supported. * * @returns {boolean} true if any changes were made; false otherwise * @private */ Style.prototype.setState = function setState (nextState ) { var this$1 = this; this._checkLoaded(); if (emitValidationErrors(this, performance.validateStyle(nextState))) { return false; } nextState = performance.clone$1(nextState); nextState.layers = derefLayers(nextState.layers); var changes = diffStyles(this.serialize(), nextState) .filter(function (op) { return !(op.command in ignoredDiffOperations); }); if (changes.length === 0) { return false; } var unimplementedOps = changes.filter(function (op) { return !(op.command in supportedDiffOperations); }); if (unimplementedOps.length > 0) { throw new Error(("Unimplemented: " + (unimplementedOps.map(function (op) { return op.command; }).join(', ')) + ".")); } changes.forEach(function (op) { if (op.command === 'setTransition') { // `transition` is always read directly off of // `this.stylesheet`, which we update below return; } (this$1 )[op.command].apply(this$1, op.args); }); this.stylesheet = nextState; return true; }; Style.prototype.addImage = function addImage (id , image , sourceId ) { if (this.getImage(id)) { return this.fire(new performance.ErrorEvent(new Error('An image with this name already exists.'))); } this.imageManagerFactory.addImage(id, image, sourceId); this._afterImageUpdated(id); }; Style.prototype.updateImage = function updateImage (id , image , sourceId ) { this.imageManagerFactory.updateImage(id, image, sourceId); }; Style.prototype.getImage = function getImage (id , sourceId ) { return this.imageManagerFactory.getImage(id, sourceId); }; Style.prototype.removeImage = function removeImage (id , sourceId ) { if (!this.getImage(id)) { return this.fire(new performance.ErrorEvent(new Error('No image with this name exists.'))); } this.imageManagerFactory.removeImage(id, sourceId); this._afterImageUpdated(id); }; Style.prototype._afterImageUpdated = function _afterImageUpdated (id ) { this._availableImages = this.imageManagerFactory.listImages(); this._changedImages[id] = true; this._changed = true; this.dispatcher.broadcast('setImages', this._availableImages); this.fire(new performance.Event('data', {dataType: 'style'})); }; Style.prototype.listImages = function listImages (sourceId ) { this._checkLoaded(); return this.imageManagerFactory.listImages(sourceId); }; Style.prototype.addSource = function addSource (id , source , options) { var this$1 = this; if ( options === void 0 ) options = {}; this._checkLoaded(); if (this.sourceCaches[id] !== undefined) { throw new Error('There is already a source with this ID'); } if (!source.type) { throw new Error(("The type property must be defined, but only the following properties were given: " + (Object.keys(source).join(', ')) + ".")); } if ( this.map._mapCRS && source.type === "geojson" && source.data && !source.data.customprj && !source.customprj ) { source.customprj = this.map.customConvertPoint; } var builtIns = ['vector', 'raster', 'geojson', 'video', 'image']; var shouldValidate = builtIns.indexOf(source.type) >= 0; if (shouldValidate && this._validate(performance.validateStyle.source, ("sources." + id), source, null, options)) { return; } if (this.map && this.map._collectResourceTiming) { (source ).collectResourceTiming = true; } var sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher); sourceCache.style = this; sourceCache.setEventedParent(this, function () { return ({ isSourceLoaded: this$1.loaded(), source: sourceCache.serialize(), sourceId: id }); }); sourceCache.onAdd(this.map); this._changed = true; }; /** * Remove a source from this stylesheet, given its id. * @param {string} id id of the source to remove * @throws {Error} if no source is found with the given ID * @returns {Map} The {@link Map} object. */ Style.prototype.removeSource = function removeSource (id ) { this._checkLoaded(); if (this.sourceCaches[id] === undefined) { throw new Error('There is no source with this ID'); } for (var layerId in this._layers) { if (this._layers[layerId].source === id) { return this.fire(new performance.ErrorEvent(new Error(("Source \"" + id + "\" cannot be removed while layer \"" + layerId + "\" is using it.")))); } } var sourceCache = this.sourceCaches[id]; delete this.sourceCaches[id]; delete this._updatedSources[id]; sourceCache.fire(new performance.Event('data', {sourceDataType: 'metadata', dataType:'source', sourceId: id})); sourceCache.setEventedParent(null); sourceCache.clearTiles(); if (sourceCache.onRemove) { sourceCache.onRemove(this.map); } this._changed = true; }; /** * Set the data of a GeoJSON source, given its id. * @param {string} id id of the source * @param {GeoJSON|string} data GeoJSON source */ Style.prototype.setGeoJSONSourceData = function setGeoJSONSourceData (id , data ) { this._checkLoaded(); performance.assert(this.sourceCaches[id] !== undefined, 'There is no source with this ID'); var geojsonSource = (this.sourceCaches[id].getSource() ); performance.assert(geojsonSource.type === 'geojson'); geojsonSource.setData(data); this._changed = true; }; /** * Get a source by id. * @param {string} id id of the desired source * @returns {Object} source */ Style.prototype.getSource = function getSource (id ) { return this.sourceCaches[id] && this.sourceCaches[id].getSource(); }; /** * Add a layer to the map style. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {Object | CustomLayerInterface} layerObject The style layer to add. * @param {string} [before] ID of an existing layer to insert before * @param {Object} options Style setter options. * @returns {Map} The {@link Map} object. */ Style.prototype.addLayer = function addLayer (layerObject , before , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var id = layerObject.id; if (this.getLayer(id)) { this.fire(new performance.ErrorEvent(new Error(("Layer with id \"" + id + "\" already exists on this map")))); return; } var layer; if (layerObject.type === 'custom') { if (emitValidationErrors(this, performance.validateCustomStyleLayer(layerObject))) { return; } layer = performance.createStyleLayer(layerObject); } else { if (typeof layerObject.source === 'object') { this.addSource(id, layerObject.source); layerObject = performance.clone$1(layerObject); layerObject = (performance.extend(layerObject, {source: id}) ); } // this layer is not in the style.layers array, so we pass an impossible array index if (this._validate(performance.validateStyle.layer, ("layers." + id), layerObject, {arrayIndex: -1}, options)) { return; } layer = performance.createStyleLayer(layerObject); this._validateLayer(layer); layer.setEventedParent(this, {layer: {id: id}}); this._serializedLayers[layer.id] = layer.serialize(); } var index = before ? this._order.indexOf(before) : this._order.length; if (before && index === -1) { this.fire(new performance.ErrorEvent(new Error(("Layer with id \"" + before + "\" does not exist on this map.")))); return; } this._order.splice(index, 0, id); this._layerOrderChanged = true; this._layers[id] = layer; if (this._removedLayers[id] && layer.source && layer.type !== 'custom') { // If, in the current batch, we have already removed this layer // and we are now re-adding it with a different `type`, then we // need to clear (rather than just reload) the underyling source's // tiles. Otherwise, tiles marked 'reloading' will have buckets / // buffers that are set up for the _previous_ version of this // layer, causing, e.g.: // https://github.com/mapbox/mapbox-gl-js/issues/3633 var removed = this._removedLayers[id]; delete this._removedLayers[id]; if (removed.type !== layer.type) { this._updatedSources[layer.source] = 'clear'; } else { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } } this._updateLayer(layer); if (layer.onAdd) { layer.onAdd(this.map); } }; /** * Moves a layer to a different z-position. The layer will be inserted before the layer with * ID `before`, or appended if `before` is omitted. * @param {string} id ID of the layer to move * @param {string} [before] ID of an existing layer to insert before */ Style.prototype.moveLayer = function moveLayer (id , before ) { this._checkLoaded(); this._changed = true; var layer = this._layers[id]; if (!layer) { this.fire(new performance.ErrorEvent(new Error(("The layer '" + id + "' does not exist in the map's style and cannot be moved.")))); return; } if (id === before) { return; } var index = this._order.indexOf(id); this._order.splice(index, 1); var newIndex = before ? this._order.indexOf(before) : this._order.length; if (before && newIndex === -1) { this.fire(new performance.ErrorEvent(new Error(("Layer with id \"" + before + "\" does not exist on this map.")))); return; } this._order.splice(newIndex, 0, id); this._layerOrderChanged = true; }; /** * Remove the layer with the given id from the style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error */ Style.prototype.removeLayer = function removeLayer (id ) { this._checkLoaded(); var layer = this._layers[id]; if (!layer) { this.fire(new performance.ErrorEvent(new Error(("The layer '" + id + "' does not exist in the map's style and cannot be removed.")))); return; } layer.setEventedParent(null); var index = this._order.indexOf(id); this._order.splice(index, 1); this._layerOrderChanged = true; this._changed = true; this._removedLayers[id] = layer; delete this._layers[id]; delete this._serializedLayers[id]; delete this._updatedLayers[id]; delete this._updatedPaintProps[id]; if (layer.onRemove) { layer.onRemove(this.map); } }; /** * Return the style layer object with the given `id`. * * @param {string} id - id of the desired layer * @returns {?Object} a layer, if one with the given `id` exists */ Style.prototype.getLayer = function getLayer (id ) { return this._layers[id]; }; /** * checks if a specific layer is present within the style. * * @param {string} id - id of the desired layer * @returns {boolean} a boolean specifying if the given layer is present */ Style.prototype.hasLayer = function hasLayer (id ) { return id in this._layers; }; Style.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new performance.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot have zoom extent.")))); return; } if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) { return; } if (minzoom != null) { layer.minzoom = minzoom; } if (maxzoom != null) { layer.maxzoom = maxzoom; } this._updateLayer(layer); }; Style.prototype.setFilter = function setFilter (layerId , filter , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new performance.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be filtered.")))); return; } if (performance.deepEqual(layer.filter, filter)) { return; } if (filter === null || filter === undefined) { layer.filter = undefined; this._updateLayer(layer); return; } if (this._validate(performance.validateStyle.filter, ("layers." + (layer.id) + ".filter"), filter, null, options)) { return; } layer.filter = performance.clone$1(filter); this._updateLayer(layer); }; /** * Get a layer's filter object * @param {string} layer the layer to inspect * @returns {*} the layer's filter, if any */ Style.prototype.getFilter = function getFilter (layer ) { return performance.clone$1(this.getLayer(layer).filter); }; Style.prototype.setLayoutProperty = function setLayoutProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new performance.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be styled.")))); return; } if (performance.deepEqual(layer.getLayoutProperty(name), value)) { return; } layer.setLayoutProperty(name, value, options); this._updateLayer(layer); }; /** * Get a layout property's value from a given layer * @param {string} layerId the layer to inspect * @param {string} name the name of the layout property * @returns {*} the property value */ Style.prototype.getLayoutProperty = function getLayoutProperty (layerId , name ) { var layer = this.getLayer(layerId); if (!layer) { this.fire(new performance.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style.")))); return; } return layer.getLayoutProperty(name); }; Style.prototype.setPaintProperty = function setPaintProperty (layerId , name , value , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var layer = this.getLayer(layerId); if (!layer) { this.fire(new performance.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be styled.")))); return; } if (performance.deepEqual(layer.getPaintProperty(name), value)) { return; } var requiresRelayout = layer.setPaintProperty(name, value, options); if (requiresRelayout) { this._updateLayer(layer); } this._changed = true; this._updatedPaintProps[layerId] = true; }; Style.prototype.getPaintProperty = function getPaintProperty (layer , name ) { return this.getLayer(layer).getPaintProperty(name); }; Style.prototype.setFeatureState = function setFeatureState (target , state ) { this._checkLoaded(); var sourceId = target.source; var sourceLayer = target.sourceLayer; var sourceCache = this.sourceCaches[sourceId]; if (sourceCache === undefined) { this.fire(new performance.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; if (sourceType === 'geojson' && sourceLayer) { this.fire(new performance.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter."))); return; } if (sourceType === 'vector' && !sourceLayer) { this.fire(new performance.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (target.id === undefined) { this.fire(new performance.ErrorEvent(new Error("The feature id parameter must be provided."))); } sourceCache.setFeatureState(sourceLayer, target.id, state); }; Style.prototype.removeFeatureState = function removeFeatureState (target , key ) { this._checkLoaded(); var sourceId = target.source; var sourceCache = this.sourceCaches[sourceId]; if (sourceCache === undefined) { this.fire(new performance.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; var sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined; if (sourceType === 'vector' && !sourceLayer) { this.fire(new performance.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) { this.fire(new performance.ErrorEvent(new Error("A feature id is required to remove its specific state property."))); return; } sourceCache.removeFeatureState(sourceLayer, target.id, key); }; Style.prototype.getFeatureState = function getFeatureState (target ) { this._checkLoaded(); var sourceId = target.source; var sourceLayer = target.sourceLayer; var sourceCache = this.sourceCaches[sourceId]; if (sourceCache === undefined) { this.fire(new performance.ErrorEvent(new Error(("The source '" + sourceId + "' does not exist in the map's style.")))); return; } var sourceType = sourceCache.getSource().type; if (sourceType === 'vector' && !sourceLayer) { this.fire(new performance.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types."))); return; } if (target.id === undefined) { this.fire(new performance.ErrorEvent(new Error("The feature id parameter must be provided."))); } return sourceCache.getFeatureState(sourceLayer, target.id); }; Style.prototype.getTransition = function getTransition () { return performance.extend({duration: 300, delay: 0}, this.stylesheet && this.stylesheet.transition); }; Style.prototype.serialize = function serialize () { return performance.filterObject({ version: this.stylesheet.version, name: this.stylesheet.name, metadata: this.stylesheet.metadata, light: this.stylesheet.light, center: this.stylesheet.center, zoom: this.stylesheet.zoom, bearing: this.stylesheet.bearing, pitch: this.stylesheet.pitch, sprite: this._sprites, glyphs: this._glyphs, transition: this.stylesheet.transition, sources: performance.mapObject(this.sourceCaches, function (source) { return source.serialize(); }), layers: this._serializeLayers(this._order) }, function (value) { return value !== undefined; }); }; Style.prototype._updateLayer = function _updateLayer (layer ) { this._updatedLayers[layer.id] = true; if (layer.source && !this._updatedSources[layer.source] && //Skip for raster layers (https://github.com/mapbox/mapbox-gl-js/issues/7865) this.sourceCaches[layer.source].getSource().type !== 'raster') { this._updatedSources[layer.source] = 'reload'; this.sourceCaches[layer.source].pause(); } this._changed = true; }; Style.prototype._flattenAndSortRenderedFeatures = function _flattenAndSortRenderedFeatures (sourceResults ) { var this$1 = this; // Feature order is complicated. // The order between features in two 2D layers is always determined by layer order. // The order between features in two 3D layers is always determined by depth. // The order between a feature in a 2D layer and a 3D layer is tricky: // Most often layer order determines the feature order in this case. If // a line layer is above a extrusion layer the line feature will be rendered // above the extrusion. If the line layer is below the extrusion layer, // it will be rendered below it. // // There is a weird case though. // You have layers in this order: extrusion_layer_a, line_layer, extrusion_layer_b // Each layer has a feature that overlaps the other features. // The feature in extrusion_layer_a is closer than the feature in extrusion_layer_b so it is rendered above. // The feature in line_layer is rendered above extrusion_layer_a. // This means that that the line_layer feature is above the extrusion_layer_b feature despite // it being in an earlier layer. var isLayer3D = function (layerId) { return this$1._layers[layerId].type === 'fill-extrusion'; }; var layerIndex = {}; var features3D = []; for (var l = this._order.length - 1; l >= 0; l--) { var layerId = this._order[l]; if (isLayer3D(layerId)) { layerIndex[layerId] = l; for (var i$2 = 0, list$1 = sourceResults; i$2 < list$1.length; i$2 += 1) { var sourceResult = list$1[i$2]; var layerFeatures = sourceResult[layerId]; if (layerFeatures) { for (var i$1 = 0, list = layerFeatures; i$1 < list.length; i$1 += 1) { var featureWrapper = list[i$1]; features3D.push(featureWrapper); } } } } } features3D.sort(function (a, b) { return b.intersectionZ - a.intersectionZ; }); var features = []; for (var l$1 = this._order.length - 1; l$1 >= 0; l$1--) { var layerId$1 = this._order[l$1]; if (isLayer3D(layerId$1)) { // add all 3D features that are in or above the current layer for (var i = features3D.length - 1; i >= 0; i--) { var topmost3D = features3D[i].feature; if (layerIndex[topmost3D.layer.id] < l$1) { break; } features.push(topmost3D); features3D.pop(); } } else { for (var i$4 = 0, list$3 = sourceResults; i$4 < list$3.length; i$4 += 1) { var sourceResult$1 = list$3[i$4]; var layerFeatures$1 = sourceResult$1[layerId$1]; if (layerFeatures$1) { for (var i$3 = 0, list$2 = layerFeatures$1; i$3 < list$2.length; i$3 += 1) { var featureWrapper$1 = list$2[i$3]; features.push(featureWrapper$1.feature); } } } } } return features; }; Style.prototype.queryRenderedFeatures = function queryRenderedFeatures$1 (queryGeometry , params , transform ) { if (params && params.filter) { this._validate(performance.validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, null, params); } var includedSources = {}; if (params && params.layers) { if (!Array.isArray(params.layers)) { this.fire(new performance.ErrorEvent(new Error('parameters.layers must be an Array.'))); return []; } for (var i = 0, list = params.layers; i < list.length; i += 1) { var layerId = list[i]; var layer = this._layers[layerId]; if (!layer) { // this layer is not in the style.layers array this.fire(new performance.ErrorEvent(new Error(("The layer '" + layerId + "' does not exist in the map's style and cannot be queried for features.")))); return []; } includedSources[layer.source] = true; } } var sourceResults = []; params.availableImages = this._availableImages; for (var id in this.sourceCaches) { if (params.layers && !includedSources[id]) { continue; } sourceResults.push( queryRenderedFeatures( this.sourceCaches[id], this._layers, this._serializedLayers, queryGeometry, params, transform) ); } if (this.placement) { // If a placement has run, query against its CollisionIndex // for symbol results, and treat it as an extra source to merge sourceResults.push( queryRenderedSymbols( this._layers, this._serializedLayers, this.sourceCaches, queryGeometry, params, this.placement.collisionIndex, this.placement.retainedQueryData) ); } return this._flattenAndSortRenderedFeatures(sourceResults); }; Style.prototype.querySourceFeatures = function querySourceFeatures$1 (sourceID , params ) { if (params && params.filter) { this._validate(performance.validateStyle.filter, 'querySourceFeatures.filter', params.filter, null, params); } var sourceCache = this.sourceCaches[sourceID]; return sourceCache ? querySourceFeatures(sourceCache, params) : []; }; Style.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { if (Style.getSourceType(name)) { return callback(new Error(("A source type called \"" + name + "\" already exists."))); } Style.setSourceType(name, SourceType); if (!SourceType.workerSourceURL) { return callback(null, null); } this.dispatcher.broadcast('loadWorkerSource', { name: name, url: SourceType.workerSourceURL }, callback); }; Style.prototype.getLight = function getLight () { return this.light.getLight(); }; Style.prototype.setLight = function setLight (lightOptions , options) { if ( options === void 0 ) options = {}; this._checkLoaded(); var light = this.light.getLight(); var _update = false; for (var key in lightOptions) { if (!performance.deepEqual(lightOptions[key], light[key])) { _update = true; break; } } if (!_update) { return; } var parameters = { now: performance.browser.now(), transition: performance.extend({ duration: 300, delay: 0 }, this.stylesheet.transition) }; this.light.setLight(lightOptions, options); this.light.updateTransitions(parameters); }; Style.prototype._validate = function _validate (validate , key , value , props , options) { if ( options === void 0 ) options = {}; if (options && options.validate === false) { return false; } return emitValidationErrors(this, validate.call(performance.validateStyle, performance.extend({ key: key, style: this.serialize(), value: value, styleSpec: performance.styleSpec }, props))); }; Style.prototype._remove = function _remove () { if (this._request) { this._request.cancel(); this._request = null; } for (var key in this._spriteRequests) { this._spriteRequests[key].cancel(); delete this._spriteRequests[key]; } this._spriteRequests = {}; performance.evented.off('pluginStateChange', this._rtlTextPluginCallback); for (var layerId in this._layers) { var layer = this._layers[layerId]; layer.setEventedParent(null); } for (var id in this.sourceCaches) { this.sourceCaches[id].clearTiles(); this.sourceCaches[id].setEventedParent(null); } this.imageManagerFactory.setEventedParent(null); this.setEventedParent(null); this.dispatcher.remove(); }; Style.prototype._clearSource = function _clearSource (id ) { this.sourceCaches[id].clearTiles(); }; Style.prototype._reloadSource = function _reloadSource (id ) { this.sourceCaches[id].resume(); this.sourceCaches[id].reload(); }; Style.prototype._updateSources = function _updateSources (transform ) { for (var id in this.sourceCaches) { this.sourceCaches[id].update(transform); } }; Style.prototype._generateCollisionBoxes = function _generateCollisionBoxes () { for (var id in this.sourceCaches) { this._reloadSource(id); } }; Style.prototype._updatePlacement = function _updatePlacement (transform , showCollisionBoxes , fadeDuration , crossSourceCollisions , forceFullPlacement) { if ( forceFullPlacement === void 0 ) forceFullPlacement = false; var symbolBucketsChanged = false; var placementCommitted = false; var layerTiles = {}; for (var i = 0, list = this._order; i < list.length; i += 1) { var layerID = list[i]; var styleLayer = this._layers[layerID]; if (styleLayer.type !== 'symbol') { continue; } if (!layerTiles[styleLayer.source]) { var sourceCache = this.sourceCaches[styleLayer.source]; layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true) .map(function (id) { return sourceCache.getTileByID(id); }) .sort(function (a, b) { return (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1); }); } var layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng); symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged; } this.crossTileSymbolIndex.pruneUnusedLayers(this._order); // Anything that changes our "in progress" layer and tile indices requires us // to start over. When we start over, we do a full placement instead of incremental // to prevent starvation. // We need to restart placement to keep layer indices in sync. // Also force full placement when fadeDuration === 0 to ensure that newly loaded // tiles will fully display symbols in their first frame forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0; if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(performance.browser.now(), transform.zoom))) { this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement); this._layerOrderChanged = false; } if (this.pauseablePlacement.isDone()) { // the last placement finished running, but the next one hasn’t // started yet because of the `stillRecent` check immediately // above, so mark it stale to ensure that we request another // render frame this.placement.setStale(); } else { this.pauseablePlacement.continuePlacement(this._order, this._layers, layerTiles); if (this.pauseablePlacement.isDone()) { this.placement = this.pauseablePlacement.commit(performance.browser.now()); placementCommitted = true; } if (symbolBucketsChanged) { // since the placement gets split over multiple frames it is possible // these buckets were processed before they were changed and so the // placement is already stale while it is in progress this.pauseablePlacement.placement.setStale(); } } if (placementCommitted || symbolBucketsChanged) { for (var i$1 = 0, list$1 = this._order; i$1 < list$1.length; i$1 += 1) { var layerID$1 = list$1[i$1]; var styleLayer$1 = this._layers[layerID$1]; if (styleLayer$1.type !== 'symbol') { continue; } this.placement.updateLayerOpacities(styleLayer$1, layerTiles[styleLayer$1.source]); } } // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols var needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(performance.browser.now()); return needsRerender; }; Style.prototype._releaseSymbolFadeTiles = function _releaseSymbolFadeTiles () { for (var id in this.sourceCaches) { this.sourceCaches[id].releaseSymbolFadeTiles(); } }; // Callbacks from web workers Style.prototype.getImages = function getImages (mapId , params , callback , sourceId) { this.imageManagerFactory.getImages(params.icons, callback, sourceId); // Apply queued image changes before setting the tile's dependencies so that the tile // is not reloaded unecessarily. Without this forced update the reload could happen in cases // like this one: // - icons contains "my-image" // - imageManager.getImages(...) triggers `onstyleimagemissing` // - the user adds "my-image" within the callback // - addImage adds "my-image" to this._changedImages // - the next frame triggers a reload of this tile even though it already has the latest version this._updateTilesForChangedImages(); var sourceCache = this.sourceCaches[params.source]; if (sourceCache) { sourceCache.setDependencies(params.tileID.key, params.type, params.icons); } }; Style.prototype.getGlyphs = function getGlyphs (mapId , params , callback , sourceId) { this.glyphManagerFactory.getGlyphs(params.stacks, callback, sourceId); }; Style.prototype.getResource = function getResource (mapId , params , callback ) { return performance.makeRequest(params, callback); }; return Style; }(performance.Evented)); Style.getSourceType = getType; Style.setSourceType = setType; Style.registerForPluginStateChange = performance.registerForPluginStateChange; // var posAttributes = performance.createLayout([ {name: 'a_pos', type: 'Int16', components: 2} ]); var preludeFrag = "#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n"; var preludeVert = "#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\n// Unpack a pair of values that have been packed into a single float.\n// The packed values are assumed to be 8-bit unsigned integers, and are\n// packed like so:\n// packedValue = floor(input[0]) * 256 + input[1],\nvec2 unpack_float(const float packedValue) {\n int packedIntValue = int(packedValue);\n int v0 = packedIntValue / 256;\n return vec2(v0, packedIntValue - v0 * 256);\n}\n\nvec2 unpack_opacity(const float packedOpacity) {\n int intOpacity = int(packedOpacity) / 2;\n return vec2(float(intOpacity) / 127.0, mod(packedOpacity, 2.0));\n}\n\n// To minimize the number of attributes needed, we encode a 4-component\n// color into a pair of floats (i.e. a vec2) as follows:\n// [ floor(color.r * 255) * 256 + color.g * 255,\n// floor(color.b * 255) * 256 + color.g * 255 ]\nvec4 decode_color(const vec2 encodedColor) {\n return vec4(\n unpack_float(encodedColor[0]) / 255.0,\n unpack_float(encodedColor[1]) / 255.0\n );\n}\n\n// Unpack a pair of paint values and interpolate between them.\nfloat unpack_mix_vec2(const vec2 packedValue, const float t) {\n return mix(packedValue[0], packedValue[1], t);\n}\n\n// Unpack a pair of paint values and interpolate between them.\nvec4 unpack_mix_color(const vec4 packedColors, const float t) {\n vec4 minColor = decode_color(vec2(packedColors[0], packedColors[1]));\n vec4 maxColor = decode_color(vec2(packedColors[2], packedColors[3]));\n return mix(minColor, maxColor, t);\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n"; var backgroundFrag = "uniform vec4 u_color;\nuniform float u_opacity;\n\nvoid main() {\n gl_FragColor = u_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var backgroundVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; var backgroundPatternFrag = "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\nuniform float u_opacity;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var backgroundPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"; var circleFrag = "varying vec3 v_data;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n vec2 extrude = v_data.xy;\n float extrude_length = length(extrude);\n\n lowp float antialiasblur = v_data.z;\n float antialiased_blur = -max(blur, antialiasblur);\n\n float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n antialiased_blur,\n 0.0,\n extrude_length - radius / (radius + stroke_width)\n );\n\n gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var circleVert = "uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform bool u_pitch_with_map;\nuniform vec2 u_extrude_scale;\nuniform lowp float u_device_pixel_ratio;\nuniform highp float u_camera_to_center_distance;\n\nattribute vec2 a_pos;\n\nvarying vec3 v_data;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvoid main(void) {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n vec2 circle_center = floor(a_pos * 0.5);\n if (u_pitch_with_map) {\n vec2 corner_position = circle_center;\n if (u_scale_with_map) {\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale;\n } else {\n // Pitching the circle with the map effectively scales it with the map\n // To counteract the effect for pitch-scale: viewport, we rescale the\n // whole circle based on the pitch scaling effect at its central point\n vec4 projected_center = u_matrix * vec4(circle_center, 0, 1);\n corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance);\n }\n\n gl_Position = u_matrix * vec4(corner_position, 0, 1);\n } else {\n gl_Position = u_matrix * vec4(circle_center, 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance;\n } else {\n gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w;\n }\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n lowp float antialiasblur = 1.0 / u_device_pixel_ratio / (radius + stroke_width);\n\n v_data = vec3(extrude.x, extrude.y, antialiasblur);\n}\n"; var clippingMaskFrag = "void main() {\n gl_FragColor = vec4(1.0);\n}\n"; var clippingMaskVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; var heatmapFrag = "uniform highp float u_intensity;\n\nvarying vec2 v_extrude;\n\n#pragma mapbox: define highp float weight\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main() {\n #pragma mapbox: initialize highp float weight\n\n // Kernel density estimation with a Gaussian kernel of size 5x5\n float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude);\n float val = weight * u_intensity * GAUSS_COEF * exp(d);\n\n gl_FragColor = vec4(val, 1.0, 1.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var heatmapVert = "\nuniform mat4 u_matrix;\nuniform float u_extrude_scale;\nuniform float u_opacity;\nuniform float u_intensity;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_extrude;\n\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\n\n// Effective \"0\" in the kernel density texture to adjust the kernel size to;\n// this empirically chosen number minimizes artifacts on overlapping kernels\n// for typical heatmap cases (assuming clustered source)\nconst highp float ZERO = 1.0 / 255.0 / 16.0;\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main(void) {\n #pragma mapbox: initialize highp float weight\n #pragma mapbox: initialize mediump float radius\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n vec2 unscaled_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n // This 'extrude' comes in ranging from [-1, -1], to [1, 1]. We'll use\n // it to produce the vertices of a square mesh framing the point feature\n // we're adding to the kernel density texture. We'll also pass it as\n // a varying, so that the fragment shader can determine the distance of\n // each fragment from the point feature.\n // Before we do so, we need to scale it up sufficiently so that the\n // kernel falls effectively to zero at the edge of the mesh.\n // That is, we want to know S such that\n // weight * u_intensity * GAUSS_COEF * exp(-0.5 * 3.0^2 * S^2) == ZERO\n // Which solves to:\n // S = sqrt(-2.0 * log(ZERO / (weight * u_intensity * GAUSS_COEF))) / 3.0\n float S = sqrt(-2.0 * log(ZERO / weight / u_intensity / GAUSS_COEF)) / 3.0;\n\n // Pass the varying in units of radius\n v_extrude = S * unscaled_extrude;\n\n // Scale by radius and the zoom-based scale factor to produce actual\n // mesh position\n vec2 extrude = v_extrude * radius * u_extrude_scale;\n\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n vec4 pos = vec4(floor(a_pos * 0.5) + extrude, 0, 1);\n\n gl_Position = u_matrix * pos;\n}\n"; var heatmapTextureFrag = "uniform sampler2D u_image;\nuniform sampler2D u_color_ramp;\nuniform float u_opacity;\nvarying vec2 v_pos;\n\nvoid main() {\n float t = texture2D(u_image, v_pos).r;\n vec4 color = texture2D(u_color_ramp, vec2(t, 0.5));\n gl_FragColor = color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n"; var heatmapTextureVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n v_pos.x = a_pos.x;\n v_pos.y = 1.0 - a_pos.y;\n}\n"; var collisionBoxFrag = "\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n\n float alpha = 0.5;\n\n // Red = collision, hide label\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n // Blue = no collision, label is showing\n if (v_placed > 0.5) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n }\n\n if (v_notUsed > 0.5) {\n // This box not used, fade it out\n gl_FragColor *= .1;\n }\n}"; var collisionBoxVert = "attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\nattribute vec2 a_shift;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles\n 4.0);\n\n gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n gl_Position.xy += (a_extrude + a_shift) * u_extrude_scale * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n}\n"; var collisionCircleFrag = "varying float v_radius;\nvarying vec2 v_extrude;\nvarying float v_perspective_ratio;\nvarying float v_collision;\n\nvoid main() {\n float alpha = 0.5 * min(v_perspective_ratio, 1.0);\n float stroke_radius = 0.9 * max(v_perspective_ratio, 1.0);\n\n float distance_to_center = length(v_extrude);\n float distance_to_edge = abs(distance_to_center - v_radius);\n float opacity_t = smoothstep(-stroke_radius, 0.0, -distance_to_edge);\n\n vec4 color = mix(vec4(0.0, 0.0, 1.0, 0.5), vec4(1.0, 0.0, 0.0, 1.0), v_collision);\n\n gl_FragColor = color * alpha * opacity_t;\n}\n"; var collisionCircleVert = "attribute vec2 a_pos;\nattribute float a_radius;\nattribute vec2 a_flags;\n\nuniform mat4 u_matrix;\nuniform mat4 u_inv_matrix;\nuniform vec2 u_viewport_size;\nuniform float u_camera_to_center_distance;\n\nvarying float v_radius;\nvarying vec2 v_extrude;\nvarying float v_perspective_ratio;\nvarying float v_collision;\n\nvec3 toTilePosition(vec2 screenPos) {\n // Shoot a ray towards the ground to reconstruct the depth-value\n vec4 rayStart = u_inv_matrix * vec4(screenPos, -1.0, 1.0);\n vec4 rayEnd = u_inv_matrix * vec4(screenPos, 1.0, 1.0);\n\n rayStart.xyz /= rayStart.w;\n rayEnd.xyz /= rayEnd.w;\n\n highp float t = (0.0 - rayStart.z) / (rayEnd.z - rayStart.z);\n return mix(rayStart.xyz, rayEnd.xyz, t);\n}\n\nvoid main() {\n vec2 quadCenterPos = a_pos;\n float radius = a_radius;\n float collision = a_flags.x;\n float vertexIdx = a_flags.y;\n\n vec2 quadVertexOffset = vec2(\n mix(-1.0, 1.0, float(vertexIdx >= 2.0)),\n mix(-1.0, 1.0, float(vertexIdx >= 1.0 && vertexIdx <= 2.0)));\n\n vec2 quadVertexExtent = quadVertexOffset * radius;\n\n // Screen position of the quad might have been computed with different camera parameters.\n // Transform the point to a proper position on the current viewport\n vec3 tilePos = toTilePosition(quadCenterPos);\n vec4 clipPos = u_matrix * vec4(tilePos, 1.0);\n\n highp float camera_to_anchor_distance = clipPos.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles\n 4.0);\n\n // Apply small padding for the anti-aliasing effect to fit the quad\n // Note that v_radius and v_extrude are in screen coordinates already\n float padding_factor = 1.2;\n v_radius = radius;\n v_extrude = quadVertexExtent * padding_factor;\n v_perspective_ratio = collision_perspective_ratio;\n v_collision = collision;\n\n gl_Position = vec4(clipPos.xyz / clipPos.w, 1.0) + vec4(quadVertexExtent * padding_factor / u_viewport_size * 2.0, 0.0, 0.0);\n}\n"; var debugFrag = "uniform highp vec4 u_color;\nuniform sampler2D u_overlay;\n\nvarying vec2 v_uv;\n\nvoid main() {\n vec4 overlay_color = texture2D(u_overlay, v_uv);\n gl_FragColor = mix(u_color, overlay_color, overlay_color.a);\n}\n"; var debugVert = "attribute vec2 a_pos;\nvarying vec2 v_uv;\n\nuniform mat4 u_matrix;\nuniform float u_overlay_scale;\n\nvoid main() {\n // This vertex shader expects a EXTENT x EXTENT quad,\n // The UV co-ordinates for the overlay texture can be calculated using that knowledge\n v_uv = a_pos / 8192.0;\n gl_Position = u_matrix * vec4(a_pos * u_overlay_scale, 0, 1);\n}\n"; var fillFrag = "#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; var fillOutlineFrag = "varying vec2 v_pos;\n\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillOutlineVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"; var fillOutlinePatternFrag = "\nuniform vec2 u_texsize;\nuniform sampler2D u_image;\nuniform float u_fade;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_fade) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillOutlinePatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec3 u_scale;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"; var fillPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_fade) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec3 u_scale;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileZoomRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileZoomRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos);\n}\n"; var fillExtrusionFrag = "varying vec4 v_color;\n\nvoid main() {\n gl_FragColor = v_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillExtrusionVert = "uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize highp float base\n #pragma mapbox: initialize highp float height\n #pragma mapbox: initialize highp vec4 color\n\n vec3 normal = a_normal_ed.xyz;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (normal.y != 0.0) {\n // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0)));\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n v_color *= u_opacity;\n}\n"; var fillExtrusionPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, pattern_br_a / u_texsize, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_fade);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var fillExtrusionPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_height_factor;\nuniform vec3 u_scale;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec3 normal = a_normal_ed.xyz;\n float edgedistance = a_normal_ed.w;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (normal.y != 0.0) {\n // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0)));\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n v_lighting *= u_opacity;\n}\n"; var hillshadePrepareFrag = "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D u_image;\nvarying vec2 v_pos;\nuniform vec2 u_dimension;\nuniform float u_zoom;\nuniform vec4 u_unpack;\n\nfloat getElevation(vec2 coord, float bias) {\n // Convert encoded elevation value to meters\n vec4 data = texture2D(u_image, coord) * 255.0;\n data.a = -1.0;\n return dot(data, u_unpack) / 4.0;\n}\n\nvoid main() {\n vec2 epsilon = 1.0 / u_dimension;\n\n // queried pixels:\n // +-----------+\n // | | | |\n // | a | b | c |\n // | | | |\n // +-----------+\n // | | | |\n // | d | e | f |\n // | | | |\n // +-----------+\n // | | | |\n // | g | h | i |\n // | | | |\n // +-----------+\n\n float a = getElevation(v_pos + vec2(-epsilon.x, -epsilon.y), 0.0);\n float b = getElevation(v_pos + vec2(0, -epsilon.y), 0.0);\n float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y), 0.0);\n float d = getElevation(v_pos + vec2(-epsilon.x, 0), 0.0);\n float e = getElevation(v_pos, 0.0);\n float f = getElevation(v_pos + vec2(epsilon.x, 0), 0.0);\n float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y), 0.0);\n float h = getElevation(v_pos + vec2(0, epsilon.y), 0.0);\n float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y), 0.0);\n\n // Here we divide the x and y slopes by 8 * pixel size\n // where pixel size (aka meters/pixel) is:\n // circumference of the world / (pixels per tile * number of tiles)\n // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom))\n // which can be reduced to: pow(2, 19.25619978527 - u_zoom).\n // We want to vertically exaggerate the hillshading because otherwise\n // it is barely noticeable at low zooms. To do this, we multiply this by\n // a scale factor that is a function of zooms below 15, which is an arbitrary\n // that corresponds to the max zoom level of Mapbox terrain-RGB tiles.\n // See nickidlugash's awesome breakdown for more info:\n // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556\n\n float exaggerationFactor = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;\n float exaggeration = u_zoom < 15.0 ? (u_zoom - 15.0) * exaggerationFactor : 0.0;\n\n vec2 deriv = vec2(\n (c + f + f + i) - (a + d + d + g),\n (g + h + h + i) - (a + b + b + c)\n ) / pow(2.0, exaggeration + (19.2562 - u_zoom));\n\n gl_FragColor = clamp(vec4(\n deriv.x / 2.0 + 0.5,\n deriv.y / 2.0 + 0.5,\n 1.0,\n 1.0), 0.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var hillshadePrepareVert = "uniform mat4 u_matrix;\nuniform vec2 u_dimension;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n highp vec2 epsilon = 1.0 / u_dimension;\n float scale = (u_dimension.x - 2.0) / u_dimension.x;\n v_pos = (a_texture_pos / 8192.0) * scale + epsilon;\n}\n"; var hillshadeFrag = "uniform sampler2D u_image;\nvarying vec2 v_pos;\n\nuniform vec2 u_latrange;\nuniform vec2 u_light;\nuniform vec4 u_shadow;\nuniform vec4 u_highlight;\nuniform vec4 u_accent;\n\n#define PI 3.141592653589793\n\nvoid main() {\n vec4 pixel = texture2D(u_image, v_pos);\n\n vec2 deriv = ((pixel.rg * 2.0) - 1.0);\n\n // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude\n // to account for mercator projection distortion. see #4807 for details\n float scaleFactor = cos(radians((u_latrange[0] - u_latrange[1]) * (1.0 - v_pos.y) + u_latrange[1]));\n // We also multiply the slope by an arbitrary z-factor of 1.25\n float slope = atan(1.25 * length(deriv) / scaleFactor);\n float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0);\n\n float intensity = u_light.x;\n // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal\n // position property to account for 0deg corresponding to north/the top of the viewport in the style spec\n // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal.\n float azimuth = u_light.y + PI;\n\n // We scale the slope exponentially based on intensity, using a calculation similar to\n // the exponential interpolation function in the style spec:\n // src/style-spec/expression/definitions/interpolate.js#L217-L228\n // so that higher intensity values create more opaque hillshading.\n float base = 1.875 - intensity * 1.75;\n float maxValue = 0.5 * PI;\n float scaledSlope = intensity != 0.5 ? ((pow(base, slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope;\n\n // The accent color is calculated with the cosine of the slope while the shade color is calculated with the sine\n // so that the accent color's rate of change eases in while the shade color's eases out.\n float accent = cos(scaledSlope);\n // We multiply both the accent and shade color by a clamped intensity value\n // so that intensities >= 0.5 do not additionally affect the color values\n // while intensity values < 0.5 make the overall color more transparent.\n vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0);\n float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0);\n vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0);\n gl_FragColor = accent_color * (1.0 - shade_color.a) + shade_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var hillshadeVert = "uniform mat4 u_matrix;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = a_texture_pos / 8192.0;\n}\n"; var lineFrag = "uniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineVert = "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_units_to_pixels;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp float v_linesofar;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n\n // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n v_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0;\n\n vec2 pos = floor(a_pos_normal * 0.5);\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"; var lineGradientFrag = "uniform lowp float u_device_pixel_ratio;\nuniform sampler2D u_image;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\nvarying highp vec2 v_uv;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n // For gradient lines, v_lineprogress is the ratio along the\n // entire line, the gradient ramp is stored in a texture.\n vec4 color = texture2D(u_image, v_uv);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineGradientVert = "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\nattribute float a_uv_x;\nattribute float a_split_index;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform lowp float u_device_pixel_ratio;\nuniform vec2 u_units_to_pixels;\nuniform float u_image_height;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp vec2 v_uv;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n\n // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n highp float texel_height = 1.0 / u_image_height;\n highp float half_texel_height = 0.5 * texel_height;\n v_uv = vec2(a_uv_x, a_split_index * texel_height - half_texel_height);\n\n vec2 pos = floor(a_pos_normal * 0.5);\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"; var linePatternFrag = "uniform lowp float u_device_pixel_ratio;\r\nuniform vec2 u_texsize;\r\nuniform float u_fade;\r\nuniform mediump vec3 u_scale;\r\n\r\nuniform sampler2D u_image;\r\n\r\nvarying vec2 v_normal;\r\nvarying vec2 v_width2;\r\nvarying float v_linesofar;\r\nvarying float v_gamma_scale;\r\nvarying float v_width;\r\n\r\n#pragma mapbox: define lowp vec4 pattern_from\r\n#pragma mapbox: define lowp vec4 pattern_to\r\n#pragma mapbox: define lowp float pixel_ratio_from\r\n#pragma mapbox: define lowp float pixel_ratio_to\r\n#pragma mapbox: define lowp float blur\r\n#pragma mapbox: define lowp float opacity\r\n\r\nvoid main() {\r\n #pragma mapbox: initialize mediump vec4 pattern_from\r\n #pragma mapbox: initialize mediump vec4 pattern_to\r\n #pragma mapbox: initialize lowp float pixel_ratio_from\r\n #pragma mapbox: initialize lowp float pixel_ratio_to\r\n\r\n #pragma mapbox: initialize lowp float blur\r\n #pragma mapbox: initialize lowp float opacity\r\n\r\n vec2 pattern_tl_a = pattern_from.xy;\r\n vec2 pattern_br_a = pattern_from.zw;\r\n vec2 pattern_tl_b = pattern_to.xy;\r\n vec2 pattern_br_b = pattern_to.zw;\r\n\r\n float tileZoomRatio = u_scale.x;\r\n float fromScale = u_scale.y;\r\n float toScale = u_scale.z;\r\n\r\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\r\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\r\n\r\n vec2 pattern_size_a = vec2(display_size_a.x * fromScale / tileZoomRatio, display_size_a.y);\r\n vec2 pattern_size_b = vec2(display_size_b.x * toScale / tileZoomRatio, display_size_b.y);\r\n\r\n float aspect_a = display_size_a.y / v_width;\r\n float aspect_b = display_size_b.y / v_width;\r\n\r\n // Calculate the distance of the pixel from the line in pixels.\r\n float dist = length(v_normal) * v_width2.s;\r\n\r\n // Calculate the antialiasing fade factor. This is either when fading in\r\n // the line in case of an offset line (v_width2.t) or when fading out\r\n // (v_width2.s)\r\n float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale;\r\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\r\n\r\n float x_a = mod(v_linesofar / pattern_size_a.x * aspect_a, 1.0);\r\n float x_b = mod(v_linesofar / pattern_size_b.x * aspect_b, 1.0);\r\n\r\n float y = 0.5 * v_normal.y + 0.5;\r\n\r\n vec2 texel_size = 1.0 / u_texsize;\r\n\r\n vec2 pos_a = mix(pattern_tl_a * texel_size - texel_size, pattern_br_a * texel_size + texel_size, vec2(x_a, y));\r\n vec2 pos_b = mix(pattern_tl_b * texel_size - texel_size, pattern_br_b * texel_size + texel_size, vec2(x_b, y));\r\n\r\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\r\n\r\n gl_FragColor = color * alpha * opacity;\r\n\r\n#ifdef OVERDRAW_INSPECTOR\r\n gl_FragColor = vec4(1.0);\r\n#endif\r\n}\r\n"; var linePatternVert = "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform vec2 u_units_to_pixels;\nuniform mediump float u_ratio;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\nvarying float v_width;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n // float tileRatio = u_scale.x;\n vec2 pos = floor(a_pos_normal * 0.5);\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n v_width = floorwidth;\n}\n"; var lineSDFFrag = "\nuniform lowp float u_device_pixel_ratio;\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma / floorwidth, 0.5 + u_sdfgamma / floorwidth, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var lineSDFVert = "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform lowp float u_device_pixel_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float width\n #pragma mapbox: initialize lowp float floorwidth\n\n // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n vec2 pos = floor(a_pos_normal * 0.5);\n\n // x is 1 if it's a round cap, 0 otherwise\n // y is 1 if the normal points up, and -1 if it points down\n // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases.\n // moved them into the shader for clarity and simplicity.\n gapwidth = gapwidth / 2.0;\n float halfwidth = width / 2.0;\n offset = -1.0 * offset;\n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + (halfwidth == 0.0 ? 0.0 : ANTIALIASING);\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist =outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x / floorwidth, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x / floorwidth, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n"; var rasterFrag = "uniform float u_fade_t;\nuniform float u_opacity;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n if (color0.a > 0.0) {\n color0.rgb = color0.rgb / color0.a;\n }\n if (color1.a > 0.0) {\n color1.rgb = color1.rgb / color1.a;\n }\n vec4 color = mix(color0, color1, u_fade_t);\n color.a *= u_opacity;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var rasterVert = "uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n // We are using Int16 for texture position coordinates to give us enough precision for\n // fractional coordinates. We use 8192 to scale the texture coordinates in the buffer\n // as an arbitrarily high number to preserve adequate precision when rendering.\n // This is also the same value as the EXTENT we are using for our tile buffer pos coordinates,\n // so math for modifying either is consistent.\n v_pos0 = (((a_texture_pos / 8192.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"; var symbolIconFrag = "uniform sampler2D u_texture;\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n lowp float alpha = opacity * v_fade_opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var symbolIconVert = "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec4 a_pixeloffset;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\nuniform highp float u_camera_to_center_distance;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform float u_fade_change;\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n vec2 a_size = a_data.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n vec2 a_pxoffset = a_pixeloffset.xy;\n vec2 a_minFontScale = a_pixeloffset.zw / 256.0;\n\n highp float segment_angle = -a_projected_pos[2];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // See comments in symbol_sdf.vertex\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 4.0);\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // See comments in symbol_sdf.vertex\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * max(a_minFontScale, fontScale) + a_pxoffset / 16.0), 0.0, 1.0);\n\n v_tex = a_tex / u_texsize;\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n}\n"; var symbolSDFFrag = "#define SDF_PX 8.0\n\nuniform bool u_is_halo;\nuniform sampler2D u_texture;\nuniform highp float u_gamma_scale;\nuniform lowp float u_device_pixel_ratio;\nuniform bool u_is_text;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n float EDGE_GAMMA = 0.105 / u_device_pixel_ratio;\n\n vec2 tex = v_data0.xy;\n float gamma_scale = v_data1.x;\n float size = v_data1.y;\n float fade_opacity = v_data1[2];\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n lowp vec4 color = fill_color;\n highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale);\n lowp float buff = (256.0 - 64.0) / 256.0;\n if (u_is_halo) {\n color = halo_color;\n gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale);\n buff = (6.0 - halo_width / fontScale) / SDF_PX;\n }\n\n lowp float dist = texture2D(u_texture, tex).a;\n highp float gamma_scaled = gamma * gamma_scale;\n highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist);\n\n gl_FragColor = color * (alpha * opacity * fade_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var symbolSDFVert = "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec4 a_pixeloffset;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\n// contents of a_size vary based on the type of property value\n// used for {text,icon}-size.\n// For constants, a_size is disabled.\n// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature.\n// For composite functions:\n// [ text-size(lowerZoomStop, feature),\n// text-size(upperZoomStop, feature) ]\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_coord_matrix;\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform highp float u_camera_to_center_distance;\nuniform float u_fade_change;\nuniform vec2 u_texsize;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n vec2 a_size = a_data.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n vec2 a_pxoffset = a_pixeloffset.xy;\n\n highp float segment_angle = -a_projected_pos[2];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // If the label is pitched with the map, layout is done in pitched space,\n // which makes labels in the distance smaller relative to viewport space.\n // We counteract part of that effect by multiplying by the perspective ratio.\n // If the label isn't pitched with the map, we do layout in viewport space,\n // which makes labels in the distance larger relative to the features around\n // them. We counteract part of that effect by dividing by the perspective ratio.\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 4.0);\n\n size *= perspective_ratio;\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units\n // To figure out that angle in projected space, we draw a short horizontal line in tile\n // space, project it, and measure its angle in projected space.\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale + a_pxoffset), 0.0, 1.0);\n float gamma_scale = gl_Position.w;\n\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n\n v_data0 = a_tex / u_texsize;\n v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity);\n}\n"; var symbolTextAndIconFrag = "#define SDF_PX 8.0\n\n#define SDF 1.0\n#define ICON 0.0\n\nuniform bool u_is_halo;\nuniform sampler2D u_texture;\nuniform sampler2D u_texture_icon;\nuniform highp float u_gamma_scale;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec4 v_data0;\nvarying vec4 v_data1;\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n float fade_opacity = v_data1[2];\n\n if (v_data1.w == ICON) {\n vec2 tex_icon = v_data0.zw;\n lowp float alpha = opacity * fade_opacity;\n gl_FragColor = texture2D(u_texture_icon, tex_icon) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n return;\n }\n\n vec2 tex = v_data0.xy;\n\n float EDGE_GAMMA = 0.105 / u_device_pixel_ratio;\n\n float gamma_scale = v_data1.x;\n float size = v_data1.y;\n\n float fontScale = size / 24.0;\n\n lowp vec4 color = fill_color;\n highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale);\n lowp float buff = (256.0 - 64.0) / 256.0;\n if (u_is_halo) {\n color = halo_color;\n gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale);\n buff = (6.0 - halo_width / fontScale) / SDF_PX;\n }\n\n lowp float dist = texture2D(u_texture, tex).a;\n highp float gamma_scaled = gamma * gamma_scale;\n highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist);\n\n gl_FragColor = color * (alpha * opacity * fade_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; var symbolTextAndIconVert = "const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\n// contents of a_size vary based on the type of property value\n// used for {text,icon}-size.\n// For constants, a_size is disabled.\n// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature.\n// For composite functions:\n// [ text-size(lowerZoomStop, feature),\n// text-size(upperZoomStop, feature) ]\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_coord_matrix;\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform highp float u_camera_to_center_distance;\nuniform float u_fade_change;\nuniform vec2 u_texsize;\nuniform vec2 u_texsize_icon;\n\nvarying vec4 v_data0;\nvarying vec4 v_data1;\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n vec2 a_size = a_data.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n float is_sdf = a_size[0] - 2.0 * a_size_min;\n\n highp float segment_angle = -a_projected_pos[2];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n highp float camera_to_anchor_distance = projectedPoint.w;\n // If the label is pitched with the map, layout is done in pitched space,\n // which makes labels in the distance smaller relative to viewport space.\n // We counteract part of that effect by multiplying by the perspective ratio.\n // If the label isn't pitched with the map, we do layout in viewport space,\n // which makes labels in the distance larger relative to the features around\n // them. We counteract part of that effect by dividing by the perspective ratio.\n highp float distance_ratio = u_pitch_with_map ?\n camera_to_anchor_distance / u_camera_to_center_distance :\n u_camera_to_center_distance / camera_to_anchor_distance;\n highp float perspective_ratio = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 4.0);\n\n size *= perspective_ratio;\n\n float fontScale = size / 24.0;\n\n highp float symbol_rotation = 0.0;\n if (u_rotate_symbol) {\n // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units\n // To figure out that angle in projected space, we draw a short horizontal line in tile\n // space, project it, and measure its angle in projected space.\n vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projectedPoint.xy / projectedPoint.w;\n vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n highp float angle_sin = sin(segment_angle + symbol_rotation);\n highp float angle_cos = cos(segment_angle + symbol_rotation);\n mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n gl_Position = u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0);\n float gamma_scale = gl_Position.w;\n\n vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n\n v_data0.xy = a_tex / u_texsize;\n v_data0.zw = a_tex / u_texsize_icon;\n v_data1 = vec4(gamma_scale, size, interpolated_fade_opacity, is_sdf);\n}\n"; var prelude = compile(preludeFrag, preludeVert); var background = compile(backgroundFrag, backgroundVert); var backgroundPattern = compile(backgroundPatternFrag, backgroundPatternVert); var circle = compile(circleFrag, circleVert); var clippingMask = compile(clippingMaskFrag, clippingMaskVert); var heatmap = compile(heatmapFrag, heatmapVert); var heatmapTexture = compile(heatmapTextureFrag, heatmapTextureVert); var collisionBox = compile(collisionBoxFrag, collisionBoxVert); var collisionCircle = compile(collisionCircleFrag, collisionCircleVert); var debug = compile(debugFrag, debugVert); var fill = compile(fillFrag, fillVert); var fillOutline = compile(fillOutlineFrag, fillOutlineVert); var fillOutlinePattern = compile(fillOutlinePatternFrag, fillOutlinePatternVert); var fillPattern = compile(fillPatternFrag, fillPatternVert); var fillExtrusion = compile(fillExtrusionFrag, fillExtrusionVert); var fillExtrusionPattern = compile(fillExtrusionPatternFrag, fillExtrusionPatternVert); var hillshadePrepare = compile(hillshadePrepareFrag, hillshadePrepareVert); var hillshade = compile(hillshadeFrag, hillshadeVert); var line = compile(lineFrag, lineVert); var lineGradient = compile(lineGradientFrag, lineGradientVert); var linePattern = compile(linePatternFrag, linePatternVert); var lineSDF = compile(lineSDFFrag, lineSDFVert); var raster = compile(rasterFrag, rasterVert); var symbolIcon = compile(symbolIconFrag, symbolIconVert); var symbolSDF = compile(symbolSDFFrag, symbolSDFVert); var symbolTextAndIcon = compile(symbolTextAndIconFrag, symbolTextAndIconVert); // Expand #pragmas to #ifdefs. function compile(fragmentSource, vertexSource) { var re = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g; var staticAttributes = vertexSource.match(/attribute ([\w]+) ([\w]+)/g); var fragmentUniforms = fragmentSource.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g); var vertexUniforms = vertexSource.match(/uniform ([\w]+) ([\w]+)([\s]*)([\w]*)/g); var staticUniforms = vertexUniforms ? vertexUniforms.concat(fragmentUniforms) : fragmentUniforms; var fragmentPragmas = {}; fragmentSource = fragmentSource.replace(re, function (match, operation, precision, type, name) { fragmentPragmas[name] = true; if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { return ("\n#ifdef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } }); vertexSource = vertexSource.replace(re, function (match, operation, precision, type, name) { var attrType = type === 'float' ? 'vec2' : 'vec4'; var unpackType = name.match(/color/) ? 'color' : attrType; if (fragmentPragmas[name]) { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float u_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\nvarying " + precision + " " + type + " " + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { if (unpackType === 'vec4') { // vec4 attributes are only used for cross-faded properties, and are not packed return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + name + " = a_" + name + ";\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } else { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + name + " = unpack_mix_" + unpackType + "(a_" + name + ", u_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } } else { if (operation === 'define') { return ("\n#ifndef HAS_UNIFORM_u_" + name + "\nuniform lowp float u_" + name + "_t;\nattribute " + precision + " " + attrType + " a_" + name + ";\n#else\nuniform " + precision + " " + type + " u_" + name + ";\n#endif\n"); } else /* if (operation === 'initialize') */ { if (unpackType === 'vec4') { // vec4 attributes are only used for cross-faded properties, and are not packed return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = a_" + name + ";\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } else /* */{ return ("\n#ifndef HAS_UNIFORM_u_" + name + "\n " + precision + " " + type + " " + name + " = unpack_mix_" + unpackType + "(a_" + name + ", u_" + name + "_t);\n#else\n " + precision + " " + type + " " + name + " = u_" + name + ";\n#endif\n"); } } } }); return {fragmentSource: fragmentSource, vertexSource: vertexSource, staticAttributes: staticAttributes, staticUniforms: staticUniforms}; } var shaders = /*#__PURE__*/Object.freeze({ __proto__: null, prelude: prelude, background: background, backgroundPattern: backgroundPattern, circle: circle, clippingMask: clippingMask, heatmap: heatmap, heatmapTexture: heatmapTexture, collisionBox: collisionBox, collisionCircle: collisionCircle, debug: debug, fill: fill, fillOutline: fillOutline, fillOutlinePattern: fillOutlinePattern, fillPattern: fillPattern, fillExtrusion: fillExtrusion, fillExtrusionPattern: fillExtrusionPattern, hillshadePrepare: hillshadePrepare, hillshade: hillshade, line: line, lineGradient: lineGradient, linePattern: linePattern, lineSDF: lineSDF, raster: raster, symbolIcon: symbolIcon, symbolSDF: symbolSDF, symbolTextAndIcon: symbolTextAndIcon }); // var VertexArrayObject = function VertexArrayObject() { this.boundProgram = null; this.boundLayoutVertexBuffer = null; this.boundPaintVertexBuffers = []; this.boundIndexBuffer = null; this.boundVertexOffset = null; this.boundDynamicVertexBuffer = null; this.vao = null; }; VertexArrayObject.prototype.bind = function bind (context , program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { this.context = context; var paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length; for (var i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) { if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) { paintBuffersDiffer = true; } } var isFreshBindRequired = ( !this.vao || this.boundProgram !== program || this.boundLayoutVertexBuffer !== layoutVertexBuffer || paintBuffersDiffer || this.boundIndexBuffer !== indexBuffer || this.boundVertexOffset !== vertexOffset || this.boundDynamicVertexBuffer !== dynamicVertexBuffer || this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2 ); if (!context.extVertexArrayObject || isFreshBindRequired) { this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2); } else { context.bindVertexArrayOES.set(this.vao); if (dynamicVertexBuffer) { // The buffer may have been updated. Rebind to upload data. dynamicVertexBuffer.bind(); } if (indexBuffer && indexBuffer.dynamicDraw) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); } } }; VertexArrayObject.prototype.freshBind = function freshBind (program , layoutVertexBuffer , paintVertexBuffers , indexBuffer , vertexOffset , dynamicVertexBuffer , dynamicVertexBuffer2 ) { var numPrevAttributes; var numNextAttributes = program.numAttributes; var context = this.context; var gl = context.gl; if (context.extVertexArrayObject) { if (this.vao) { this.destroy(); } this.vao = context.extVertexArrayObject.createVertexArrayOES(); context.bindVertexArrayOES.set(this.vao); numPrevAttributes = 0; // store the arguments so that we can verify them when the vao is bound again this.boundProgram = program; this.boundLayoutVertexBuffer = layoutVertexBuffer; this.boundPaintVertexBuffers = paintVertexBuffers; this.boundIndexBuffer = indexBuffer; this.boundVertexOffset = vertexOffset; this.boundDynamicVertexBuffer = dynamicVertexBuffer; this.boundDynamicVertexBuffer2 = dynamicVertexBuffer2; } else { numPrevAttributes = context.currentNumAttributes || 0; // Disable all attributes from the previous program that aren't used in // the new program. Note: attribute indices are *not* program specific! for (var i = numNextAttributes; i < numPrevAttributes; i++) { // WebGL breaks if you disable attribute 0. // http://stackoverflow.com/questions/20305231 performance.assert(i !== 0); gl.disableVertexAttribArray(i); } } layoutVertexBuffer.enableAttributes(gl, program); for (var i$1 = 0, list = paintVertexBuffers; i$1 < list.length; i$1 += 1) { var vertexBuffer = list[i$1]; vertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer) { dynamicVertexBuffer.enableAttributes(gl, program); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.enableAttributes(gl, program); } layoutVertexBuffer.bind(); layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); for (var i$2 = 0, list$1 = paintVertexBuffers; i$2 < list$1.length; i$2 += 1) { var vertexBuffer$1 = list$1[i$2]; vertexBuffer$1.bind(); vertexBuffer$1.setVertexAttribPointers(gl, program, vertexOffset); } if (dynamicVertexBuffer) { dynamicVertexBuffer.bind(); dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); } if (indexBuffer) { indexBuffer.bind(); } if (dynamicVertexBuffer2) { dynamicVertexBuffer2.bind(); dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); } context.currentNumAttributes = numNextAttributes; }; VertexArrayObject.prototype.destroy = function destroy () { if (this.vao) { this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao); this.vao = null; } }; // function getTokenizedAttributesAndUniforms (array ) { var result = []; for (var i = 0; i < array.length; i++) { if (array[i] === null) { continue; } var token = array[i].split(' '); result.push(token.pop()); } return result; } var Program$1 = function Program(context , name , source , configuration , fixedUniforms , showOverdrawInspector ) { var gl = context.gl; this.program = gl.createProgram(); var staticAttrInfo = getTokenizedAttributesAndUniforms(source.staticAttributes); var dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : []; var allAttrInfo = staticAttrInfo.concat(dynamicAttrInfo); var staticUniformsInfo = source.staticUniforms ? getTokenizedAttributesAndUniforms(source.staticUniforms) : []; var dynamicUniformsInfo = configuration ? configuration.getBinderUniforms() : []; // remove duplicate uniforms var uniformList = staticUniformsInfo.concat(dynamicUniformsInfo); var allUniformsInfo = []; for (var i$1 = 0, list = uniformList; i$1 < list.length; i$1 += 1) { var uniform = list[i$1]; if (allUniformsInfo.indexOf(uniform) < 0) { allUniformsInfo.push(uniform); } } var defines = configuration ? configuration.defines() : []; if (showOverdrawInspector) { defines.push('#define OVERDRAW_INSPECTOR;'); } var fragmentSource = defines.concat(prelude.fragmentSource, source.fragmentSource).join('\n'); var vertexSource = defines.concat(prelude.vertexSource, source.vertexSource).join('\n'); var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); if (gl.isContextLost()) { this.failedToCreate = true; return; } gl.shaderSource(fragmentShader, fragmentSource); gl.compileShader(fragmentShader); performance.assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(fragmentShader) )); gl.attachShader(this.program, fragmentShader); var vertexShader = gl.createShader(gl.VERTEX_SHADER); if (gl.isContextLost()) { this.failedToCreate = true; return; } gl.shaderSource(vertexShader, vertexSource); gl.compileShader(vertexShader); performance.assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(vertexShader) )); gl.attachShader(this.program, vertexShader); this.attributes = {}; var uniformLocations = {}; this.numAttributes = allAttrInfo.length; for (var i = 0; i < this.numAttributes; i++) { if (allAttrInfo[i]) { gl.bindAttribLocation(this.program, i, allAttrInfo[i]); this.attributes[allAttrInfo[i]] = i; } } gl.linkProgram(this.program); performance.assert(gl.getProgramParameter(this.program, gl.LINK_STATUS), (gl.getProgramInfoLog(this.program) )); gl.deleteShader(vertexShader); gl.deleteShader(fragmentShader); for (var it = 0; it < allUniformsInfo.length; it++) { var uniform$1 = allUniformsInfo[it]; if (uniform$1 && !uniformLocations[uniform$1]) { var uniformLocation = gl.getUniformLocation(this.program, uniform$1); if (uniformLocation) { uniformLocations[uniform$1] = uniformLocation; } } } this.fixedUniforms = fixedUniforms(context, uniformLocations); this.binderUniforms = configuration ? configuration.getUniforms(context, uniformLocations) : []; }; Program$1.prototype.draw = function draw (context , drawMode , depthMode , stencilMode , colorMode , cullFaceMode , uniformValues , layerID , layoutVertexBuffer , indexBuffer , segments , currentProperties , zoom , configuration , dynamicLayoutBuffer , dynamicLayoutBuffer2 ) { var obj; var gl = context.gl; if (this.failedToCreate) { return; } context.program.set(this.program); context.setDepthMode(depthMode); context.setStencilMode(stencilMode); context.setColorMode(colorMode); context.setCullFace(cullFaceMode); for (var name in this.fixedUniforms) { this.fixedUniforms[name].set(uniformValues[name]); } if (configuration) { configuration.setUniforms(context, this.binderUniforms, currentProperties, {zoom: (zoom )}); } var primitiveSize = ( obj = {}, obj[gl.LINES] = 2, obj[gl.TRIANGLES] = 3, obj[gl.LINE_STRIP] = 1, obj )[drawMode]; for (var i = 0, list = segments.get(); i < list.length; i += 1) { var segment = list[i]; var vaos = segment.vaos || (segment.vaos = {}); var vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); vao.bind( context, this, layoutVertexBuffer, configuration ? configuration.getPaintVertexBuffers() : [], indexBuffer, segment.vertexOffset, dynamicLayoutBuffer, dynamicLayoutBuffer2 ); gl.drawElements( drawMode, segment.primitiveLength * primitiveSize, gl.UNSIGNED_SHORT, segment.primitiveOffset * primitiveSize * 2); } }; // function patternUniformValues(crossfade , painter , tile ) { var tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom); var numTiles = Math.pow(2, tile.tileID.overscaledZ); var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; var pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); var pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; return { 'u_image': 0, 'u_texsize': tile.imageAtlasTexture.size, 'u_scale': [tileRatio, crossfade.fromScale, crossfade.toScale], 'u_fade': crossfade.t, // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] }; } function bgPatternUniformValues(image , crossfade , painter , tile ) { var imagePosA = painter.imageManagerFactory.getPattern(image.from.toString()); var imagePosB = painter.imageManagerFactory.getPattern(image.to.toString()); performance.assert(imagePosA && imagePosB); var ref = painter.imageManagerFactory.getPixelSize(); var width = ref.width; var height = ref.height; var numTiles = Math.pow(2, tile.tileID.overscaledZ); var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; var pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); var pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; return { 'u_image': 0, 'u_pattern_tl_a': (imagePosA ).tl, 'u_pattern_br_a': (imagePosA ).br, 'u_pattern_tl_b': (imagePosB ).tl, 'u_pattern_br_b': (imagePosB ).br, 'u_texsize': [width, height], 'u_mix': crossfade.t, 'u_pattern_size_a': (imagePosA ).displaySize, 'u_pattern_size_b': (imagePosB ).displaySize, 'u_scale_a': crossfade.fromScale, 'u_scale_b': crossfade.toScale, 'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom), // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] }; } // var fillExtrusionUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_lightpos': new performance.Uniform3f(context, locations.u_lightpos), 'u_lightintensity': new performance.Uniform1f(context, locations.u_lightintensity), 'u_lightcolor': new performance.Uniform3f(context, locations.u_lightcolor), 'u_vertical_gradient': new performance.Uniform1f(context, locations.u_vertical_gradient), 'u_opacity': new performance.Uniform1f(context, locations.u_opacity) }); }; var fillExtrusionPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_lightpos': new performance.Uniform3f(context, locations.u_lightpos), 'u_lightintensity': new performance.Uniform1f(context, locations.u_lightintensity), 'u_lightcolor': new performance.Uniform3f(context, locations.u_lightcolor), 'u_vertical_gradient': new performance.Uniform1f(context, locations.u_vertical_gradient), 'u_height_factor': new performance.Uniform1f(context, locations.u_height_factor), // pattern uniforms 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new performance.Uniform3f(context, locations.u_scale), 'u_fade': new performance.Uniform1f(context, locations.u_fade), 'u_opacity': new performance.Uniform1f(context, locations.u_opacity) }); }; var fillExtrusionUniformValues = function ( matrix , painter , shouldUseVerticalGradient , opacity ) { var light = painter.style.light; var _lp = light.properties.get('position'); var lightPos = [_lp.x, _lp.y, _lp.z]; var lightMat = performance.create$1(); if (light.properties.get('anchor') === 'viewport') { performance.fromRotation(lightMat, -painter.transform.angle); } performance.transformMat3(lightPos, lightPos, lightMat); var lightColor = light.properties.get('color'); return { 'u_matrix': matrix, 'u_lightpos': lightPos, 'u_lightintensity': light.properties.get('intensity'), 'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b], 'u_vertical_gradient': +shouldUseVerticalGradient, 'u_opacity': opacity }; }; var fillExtrusionPatternUniformValues = function ( matrix , painter , shouldUseVerticalGradient , opacity , coord , crossfade , tile ) { return performance.extend(fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity), patternUniformValues(crossfade, painter, tile), { 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8 }); }; // var fillUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix) }); }; var fillPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new performance.Uniform3f(context, locations.u_scale), 'u_fade': new performance.Uniform1f(context, locations.u_fade) }); }; var fillOutlineUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_world': new performance.Uniform2f(context, locations.u_world) }); }; var fillOutlinePatternUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_world': new performance.Uniform2f(context, locations.u_world), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower), 'u_scale': new performance.Uniform3f(context, locations.u_scale), 'u_fade': new performance.Uniform1f(context, locations.u_fade) }); }; var fillUniformValues = function (matrix ) { return ({ 'u_matrix': matrix }); }; var fillPatternUniformValues = function ( matrix , painter , crossfade , tile ) { return performance.extend( fillUniformValues(matrix), patternUniformValues(crossfade, painter, tile) ); }; var fillOutlineUniformValues = function ( matrix , drawingBufferSize ) { return ({ 'u_matrix': matrix, 'u_world': drawingBufferSize }); }; var fillOutlinePatternUniformValues = function ( matrix , painter , crossfade , tile , drawingBufferSize ) { return performance.extend( fillPatternUniformValues(matrix, painter, crossfade, tile), { 'u_world': drawingBufferSize } ); }; // var circleUniforms = function (context , locations ) { return ({ 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance), 'u_scale_with_map': new performance.Uniform1i(context, locations.u_scale_with_map), 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map), 'u_extrude_scale': new performance.Uniform2f(context, locations.u_extrude_scale), 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio), 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix) }); }; var circleUniformValues = function ( painter , coord , tile , layer ) { var transform = painter.transform; var pitchWithMap , extrudeScale ; if (layer.paint.get('circle-pitch-alignment') === 'map') { var pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom); pitchWithMap = true; extrudeScale = [pixelRatio, pixelRatio]; } else { pitchWithMap = false; extrudeScale = transform.pixelsToGLUnits; } return { 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_scale_with_map': +(layer.paint.get('circle-pitch-scale') === 'map'), 'u_matrix': painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('circle-translate'), layer.paint.get('circle-translate-anchor')), 'u_pitch_with_map': +(pitchWithMap), 'u_device_pixel_ratio': performance.browser.devicePixelRatio, 'u_extrude_scale': extrudeScale }; }; // var collisionUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pixels_to_tile_units': new performance.Uniform1f(context, locations.u_pixels_to_tile_units), 'u_extrude_scale': new performance.Uniform2f(context, locations.u_extrude_scale), 'u_overscale_factor': new performance.Uniform1f(context, locations.u_overscale_factor) }); }; var collisionCircleUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_inv_matrix': new performance.UniformMatrix4f(context, locations.u_inv_matrix), 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance), 'u_viewport_size': new performance.Uniform2f(context, locations.u_viewport_size) }); }; var collisionUniformValues = function ( matrix , transform , tile ) { var pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom); var scale = Math.pow(2, transform.zoom - tile.tileID.overscaledZ); var overscaleFactor = tile.tileID.overscaleFactor(); return { 'u_matrix': matrix, 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_pixels_to_tile_units': pixelRatio, 'u_extrude_scale': [transform.pixelsToGLUnits[0] / (pixelRatio * scale), transform.pixelsToGLUnits[1] / (pixelRatio * scale)], 'u_overscale_factor': overscaleFactor }; }; var collisionCircleUniformValues = function ( matrix , invMatrix , transform ) { return { 'u_matrix': matrix, 'u_inv_matrix': invMatrix, 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_viewport_size': [transform.width, transform.height] }; }; // var debugUniforms = function (context , locations ) { return ({ 'u_color': new performance.UniformColor(context, locations.u_color), 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_overlay': new performance.Uniform1i(context, locations.u_overlay), 'u_overlay_scale': new performance.Uniform1f(context, locations.u_overlay_scale), }); }; var debugUniformValues = function (matrix , color , scaleRatio) { if ( scaleRatio === void 0 ) scaleRatio = 1; return ({ 'u_matrix': matrix, 'u_color': color, 'u_overlay': 0, 'u_overlay_scale': scaleRatio }); }; // var clippingMaskUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix) }); }; var clippingMaskUniformValues = function (matrix ) { return ({ 'u_matrix': matrix }); }; // var heatmapUniforms = function (context , locations ) { return ({ 'u_extrude_scale': new performance.Uniform1f(context, locations.u_extrude_scale), 'u_intensity': new performance.Uniform1f(context, locations.u_intensity), 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix) }); }; var heatmapTextureUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_world': new performance.Uniform2f(context, locations.u_world), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_color_ramp': new performance.Uniform1i(context, locations.u_color_ramp), 'u_opacity': new performance.Uniform1f(context, locations.u_opacity) }); }; var heatmapUniformValues = function ( matrix , tile , zoom , intensity ) { return ({ 'u_matrix': matrix, 'u_extrude_scale': pixelsToTileUnits(tile, 1, zoom), 'u_intensity': intensity }); }; var heatmapTextureUniformValues = function ( painter , layer , textureUnit , colorRampUnit ) { var matrix = performance.create(); performance.ortho(matrix, 0, painter.width, painter.height, 0, 0, 1); var gl = painter.context.gl; return { 'u_matrix': matrix, 'u_world': [gl.drawingBufferWidth, gl.drawingBufferHeight], 'u_image': textureUnit, 'u_color_ramp': colorRampUnit, 'u_opacity': layer.paint.get('heatmap-opacity') }; }; // var hillshadeUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_latrange': new performance.Uniform2f(context, locations.u_latrange), 'u_light': new performance.Uniform2f(context, locations.u_light), 'u_shadow': new performance.UniformColor(context, locations.u_shadow), 'u_highlight': new performance.UniformColor(context, locations.u_highlight), 'u_accent': new performance.UniformColor(context, locations.u_accent) }); }; var hillshadePrepareUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_dimension': new performance.Uniform2f(context, locations.u_dimension), 'u_zoom': new performance.Uniform1f(context, locations.u_zoom), 'u_unpack': new performance.Uniform4f(context, locations.u_unpack) }); }; var hillshadeUniformValues = function ( painter , tile , layer ) { var shadow = layer.paint.get("hillshade-shadow-color"); var highlight = layer.paint.get("hillshade-highlight-color"); var accent = layer.paint.get("hillshade-accent-color"); var azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180); // modify azimuthal angle by map rotation if light is anchored at the viewport if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') { azimuthal -= painter.transform.angle; } var align = !painter.options.moving; return { 'u_matrix': painter.transform.calculatePosMatrix(tile.tileID.toUnwrapped(), align), 'u_image': 0, 'u_latrange': getTileLatRange(painter, tile.tileID), 'u_light': [layer.paint.get('hillshade-exaggeration'), azimuthal], 'u_shadow': shadow, 'u_highlight': highlight, 'u_accent': accent }; }; var hillshadeUniformPrepareValues = function ( tileID , dem ) { var stride = dem.stride; var matrix = performance.create(); // Flip rendering at y axis. performance.ortho(matrix, 0, performance.EXTENT, -performance.EXTENT, 0, 0, 1); performance.translate(matrix, matrix, [0, -performance.EXTENT, 0]); return { 'u_matrix': matrix, 'u_image': 1, 'u_dimension': [stride, stride], 'u_zoom': tileID.overscaledZ, 'u_unpack': dem.getUnpackVector() }; }; function getTileLatRange(painter , tileID ) { // for scaling the magnitude of a points slope by its latitude var tilesAtZoom = Math.pow(2, tileID.canonical.z); var y = tileID.canonical.y; return [ new performance.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat, new performance.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat]; } // var lineUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new performance.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio), 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels) }); }; var lineGradientUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new performance.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio), 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_image_height': new performance.Uniform1f(context, locations.u_image_height), }); }; var linePatternUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_ratio': new performance.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels), 'u_scale': new performance.Uniform3f(context, locations.u_scale), 'u_fade': new performance.Uniform1f(context, locations.u_fade) }); }; var lineSDFUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_ratio': new performance.Uniform1f(context, locations.u_ratio), 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio), 'u_units_to_pixels': new performance.Uniform2f(context, locations.u_units_to_pixels), 'u_patternscale_a': new performance.Uniform2f(context, locations.u_patternscale_a), 'u_patternscale_b': new performance.Uniform2f(context, locations.u_patternscale_b), 'u_sdfgamma': new performance.Uniform1f(context, locations.u_sdfgamma), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_tex_y_a': new performance.Uniform1f(context, locations.u_tex_y_a), 'u_tex_y_b': new performance.Uniform1f(context, locations.u_tex_y_b), 'u_mix': new performance.Uniform1f(context, locations.u_mix) }); }; var lineUniformValues = function ( painter , tile , layer ) { var transform = painter.transform; return { 'u_matrix': calculateMatrix(painter, tile, layer), 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), 'u_device_pixel_ratio': performance.browser.devicePixelRatio, 'u_units_to_pixels': [ 1 / transform.pixelsToGLUnits[0], 1 / transform.pixelsToGLUnits[1] ] }; }; var lineGradientUniformValues = function ( painter , tile , layer , imageHeight ) { return performance.extend(lineUniformValues(painter, tile, layer), { 'u_image': 0, 'u_image_height': imageHeight, }); }; var linePatternUniformValues = function ( painter , tile , layer , crossfade ) { var transform = painter.transform; var tileZoomRatio = calculateTileRatio(tile, transform); return { 'u_matrix': calculateMatrix(painter, tile, layer), 'u_texsize': tile.imageAtlasTexture.size, // camera zoom ratio 'u_ratio': 1 / pixelsToTileUnits(tile, 1, transform.zoom), 'u_device_pixel_ratio': performance.browser.devicePixelRatio, 'u_image': 0, 'u_scale': [tileZoomRatio, crossfade.fromScale, crossfade.toScale], 'u_fade': crossfade.t, 'u_units_to_pixels': [ 1 / transform.pixelsToGLUnits[0], 1 / transform.pixelsToGLUnits[1] ] }; }; var lineSDFUniformValues = function ( painter , tile , layer , dasharray , crossfade ) { var transform = painter.transform; var lineAtlas = painter.lineAtlas; var tileRatio = calculateTileRatio(tile, transform); var round = layer.layout.get('line-cap') === 'round'; var posA = lineAtlas.getDash(dasharray.from, round); var posB = lineAtlas.getDash(dasharray.to, round); var widthA = posA.width * crossfade.fromScale; var widthB = posB.width * crossfade.toScale; return performance.extend(lineUniformValues(painter, tile, layer), { 'u_patternscale_a': [tileRatio / widthA, -posA.height / 2], 'u_patternscale_b': [tileRatio / widthB, -posB.height / 2], 'u_sdfgamma': lineAtlas.width / (Math.min(widthA, widthB) * 256 * performance.browser.devicePixelRatio) / 2, 'u_image': 0, 'u_tex_y_a': posA.y, 'u_tex_y_b': posB.y, 'u_mix': crossfade.t }); }; function calculateTileRatio(tile , transform ) { return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom); } function calculateMatrix(painter, tile, layer) { return painter.translatePosMatrix( tile.tileID.posMatrix, tile, layer.paint.get('line-translate'), layer.paint.get('line-translate-anchor') ); } // var rasterUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_tl_parent': new performance.Uniform2f(context, locations.u_tl_parent), 'u_scale_parent': new performance.Uniform1f(context, locations.u_scale_parent), 'u_buffer_scale': new performance.Uniform1f(context, locations.u_buffer_scale), 'u_fade_t': new performance.Uniform1f(context, locations.u_fade_t), 'u_opacity': new performance.Uniform1f(context, locations.u_opacity), 'u_image0': new performance.Uniform1i(context, locations.u_image0), 'u_image1': new performance.Uniform1i(context, locations.u_image1), 'u_brightness_low': new performance.Uniform1f(context, locations.u_brightness_low), 'u_brightness_high': new performance.Uniform1f(context, locations.u_brightness_high), 'u_saturation_factor': new performance.Uniform1f(context, locations.u_saturation_factor), 'u_contrast_factor': new performance.Uniform1f(context, locations.u_contrast_factor), 'u_spin_weights': new performance.Uniform3f(context, locations.u_spin_weights) }); }; var rasterUniformValues = function ( matrix , parentTL , parentScaleBy , fade , layer ) { return ({ 'u_matrix': matrix, 'u_tl_parent': parentTL, 'u_scale_parent': parentScaleBy, 'u_buffer_scale': 1, 'u_fade_t': fade.mix, 'u_opacity': fade.opacity * layer.paint.get('raster-opacity'), 'u_image0': 0, 'u_image1': 1, 'u_brightness_low': layer.paint.get('raster-brightness-min'), 'u_brightness_high': layer.paint.get('raster-brightness-max'), 'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')), 'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')), 'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate')) }); }; function spinWeights(angle) { angle *= Math.PI / 180; var s = Math.sin(angle); var c = Math.cos(angle); return [ (2 * c + 1) / 3, (-Math.sqrt(3) * s - c + 1) / 3, (Math.sqrt(3) * s - c + 1) / 3 ]; } function contrastFactor(contrast) { return contrast > 0 ? 1 / (1 - contrast) : 1 + contrast; } function saturationFactor(saturation) { return saturation > 0 ? 1 - 1 / (1.001 - saturation) : -saturation; } // var symbolIconUniforms = function (context , locations ) { return ({ 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant), 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant), 'u_size_t': new performance.Uniform1f(context, locations.u_size_t), 'u_size': new performance.Uniform1f(context, locations.u_size), 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pitch': new performance.Uniform1f(context, locations.u_pitch), 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol), 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio), 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change), 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix), 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix), 'u_is_text': new performance.Uniform1i(context, locations.u_is_text), 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_texture': new performance.Uniform1i(context, locations.u_texture) }); }; var symbolSDFUniforms = function (context , locations ) { return ({ 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant), 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant), 'u_size_t': new performance.Uniform1f(context, locations.u_size_t), 'u_size': new performance.Uniform1f(context, locations.u_size), 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pitch': new performance.Uniform1f(context, locations.u_pitch), 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol), 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio), 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change), 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix), 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix), 'u_is_text': new performance.Uniform1i(context, locations.u_is_text), 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_texture': new performance.Uniform1i(context, locations.u_texture), 'u_gamma_scale': new performance.Uniform1f(context, locations.u_gamma_scale), 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio), 'u_is_halo': new performance.Uniform1i(context, locations.u_is_halo) }); }; var symbolTextAndIconUniforms = function (context , locations ) { return ({ 'u_is_size_zoom_constant': new performance.Uniform1i(context, locations.u_is_size_zoom_constant), 'u_is_size_feature_constant': new performance.Uniform1i(context, locations.u_is_size_feature_constant), 'u_size_t': new performance.Uniform1f(context, locations.u_size_t), 'u_size': new performance.Uniform1f(context, locations.u_size), 'u_camera_to_center_distance': new performance.Uniform1f(context, locations.u_camera_to_center_distance), 'u_pitch': new performance.Uniform1f(context, locations.u_pitch), 'u_rotate_symbol': new performance.Uniform1i(context, locations.u_rotate_symbol), 'u_aspect_ratio': new performance.Uniform1f(context, locations.u_aspect_ratio), 'u_fade_change': new performance.Uniform1f(context, locations.u_fade_change), 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_label_plane_matrix': new performance.UniformMatrix4f(context, locations.u_label_plane_matrix), 'u_coord_matrix': new performance.UniformMatrix4f(context, locations.u_coord_matrix), 'u_is_text': new performance.Uniform1i(context, locations.u_is_text), 'u_pitch_with_map': new performance.Uniform1i(context, locations.u_pitch_with_map), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_texsize_icon': new performance.Uniform2f(context, locations.u_texsize_icon), 'u_texture': new performance.Uniform1i(context, locations.u_texture), 'u_texture_icon': new performance.Uniform1i(context, locations.u_texture_icon), 'u_gamma_scale': new performance.Uniform1f(context, locations.u_gamma_scale), 'u_device_pixel_ratio': new performance.Uniform1f(context, locations.u_device_pixel_ratio), 'u_is_halo': new performance.Uniform1i(context, locations.u_is_halo) }); }; var symbolIconUniformValues = function ( functionType , size , rotateInShader , pitchWithMap , painter , matrix , labelPlaneMatrix , glCoordMatrix , isText , texSize ) { var transform = painter.transform; return { 'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'), 'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'), 'u_size_t': size ? size.uSizeT : 0, 'u_size': size ? size.uSize : 0, 'u_camera_to_center_distance': transform.cameraToCenterDistance, 'u_pitch': transform.pitch / 360 * 2 * Math.PI, 'u_rotate_symbol': +rotateInShader, 'u_aspect_ratio': transform.width / transform.height, 'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1, 'u_matrix': matrix, 'u_label_plane_matrix': labelPlaneMatrix, 'u_coord_matrix': glCoordMatrix, 'u_is_text': +isText, 'u_pitch_with_map': +pitchWithMap, 'u_texsize': texSize, 'u_texture': 0 }; }; var symbolSDFUniformValues = function ( functionType , size , rotateInShader , pitchWithMap , painter , matrix , labelPlaneMatrix , glCoordMatrix , isText , texSize , isHalo ) { var transform = painter.transform; return performance.extend(symbolIconUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, texSize), { 'u_gamma_scale': (pitchWithMap ? Math.cos(transform._pitch) * transform.cameraToCenterDistance : 1), 'u_device_pixel_ratio': performance.browser.devicePixelRatio, 'u_is_halo': +isHalo }); }; var symbolTextAndIconUniformValues = function ( functionType , size , rotateInShader , pitchWithMap , painter , matrix , labelPlaneMatrix , glCoordMatrix , texSizeSDF , texSizeIcon ) { return performance.extend(symbolSDFUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, true, texSizeSDF, true), { 'u_texsize_icon': texSizeIcon, 'u_texture_icon': 1 }); }; // var backgroundUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_opacity': new performance.Uniform1f(context, locations.u_opacity), 'u_color': new performance.UniformColor(context, locations.u_color) }); }; var backgroundPatternUniforms = function (context , locations ) { return ({ 'u_matrix': new performance.UniformMatrix4f(context, locations.u_matrix), 'u_opacity': new performance.Uniform1f(context, locations.u_opacity), 'u_image': new performance.Uniform1i(context, locations.u_image), 'u_pattern_tl_a': new performance.Uniform2f(context, locations.u_pattern_tl_a), 'u_pattern_br_a': new performance.Uniform2f(context, locations.u_pattern_br_a), 'u_pattern_tl_b': new performance.Uniform2f(context, locations.u_pattern_tl_b), 'u_pattern_br_b': new performance.Uniform2f(context, locations.u_pattern_br_b), 'u_texsize': new performance.Uniform2f(context, locations.u_texsize), 'u_mix': new performance.Uniform1f(context, locations.u_mix), 'u_pattern_size_a': new performance.Uniform2f(context, locations.u_pattern_size_a), 'u_pattern_size_b': new performance.Uniform2f(context, locations.u_pattern_size_b), 'u_scale_a': new performance.Uniform1f(context, locations.u_scale_a), 'u_scale_b': new performance.Uniform1f(context, locations.u_scale_b), 'u_pixel_coord_upper': new performance.Uniform2f(context, locations.u_pixel_coord_upper), 'u_pixel_coord_lower': new performance.Uniform2f(context, locations.u_pixel_coord_lower), 'u_tile_units_to_pixels': new performance.Uniform1f(context, locations.u_tile_units_to_pixels) }); }; var backgroundUniformValues = function ( matrix , opacity , color ) { return ({ 'u_matrix': matrix, 'u_opacity': opacity, 'u_color': color }); }; var backgroundPatternUniformValues = function ( matrix , opacity , painter , image , tile , crossfade ) { return performance.extend( bgPatternUniformValues(image, crossfade, painter, tile), { 'u_matrix': matrix, 'u_opacity': opacity } ); }; // var programUniforms = { fillExtrusion: fillExtrusionUniforms, fillExtrusionPattern: fillExtrusionPatternUniforms, fill: fillUniforms, fillPattern: fillPatternUniforms, fillOutline: fillOutlineUniforms, fillOutlinePattern: fillOutlinePatternUniforms, circle: circleUniforms, collisionBox: collisionUniforms, collisionCircle: collisionCircleUniforms, debug: debugUniforms, clippingMask: clippingMaskUniforms, heatmap: heatmapUniforms, heatmapTexture: heatmapTextureUniforms, hillshade: hillshadeUniforms, hillshadePrepare: hillshadePrepareUniforms, line: lineUniforms, lineGradient: lineGradientUniforms, linePattern: linePatternUniforms, lineSDF: lineSDFUniforms, raster: rasterUniforms, symbolIcon: symbolIconUniforms, symbolSDF: symbolSDFUniforms, symbolTextAndIcon: symbolTextAndIconUniforms, background: backgroundUniforms, backgroundPattern: backgroundPatternUniforms }; // var quadTriangles ; function drawCollisionDebug(painter , sourceCache , layer , coords , translate , translateAnchor , isText ) { var context = painter.context; var gl = context.gl; var program = painter.useProgram('collisionBox'); var tileBatches = []; var circleCount = 0; var circleOffset = 0; for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var posMatrix = coord.posMatrix; if (translate[0] !== 0 || translate[1] !== 0) { posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor); } var buffers = isText ? bucket.textCollisionBox : bucket.iconCollisionBox; // Get collision circle data of this bucket var circleArray = bucket.collisionCircleArray; if (circleArray.length > 0) { // We need to know the projection matrix that was used for projecting collision circles to the screen. // This might vary between buckets as the symbol placement is a continous process. This matrix is // required for transforming points from previous screen space to the current one var invTransform = performance.create(); var transform = posMatrix; performance.mul(invTransform, bucket.placementInvProjMatrix, painter.transform.glCoordMatrix); performance.mul(invTransform, invTransform, bucket.placementViewportMatrix); tileBatches.push({ circleArray: circleArray, circleOffset: circleOffset, transform: transform, invTransform: invTransform }); circleCount += circleArray.length / 4; // 4 values per circle circleOffset = circleCount; } if (!buffers) { continue; } program.draw(context, gl.LINES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, collisionUniformValues( posMatrix, painter.transform, tile), layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, buffers.segments, null, painter.transform.zoom, null, null, buffers.collisionVertexBuffer); } if (!isText || !tileBatches.length) { return; } // Render collision circles var circleProgram = painter.useProgram('collisionCircle'); // Construct vertex data var vertexData = new performance.StructArrayLayout2f1f2i16(); vertexData.resize(circleCount * 4); vertexData._trim(); var vertexOffset = 0; for (var i$2 = 0, list = tileBatches; i$2 < list.length; i$2 += 1) { var batch = list[i$2]; for (var i$1 = 0; i$1 < batch.circleArray.length / 4; i$1++) { var circleIdx = i$1 * 4; var x = batch.circleArray[circleIdx + 0]; var y = batch.circleArray[circleIdx + 1]; var radius = batch.circleArray[circleIdx + 2]; var collision = batch.circleArray[circleIdx + 3]; // 4 floats per vertex, 4 vertices per quad vertexData.emplace(vertexOffset++, x, y, radius, collision, 0); vertexData.emplace(vertexOffset++, x, y, radius, collision, 1); vertexData.emplace(vertexOffset++, x, y, radius, collision, 2); vertexData.emplace(vertexOffset++, x, y, radius, collision, 3); } } if (!quadTriangles || quadTriangles.length < circleCount * 2) { quadTriangles = createQuadTriangles(circleCount); } var indexBuffer = context.createIndexBuffer(quadTriangles, true); var vertexBuffer = context.createVertexBuffer(vertexData, performance.collisionCircleLayout.members, true); // Render batches for (var i$3 = 0, list$1 = tileBatches; i$3 < list$1.length; i$3 += 1) { var batch$1 = list$1[i$3]; var uniforms = collisionCircleUniformValues( batch$1.transform, batch$1.invTransform, painter.transform ); circleProgram.draw( context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, uniforms, layer.id, vertexBuffer, indexBuffer, performance.SegmentVector.simpleSegment(0, batch$1.circleOffset * 2, batch$1.circleArray.length, batch$1.circleArray.length / 2), null, painter.transform.zoom, null, null, null); } vertexBuffer.destroy(); indexBuffer.destroy(); } function createQuadTriangles(quadCount ) { var triCount = quadCount * 2; var array = new performance.StructArrayLayout3ui6(); array.resize(triCount); array._trim(); // Two triangles and 4 vertices per quad. for (var i = 0; i < triCount; i++) { var idx = i * 6; array.uint16[idx + 0] = i * 4 + 0; array.uint16[idx + 1] = i * 4 + 1; array.uint16[idx + 2] = i * 4 + 2; array.uint16[idx + 3] = i * 4 + 2; array.uint16[idx + 4] = i * 4 + 3; array.uint16[idx + 5] = i * 4 + 0; } return array; } // var identityMat4 = performance.identity(new Float32Array(16)); function drawSymbols(painter , sourceCache , layer , coords , variableOffsets ) { if (painter.renderPass !== 'translucent') { return; } // Disable the stencil test so that labels aren't clipped to tile boundaries. var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var variablePlacement = layer.layout.get('text-variable-anchor'); //Compute variable-offsets before painting since icons and text data positioning //depend on each other in this case. if (variablePlacement) { updateVariableAnchors(coords, painter, layer, sourceCache, layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), variableOffsets ); } if (layer.paint.get('icon-opacity').constantOr(1) !== 0) { drawLayerSymbols(painter, sourceCache, layer, coords, false, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright'), stencilMode, colorMode ); } if (layer.paint.get('text-opacity').constantOr(1) !== 0) { drawLayerSymbols(painter, sourceCache, layer, coords, true, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), layer.layout.get('text-keep-upright'), stencilMode, colorMode ); } if (sourceCache.map.showCollisionBoxes) { drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('text-translate'), layer.paint.get('text-translate-anchor'), true); drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('icon-translate'), layer.paint.get('icon-translate-anchor'), false); } } function calculateVariableRenderShift(anchor, width, height, textOffset, textBoxScale, renderTextSize) { var ref = performance.getAnchorAlignment(anchor); var horizontalAlign = ref.horizontalAlign; var verticalAlign = ref.verticalAlign; var shiftX = -(horizontalAlign - 0.5) * width; var shiftY = -(verticalAlign - 0.5) * height; var variableOffset = performance.evaluateVariableOffset(anchor, textOffset); return new performance.Point( (shiftX / textBoxScale + variableOffset[0]) * renderTextSize, (shiftY / textBoxScale + variableOffset[1]) * renderTextSize ); } function updateVariableAnchors(coords, painter, layer, sourceCache, rotationAlignment, pitchAlignment, variableOffsets) { var tr = painter.transform; var rotateWithMap = rotationAlignment === 'map'; var pitchWithMap = pitchAlignment === 'map'; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket || !bucket.text || !bucket.text.segments.get().length) { continue; } var sizeData = bucket.textSizeData; var size = performance.evaluateSizeForZoom(sizeData, tr.zoom); var pixelToTileScale = pixelsToTileUnits(tile, 1, painter.transform.zoom); var labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, pixelToTileScale); var updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && bucket.hasIconData(); if (size) { var tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ); updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, performance.symbolSize, tr, labelPlaneMatrix, coord.posMatrix, tileScale, size, updateTextFitIcon); } } } function updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbolSize, transform, labelPlaneMatrix, posMatrix, tileScale, size, updateTextFitIcon) { var placedSymbols = bucket.text.placedSymbolArray; var dynamicTextLayoutVertexArray = bucket.text.dynamicLayoutVertexArray; var dynamicIconLayoutVertexArray = bucket.icon.dynamicLayoutVertexArray; var placedTextShifts = {}; dynamicTextLayoutVertexArray.clear(); for (var s = 0; s < placedSymbols.length; s++) { var symbol = placedSymbols.get(s); var skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation; var variableOffset = (!symbol.hidden && symbol.crossTileID && !skipOrientation) ? variableOffsets[symbol.crossTileID] : null; if (!variableOffset) { // These symbols are from a justification that is not being used, or a label that wasn't placed // so we don't need to do the extra math to figure out what incremental shift to apply. hideGlyphs(symbol.numGlyphs, dynamicTextLayoutVertexArray); } else { var tileAnchor = new performance.Point(symbol.anchorX, symbol.anchorY); var projectedAnchor = project(tileAnchor, pitchWithMap ? posMatrix : labelPlaneMatrix); var perspectiveRatio = getPerspectiveRatio(transform.cameraToCenterDistance, projectedAnchor.signedDistanceFromCamera); var renderTextSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / performance.ONE_EM; if (pitchWithMap) { // Go from size in pixels to equivalent size in tile units renderTextSize *= bucket.tilePixelRatio / tileScale; } var width = variableOffset.width; var height = variableOffset.height; var anchor = variableOffset.anchor; var textOffset = variableOffset.textOffset; var textBoxScale = variableOffset.textBoxScale; var shift = calculateVariableRenderShift( anchor, width, height, textOffset, textBoxScale, renderTextSize); // Usual case is that we take the projected anchor and add the pixel-based shift // calculated above. In the (somewhat weird) case of pitch-aligned text, we add an equivalent // tile-unit based shift to the anchor before projecting to the label plane. var shiftedAnchor = pitchWithMap ? project(tileAnchor.add(shift), labelPlaneMatrix).point : projectedAnchor.point.add(rotateWithMap ? shift.rotate(-transform.angle) : shift); var angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === performance.WritingMode.vertical) ? Math.PI / 2 : 0; for (var g = 0; g < symbol.numGlyphs; g++) { performance.addDynamicAttributes(dynamicTextLayoutVertexArray, shiftedAnchor, angle); } //Only offset horizontal text icons if (updateTextFitIcon && symbol.associatedIconIndex >= 0) { placedTextShifts[symbol.associatedIconIndex] = {shiftedAnchor: shiftedAnchor, angle: angle}; } } } if (updateTextFitIcon) { dynamicIconLayoutVertexArray.clear(); var placedIcons = bucket.icon.placedSymbolArray; for (var i = 0; i < placedIcons.length; i++) { var placedIcon = placedIcons.get(i); if (placedIcon.hidden) { hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); } else { var shift$1 = placedTextShifts[i]; if (!shift$1) { hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); } else { for (var g$1 = 0; g$1 < placedIcon.numGlyphs; g$1++) { performance.addDynamicAttributes(dynamicIconLayoutVertexArray, shift$1.shiftedAnchor, shift$1.angle); } } } } bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicIconLayoutVertexArray); } bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicTextLayoutVertexArray); } function getSymbolProgramName(isSDF , isText , bucket ) { if (bucket.iconsInText && isText) { return 'symbolTextAndIcon'; } else if (isSDF) { return 'symbolSDF'; } else { return 'symbolIcon'; } } function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var tr = painter.transform; var rotateWithMap = rotationAlignment === 'map'; var pitchWithMap = pitchAlignment === 'map'; var alongLine = rotateWithMap && layer.layout.get('symbol-placement') !== 'point'; // Line label rotation happens in `updateLineLabels` // Pitched point labels are automatically rotated by the labelPlaneMatrix projection // Unpitched point labels need to have their rotation applied after projection var rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; var sortFeaturesByKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var variablePlacement = layer.layout.get('text-variable-anchor'); var tileRenderState = []; for (var i$1 = 0, list$1 = coords; i$1 < list$1.length; i$1 += 1) { var coord = list$1[i$1]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var buffers = isText ? bucket.text : bucket.icon; if (!buffers || !buffers.segments.get().length) { continue; } var programConfiguration = buffers.programConfigurations.get(layer.id); var isSDF = isText || bucket.sdfIcons; var sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; var transformed = pitchWithMap || tr.pitch !== 0; var program = painter.useProgram(getSymbolProgramName(isSDF, isText, bucket), programConfiguration); var size = performance.evaluateSizeForZoom(sizeData, tr.zoom); var texSize = (void 0) ; var texSizeIcon = [0, 0]; var atlasTexture = (void 0); var atlasInterpolation = (void 0); var atlasTextureIcon = null; var atlasInterpolationIcon = (void 0); if (isText) { atlasTexture = tile.glyphAtlasTexture; atlasInterpolation = gl.LINEAR; texSize = tile.glyphAtlasTexture.size; if (bucket.iconsInText) { texSizeIcon = tile.imageAtlasTexture.size; atlasTextureIcon = tile.imageAtlasTexture; var zoomDependentSize = sizeData.kind === 'composite' || sizeData.kind === 'camera'; atlasInterpolationIcon = transformed || painter.options.rotating || painter.options.zooming || zoomDependentSize ? gl.LINEAR : gl.NEAREST; } } else { var iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear; atlasTexture = tile.imageAtlasTexture; atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || transformed ? gl.LINEAR : gl.NEAREST; texSize = tile.imageAtlasTexture.size; } var s = pixelsToTileUnits(tile, 1, painter.transform.zoom); var labelPlaneMatrix = getLabelPlaneMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); var glCoordMatrix = getGlCoordMatrix(coord.posMatrix, pitchWithMap, rotateWithMap, painter.transform, s); var hasVariableAnchors = variablePlacement && bucket.hasTextData(); var updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && hasVariableAnchors && bucket.hasIconData(); if (alongLine) { updateLineLabels(bucket, coord.posMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright); } var matrix = painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor), uLabelPlaneMatrix = (alongLine || (isText && variablePlacement) || updateTextFitIcon) ? identityMat4 : labelPlaneMatrix, uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true); var hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0; var uniformValues = (void 0); if (isSDF) { if (!bucket.iconsInText) { uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true); } else { uniformValues = symbolTextAndIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon); } } else { uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize); } var state = { program: program, buffers: buffers, uniformValues: uniformValues, atlasTexture: atlasTexture, atlasTextureIcon: atlasTextureIcon, atlasInterpolation: atlasInterpolation, atlasInterpolationIcon: atlasInterpolationIcon, isSDF: isSDF, hasHalo: hasHalo }; if (sortFeaturesByKey) { var oldSegments = buffers.segments.get(); for (var i = 0, list = oldSegments; i < list.length; i += 1) { var segment = list[i]; tileRenderState.push({ segments: new performance.SegmentVector([segment]), sortKey: ((segment.sortKey ) ), state: state }); } } else { tileRenderState.push({ segments: buffers.segments, sortKey: 0, state: state }); } } if (sortFeaturesByKey) { tileRenderState.sort(function (a, b) { return a.sortKey - b.sortKey; }); } for (var i$2 = 0, list$2 = tileRenderState; i$2 < list$2.length; i$2 += 1) { var segmentState = list$2[i$2]; var state$1 = segmentState.state; context.activeTexture.set(gl.TEXTURE0); state$1.atlasTexture.bind(state$1.atlasInterpolation, gl.CLAMP_TO_EDGE); if (state$1.atlasTextureIcon) { context.activeTexture.set(gl.TEXTURE1); if (state$1.atlasTextureIcon) { state$1.atlasTextureIcon.bind(state$1.atlasInterpolationIcon, gl.CLAMP_TO_EDGE); } } if (state$1.isSDF) { var uniformValues$1 = ((state$1.uniformValues ) ); if (state$1.hasHalo) { uniformValues$1['u_is_halo'] = 1; drawSymbolElements(state$1.buffers, segmentState.segments, layer, painter, state$1.program, depthMode, stencilMode, colorMode, uniformValues$1); } uniformValues$1['u_is_halo'] = 0; } drawSymbolElements(state$1.buffers, segmentState.segments, layer, painter, state$1.program, depthMode, stencilMode, colorMode, state$1.uniformValues); } } function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) { var context = painter.context; var gl = context.gl; program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, segments, layer.paint, painter.transform.zoom, buffers.programConfigurations.get(layer.id), buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer); } // function drawCircles(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('circle-opacity'); var strokeWidth = layer.paint.get('circle-stroke-width'); var strokeOpacity = layer.paint.get('circle-stroke-opacity'); var sortFeaturesByKey = layer.layout.get('circle-sort-key').constantOr(1) !== undefined; if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) { return; } var context = painter.context; var gl = context.gl; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); // Turn off stencil testing to allow circles to be drawn across boundaries, // so that large circles are not clipped to tiles var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var segmentsRenderStates = []; for (var i = 0; i < coords.length; i++) { var coord = coords[i]; var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('circle', programConfiguration); var layoutVertexBuffer = bucket.layoutVertexBuffer; var indexBuffer = bucket.indexBuffer; var uniformValues = circleUniformValues(painter, coord, tile, layer); var state = { programConfiguration: programConfiguration, program: program, layoutVertexBuffer: layoutVertexBuffer, indexBuffer: indexBuffer, uniformValues: uniformValues, }; if (sortFeaturesByKey) { var oldSegments = bucket.segments.get(); for (var i$1 = 0, list = oldSegments; i$1 < list.length; i$1 += 1) { var segment = list[i$1]; segmentsRenderStates.push({ segments: new performance.SegmentVector([segment]), sortKey: ((segment.sortKey ) ), state: state }); } } else { segmentsRenderStates.push({ segments: bucket.segments, sortKey: 0, state: state }); } } if (sortFeaturesByKey) { segmentsRenderStates.sort(function (a, b) { return a.sortKey - b.sortKey; }); } for (var i$2 = 0, list$1 = segmentsRenderStates; i$2 < list$1.length; i$2 += 1) { var segmentsState = list$1[i$2]; var ref = segmentsState.state; var programConfiguration$1 = ref.programConfiguration; var program$1 = ref.program; var layoutVertexBuffer$1 = ref.layoutVertexBuffer; var indexBuffer$1 = ref.indexBuffer; var uniformValues$1 = ref.uniformValues; var segments = segmentsState.segments; program$1.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues$1, layer.id, layoutVertexBuffer$1, indexBuffer$1, segments, layer.paint, painter.transform.zoom, programConfiguration$1); } } // function drawHeatmap(painter , sourceCache , layer , coords ) { if (layer.paint.get('heatmap-opacity') === 0) { return; } if (painter.renderPass === 'offscreen') { var context = painter.context; var gl = context.gl; // Allow kernels to be drawn across boundaries, so that // large kernels are not clipped to tiles var stencilMode = StencilMode.disabled; // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula var colorMode = new ColorMode([gl.ONE, gl.ONE], performance.Color.transparent, [true, true, true, true]); bindFramebuffer(context, painter, layer); context.clear({color: performance.Color.transparent}); for (var i = 0; i < coords.length; i++) { var coord = coords[i]; // Skip tiles that have uncovered parents to avoid flickering; we don't need // to use complex tile masking here because the change between zoom levels is subtle, // so it's fine to simply render the parent until all its 4 children are loaded if (sourceCache.hasRenderableParent(coord)) { continue; } var tile = sourceCache.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram('heatmap', programConfiguration); var ref = painter.transform; var zoom = ref.zoom; program.draw(context, gl.TRIANGLES, DepthMode.disabled, stencilMode, colorMode, CullFaceMode.disabled, heatmapUniformValues(coord.posMatrix, tile, zoom, layer.paint.get('heatmap-intensity')), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); } context.viewport.set([0, 0, painter.width, painter.height]); } else if (painter.renderPass === 'translucent') { painter.context.setColorMode(painter.colorModeForRenderPass()); renderTextureToMap(painter, layer); } } function bindFramebuffer(context, painter, layer) { var gl = context.gl; context.activeTexture.set(gl.TEXTURE1); // Use a 4x downscaled screen texture for better performance context.viewport.set([0, 0, painter.width / 4, painter.height / 4]); var fbo = layer.heatmapFbo; if (!fbo) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4, false); bindTextureToFramebuffer(context, painter, texture, fbo); } else { gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.bindFramebuffer.set(fbo.framebuffer); } } function bindTextureToFramebuffer(context, painter, texture, fbo) { var gl = context.gl; // Use the higher precision half-float texture where available (producing much smoother looking heatmaps); // Otherwise, fall back to a low precision texture var internalFormat = context.extRenderToTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE; gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, internalFormat, null); fbo.colorAttachment.set(texture); } function renderTextureToMap(painter, layer) { var context = painter.context; var gl = context.gl; // Here we bind two different textures from which we'll sample in drawing // heatmaps: the kernel texture, prepared in the offscreen pass, and a // color ramp texture. var fbo = layer.heatmapFbo; if (!fbo) { return; } context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); context.activeTexture.set(gl.TEXTURE1); var colorRampTexture = layer.colorRampTexture; if (!colorRampTexture) { colorRampTexture = layer.colorRampTexture = new performance.Texture(context, layer.colorRamp, gl.RGBA); } colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, DepthMode.disabled, StencilMode.disabled, painter.colorModeForRenderPass(), CullFaceMode.disabled, heatmapTextureUniformValues(painter, layer, 0, 1), layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, painter.viewportSegments, layer.paint, painter.transform.zoom); } // function drawLine(painter , sourceCache , layer , coords ) { if (painter.renderPass !== 'translucent') { return; } var opacity = layer.paint.get('line-opacity'); var width = layer.paint.get('line-width'); if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) { return; } var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var colorMode = painter.colorModeForRenderPass(); var dasharray = layer.paint.get('line-dasharray'); var patternProperty = layer.paint.get('line-pattern'); var image = patternProperty.constantOr((1 )); var gradient = layer.paint.get('line-gradient'); var crossfade = layer.getCrossfadeParameters(); var programId = image ? 'linePattern' : dasharray ? 'lineSDF' : gradient ? 'lineGradient' : 'line'; var context = painter.context; var gl = context.gl; var firstTile = true; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); if (image && !tile.patternsLoaded()) { continue; } var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var prevProgram = painter.context.program.get(); var program = painter.useProgram(programId, programConfiguration); var programChanged = firstTile || program.program !== prevProgram; var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var atlas = tile.imageAtlas; var posTo = atlas.patternPositions[constantPattern.to.toString()]; var posFrom = atlas.patternPositions[constantPattern.from.toString()]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var uniformValues = image ? linePatternUniformValues(painter, tile, layer, crossfade) : dasharray ? lineSDFUniformValues(painter, tile, layer, dasharray, crossfade) : gradient ? lineGradientUniformValues(painter, tile, layer, bucket.lineClipsArray.length) : lineUniformValues(painter, tile, layer); if (image) { context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePaintBuffers(crossfade); } else if (dasharray && (programChanged || painter.lineAtlas.dirty)) { context.activeTexture.set(gl.TEXTURE0); painter.lineAtlas.bind(context); } else if (gradient) { var layerGradient = bucket.gradients[layer.id]; var gradientTexture = layerGradient.texture; if (layer.gradientVersion !== layerGradient.version) { var textureResolution = 256; if (layer.stepInterpolant) { var sourceMaxZoom = sourceCache.getSource().maxzoom; var potentialOverzoom = coord.canonical.z === sourceMaxZoom ? Math.ceil(1 << (painter.transform.maxZoom - coord.canonical.z)) : 1; var lineLength = bucket.maxLineLength / performance.EXTENT; // Logical pixel tile size is 512px, and 1024px right before current zoom + 1 var maxTilePixelSize = 1024; // Maximum possible texture coverage heuristic, bound by hardware max texture size var maxTextureCoverage = lineLength * maxTilePixelSize * potentialOverzoom; textureResolution = performance.clamp(performance.nextPowerOfTwo(maxTextureCoverage), 256, context.maxTextureSize); } layerGradient.gradient = performance.renderColorRamp({ expression: layer.gradientExpression(), evaluationKey: 'lineProgress', resolution: textureResolution, image: layerGradient.gradient || undefined, clips: bucket.lineClipsArray }); if (layerGradient.texture) { layerGradient.texture.update(layerGradient.gradient); } else { layerGradient.texture = new performance.Texture(context, layerGradient.gradient, gl.RGBA); } layerGradient.version = layer.gradientVersion; gradientTexture = layerGradient.texture; } context.activeTexture.set(gl.TEXTURE0); gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE); } program.draw(context, gl.TRIANGLES, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration, bucket.layoutVertexBuffer2); firstTile = false; // once refactored so that bound texture state is managed, we'll also be able to remove this firstTile/programChanged logic } } // function drawFill(painter , sourceCache , layer , coords ) { var color = layer.paint.get('fill-color'); var opacity = layer.paint.get('fill-opacity'); if (opacity.constantOr(1) === 0) { return; } var colorMode = painter.colorModeForRenderPass(); var pattern = layer.paint.get('fill-pattern'); var pass = painter.opaquePassEnabledForLayer() && (!pattern.constantOr((1 )) && color.constantOr(performance.Color.transparent).a === 1 && opacity.constantOr(0) === 1) ? 'opaque' : 'translucent'; // Draw fill if (painter.renderPass === pass) { var depthMode = painter.depthModeForSublayer( 1, painter.renderPass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly); drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false); } // Draw stroke if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) { // If we defined a different color for the fill outline, we are // going to ignore the bits in 0x07 and just care about the global // clipping mask. // Otherwise, we only want to drawFill the antialiased parts that are // *outside* the current shape. This is important in case the fill // or stroke color is translucent. If we wouldn't clip to outside // the current shape, some pixels from the outline stroke overlapped // the (non-antialiased) fill. var depthMode$1 = painter.depthModeForSublayer( layer.getPaintProperty('fill-outline-color') ? 2 : 0, DepthMode.ReadOnly); drawFillTiles(painter, sourceCache, layer, coords, depthMode$1, colorMode, true); } } function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) { var gl = painter.context.gl; var patternProperty = layer.paint.get('fill-pattern'); var image = patternProperty && patternProperty.constantOr((1 )); var crossfade = layer.getCrossfadeParameters(); var drawMode, programName, uniformValues, indexBuffer, segments; if (!isOutline) { programName = image ? 'fillPattern' : 'fill'; drawMode = gl.TRIANGLES; } else { programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline'; drawMode = gl.LINES; } for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); if (image && !tile.patternsLoaded()) { continue; } var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram(programName, programConfiguration); if (image) { painter.context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePaintBuffers(crossfade); } var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var atlas = tile.imageAtlas; var posTo = atlas.patternPositions[constantPattern.to.toString()]; var posFrom = atlas.patternPositions[constantPattern.from.toString()]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var tileMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor')); if (!isOutline) { indexBuffer = bucket.indexBuffer; segments = bucket.segments; uniformValues = image ? fillPatternUniformValues(tileMatrix, painter, crossfade, tile) : fillUniformValues(tileMatrix); } else { indexBuffer = bucket.indexBuffer2; segments = bucket.segments2; var drawingBufferSize = [gl.drawingBufferWidth, gl.drawingBufferHeight]; uniformValues = (programName === 'fillOutlinePattern' && image) ? fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) : fillOutlineUniformValues(tileMatrix, drawingBufferSize); } program.draw(painter.context, drawMode, depthMode, painter.stencilModeForClipping(coord), colorMode, CullFaceMode.disabled, uniformValues, layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, layer.paint, painter.transform.zoom, programConfiguration); } } // function draw(painter , source , layer , coords ) { var opacity = layer.paint.get('fill-extrusion-opacity'); if (opacity === 0) { return; } if (painter.renderPass === 'translucent') { var depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D); if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr((1 ))) { var colorMode = painter.colorModeForRenderPass(); drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode); } else { // Draw transparent buildings in two passes so that only the closest surface is drawn. // First draw all the extrusions into only the depth buffer. No colors are drawn. drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, ColorMode.disabled); // Then draw all the extrusions a second type, only coloring fragments if they have the // same depth value as the closest fragment in the previous pass. Use the stencil buffer // to prevent the second draw in cases where we have coincident polygons. drawExtrusionTiles(painter, source, layer, coords, depthMode, painter.stencilModeFor3D(), painter.colorModeForRenderPass()); } } } function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var patternProperty = layer.paint.get('fill-extrusion-pattern'); var image = patternProperty.constantOr((1 )); var crossfade = layer.getCrossfadeParameters(); var opacity = layer.paint.get('fill-extrusion-opacity'); for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = source.getTile(coord); var bucket = (tile.getBucket(layer) ); if (!bucket) { continue; } var programConfiguration = bucket.programConfigurations.get(layer.id); var program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration); if (image) { painter.context.activeTexture.set(gl.TEXTURE0); tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); programConfiguration.updatePaintBuffers(crossfade); } var constantPattern = patternProperty.constantOr(null); if (constantPattern && tile.imageAtlas) { var atlas = tile.imageAtlas; var posTo = atlas.patternPositions[constantPattern.to.toString()]; var posFrom = atlas.patternPositions[constantPattern.from.toString()]; if (posTo && posFrom) { programConfiguration.setConstantPatternPositions(posTo, posFrom); } } var matrix = painter.translatePosMatrix( coord.posMatrix, tile, layer.paint.get('fill-extrusion-translate'), layer.paint.get('fill-extrusion-translate-anchor')); var shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient'); var uniformValues = image ? fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) : fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity); program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.backCCW, uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, programConfiguration); } } // function drawHillshade(painter , sourceCache , layer , tileIDs ) { if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') { return; } var context = painter.context; var depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly); var colorMode = painter.colorModeForRenderPass(); var ref = painter.renderPass === 'translucent' ? painter.stencilConfigForOverlap(tileIDs) : [{}, tileIDs]; var stencilModes = ref[0]; var coords = ref[1]; for (var i = 0, list = coords; i < list.length; i += 1) { var coord = list[i]; var tile = sourceCache.getTile(coord); if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') { prepareHillshade(painter, tile, layer, depthMode, StencilMode.disabled, colorMode); } else if (painter.renderPass === 'translucent') { renderHillshade(painter, tile, layer, depthMode, stencilModes[coord.overscaledZ], colorMode); } } context.viewport.set([0, 0, painter.width, painter.height]); } function renderHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var fbo = tile.fbo; if (!fbo) { return; } var program = painter.useProgram('hillshade'); context.activeTexture.set(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); var uniformValues = hillshadeUniformValues(painter, tile, layer); program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); } // hillshade rendering is done in two steps. the prepare step first calculates the slope of the terrain in the x and y // directions for each pixel, and saves those values to a framebuffer texture in the r and g channels. function prepareHillshade(painter, tile, layer, depthMode, stencilMode, colorMode) { var context = painter.context; var gl = context.gl; var dem = tile.dem; if (dem && dem.data) { var tileSize = dem.dim; var textureStride = dem.stride; var pixelData = dem.getPixels(); context.activeTexture.set(gl.TEXTURE1); context.pixelStoreUnpackPremultiplyAlpha.set(false); tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); if (tile.demTexture) { var demTexture = tile.demTexture; demTexture.update(pixelData, {premultiply: false}); demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } else { tile.demTexture = new performance.Texture(context, pixelData, gl.RGBA, {premultiply: false}); tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } context.activeTexture.set(gl.TEXTURE0); var fbo = tile.fbo; if (!fbo) { var renderTexture = new performance.Texture(context, {width: tileSize, height: tileSize, data: null}, gl.RGBA); renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); fbo = tile.fbo = context.createFramebuffer(tileSize, tileSize, true); fbo.colorAttachment.set(renderTexture.texture); } context.bindFramebuffer.set(fbo.framebuffer); context.viewport.set([0, 0, tileSize, tileSize]); painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, hillshadeUniformPrepareValues(tile.tileID, dem), layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); tile.needsHillshadePrepare = false; } } // function drawRaster(painter , sourceCache , layer , tileIDs ) { if (painter.renderPass !== 'translucent') { return; } if (layer.paint.get('raster-opacity') === 0) { return; } if (!tileIDs.length) { return; } var context = painter.context; var gl = context.gl; var source = sourceCache.getSource(); var program = painter.useProgram('raster'); var colorMode = painter.colorModeForRenderPass(); var ref = source instanceof ImageSource ? [{}, tileIDs] : painter.stencilConfigForOverlap(tileIDs); var stencilModes = ref[0]; var coords = ref[1]; var minTileZ = coords[coords.length - 1].overscaledZ; var align = !painter.options.moving; for (var i = 0, list = coords; i < list.length; i += 1) { // Set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers // Use gl.LESS to prevent double drawing in areas where tiles overlap. var coord = list[i]; var depthMode = painter.depthModeForSublayer(coord.overscaledZ - minTileZ, layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS); var tile = sourceCache.getTile(coord); var posMatrix = painter.transform.calculatePosMatrix(coord.toUnwrapped(), align); tile.registerFadeDuration(layer.paint.get('raster-fade-duration')); var parentTile = sourceCache.findLoadedParent(coord, 0), fade = getFadeValues(tile, parentTile, sourceCache, layer, painter.transform); var parentScaleBy = (void 0), parentTL = (void 0); var textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR; context.activeTexture.set(gl.TEXTURE0); tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); context.activeTexture.set(gl.TEXTURE1); if (parentTile) { parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ); parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1]; } else { tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); } var uniformValues = rasterUniformValues(posMatrix, parentTL || [0, 0], parentScaleBy || 1, fade, layer); if (source instanceof ImageSource) { program.draw(context, gl.TRIANGLES, depthMode, StencilMode.disabled, colorMode, CullFaceMode.disabled, uniformValues, layer.id, source.boundsBuffer, painter.quadTriangleIndexBuffer, source.boundsSegments); } else { program.draw(context, gl.TRIANGLES, depthMode, stencilModes[coord.overscaledZ], colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.rasterBoundsBuffer, painter.quadTriangleIndexBuffer, painter.rasterBoundsSegments); } } } function getFadeValues(tile, parentTile, sourceCache, layer, transform) { var fadeDuration = layer.paint.get('raster-fade-duration'); if (fadeDuration > 0) { var now = performance.browser.now(); var sinceTile = (now - tile.timeAdded) / fadeDuration; var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; var source = sourceCache.getSource(); var idealZ = transform.coveringZoomLevel({ tileSize: source.tileSize, roundZoom: source.roundZoom }); // if no parent or parent is older, fade in; if parent is younger, fade out var fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); var childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : performance.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1); // we don't crossfade tiles that were just refreshed upon expiring: // once they're old enough to pass the crossfading threshold // (fadeDuration), unset the `refreshedUponExpiration` flag so we don't // incorrectly fail to crossfade them when zooming if (tile.refreshedUponExpiration && sinceTile >= 1) { tile.refreshedUponExpiration = false; } if (parentTile) { return { opacity: 1, mix: 1 - childOpacity }; } else { return { opacity: childOpacity, mix: 0 }; } } else { return { opacity: 1, mix: 0 }; } } // function drawBackground(painter , sourceCache , layer ) { var color = layer.paint.get('background-color'); var opacity = layer.paint.get('background-opacity'); if (opacity === 0) { return; } var context = painter.context; var gl = context.gl; var transform = painter.transform; var tileSize = transform.tileSize; var image = layer.paint.get('background-pattern'); if (painter.isPatternMissing(image)) { return; } var pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent'; if (painter.renderPass !== pass) { return; } var stencilMode = StencilMode.disabled; var depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? DepthMode.ReadWrite : DepthMode.ReadOnly); var colorMode = painter.colorModeForRenderPass(); var program = painter.useProgram(image ? 'backgroundPattern' : 'background'); var tileIDs = transform.coveringTiles({tileSize: tileSize}); if (image) { context.activeTexture.set(gl.TEXTURE0); painter.imageManagerFactory.bind(painter.context); } var crossfade = layer.getCrossfadeParameters(); for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var matrix = painter.transform.calculatePosMatrix(tileID.toUnwrapped()); var uniformValues = image ? backgroundPatternUniformValues(matrix, opacity, painter, image, {tileID: tileID, tileSize: tileSize}, crossfade) : backgroundUniformValues(matrix, opacity, color); program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, uniformValues, layer.id, painter.tileExtentBuffer, painter.quadTriangleIndexBuffer, painter.tileExtentSegments); } } // var topColor = new performance.Color(1, 0, 0, 1); var btmColor = new performance.Color(0, 1, 0, 1); var leftColor = new performance.Color(0, 0, 1, 1); var rightColor = new performance.Color(1, 0, 1, 1); var centerColor = new performance.Color(0, 1, 1, 1); function drawDebugPadding(painter ) { var padding = painter.transform.padding; var lineWidth = 3; // Top drawHorizontalLine(painter, painter.transform.height - (padding.top || 0), lineWidth, topColor); // Bottom drawHorizontalLine(painter, padding.bottom || 0, lineWidth, btmColor); // Left drawVerticalLine(painter, padding.left || 0, lineWidth, leftColor); // Right drawVerticalLine(painter, painter.transform.width - (padding.right || 0), lineWidth, rightColor); // Center var center = painter.transform.centerPoint; drawCrosshair(painter, center.x, painter.transform.height - center.y, centerColor); } function drawCrosshair(painter , x , y , color ) { var size = 20; var lineWidth = 2; //Vertical line drawDebugSSRect(painter, x - lineWidth / 2, y - size / 2, lineWidth, size, color); //Horizontal line drawDebugSSRect(painter, x - size / 2, y - lineWidth / 2, size, lineWidth, color); } function drawHorizontalLine(painter , y , lineWidth , color ) { drawDebugSSRect(painter, 0, y + lineWidth / 2, painter.transform.width, lineWidth, color); } function drawVerticalLine(painter , x , lineWidth , color ) { drawDebugSSRect(painter, x - lineWidth / 2, 0, lineWidth, painter.transform.height, color); } function drawDebugSSRect(painter , x , y , width , height , color ) { var context = painter.context; var gl = context.gl; gl.enable(gl.SCISSOR_TEST); gl.scissor(x * performance.browser.devicePixelRatio, y * performance.browser.devicePixelRatio, width * performance.browser.devicePixelRatio, height * performance.browser.devicePixelRatio); context.clear({color: color}); gl.disable(gl.SCISSOR_TEST); } function drawDebug(painter , sourceCache , coords ) { for (var i = 0; i < coords.length; i++) { drawDebugTile(painter, sourceCache, coords[i]); } } function drawDebugTile(painter, sourceCache, coord ) { var context = painter.context; var gl = context.gl; var posMatrix = coord.posMatrix; var program = painter.useProgram('debug'); var depthMode = DepthMode.disabled; var stencilMode = StencilMode.disabled; var colorMode = painter.colorModeForRenderPass(); var id = '$debug'; context.activeTexture.set(gl.TEXTURE0); // Bind the empty texture for drawing outlines painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, CullFaceMode.disabled, debugUniformValues(posMatrix, performance.Color.red), id, painter.debugBuffer, painter.tileBorderIndexBuffer, painter.debugSegments); var tileRawData = sourceCache.getTileByID(coord.key).latestRawTileData; var tileByteLength = (tileRawData && tileRawData.byteLength) || 0; var tileSizeKb = Math.floor(tileByteLength / 1024); var tileSize = sourceCache.getTile(coord).tileSize; var scaleRatio = (512 / Math.min(tileSize, 512) * (coord.overscaledZ / painter.transform.zoom)) * 0.5; var tileIdText = coord.canonical.toString(); if (coord.overscaledZ !== coord.canonical.z) { tileIdText += " => " + (coord.overscaledZ); } var tileLabel = tileIdText + " " + tileSizeKb + "kb"; drawTextToOverlay(painter, tileLabel); program.draw(context, gl.TRIANGLES, depthMode, stencilMode, ColorMode.alphaBlended, CullFaceMode.disabled, debugUniformValues(posMatrix, performance.Color.transparent, scaleRatio), id, painter.debugBuffer, painter.quadTriangleIndexBuffer, painter.debugSegments); } function drawTextToOverlay(painter , text ) { painter.initDebugOverlayCanvas(); var canvas = painter.debugOverlayCanvas; var gl = painter.context.gl; var ctx2d = painter.debugOverlayCanvas.getContext('2d'); ctx2d.clearRect(0, 0, canvas.width, canvas.height); ctx2d.shadowColor = 'white'; ctx2d.shadowBlur = 2; ctx2d.lineWidth = 1.5; ctx2d.strokeStyle = 'white'; ctx2d.textBaseline = 'top'; ctx2d.font = "bold " + (36) + "px Open Sans, sans-serif"; ctx2d.fillText(text, 5, 5); ctx2d.strokeText(text, 5, 5); painter.debugOverlayTexture.update(canvas); painter.debugOverlayTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } // function drawCustom(painter , sourceCache , layer ) { var context = painter.context; var implementation = layer.implementation; if (painter.renderPass === 'offscreen') { var prerender = implementation.prerender; if (prerender) { painter.setCustomLayerDefaults(); context.setColorMode(painter.colorModeForRenderPass()); prerender.call(implementation, context.gl, painter.transform.customLayerMatrix()); context.setDirty(); painter.setBaseState(); } } else if (painter.renderPass === 'translucent') { painter.setCustomLayerDefaults(); context.setColorMode(painter.colorModeForRenderPass()); context.setStencilMode(StencilMode.disabled); var depthMode = implementation.renderingMode === '3d' ? new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D) : painter.depthModeForSublayer(0, DepthMode.ReadOnly); context.setDepthMode(depthMode); implementation.render(context.gl, painter.transform.customLayerMatrix()); context.setDirty(); painter.setBaseState(); context.bindFramebuffer.set(null); } } // var draw$1 = { symbol: drawSymbols, circle: drawCircles, heatmap: drawHeatmap, line: drawLine, fill: drawFill, 'fill-extrusion': draw, hillshade: drawHillshade, raster: drawRaster, background: drawBackground, debug: drawDebug, custom: drawCustom }; // import type ImageManager from './image_manager'; /** * Initialize a new painter object. * * @param {Canvas} gl an experimental-webgl drawing context * @private */ var Painter = function Painter(gl , transform ) { this.context = new Context(gl); this.transform = transform; this._tileTextures = {}; this.setup(); // Within each layer there are multiple distinct z-planes that can be drawn to. // This is implemented using the WebGL depth buffer. this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1; this.depthEpsilon = 1 / Math.pow(2, 16); this.crossTileSymbolIndex = new CrossTileSymbolIndex(); this.gpuTimers = {}; }; /* * Update the GL viewport, projection matrix, and transforms to compensate * for a new width and height value. */ Painter.prototype.resize = function resize (width , height ) { this.width = width * performance.browser.devicePixelRatio; this.height = height * performance.browser.devicePixelRatio; this.context.viewport.set([0, 0, this.width, this.height]); if (this.style) { for (var i = 0, list = this.style._order; i < list.length; i += 1) { var layerId = list[i]; this.style._layers[layerId].resize(); } } }; Painter.prototype.setup = function setup () { var context = this.context; var tileExtentArray = new performance.StructArrayLayout2i4(); tileExtentArray.emplaceBack(0, 0); tileExtentArray.emplaceBack(performance.EXTENT, 0); tileExtentArray.emplaceBack(0, performance.EXTENT); tileExtentArray.emplaceBack(performance.EXTENT, performance.EXTENT); this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, posAttributes.members); this.tileExtentSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2); var debugArray = new performance.StructArrayLayout2i4(); debugArray.emplaceBack(0, 0); debugArray.emplaceBack(performance.EXTENT, 0); debugArray.emplaceBack(0, performance.EXTENT); debugArray.emplaceBack(performance.EXTENT, performance.EXTENT); this.debugBuffer = context.createVertexBuffer(debugArray, posAttributes.members); this.debugSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 5); var rasterBoundsArray = new performance.StructArrayLayout4i8(); rasterBoundsArray.emplaceBack(0, 0, 0, 0); rasterBoundsArray.emplaceBack(performance.EXTENT, 0, performance.EXTENT, 0); rasterBoundsArray.emplaceBack(0, performance.EXTENT, 0, performance.EXTENT); rasterBoundsArray.emplaceBack(performance.EXTENT, performance.EXTENT, performance.EXTENT, performance.EXTENT); this.rasterBoundsBuffer = context.createVertexBuffer(rasterBoundsArray, rasterBoundsAttributes.members); this.rasterBoundsSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2); var viewportArray = new performance.StructArrayLayout2i4(); viewportArray.emplaceBack(0, 0); viewportArray.emplaceBack(1, 0); viewportArray.emplaceBack(0, 1); viewportArray.emplaceBack(1, 1); this.viewportBuffer = context.createVertexBuffer(viewportArray, posAttributes.members); this.viewportSegments = performance.SegmentVector.simpleSegment(0, 0, 4, 2); var tileLineStripIndices = new performance.StructArrayLayout1ui2(); tileLineStripIndices.emplaceBack(0); tileLineStripIndices.emplaceBack(1); tileLineStripIndices.emplaceBack(3); tileLineStripIndices.emplaceBack(2); tileLineStripIndices.emplaceBack(0); this.tileBorderIndexBuffer = context.createIndexBuffer(tileLineStripIndices); var quadTriangleIndices = new performance.StructArrayLayout3ui6(); quadTriangleIndices.emplaceBack(0, 1, 2); quadTriangleIndices.emplaceBack(2, 1, 3); this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices); this.emptyTexture = new performance.Texture(context, { width: 1, height: 1, data: new Uint8Array([0, 0, 0, 0]) }, context.gl.RGBA); var gl = this.context.gl; this.stencilClearMode = new StencilMode({func: gl.ALWAYS, mask: 0}, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO); }; /* * Reset the drawing canvas by clearing the stencil buffer so that we can draw * new tiles at the same location, while retaining previously drawn pixels. */ Painter.prototype.clearStencil = function clearStencil () { var context = this.context; var gl = context.gl; this.nextStencilID = 1; this.currentStencilSource = undefined; // As a temporary workaround for https://github.com/mapbox/mapbox-gl-js/issues/5490, // pending an upstream fix, we draw a fullscreen stencil=0 clipping mask here, // effectively clearing the stencil buffer: once an upstream patch lands, remove // this function in favor of context.clear({ stencil: 0x0 }) var matrix = performance.create(); performance.ortho(matrix, 0, this.width, this.height, 0, 0, 1); performance.scale(matrix, matrix, [gl.drawingBufferWidth, gl.drawingBufferHeight, 0]); this.useProgram('clippingMask').draw(context, gl.TRIANGLES, DepthMode.disabled, this.stencilClearMode, ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(matrix), '$clipping', this.viewportBuffer, this.quadTriangleIndexBuffer, this.viewportSegments); }; Painter.prototype._renderTileClippingMasks = function _renderTileClippingMasks (layer , tileIDs ) { if (this.currentStencilSource === layer.source || !layer.isTileClipped() || !tileIDs || !tileIDs.length) { return; } this.currentStencilSource = layer.source; var context = this.context; var gl = context.gl; if (this.nextStencilID + tileIDs.length > 256) { // we'll run out of fresh IDs so we need to clear and start from scratch this.clearStencil(); } context.setColorMode(ColorMode.disabled); context.setDepthMode(DepthMode.disabled); var program = this.useProgram('clippingMask'); this._tileClippingMaskIDs = {}; for (var i = 0, list = tileIDs; i < list.length; i += 1) { var tileID = list[i]; var id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++; program.draw(context, gl.TRIANGLES, DepthMode.disabled, // Tests will always pass, and ref value will be written to stencil buffer. new StencilMode({func: gl.ALWAYS, mask: 0}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), ColorMode.disabled, CullFaceMode.disabled, clippingMaskUniformValues(tileID.posMatrix), '$clipping', this.tileExtentBuffer, this.quadTriangleIndexBuffer, this.tileExtentSegments); } }; Painter.prototype.stencilModeFor3D = function stencilModeFor3D () { this.currentStencilSource = undefined; if (this.nextStencilID + 1 > 256) { this.clearStencil(); } var id = this.nextStencilID++; var gl = this.context.gl; return new StencilMode({func: gl.NOTEQUAL, mask: 0xFF}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); }; Painter.prototype.stencilModeForClipping = function stencilModeForClipping (tileID ) { var gl = this.context.gl; return new StencilMode({func: gl.EQUAL, mask: 0xFF}, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE); }; /* * Sort coordinates by Z as drawing tiles is done in Z-descending order. * All children with the same Z write the same stencil value. Children * stencil values are greater than parent's. This is used only for raster * and raster-dem tiles, which are already clipped to tile boundaries, to * mask area of tile overlapped by children tiles. * Stencil ref values continue range used in _tileClippingMaskIDs. * * Returns [StencilMode for tile overscaleZ map, sortedCoords]. */ Painter.prototype.stencilConfigForOverlap = function stencilConfigForOverlap (tileIDs ) { var obj; var gl = this.context.gl; var coords = tileIDs.sort(function (a, b) { return b.overscaledZ - a.overscaledZ; }); var minTileZ = coords[coords.length - 1].overscaledZ; var stencilValues = coords[0].overscaledZ - minTileZ + 1; if (stencilValues > 1) { this.currentStencilSource = undefined; if (this.nextStencilID + stencilValues > 256) { this.clearStencil(); } var zToStencilMode = {}; for (var i = 0; i < stencilValues; i++) { zToStencilMode[i + minTileZ] = new StencilMode({func: gl.GEQUAL, mask: 0xFF}, i + this.nextStencilID, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); } this.nextStencilID += stencilValues; return [zToStencilMode, coords]; } return [( obj = {}, obj[minTileZ] = StencilMode.disabled, obj ), coords]; }; Painter.prototype.colorModeForRenderPass = function colorModeForRenderPass () { var gl = this.context.gl; if (this._showOverdrawInspector) { var numOverdrawSteps = 8; var a = 1 / numOverdrawSteps; return new ColorMode([gl.CONSTANT_COLOR, gl.ONE], new performance.Color(a, a, a, 0), [true, true, true, true]); } else if (this.renderPass === 'opaque') { return ColorMode.unblended; } else { return ColorMode.alphaBlended; } }; Painter.prototype.depthModeForSublayer = function depthModeForSublayer (n , mask , func ) { if (!this.opaquePassEnabledForLayer()) { return DepthMode.disabled; } var depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; return new DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]); }; /* * The opaque pass and 3D layers both use the depth buffer. * Layers drawn above 3D layers need to be drawn using the * painter's algorithm so that they appear above 3D features. * This returns true for layers that can be drawn using the * opaque pass. */ Painter.prototype.opaquePassEnabledForLayer = function opaquePassEnabledForLayer () { return this.currentLayer < this.opaquePassCutoff; }; Painter.prototype.render = function render (style , options ) { var this$1 = this; this.style = style; this.options = options; this.lineAtlas = style.lineAtlas; this.imageManagerFactory = style.imageManagerFactory; this.glyphManager = style.glyphManager; this.symbolFadeChange = style.placement.symbolFadeChange(performance.browser.now()); this.imageManagerFactory.beginFrame(); var layerIds = this.style._order; var sourceCaches = this.style.sourceCaches; for (var id in sourceCaches) { var sourceCache = sourceCaches[id]; if (sourceCache.used) { sourceCache.prepare(this.context); } } var coordsAscending = {}; var coordsDescending = {}; var coordsDescendingSymbol = {}; for (var id$1 in sourceCaches) { var sourceCache$1 = sourceCaches[id$1]; coordsAscending[id$1] = sourceCache$1.getVisibleCoordinates(); coordsDescending[id$1] = coordsAscending[id$1].slice().reverse(); coordsDescendingSymbol[id$1] = sourceCache$1.getVisibleCoordinates(true).reverse(); } this.opaquePassCutoff = Infinity; for (var i = 0; i < layerIds.length; i++) { var layerId = layerIds[i]; if (this.style._layers[layerId].is3D()) { this.opaquePassCutoff = i; break; } } // Offscreen pass =============================================== // We first do all rendering that requires rendering to a separate // framebuffer, and then save those for rendering back to the map // later: in doing this we avoid doing expensive framebuffer restores. this.renderPass = 'offscreen'; for (var i$1 = 0, list = layerIds; i$1 < list.length; i$1 += 1) { var layerId$1 = list[i$1]; var layer = this.style._layers[layerId$1]; if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) { continue; } var coords = coordsDescending[layer.source]; if (layer.type !== 'custom' && !coords.length) { continue; } this.renderLayer(this, sourceCaches[layer.source], layer, coords); } // Rebind the main framebuffer now that all offscreen layers have been rendered: this.context.bindFramebuffer.set(null); // Clear buffers in preparation for drawing to the main framebuffer this.context.clear({color: options.showOverdrawInspector ? performance.Color.black : performance.Color.transparent, depth: 1}); this.clearStencil(); this._showOverdrawInspector = options.showOverdrawInspector; this.depthRangeFor3D = [0, 1 - ((style._order.length + 2) * this.numSublayers * this.depthEpsilon)]; // Opaque pass =============================================== // Draw opaque layers top-to-bottom first. this.renderPass = 'opaque'; for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) { var layer$1 = this.style._layers[layerIds[this.currentLayer]]; var sourceCache$2 = sourceCaches[layer$1.source]; var coords$1 = coordsAscending[layer$1.source]; this._renderTileClippingMasks(layer$1, coords$1); this.renderLayer(this, sourceCache$2, layer$1, coords$1); } // Translucent pass =============================================== // Draw all other layers bottom-to-top. this.renderPass = 'translucent'; for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) { var layer$2 = this.style._layers[layerIds[this.currentLayer]]; var sourceCache$3 = sourceCaches[layer$2.source]; // For symbol layers in the translucent pass, we add extra tiles to the renderable set // for cross-tile symbol fading. Symbol layers don't use tile clipping, so no need to render // separate clipping masks var coords$2 = (layer$2.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[layer$2.source]; this._renderTileClippingMasks(layer$2, coordsAscending[layer$2.source]); this.renderLayer(this, sourceCache$3, layer$2, coords$2); } if (this.options.showTileBoundaries) { //Use source with highest maxzoom var selectedSource; var sourceCache$4; var layers = performance.values(this.style._layers); layers.forEach(function (layer) { if (layer.source && !layer.isHidden(this$1.transform.zoom)) { if (layer.source !== (sourceCache$4 && sourceCache$4.id)) { sourceCache$4 = this$1.style.sourceCaches[layer.source]; } if (!selectedSource || (selectedSource.getSource().maxzoom < sourceCache$4.getSource().maxzoom)) { selectedSource = sourceCache$4; } } }); if (selectedSource) { draw$1.debug(this, selectedSource, selectedSource.getVisibleCoordinates()); } } if (this.options.showPadding) { drawDebugPadding(this); } // Set defaults for most GL values so that anyone using the state after the render // encounters more expected values. this.context.setDefault(); }; Painter.prototype.renderLayer = function renderLayer (painter , sourceCache , layer , coords ) { if (layer.isHidden(this.transform.zoom)) { return; } if (layer.type !== 'background' && layer.type !== 'custom' && !coords.length) { return; } this.id = layer.id; this.gpuTimingStart(layer); draw$1[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets); this.gpuTimingEnd(); }; Painter.prototype.gpuTimingStart = function gpuTimingStart (layer ) { if (!this.options.gpuTiming) { return; } var ext = this.context.extTimerQuery; // This tries to time the draw call itself, but note that the cost for drawing a layer // may be dominated by the cost of uploading vertices to the GPU. // To instrument that, we'd need to pass the layerTimers object down into the bucket // uploading logic. var layerTimer = this.gpuTimers[layer.id]; if (!layerTimer) { layerTimer = this.gpuTimers[layer.id] = { calls: 0, cpuTime: 0, query: ext.createQueryEXT() }; } layerTimer.calls++; ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, layerTimer.query); }; Painter.prototype.gpuTimingEnd = function gpuTimingEnd () { if (!this.options.gpuTiming) { return; } var ext = this.context.extTimerQuery; ext.endQueryEXT(ext.TIME_ELAPSED_EXT); }; Painter.prototype.collectGpuTimers = function collectGpuTimers () { var currentLayerTimers = this.gpuTimers; this.gpuTimers = {}; return currentLayerTimers; }; Painter.prototype.queryGpuTimers = function queryGpuTimers (gpuTimers ) { var layers = {}; for (var layerId in gpuTimers) { var gpuTimer = gpuTimers[layerId]; var ext = this.context.extTimerQuery; var gpuTime = ext.getQueryObjectEXT(gpuTimer.query, ext.QUERY_RESULT_EXT) / (1000 * 1000); ext.deleteQueryEXT(gpuTimer.query); layers[layerId] = gpuTime; } return layers; }; /** * Transform a matrix to incorporate the *-translate and *-translate-anchor properties into it. * @param inViewportPixelUnitsUnits True when the units accepted by the matrix are in viewport pixels instead of tile units. * @returns {Float32Array} matrix * @private */ Painter.prototype.translatePosMatrix = function translatePosMatrix (matrix , tile , translate , translateAnchor , inViewportPixelUnitsUnits ) { if (!translate[0] && !translate[1]) { return matrix; } var angle = inViewportPixelUnitsUnits ? (translateAnchor === 'map' ? this.transform.angle : 0) : (translateAnchor === 'viewport' ? -this.transform.angle : 0); if (angle) { var sinA = Math.sin(angle); var cosA = Math.cos(angle); translate = [ translate[0] * cosA - translate[1] * sinA, translate[0] * sinA + translate[1] * cosA ]; } var translation = [ inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom), inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom), 0 ]; var translatedMatrix = new Float32Array(16); performance.translate(translatedMatrix, matrix, translation); return translatedMatrix; }; Painter.prototype.saveTileTexture = function saveTileTexture (texture ) { var textures = this._tileTextures[texture.size[0]]; if (!textures) { this._tileTextures[texture.size[0]] = [texture]; } else { textures.push(texture); } }; Painter.prototype.getTileTexture = function getTileTexture (size ) { var textures = this._tileTextures[size]; return textures && textures.length > 0 ? textures.pop() : null; }; /** * Checks whether a pattern image is needed, and if it is, whether it is not loaded. * * @returns true if a needed image is missing and rendering needs to be skipped. * @private */ Painter.prototype.isPatternMissing = function isPatternMissing (image ) { if (!image) { return false; } if (!image.from || !image.to) { return true; } var imagePosA = this.imageManagerFactory.getPattern(image.from.toString()); var imagePosB = this.imageManagerFactory.getPattern(image.to.toString()); return !imagePosA || !imagePosB; }; Painter.prototype.useProgram = function useProgram (name , programConfiguration ) { this.cache = this.cache || {}; var key = "" + name + (programConfiguration ? programConfiguration.cacheKey : '') + (this._showOverdrawInspector ? '/overdraw' : ''); if (!this.cache[key]) { this.cache[key] = new Program$1(this.context, name, shaders[name], programConfiguration, programUniforms[name], this._showOverdrawInspector); } return this.cache[key]; }; /* * Reset some GL state to default values to avoid hard-to-debug bugs * in custom layers. */ Painter.prototype.setCustomLayerDefaults = function setCustomLayerDefaults () { // Prevent custom layers from unintentionally modify the last VAO used. // All other state is state is restored on it's own, but for VAOs it's // simpler to unbind so that we don't have to track the state of VAOs. this.context.unbindVAO(); // The default values for this state is meaningful and often expected. // Leaving this state dirty could cause a lot of confusion for users. this.context.cullFace.setDefault(); this.context.activeTexture.setDefault(); this.context.pixelStoreUnpack.setDefault(); this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(); this.context.pixelStoreUnpackFlipY.setDefault(); }; /* * Set GL state that is shared by all layers. */ Painter.prototype.setBaseState = function setBaseState () { var gl = this.context.gl; this.context.cullFace.set(false); this.context.viewport.set([0, 0, this.width, this.height]); this.context.blendEquation.set(gl.FUNC_ADD); }; Painter.prototype.initDebugOverlayCanvas = function initDebugOverlayCanvas () { if (this.debugOverlayCanvas == null) { this.debugOverlayCanvas = performance.window.document.createElement('canvas'); this.debugOverlayCanvas.width = 512; this.debugOverlayCanvas.height = 512; var gl = this.context.gl; this.debugOverlayTexture = new performance.Texture(this.context, this.debugOverlayCanvas, gl.RGBA); } }; Painter.prototype.destroy = function destroy () { this.emptyTexture.destroy(); if (this.debugOverlayTexture) { this.debugOverlayTexture.destroy(); } }; // var Frustum = function Frustum(points_ , planes_ ) { this.points = points_; this.planes = planes_; }; Frustum.fromInvProjectionMatrix = function fromInvProjectionMatrix (invProj , worldSize , zoom ) { var clipSpaceCorners = [ [-1, 1, -1, 1], [ 1, 1, -1, 1], [ 1, -1, -1, 1], [-1, -1, -1, 1], [-1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, -1, 1, 1], [-1, -1, 1, 1] ]; var scale = Math.pow(2, zoom); // Transform frustum corner points from clip space to tile space var frustumCoords = clipSpaceCorners .map(function (v) { return performance.transformMat4([], v, invProj); }) .map(function (v) { return performance.scale$1([], v, 1.0 / v[3] / worldSize * scale); }); var frustumPlanePointIndices = [ [0, 1, 2], // near [6, 5, 4], // far [0, 3, 7], // left [2, 1, 5], // right [3, 2, 6], // bottom [0, 4, 5] // top ]; var frustumPlanes = frustumPlanePointIndices.map(function (p ) { var a = performance.sub([], frustumCoords[p[0]], frustumCoords[p[1]]); var b = performance.sub([], frustumCoords[p[2]], frustumCoords[p[1]]); var n = performance.normalize([], performance.cross([], a, b)); var d = -performance.dot(n, frustumCoords[p[1]]); return n.concat(d); }); return new Frustum(frustumCoords, frustumPlanes); }; var Aabb = function Aabb(min_ , max_ ) { this.min = min_; this.max = max_; this.center = performance.scale$2([], performance.add([], this.min, this.max), 0.5); }; Aabb.prototype.quadrant = function quadrant (index ) { var split = [(index % 2) === 0, index < 2]; var qMin = performance.clone$2(this.min); var qMax = performance.clone$2(this.max); for (var axis = 0; axis < split.length; axis++) { qMin[axis] = split[axis] ? this.min[axis] : this.center[axis]; qMax[axis] = split[axis] ? this.center[axis] : this.max[axis]; } // Elevation is always constant, hence quadrant.max.z = this.max.z qMax[2] = this.max[2]; return new Aabb(qMin, qMax); }; Aabb.prototype.distanceX = function distanceX (point ) { var pointOnAabb = Math.max(Math.min(this.max[0], point[0]), this.min[0]); return pointOnAabb - point[0]; }; Aabb.prototype.distanceY = function distanceY (point ) { var pointOnAabb = Math.max(Math.min(this.max[1], point[1]), this.min[1]); return pointOnAabb - point[1]; }; // Performs a frustum-aabb intersection test. Returns 0 if there's no intersection, // 1 if shapes are intersecting and 2 if the aabb if fully inside the frustum. Aabb.prototype.intersects = function intersects (frustum ) { // Execute separating axis test between two convex objects to find intersections // Each frustum plane together with 3 major axes define the separating axes // Note: test only 4 points as both min and max points have equal elevation performance.assert(this.min[2] === 0 && this.max[2] === 0); var aabbPoints = [ [this.min[0], this.min[1], 0.0, 1], [this.max[0], this.min[1], 0.0, 1], [this.max[0], this.max[1], 0.0, 1], [this.min[0], this.max[1], 0.0, 1] ]; var fullyInside = true; for (var p = 0; p < frustum.planes.length; p++) { var plane = frustum.planes[p]; var pointsInside = 0; for (var i = 0; i < aabbPoints.length; i++) { pointsInside += performance.dot$1(plane, aabbPoints[i]) >= 0; } if (pointsInside === 0) { return 0; } if (pointsInside !== aabbPoints.length) { fullyInside = false; } } if (fullyInside) { return 2; } for (var axis = 0; axis < 3; axis++) { var projMin = Number.MAX_VALUE; var projMax = -Number.MAX_VALUE; for (var p$1 = 0; p$1 < frustum.points.length; p$1++) { var projectedPoint = frustum.points[p$1][axis] - this.min[axis]; projMin = Math.min(projMin, projectedPoint); projMax = Math.max(projMax, projectedPoint); } if (projMax < 0 || projMin > this.max[axis] - this.min[axis]) { return 0; } } return 1; }; // /** * An `EdgeInset` object represents screen space padding applied to the edges of the viewport. * This shifts the apprent center or the vanishing point of the map. This is useful for adding floating UI elements * on top of the map and having the vanishing point shift as UI elements resize. * * @param {number} [top=0] * @param {number} [bottom=0] * @param {number} [left=0] * @param {number} [right=0] */ var EdgeInsets = function EdgeInsets(top, bottom, left, right) { if ( top === void 0 ) top = 0; if ( bottom === void 0 ) bottom = 0; if ( left === void 0 ) left = 0; if ( right === void 0 ) right = 0; if (isNaN(top) || top < 0 || isNaN(bottom) || bottom < 0 || isNaN(left) || left < 0 || isNaN(right) || right < 0 ) { throw new Error('Invalid value for edge-insets, top, bottom, left and right must all be numbers'); } this.top = top; this.bottom = bottom; this.left = left; this.right = right; }; /** * Interpolates the inset in-place. * This maintains the current inset value for any inset not present in `target`. * * @param {PaddingOptions} target * @param {number} t * @returns {EdgeInsets} * @memberof EdgeInsets */ EdgeInsets.prototype.interpolate = function interpolate (start , target , t ) { if (target.top != null && start.top != null) { this.top = performance.number(start.top, target.top, t); } if (target.bottom != null && start.bottom != null) { this.bottom = performance.number(start.bottom, target.bottom, t); } if (target.left != null && start.left != null) { this.left = performance.number(start.left, target.left, t); } if (target.right != null && start.right != null) { this.right = performance.number(start.right, target.right, t); } return this; }; /** * Utility method that computes the new apprent center or vanishing point after applying insets. * This is in pixels and with the top left being (0.0) and +y being downwards. * * @param {number} width * @param {number} height * @returns {Point} * @memberof EdgeInsets */ EdgeInsets.prototype.getCenter = function getCenter (width , height ) { // Clamp insets so they never overflow width/height and always calculate a valid center var x = performance.clamp((this.left + width - this.right) / 2, 0, width); var y = performance.clamp((this.top + height - this.bottom) / 2, 0, height); return new performance.Point(x, y); }; EdgeInsets.prototype.equals = function equals (other ) { return this.top === other.top && this.bottom === other.bottom && this.left === other.left && this.right === other.right; }; EdgeInsets.prototype.clone = function clone () { return new EdgeInsets(this.top, this.bottom, this.left, this.right); }; /** * Returns the current sdtate as json, useful when you want to have a * read-only representation of the inset. * * @returns {PaddingOptions} * @memberof EdgeInsets */ EdgeInsets.prototype.toJSON = function toJSON () { return { top: this.top, bottom: this.bottom, left: this.left, right: this.right }; }; // /** * A single transform, generally used for a single tile to be * scaled, rotated, and zoomed. * @private */ var Transform = function Transform(minZoom , maxZoom , minPitch , maxPitch , renderWorldCopies , maxBounds, crs) { this.tileSize = 512; // constant this.maxValidLatitude = 85.051129; // constant this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; this._minZoom = minZoom || 0; this._maxZoom = maxZoom || 22; this._minPitch = (minPitch === undefined || minPitch === null) ? 0 : minPitch; this._maxPitch = (maxPitch === undefined || maxPitch === null) ? 60 : maxPitch; this.setMaxBounds(); if (crs) { this.setCRS(crs); } this.width = 0; this.height = 0; this._center = new performance.LngLat(0, 0); this.zoom = 0; this.angle = 0; this._fov = 0.6435011087932844; this._pitch = 0; this._unmodified = true; this._edgeInsets = new EdgeInsets(); this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; var prototypeAccessors = { minZoom: { configurable: true },maxZoom: { configurable: true },minPitch: { configurable: true },maxPitch: { configurable: true },renderWorldCopies: { configurable: true },worldSize: { configurable: true },centerOffset: { configurable: true },size: { configurable: true },bearing: { configurable: true },pitch: { configurable: true },fov: { configurable: true },zoom: { configurable: true },center: { configurable: true },padding: { configurable: true },centerPoint: { configurable: true },unmodified: { configurable: true },point: { configurable: true } }; Transform.prototype.clone = function clone () { var clone = new Transform(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies, null, this.crs); clone.tileSize = this.tileSize; clone.latRange = this.latRange; clone.width = this.width; clone.height = this.height; clone._center = this._center; clone.zoom = this.zoom; clone.angle = this.angle; clone._fov = this._fov; clone._pitch = this._pitch; clone._unmodified = this._unmodified; clone._edgeInsets = this._edgeInsets.clone(); clone._calcMatrices(); return clone; }; Transform.prototype.getCRS = function getCRS () { return this.crs; }; Transform.prototype.setCRS = function setCRS (crs) { this.crs = crs; this.indexExtent = crs.getExtent(); this.worldWidth = this.indexExtent[2] - this.indexExtent[0]; this.worldHeight = this.indexExtent[3] - this.indexExtent[1]; this.centerX = (this.indexExtent[2] + this.indexExtent[0]) / 2; this.centerY = (this.indexExtent[3] + this.indexExtent[1]) / 2; this.originX = this.indexExtent[0]; this.originY = this.indexExtent[3]; this.crs.renderWorldCopies = this.renderWorldCopies; }; prototypeAccessors.minZoom.get = function () { return this._minZoom; }; prototypeAccessors.minZoom.set = function (zoom ) { if (this._minZoom === zoom) { return; } this._minZoom = zoom; this.zoom = Math.max(this.zoom, zoom); }; prototypeAccessors.maxZoom.get = function () { return this._maxZoom; }; prototypeAccessors.maxZoom.set = function (zoom ) { if (this._maxZoom === zoom) { return; } this._maxZoom = zoom; this.zoom = Math.min(this.zoom, zoom); }; prototypeAccessors.minPitch.get = function () { return this._minPitch; }; prototypeAccessors.minPitch.set = function (pitch ) { if (this._minPitch === pitch) { return; } this._minPitch = pitch; this.pitch = Math.max(this.pitch, pitch); }; prototypeAccessors.maxPitch.get = function () { return this._maxPitch; }; prototypeAccessors.maxPitch.set = function (pitch ) { if (this._maxPitch === pitch) { return; } this._maxPitch = pitch; this.pitch = Math.min(this.pitch, pitch); }; prototypeAccessors.renderWorldCopies.get = function () { return this._renderWorldCopies; }; prototypeAccessors.renderWorldCopies.set = function (renderWorldCopies ) { if (renderWorldCopies === undefined) { renderWorldCopies = true; } else if (renderWorldCopies === null) { renderWorldCopies = false; } this._renderWorldCopies = renderWorldCopies; }; prototypeAccessors.worldSize.get = function () { return this.tileSize * this.scale; }; prototypeAccessors.centerOffset.get = function () { return this.centerPoint._sub(this.size._div(2)); }; prototypeAccessors.size.get = function () { return new performance.Point(this.width, this.height); }; prototypeAccessors.bearing.get = function () { return -this.angle / Math.PI * 180; }; prototypeAccessors.bearing.set = function (bearing ) { var b = -performance.wrap(bearing, -180, 180) * Math.PI / 180; if (this.angle === b) { return; } this._unmodified = false; this.angle = b; this._calcMatrices(); // 2x2 matrix for rotating points this.rotationMatrix = performance.create$2(); performance.rotate(this.rotationMatrix, this.rotationMatrix, this.angle); }; prototypeAccessors.pitch.get = function () { return this._pitch / Math.PI * 180; }; prototypeAccessors.pitch.set = function (pitch ) { var p = performance.clamp(pitch, this.minPitch, this.maxPitch) / 180 * Math.PI; if (this._pitch === p) { return; } this._unmodified = false; this._pitch = p; this._calcMatrices(); }; prototypeAccessors.fov.get = function () { return this._fov / Math.PI * 180; }; prototypeAccessors.fov.set = function (fov ) { fov = Math.max(0.01, Math.min(60, fov)); if (this._fov === fov) { return; } this._unmodified = false; this._fov = fov / 180 * Math.PI; this._calcMatrices(); }; prototypeAccessors.zoom.get = function () { return this._zoom; }; prototypeAccessors.zoom.set = function (zoom ) { var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); if (this._zoom === z) { return; } this._unmodified = false; this._zoom = z; this.scale = this.zoomScale(z); this.tileZoom = Math.floor(z); this.zoomFraction = z - this.tileZoom; this._constrain(); this._calcMatrices(); }; prototypeAccessors.center.get = function () { return this._center; }; prototypeAccessors.center.set = function (center ) { if (center.lat === this._center.lat && center.lng === this._center.lng) { return; } this._unmodified = false; this._center = center; this._constrain(); this._calcMatrices(); }; prototypeAccessors.padding.get = function () { return this._edgeInsets.toJSON(); }; prototypeAccessors.padding.set = function (padding ) { if (this._edgeInsets.equals(padding)) { return; } this._unmodified = false; //Update edge-insets inplace this._edgeInsets.interpolate(this._edgeInsets, padding, 1); this._calcMatrices(); }; /** * The center of the screen in pixels with the top-left corner being (0,0) * and +y axis pointing downwards. This accounts for padding. * * @readonly * @type {Point} * @memberof Transform */ prototypeAccessors.centerPoint.get = function () { return this._edgeInsets.getCenter(this.width, this.height); }; /** * Returns if the padding params match * * @param {PaddingOptions} padding * @returns {boolean} * @memberof Transform */ Transform.prototype.isPaddingEqual = function isPaddingEqual (padding ) { return this._edgeInsets.equals(padding); }; /** * Helper method to upadte edge-insets inplace * * @param {PaddingOptions} target * @param {number} t * @memberof Transform */ Transform.prototype.interpolatePadding = function interpolatePadding (start , target , t ) { this._unmodified = false; this._edgeInsets.interpolate(start, target, t); this._constrain(); this._calcMatrices(); }; /** * Return a zoom level that will cover all tiles the transform * @param {Object} options options * @param {number} options.tileSize Tile size, expressed in screen pixels. * @param {boolean} options.roundZoom Target zoom level. If true, the value will be rounded to the closest integer. Otherwise the value will be floored. * @returns {number} zoom level An integer zoom level at which all tiles will be visible. */ Transform.prototype.coveringZoomLevel = function coveringZoomLevel (options ) { var z = (options.roundZoom ? Math.round : Math.floor)( this.zoom + this.scaleZoom(this.tileSize / options.tileSize) ); // At negative zoom levels load tiles from z0 because negative tile zoom levels don't exist. return Math.max(0, z); }; /** * Return any "wrapped" copies of a given tile coordinate that are visible * in the current view. * * @private */ Transform.prototype.getVisibleUnwrappedCoordinates = function getVisibleUnwrappedCoordinates (tileID ) { var result = [new performance.UnwrappedTileID(0, tileID)]; if (this._renderWorldCopies) { var utl = this.pointCoordinate(new performance.Point(0, 0)); var utr = this.pointCoordinate(new performance.Point(this.width, 0)); var ubl = this.pointCoordinate(new performance.Point(this.width, this.height)); var ubr = this.pointCoordinate(new performance.Point(0, this.height)); var w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x)); var w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x)); // Add an extra copy of the world on each side to properly render ImageSources and CanvasSources. // Both sources draw outside the tile boundaries of the tile that "contains them" so we need // to add extra copies on both sides in case offscreen tiles need to draw into on-screen ones. var extraWorldCopy = 1; for (var w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) { if (w === 0) { continue; } result.push(new performance.UnwrappedTileID(w, tileID)); } } return result; }; /** * Return all coordinates that could cover this transform for a covering * zoom level. * @param {Object} options * @param {number} options.tileSize * @param {number} options.minzoom * @param {number} options.maxzoom * @param {boolean} options.roundZoom * @param {boolean} options.reparseOverscaled * @param {boolean} options.renderWorldCopies * @returns {Array} OverscaledTileIDs * @private */ Transform.prototype.coveringTiles = function coveringTiles ( options ) { var z = this.coveringZoomLevel(options); var actualZ = z; if (options.minzoom !== undefined && z < options.minzoom) { return []; } if (options.maxzoom !== undefined && z > options.maxzoom) { z = options.maxzoom; } var centerCoord = this.crs.fromLngLat(this.center); var numTiles = Math.pow(2, z); var centerPoint = [numTiles * centerCoord.x, numTiles * centerCoord.y, 0]; var cameraFrustum = Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, z); // No change of LOD behavior for pitch lower than 60 and when there is no top padding: return only tile ids from the requested zoom level var minZoom = options.minzoom || 0; // Use 0.1 as an epsilon to avoid for explicit == 0.0 floating point checks if (this.pitch <= 60.0 && this._edgeInsets.top < 0.1) { minZoom = z; } // There should always be a certain number of maximum zoom level tiles surrounding the center location var radiusOfMaxLvlLodInTiles = 3; var newRootTile = function (wrap ) { return { // All tiles are on zero elevation plane => z difference is zero aabb: new Aabb([wrap * numTiles, 0, 0], [(wrap + 1) * numTiles, numTiles, 0]), zoom: 0, x: 0, y: 0, wrap: wrap, fullyVisible: false }; }; // Do a depth-first traversal to find visible tiles and proper levels of detail var stack = []; var result = []; var maxZoom = z; var overscaledZ = options.reparseOverscaled ? actualZ : z; if (this._renderWorldCopies) { // Render copy of the globe thrice on both sides for (var i = 1; i <= 3; i++) { stack.push(newRootTile(-i)); stack.push(newRootTile(i)); } } stack.push(newRootTile(0)); while (stack.length > 0) { var it = stack.pop(); var x = it.x; var y = it.y; var fullyVisible = it.fullyVisible; // Visibility of a tile is not required if any of its ancestor if fully inside the frustum if (!fullyVisible) { var intersectResult = it.aabb.intersects(cameraFrustum); if (intersectResult === 0) { continue; } fullyVisible = intersectResult === 2; } var distanceX = it.aabb.distanceX(centerPoint); var distanceY = it.aabb.distanceY(centerPoint); var longestDim = Math.max(Math.abs(distanceX), Math.abs(distanceY)); // We're using distance based heuristics to determine if a tile should be split into quadrants or not. // radiusOfMaxLvlLodInTiles defines that there's always a certain number of maxLevel tiles next to the map center. // Using the fact that a parent node in quadtree is twice the size of its children (per dimension) // we can define distance thresholds for each relative level: // f(k) = offset + 2 + 4 + 8 + 16 + ... + 2^k. This is the same as "offset+2^(k+1)-2" var distToSplit = radiusOfMaxLvlLodInTiles + (1 << (maxZoom - it.zoom)) - 2; // Have we reached the target depth or is the tile too far away to be any split further? if (it.zoom === maxZoom || (longestDim > distToSplit && it.zoom >= minZoom)) { result.push({ tileID: new performance.OverscaledTileID(it.zoom === maxZoom ? overscaledZ : it.zoom, it.wrap, it.zoom, x, y, this.indexExtent), distanceSq: performance.sqrLen([centerPoint[0] - 0.5 - x, centerPoint[1] - 0.5 - y]) }); continue; } for (var i$1 = 0; i$1 < 4; i$1++) { var childX = (x << 1) + (i$1 % 2); var childY = (y << 1) + (i$1 >> 1); stack.push({aabb: it.aabb.quadrant(i$1), zoom: it.zoom + 1, x: childX, y: childY, wrap: it.wrap, fullyVisible: fullyVisible}); } } return result.sort(function (a, b) { return a.distanceSq - b.distanceSq; }).map(function (a) { return a.tileID; }); }; Transform.prototype.resize = function resize (width , height ) { this.width = width; this.height = height; this.pixelsToGLUnits = [2 / width, -2 / height]; this._constrain(); this._calcMatrices(); }; prototypeAccessors.unmodified.get = function () { return this._unmodified; }; Transform.prototype.zoomScale = function zoomScale (zoom ) { return Math.pow(2, zoom); }; Transform.prototype.scaleZoom = function scaleZoom (scale ) { return Math.log(scale) / Math.LN2; }; Transform.prototype.project = function project (lnglat ) { var lat = this.latRange?performance.clamp(lnglat.lat, -this.maxValidLatitude, this.maxValidLatitude):lnglat.lat; var xy = this.lngLatXY(lnglat.lng, lat); return new performance.Point( xy[0], xy[1]); }; Transform.prototype.unproject = function unproject (point ) { var unproject = this.xYLngLat(point.x, point.y); return new performance.LngLat(unproject[0], unproject[1]); }; prototypeAccessors.point.get = function () { return this.project(this.center); }; Transform.prototype.lngLatXY = function lngLatXY (lng , lat ) { var forward = this.crs.fromWGS84([lng, lat]); return [((forward[0] - this.originX) * this.worldSize) / this.worldWidth, ((this.originY - forward[1]) * this.worldSize) / this.worldHeight]; }; /** * latitude to absolute x coord * @param {number} lon * @returns {number} pixel coordinate */ Transform.prototype.lngX = function lngX (lng ) { return this.lngLatXY(lng, this.center.lat)[0]; }; /** * latitude to absolute y coord * @param {number} lat * @returns {number} pixel coordinate */ Transform.prototype.latY = function latY (lat ) { return this.lngLatXY(this.center.lng, lat)[1]; }; Transform.prototype.xYLngLat = function xYLngLat (x , y ) { return this.crs.toWGS84([(x * this.worldWidth) / this.worldSize + this.originX, this.originY - (y * this.worldHeight) / this.worldSize]); }; Transform.prototype.xLng = function xLng (x) { var center = this.center; var centerXY = this.lngLatXY(center.lng, center.lat); return this.xYLngLat(x, centerXY[1])[0]; }; Transform.prototype.yLat = function yLat (y) { var center = this.center; var centerXY = this.lngLatXY(center.lng, center.lat); return this.xYLngLat(centerXY[0], y)[1]; }; Transform.prototype.setLocationAtPoint = function setLocationAtPoint (lnglat , point ) { var a = this.pointCoordinate(point); var b = this.pointCoordinate(this.centerPoint); var loc = this.locationCoordinate(lnglat); var newCenter = new performance.MercatorCoordinate( loc.x - (a.x - b.x), loc.y - (a.y - b.y)); this.center = this.coordinateLocation(newCenter); if (this._renderWorldCopies) { this.center = this.center.wrap(); } }; /** * Given a location, return the screen point that corresponds to it * @param {LngLat} lnglat location * @returns {Point} screen point * @private */ Transform.prototype.locationPoint = function locationPoint (lnglat ) { return this.coordinatePoint(this.locationCoordinate(lnglat)); }; /** * Given a point on screen, return its lnglat * @param {Point} p screen point * @returns {LngLat} lnglat location * @private */ Transform.prototype.pointLocation = function pointLocation (p ) { return this.coordinateLocation(this.pointCoordinate(p)); }; /** * Given a geographical lnglat, return an unrounded * coordinate that represents it at this transform's zoom level. * @param {LngLat} lnglat * @returns {Coordinate} * @private */ Transform.prototype.locationCoordinate = function locationCoordinate (lnglat ) { return this.crs.fromLngLat(lnglat); }; /** * Given a Coordinate, return its geographical position. * @param {Coordinate} coord * @returns {LngLat} lnglat * @private */ Transform.prototype.coordinateLocation = function coordinateLocation (coord ) { return this.crs.toLngLat(coord.x, coord.y); }; Transform.prototype.pointCoordinate = function pointCoordinate (p ) { var targetZ = 0; // since we don't know the correct projected z value for the point, // unproject two points to get a line and then find the point on that // line with z=0 var coord0 = [p.x, p.y, 0, 1]; var coord1 = [p.x, p.y, 1, 1]; performance.transformMat4(coord0, coord0, this.pixelMatrixInverse); performance.transformMat4(coord1, coord1, this.pixelMatrixInverse); var w0 = coord0[3]; var w1 = coord1[3]; var x0 = coord0[0] / w0; var x1 = coord1[0] / w1; var y0 = coord0[1] / w0; var y1 = coord1[1] / w1; var z0 = coord0[2] / w0; var z1 = coord1[2] / w1; var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); return new performance.MercatorCoordinate( performance.number(x0, x1, t) / this.worldSize, performance.number(y0, y1, t) / this.worldSize); }; /** * Given a coordinate, return the screen point that corresponds to it * @param {Coordinate} coord * @returns {Point} screen point * @private */ Transform.prototype.coordinatePoint = function coordinatePoint (coord ) { var p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1]; performance.transformMat4(p, p, this.pixelMatrix); return new performance.Point(p[0] / p[3], p[1] / p[3]); }; /** * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region. * @returns {LngLatBounds} Returns a {@link LngLatBounds} object describing the map's geographical bounds. */ Transform.prototype.getBounds = function getBounds () { return new performance.LngLatBounds() .extend(this.pointLocation(new performance.Point(0, 0))) .extend(this.pointLocation(new performance.Point(this.width, 0))) .extend(this.pointLocation(new performance.Point(this.width, this.height))) .extend(this.pointLocation(new performance.Point(0, this.height))); }; /** * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. * @returns {LngLatBounds} {@link LngLatBounds} */ Transform.prototype.getMaxBounds = function getMaxBounds () { if (!this.latRange || this.latRange.length !== 2 || !this.lngRange || this.lngRange.length !== 2) { return null; } return new performance.LngLatBounds([this.lngRange[0], this.latRange[0]], [this.lngRange[1], this.latRange[1]]); }; /** * Sets or clears the map's geographical constraints. * @param {LngLatBounds} bounds A {@link LngLatBounds} object describing the new geographic boundaries of the map. */ Transform.prototype.setMaxBounds = function setMaxBounds (bounds ) { if (bounds) { this.lngRange = [bounds.getWest(), bounds.getEast()]; this.latRange = [bounds.getSouth(), bounds.getNorth()]; this._constrain(); } else { this.lngRange = null; this.latRange = [-this.maxValidLatitude, this.maxValidLatitude]; } }; /** * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map. * @param {UnwrappedTileID} unwrappedTileID; * @private */ Transform.prototype.calculatePosMatrix = function calculatePosMatrix (unwrappedTileID , aligned) { if ( aligned === void 0 ) aligned = false; var posMatrixKey = unwrappedTileID.key; var cache = aligned ? this._alignedPosMatrixCache : this._posMatrixCache; if (cache[posMatrixKey]) { return cache[posMatrixKey]; } var canonical = unwrappedTileID.canonical; var scale = this.worldSize / this.zoomScale(canonical.z); var unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap; var posMatrix = performance.identity(new Float64Array(16)); performance.translate(posMatrix, posMatrix, [unwrappedX * scale, canonical.y * scale, 0]); performance.scale(posMatrix, posMatrix, [scale / performance.EXTENT, scale / performance.EXTENT, 1]); performance.multiply(posMatrix, aligned ? this.alignedProjMatrix : this.projMatrix, posMatrix); cache[posMatrixKey] = new Float32Array(posMatrix); return cache[posMatrixKey]; }; Transform.prototype.customLayerMatrix = function customLayerMatrix () { return this.mercatorMatrix.slice(); }; Transform.prototype._constrain = function _constrain () { if (!this.center || !this.width || !this.height || this._constraining) { return; } this._constraining = true; var minY = -90; var maxY = 90; var minX = -180; var maxX = 180; var sy, sx, x2, y2; var size = this.size, unmodified = this._unmodified; if (this.latRange) { var latRange = this.latRange; minY = this.latY(latRange[1]); maxY = this.latY(latRange[0]); sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; } if (this.lngRange) { var lngRange = this.lngRange; minX = this.lngX(lngRange[0]); maxX = this.lngX(lngRange[1]); sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; } var point = this.point; // how much the map should scale to fit the screen into given latitude/longitude ranges var s = Math.max(sx || 0, sy || 0); if (s) { this.center = this.unproject(new performance.Point( sx ? (maxX + minX) / 2 : point.x, sy ? (maxY + minY) / 2 : point.y)); this.zoom += this.scaleZoom(s); this._unmodified = unmodified; this._constraining = false; return; } if (this.latRange) { var y = point.y, h2 = size.y / 2; if (y - h2 < minY) { y2 = minY + h2; } if (y + h2 > maxY) { y2 = maxY - h2; } } if (this.lngRange) { var x = point.x, w2 = size.x / 2; if (x - w2 < minX) { x2 = minX + w2; } if (x + w2 > maxX) { x2 = maxX - w2; } } // pan the map if the screen goes off the range if (x2 !== undefined || y2 !== undefined) { this.center = this.unproject(new performance.Point( x2 !== undefined ? x2 : point.x, y2 !== undefined ? y2 : point.y)); } this._unmodified = unmodified; this._constraining = false; }; Transform.prototype._calcMatrices = function _calcMatrices () { if (!this.height) { return; } var halfFov = this._fov / 2; var offset = this.centerOffset; this.cameraToCenterDistance = 0.5 / Math.tan(halfFov) * this.height; // Find the distance from the center point [width/2 + offset.x, height/2 + offset.y] to the // center top point [width/2 + offset.x, 0] in Z units, using the law of sines. // 1 Z unit is equivalent to 1 horizontal px at the center of the map // (the distance between[width/2, height/2] and [width/2 + 1, height/2]) var groundAngle = Math.PI / 2 + this._pitch; var fovAboveCenter = this._fov * (0.5 + offset.y / this.height); var topHalfSurfaceDistance = Math.sin(fovAboveCenter) * this.cameraToCenterDistance / Math.sin(performance.clamp(Math.PI - groundAngle - fovAboveCenter, 0.01, Math.PI - 0.01)); var point = this.point; var x = point.x, y = point.y; // Calculate z distance of the farthest fragment that should be rendered. var furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance; // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` var farZ = furthestDistance * 1.01; // The larger the value of nearZ is // - the more depth precision is available for features (good) // - clipping starts appearing sooner when the camera is close to 3d features (bad) // // Smaller values worked well for mapbox-gl-js but deckgl was encountering precision issues // when rendering it's layers using custom layers. This value was experimentally chosen and // seems to solve z-fighting issues in deckgl while not clipping buildings too close to the camera. var nearZ = this.height / 50; // matrix for conversion from location to GL coordinates (-1 .. 1) var m = new Float64Array(16); performance.perspective(m, this._fov, this.width / this.height, nearZ, farZ); //Apply center of perspective offset m[8] = -offset.x * 2 / this.width; m[9] = offset.y * 2 / this.height; performance.scale(m, m, [1, -1, 1]); performance.translate(m, m, [0, 0, -this.cameraToCenterDistance]); performance.rotateX(m, m, this._pitch); performance.rotateZ(m, m, this.angle); performance.translate(m, m, [-x, -y, 0]); // The mercatorMatrix can be used to transform points from mercator coordinates // ([0, 0] nw, [1, 1] se) to GL coordinates. this.mercatorMatrix = performance.scale([], m, [this.worldSize, this.worldSize, this.worldSize]); // scale vertically to meters per pixel (inverse of ground resolution): // mat4.scale(m, m, [1, 1, mercatorZfromAltitude(1, this.center.lat) * this.worldSize, 1]); var verticalScale = this.worldSize / (2 * Math.PI * 6378137 * Math.abs(Math.cos(this.center.lat * (Math.PI / 180)))); if (this.units === 'm' || this.units === 'meter') { if(this.crs){ verticalScale = this.worldSize / (this.crs.extent[3] - this.crs.extent[1]); }else { verticalScale = this.worldSize / (this.latRange[1] - this.latRange[0]); } } performance.scale(m, m, [1, 1, verticalScale, 1]); this.projMatrix = m; this.invProjMatrix = performance.invert([], this.projMatrix); // Make a second projection matrix that is aligned to a pixel grid for rendering raster tiles. // We're rounding the (floating point) x/y values to achieve to avoid rendering raster images to fractional // coordinates. Additionally, we adjust by half a pixel in either direction in case that viewport dimension // is an odd integer to preserve rendering to the pixel grid. We're rotating this shift based on the angle // of the transformation so that 0°, 90°, 180°, and 270° rasters are crisp, and adjust the shift so that // it is always <= 0.5 pixels. var xShift = (this.width % 2) / 2, yShift = (this.height % 2) / 2, angleCos = Math.cos(this.angle), angleSin = Math.sin(this.angle), dx = x - Math.round(x) + angleCos * xShift + angleSin * yShift, dy = y - Math.round(y) + angleCos * yShift + angleSin * xShift; var alignedM = new Float64Array(m); performance.translate(alignedM, alignedM, [ dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0 ]); this.alignedProjMatrix = alignedM; m = performance.create(); performance.scale(m, m, [this.width / 2, -this.height / 2, 1]); performance.translate(m, m, [1, -1, 0]); this.labelPlaneMatrix = m; m = performance.create(); performance.scale(m, m, [1, -1, 1]); performance.translate(m, m, [-1, -1, 0]); performance.scale(m, m, [2 / this.width, 2 / this.height, 1]); this.glCoordMatrix = m; // matrix for conversion from location to screen coordinates this.pixelMatrix = performance.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix); // inverse matrix for conversion from screen coordinaes to location m = performance.invert(new Float64Array(16), this.pixelMatrix); if (!m) { throw new Error("failed to invert matrix"); } this.pixelMatrixInverse = m; this._posMatrixCache = {}; this._alignedPosMatrixCache = {}; }; Transform.prototype.maxPitchScaleFactor = function maxPitchScaleFactor () { // calcMatrices hasn't run yet if (!this.pixelMatrixInverse) { return 1; } var coord = this.pointCoordinate(new performance.Point(0, 0)); var p = [coord.x * this.worldSize, coord.y * this.worldSize, 0, 1]; var topPoint = performance.transformMat4(p, p, this.pixelMatrix); return topPoint[3] / this.cameraToCenterDistance; }; /* * The camera looks at the map from a 3D (lng, lat, altitude) location. Let's use `cameraLocation` * as the name for the location under the camera and on the surface of the earth (lng, lat, 0). * `cameraPoint` is the projected position of the `cameraLocation`. * * This point is useful to us because only fill-extrusions that are between `cameraPoint` and * the query point on the surface of the earth can extend and intersect the query. * * When the map is not pitched the `cameraPoint` is equivalent to the center of the map because * the camera is right above the center of the map. */ Transform.prototype.getCameraPoint = function getCameraPoint () { var pitch = this._pitch; var yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1); return this.centerPoint.add(new performance.Point(0, yOffset)); }; /* * When the map is pitched, some of the 3D features that intersect a query will not intersect * the query at the surface of the earth. Instead the feature may be closer and only intersect * the query because it extrudes into the air. * * This returns a geometry that includes all of the original query as well as all possible ares of the * screen where the *base* of a visible extrusion could be. * - For point queries, the line from the query point to the "camera point" * - For other geometries, the envelope of the query geometry and the "camera point" */ Transform.prototype.getCameraQueryGeometry = function getCameraQueryGeometry (queryGeometry ) { var c = this.getCameraPoint(); if (queryGeometry.length === 1) { return [queryGeometry[0], c]; } else { var minX = c.x; var minY = c.y; var maxX = c.x; var maxY = c.y; for (var i = 0, list = queryGeometry; i < list.length; i += 1) { var p = list[i]; minX = Math.min(minX, p.x); minY = Math.min(minY, p.y); maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y); } return [ new performance.Point(minX, minY), new performance.Point(maxX, minY), new performance.Point(maxX, maxY), new performance.Point(minX, maxY), new performance.Point(minX, minY) ]; } }; Object.defineProperties( Transform.prototype, prototypeAccessors ); // strict /** * Throttle the given function to run at most every `period` milliseconds. * @private */ function throttle(fn , time ) { var pending = false; var timerId = null; var later = function () { timerId = null; if (pending) { fn(); timerId = setTimeout(later, time); pending = false; } }; return function () { pending = true; if (!timerId) { later(); } return timerId; }; } // /* * Adds the map's position to its page's location hash. * Passed as an option to the map object. * * @returns {Hash} `this` */ var Hash = function Hash(hashName ) { this._hashName = hashName && encodeURIComponent(hashName); performance.bindAll([ '_getCurrentHash', '_onHashChange', '_updateHash' ], this); // Mobile Safari doesn't allow updating the hash more than 100 times per 30 seconds. this._updateHash = throttle(this._updateHashUnthrottled.bind(this), 30 * 1000 / 100); }; /* * Map element to listen for coordinate changes * * @param {Object} map * @returns {Hash} `this` */ Hash.prototype.addTo = function addTo (map ) { this._map = map; performance.window.addEventListener('hashchange', this._onHashChange, false); this._map.on('moveend', this._updateHash); return this; }; /* * Removes hash * * @returns {Popup} `this` */ Hash.prototype.remove = function remove () { performance.window.removeEventListener('hashchange', this._onHashChange, false); this._map.off('moveend', this._updateHash); clearTimeout(this._updateHash()); delete this._map; return this; }; Hash.prototype.getHashString = function getHashString (mapFeedback ) { var center = this._map.getCenter(), zoom = Math.round(this._map.getZoom() * 100) / 100, // derived from equation: 512px * 2^z / 360 / 10^d < 0.5px precision = Math.ceil((zoom * Math.LN2 + Math.log(512 / 360 / 0.5)) / Math.LN10), m = Math.pow(10, precision), lng = Math.round(center.lng * m) / m, lat = Math.round(center.lat * m) / m, bearing = this._map.getBearing(), pitch = this._map.getPitch(); var hash = ''; if (mapFeedback) { // new map feedback site has some constraints that don't allow // us to use the same hash format as we do for the Map hash option. hash += "/" + lng + "/" + lat + "/" + zoom; } else { hash += zoom + "/" + lat + "/" + lng; } if (bearing || pitch) { hash += (("/" + (Math.round(bearing * 10) / 10))); } if (pitch) { hash += (("/" + (Math.round(pitch)))); } if (this._hashName) { var hashName = this._hashName; var found = false; var parts = performance.window.location.hash.slice(1).split('&').map(function (part) { var key = part.split('=')[0]; if (key === hashName) { found = true; return (key + "=" + hash); } return part; }).filter(function (a) { return a; }); if (!found) { parts.push((hashName + "=" + hash)); } return ("#" + (parts.join('&'))); } return ("#" + hash); }; Hash.prototype._getCurrentHash = function _getCurrentHash () { var this$1 = this; // Get the current hash from location, stripped from its number sign var hash = performance.window.location.hash.replace('#', ''); if (this._hashName) { // Split the parameter-styled hash into parts and find the value we need var keyval; hash.split('&').map( function (part) { return part.split('='); } ).forEach(function (part) { if (part[0] === this$1._hashName) { keyval = part; } }); return (keyval ? keyval[1] || '' : '').split('/'); } return hash.split('/'); }; Hash.prototype._onHashChange = function _onHashChange () { var loc = this._getCurrentHash(); if (loc.length >= 3 && !loc.some(function (v) { return isNaN(v); })) { var bearing = this._map.dragRotate.isEnabled() && this._map.touchZoomRotate.isEnabled() ? +(loc[3] || 0) : this._map.getBearing(); this._map.jumpTo({ center: [+loc[2], +loc[1]], zoom: +loc[0], bearing: bearing, pitch: +(loc[4] || 0) }); return true; } return false; }; Hash.prototype._updateHashUnthrottled = function _updateHashUnthrottled () { var hash = this.getHashString(); try { performance.window.history.replaceState(performance.window.history.state, '', hash); } catch (SecurityError) { // IE11 does not allow this if the page is within an iframe created // with iframe.contentWindow.document.write(...). // https://github.com/mapbox/mapbox-gl-js/issues/7410 } }; // var defaultInertiaOptions = { linearity: 0.3, easing: performance.bezier(0, 0, 0.3, 1), }; var defaultPanInertiaOptions = performance.extend({ deceleration: 2500, maxSpeed: 1400 }, defaultInertiaOptions); var defaultZoomInertiaOptions = performance.extend({ deceleration: 20, maxSpeed: 1400 }, defaultInertiaOptions); var defaultBearingInertiaOptions = performance.extend({ deceleration: 1000, maxSpeed: 360 }, defaultInertiaOptions); var defaultPitchInertiaOptions = performance.extend({ deceleration: 1000, maxSpeed: 90 }, defaultInertiaOptions); var HandlerInertia = function HandlerInertia(map ) { this._map = map; this.clear(); }; HandlerInertia.prototype.clear = function clear () { this._inertiaBuffer = []; }; HandlerInertia.prototype.record = function record (settings ) { this._drainInertiaBuffer(); this._inertiaBuffer.push({time: performance.browser.now(), settings: settings}); }; HandlerInertia.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { var inertia = this._inertiaBuffer, now = performance.browser.now(), cutoff = 160; //msec while (inertia.length > 0 && now - inertia[0].time > cutoff) { inertia.shift(); } }; HandlerInertia.prototype._onMoveEnd = function _onMoveEnd (panInertiaOptions ) { this._drainInertiaBuffer(); if (this._inertiaBuffer.length < 2) { return; } var deltas = { zoom: 0, bearing: 0, pitch: 0, pan: new performance.Point(0, 0), pinchAround: undefined, around: undefined }; for (var i = 0, list = this._inertiaBuffer; i < list.length; i += 1) { var ref = list[i]; var settings = ref.settings; deltas.zoom += settings.zoomDelta || 0; deltas.bearing += settings.bearingDelta || 0; deltas.pitch += settings.pitchDelta || 0; if (settings.panDelta) { deltas.pan._add(settings.panDelta); } if (settings.around) { deltas.around = settings.around; } if (settings.pinchAround) { deltas.pinchAround = settings.pinchAround; } } var lastEntry = this._inertiaBuffer[this._inertiaBuffer.length - 1]; var duration = (lastEntry.time - this._inertiaBuffer[0].time); var easeOptions = {}; if (deltas.pan.mag()) { var result = calculateEasing(deltas.pan.mag(), duration, performance.extend({}, defaultPanInertiaOptions, panInertiaOptions || {})); easeOptions.offset = deltas.pan.mult(result.amount / deltas.pan.mag()); easeOptions.center = this._map.transform.center; extendDuration(easeOptions, result); } if (deltas.zoom) { var result$1 = calculateEasing(deltas.zoom, duration, defaultZoomInertiaOptions); easeOptions.zoom = this._map.transform.zoom + result$1.amount; extendDuration(easeOptions, result$1); } if (deltas.bearing) { var result$2 = calculateEasing(deltas.bearing, duration, defaultBearingInertiaOptions); easeOptions.bearing = this._map.transform.bearing + performance.clamp(result$2.amount, -179, 179); extendDuration(easeOptions, result$2); } if (deltas.pitch) { var result$3 = calculateEasing(deltas.pitch, duration, defaultPitchInertiaOptions); easeOptions.pitch = this._map.transform.pitch + result$3.amount; extendDuration(easeOptions, result$3); } if (easeOptions.zoom || easeOptions.bearing) { var last = deltas.pinchAround === undefined ? deltas.around : deltas.pinchAround; easeOptions.around = last ? this._map.unproject(last) : this._map.getCenter(); } this.clear(); return performance.extend(easeOptions, { noMoveStart: true }); }; // Unfortunately zoom, bearing, etc can't have different durations and easings so // we need to choose one. We use the longest duration and it's corresponding easing. function extendDuration(easeOptions, result) { if (!easeOptions.duration || easeOptions.duration < result.duration) { easeOptions.duration = result.duration; easeOptions.easing = result.easing; } } function calculateEasing(amount, inertiaDuration , inertiaOptions) { var maxSpeed = inertiaOptions.maxSpeed; var linearity = inertiaOptions.linearity; var deceleration = inertiaOptions.deceleration; var speed = performance.clamp( amount * linearity / (inertiaDuration / 1000), -maxSpeed, maxSpeed); var duration = Math.abs(speed) / (deceleration * linearity); return { easing: inertiaOptions.easing, duration: duration * 1000, amount: speed * (duration / 2) }; } // /** * `MapMouseEvent` is the event type for mouse-related map events. * @extends {Object} * @example * // The `click` event is an example of a `MapMouseEvent`. * // Set up an event listener on the map. * map.on('click', function(e) { * // The event object (e) contains information like the * // coordinates of the point on the map that was clicked. * console.log('A click event has occurred at ' + e.lngLat); * }); */ var MapMouseEvent = /*@__PURE__*/(function (Event) { function MapMouseEvent(type , map , originalEvent , data) { if ( data === void 0 ) data = {}; var point = DOM.mousePos(map.getCanvasContainer(), originalEvent); var lngLat = map.unproject(point); Event.call(this, type, performance.extend({point: point, lngLat: lngLat, originalEvent: originalEvent}, data)); this._defaultPrevented = false; this.target = map; } if ( Event ) MapMouseEvent.__proto__ = Event; MapMouseEvent.prototype = Object.create( Event && Event.prototype ); MapMouseEvent.prototype.constructor = MapMouseEvent; var prototypeAccessors = { defaultPrevented: { configurable: true } }; MapMouseEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. * @private */ prototypeAccessors.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapMouseEvent.prototype, prototypeAccessors ); return MapMouseEvent; }(performance.Event)); /** * `MapTouchEvent` is the event type for touch-related map events. * @extends {Object} */ var MapTouchEvent = /*@__PURE__*/(function (Event) { function MapTouchEvent(type , map , originalEvent ) { var touches = type === "touchend" ? originalEvent.changedTouches : originalEvent.touches; var points = DOM.touchPos(map.getCanvasContainer(), touches); var lngLats = points.map(function (t) { return map.unproject(t); }); var point = points.reduce(function (prev, curr, i, arr) { return prev.add(curr.div(arr.length)); }, new performance.Point(0, 0)); var lngLat = map.unproject(point); Event.call(this, type, {points: points, point: point, lngLats: lngLats, lngLat: lngLat, originalEvent: originalEvent}); this._defaultPrevented = false; } if ( Event ) MapTouchEvent.__proto__ = Event; MapTouchEvent.prototype = Object.create( Event && Event.prototype ); MapTouchEvent.prototype.constructor = MapTouchEvent; var prototypeAccessors$1 = { defaultPrevented: { configurable: true } }; MapTouchEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. * @private */ prototypeAccessors$1.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapTouchEvent.prototype, prototypeAccessors$1 ); return MapTouchEvent; }(performance.Event)); /** * `MapWheelEvent` is the event type for the `wheel` map event. * @extends {Object} */ var MapWheelEvent = /*@__PURE__*/(function (Event) { function MapWheelEvent(type , map , originalEvent ) { Event.call(this, type, {originalEvent: originalEvent}); this._defaultPrevented = false; } if ( Event ) MapWheelEvent.__proto__ = Event; MapWheelEvent.prototype = Object.create( Event && Event.prototype ); MapWheelEvent.prototype.constructor = MapWheelEvent; var prototypeAccessors$2 = { defaultPrevented: { configurable: true } }; MapWheelEvent.prototype.preventDefault = function preventDefault () { this._defaultPrevented = true; }; /** * `true` if `preventDefault` has been called. * @private */ prototypeAccessors$2.defaultPrevented.get = function () { return this._defaultPrevented; }; Object.defineProperties( MapWheelEvent.prototype, prototypeAccessors$2 ); return MapWheelEvent; }(performance.Event)); /** * A `MapBoxZoomEvent` is the event type for the boxzoom-related map events emitted by the {@link BoxZoomHandler}. * * @typedef {Object} MapBoxZoomEvent * @property {MouseEvent} originalEvent The DOM event that triggered the boxzoom event. Can be a `MouseEvent` or `KeyboardEvent` * @property {string} type The type of boxzoom event. One of `boxzoomstart`, `boxzoomend` or `boxzoomcancel` * @property {Map} target The `Map` instance that triggerred the event */ /** * A `MapDataEvent` object is emitted with the {@link Map.event:data} * and {@link Map.event:dataloading} events. Possible values for * `dataType`s are: * * - `'source'`: The non-tile data associated with any source * - `'style'`: The [style](https://www.mapbox.com/mapbox-gl-style-spec/) used by the map * * @typedef {Object} MapDataEvent * @property {string} type The event type. * @property {string} dataType The type of data that has changed. One of `'source'`, `'style'`. * @property {boolean} [isSourceLoaded] True if the event has a `dataType` of `source` and the source has no outstanding network requests. * @property {Object} [source] The [style spec representation of the source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) if the event has a `dataType` of `source`. * @property {string} [sourceDataType] Included if the event has a `dataType` of `source` and the event signals * that internal data has been received or changed. Possible values are `metadata` and `content`. * @property {Object} [tile] The tile being loaded or changed, if the event has a `dataType` of `source` and * the event is related to loading of a tile. * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `source` and * the event is related to loading of a tile. * @example * // The sourcedata event is an example of MapDataEvent. * // Set up an event listener on the map. * map.on('sourcedata', function(e) { * if (e.isSourceLoaded) { * // Do something when the source has finished loading * } * }); */ // var MapEventHandler = function MapEventHandler(map , options ) { this._map = map; this._clickTolerance = options.clickTolerance; }; MapEventHandler.prototype.reset = function reset () { delete this._mousedownPos; }; MapEventHandler.prototype.wheel = function wheel (e ) { // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - ScrollZoom return this._firePreventable(new MapWheelEvent(e.type, this._map, e)); }; MapEventHandler.prototype.mousedown = function mousedown (e , point ) { this._mousedownPos = point; // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - MousePan // - MouseRotate // - MousePitch // - DblclickHandler return this._firePreventable(new MapMouseEvent(e.type, this._map, e)); }; MapEventHandler.prototype.mouseup = function mouseup (e ) { this._map.fire(new MapMouseEvent(e.type, this._map, e)); }; MapEventHandler.prototype.click = function click (e , point ) { if (this._mousedownPos && this._mousedownPos.dist(point) >= this._clickTolerance) { return; } this._map.fire(new MapMouseEvent(e.type, this._map, e)); }; MapEventHandler.prototype.dblclick = function dblclick (e ) { // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - DblClickZoom return this._firePreventable(new MapMouseEvent(e.type, this._map, e)); }; MapEventHandler.prototype.mouseover = function mouseover (e ) { this._map.fire(new MapMouseEvent(e.type, this._map, e)); }; MapEventHandler.prototype.mouseout = function mouseout (e ) { this._map.fire(new MapMouseEvent(e.type, this._map, e)); }; MapEventHandler.prototype.touchstart = function touchstart (e ) { // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - TouchPan // - TouchZoom // - TouchRotate // - TouchPitch // - TapZoom // - SwipeZoom return this._firePreventable(new MapTouchEvent(e.type, this._map, e)); }; MapEventHandler.prototype.touchmove = function touchmove (e ) { this._map.fire(new MapTouchEvent(e.type, this._map, e)); }; MapEventHandler.prototype.touchend = function touchend (e ) { this._map.fire(new MapTouchEvent(e.type, this._map, e)); }; MapEventHandler.prototype.touchcancel = function touchcancel (e ) { this._map.fire(new MapTouchEvent(e.type, this._map, e)); }; MapEventHandler.prototype._firePreventable = function _firePreventable (mapEvent ) { this._map.fire(mapEvent); if (mapEvent.defaultPrevented) { // returning an object marks the handler as active and resets other handlers return {}; } }; MapEventHandler.prototype.isEnabled = function isEnabled () { return true; }; MapEventHandler.prototype.isActive = function isActive () { return false; }; MapEventHandler.prototype.enable = function enable () {}; MapEventHandler.prototype.disable = function disable () {}; var BlockableMapEventHandler = function BlockableMapEventHandler(map ) { this._map = map; }; BlockableMapEventHandler.prototype.reset = function reset () { this._delayContextMenu = false; delete this._contextMenuEvent; }; BlockableMapEventHandler.prototype.mousemove = function mousemove (e ) { // mousemove map events should not be fired when interaction handlers (pan, rotate, etc) are active this._map.fire(new MapMouseEvent(e.type, this._map, e)); }; BlockableMapEventHandler.prototype.mousedown = function mousedown () { this._delayContextMenu = true; }; BlockableMapEventHandler.prototype.mouseup = function mouseup () { this._delayContextMenu = false; if (this._contextMenuEvent) { this._map.fire(new MapMouseEvent('contextmenu', this._map, this._contextMenuEvent)); delete this._contextMenuEvent; } }; BlockableMapEventHandler.prototype.contextmenu = function contextmenu (e ) { if (this._delayContextMenu) { // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake this._contextMenuEvent = e; } else { // Windows: contextmenu fired on mouseup, so fire event now this._map.fire(new MapMouseEvent(e.type, this._map, e)); } // prevent browser context menu when necessary if (this._map.listens('contextmenu')) { e.preventDefault(); } }; BlockableMapEventHandler.prototype.isEnabled = function isEnabled () { return true; }; BlockableMapEventHandler.prototype.isActive = function isActive () { return false; }; BlockableMapEventHandler.prototype.enable = function enable () {}; BlockableMapEventHandler.prototype.disable = function disable () {}; // /** * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box. * The bounding box is defined by clicking and holding `shift` while dragging the cursor. */ var BoxZoomHandler = function BoxZoomHandler(map , options ) { this._map = map; this._el = map.getCanvasContainer(); this._container = map.getContainer(); this._clickTolerance = options.clickTolerance || 1; }; /** * Returns a Boolean indicating whether the "box zoom" interaction is enabled. * * @returns {boolean} `true` if the "box zoom" interaction is enabled. */ BoxZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /** * Returns a Boolean indicating whether the "box zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "box zoom" interaction is active. */ BoxZoomHandler.prototype.isActive = function isActive () { return !!this._active; }; /** * Enables the "box zoom" interaction. * * @example * map.boxZoom.enable(); */ BoxZoomHandler.prototype.enable = function enable () { if (this.isEnabled()) { return; } this._enabled = true; }; /** * Disables the "box zoom" interaction. * * @example * map.boxZoom.disable(); */ BoxZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; BoxZoomHandler.prototype.mousedown = function mousedown (e , point ) { if (!this.isEnabled()) { return; } if (!(e.shiftKey && e.button === 0)) { return; } DOM.disableDrag(); this._startPos = this._lastPos = point; this._active = true; }; BoxZoomHandler.prototype.mousemoveWindow = function mousemoveWindow (e , point ) { if (!this._active) { return; } var pos = point; if (this._lastPos.equals(pos) || (!this._box && pos.dist(this._startPos) < this._clickTolerance)) { return; } var p0 = this._startPos; this._lastPos = pos; if (!this._box) { this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); this._container.classList.add('mapboxgl-crosshair'); this._fireEvent('boxzoomstart', e); } var minX = Math.min(p0.x, pos.x), maxX = Math.max(p0.x, pos.x), minY = Math.min(p0.y, pos.y), maxY = Math.max(p0.y, pos.y); DOM.setTransform(this._box, ("translate(" + minX + "px," + minY + "px)")); this._box.style.width = (maxX - minX) + "px"; this._box.style.height = (maxY - minY) + "px"; }; BoxZoomHandler.prototype.mouseupWindow = function mouseupWindow (e , point ) { var this$1 = this; if (!this._active) { return; } if (e.button !== 0) { return; } var p0 = this._startPos, p1 = point; this.reset(); DOM.suppressClick(); if (p0.x === p1.x && p0.y === p1.y) { this._fireEvent('boxzoomcancel', e); } else { this._map.fire(new performance.Event('boxzoomend', {originalEvent: e})); return { cameraAnimation: function (map) { return map.fitScreenCoordinates(p0, p1, this$1._map.getBearing(), {linear: true}); } }; } }; BoxZoomHandler.prototype.keydown = function keydown (e ) { if (!this._active) { return; } if (e.keyCode === 27) { this.reset(); this._fireEvent('boxzoomcancel', e); } }; BoxZoomHandler.prototype.reset = function reset () { this._active = false; this._container.classList.remove('mapboxgl-crosshair'); if (this._box) { DOM.remove(this._box); this._box = (null ); } DOM.enableDrag(); delete this._startPos; delete this._lastPos; }; BoxZoomHandler.prototype._fireEvent = function _fireEvent (type , e ) { return this._map.fire(new performance.Event(type, {originalEvent: e})); }; // function indexTouches(touches , points ) { performance.assert(touches.length === points.length); var obj = {}; for (var i = 0; i < touches.length; i++) { obj[touches[i].identifier] = points[i]; } return obj; } // function getCentroid(points ) { var sum = new performance.Point(0, 0); for (var i = 0, list = points; i < list.length; i += 1) { var point = list[i]; sum._add(point); } return sum.div(points.length); } var MAX_TAP_INTERVAL = 500; var MAX_TOUCH_TIME = 500; var MAX_DIST = 30; var SingleTapRecognizer = function SingleTapRecognizer(options ) { this.reset(); this.numTouches = options.numTouches; }; SingleTapRecognizer.prototype.reset = function reset () { delete this.centroid; delete this.startTime; delete this.touches; this.aborted = false; }; SingleTapRecognizer.prototype.touchstart = function touchstart (e , points , mapTouches ) { if (this.centroid || mapTouches.length > this.numTouches) { this.aborted = true; } if (this.aborted) { return; } if (this.startTime === undefined) { this.startTime = e.timeStamp; } if (mapTouches.length === this.numTouches) { this.centroid = getCentroid(points); this.touches = indexTouches(mapTouches, points); } }; SingleTapRecognizer.prototype.touchmove = function touchmove (e , points , mapTouches ) { if (this.aborted || !this.centroid) { return; } var newTouches = indexTouches(mapTouches, points); for (var id in this.touches) { var prevPos = this.touches[id]; var pos = newTouches[id]; if (!pos || pos.dist(prevPos) > MAX_DIST) { this.aborted = true; } } }; SingleTapRecognizer.prototype.touchend = function touchend (e , points , mapTouches ) { if (!this.centroid || e.timeStamp - this.startTime > MAX_TOUCH_TIME) { this.aborted = true; } if (mapTouches.length === 0) { var centroid = !this.aborted && this.centroid; this.reset(); if (centroid) { return centroid; } } }; var TapRecognizer = function TapRecognizer(options ) { this.singleTap = new SingleTapRecognizer(options); this.numTaps = options.numTaps; this.reset(); }; TapRecognizer.prototype.reset = function reset () { this.lastTime = Infinity; delete this.lastTap; this.count = 0; this.singleTap.reset(); }; TapRecognizer.prototype.touchstart = function touchstart (e , points , mapTouches ) { this.singleTap.touchstart(e, points, mapTouches); }; TapRecognizer.prototype.touchmove = function touchmove (e , points , mapTouches ) { this.singleTap.touchmove(e, points, mapTouches); }; TapRecognizer.prototype.touchend = function touchend (e , points , mapTouches ) { var tap = this.singleTap.touchend(e, points, mapTouches); if (tap) { var soonEnough = e.timeStamp - this.lastTime < MAX_TAP_INTERVAL; var closeEnough = !this.lastTap || this.lastTap.dist(tap) < MAX_DIST; if (!soonEnough || !closeEnough) { this.reset(); } this.count++; this.lastTime = e.timeStamp; this.lastTap = tap; if (this.count === this.numTaps) { this.reset(); return tap; } } }; // var TapZoomHandler = function TapZoomHandler() { this._zoomIn = new TapRecognizer({ numTouches: 1, numTaps: 2 }); this._zoomOut = new TapRecognizer({ numTouches: 2, numTaps: 1 }); this.reset(); }; TapZoomHandler.prototype.reset = function reset () { this._active = false; this._zoomIn.reset(); this._zoomOut.reset(); }; TapZoomHandler.prototype.touchstart = function touchstart (e , points , mapTouches ) { this._zoomIn.touchstart(e, points, mapTouches); this._zoomOut.touchstart(e, points, mapTouches); }; TapZoomHandler.prototype.touchmove = function touchmove (e , points , mapTouches ) { this._zoomIn.touchmove(e, points, mapTouches); this._zoomOut.touchmove(e, points, mapTouches); }; TapZoomHandler.prototype.touchend = function touchend (e , points , mapTouches ) { var this$1 = this; var zoomInPoint = this._zoomIn.touchend(e, points, mapTouches); var zoomOutPoint = this._zoomOut.touchend(e, points, mapTouches); if (zoomInPoint) { this._active = true; e.preventDefault(); setTimeout(function () { return this$1.reset(); }, 0); return { cameraAnimation: function (map ) { return map.easeTo({ duration: 300, zoom: map.getZoom() + 1, around: map.unproject(zoomInPoint) }, {originalEvent: e}); } }; } else if (zoomOutPoint) { this._active = true; e.preventDefault(); setTimeout(function () { return this$1.reset(); }, 0); return { cameraAnimation: function (map ) { return map.easeTo({ duration: 300, zoom: map.getZoom() - 1, around: map.unproject(zoomOutPoint) }, {originalEvent: e}); } }; } }; TapZoomHandler.prototype.touchcancel = function touchcancel () { this.reset(); }; TapZoomHandler.prototype.enable = function enable () { this._enabled = true; }; TapZoomHandler.prototype.disable = function disable () { this._enabled = false; this.reset(); }; TapZoomHandler.prototype.isEnabled = function isEnabled () { return this._enabled; }; TapZoomHandler.prototype.isActive = function isActive () { return this._active; }; // var LEFT_BUTTON = 0; var RIGHT_BUTTON = 2; // the values for each button in MouseEvent.buttons var BUTTONS_FLAGS = {}; BUTTONS_FLAGS[LEFT_BUTTON] = 1; BUTTONS_FLAGS[RIGHT_BUTTON] = 2; function buttonStillPressed(e , button ) { var flag = BUTTONS_FLAGS[button]; return e.buttons === undefined || (e.buttons & flag) !== flag; } var MouseHandler = function MouseHandler(options ) { this.reset(); this._clickTolerance = options.clickTolerance || 1; }; MouseHandler.prototype.reset = function reset () { this._active = false; this._moved = false; delete this._lastPoint; delete this._eventButton; }; MouseHandler.prototype._correctButton = function _correctButton (e , button ) { //eslint-disable-line return false; // implemented by child }; MouseHandler.prototype._move = function _move (lastPoint , point ) { //eslint-disable-line return {}; // implemented by child }; MouseHandler.prototype.mousedown = function mousedown (e , point ) { if (this._lastPoint) { return; } var eventButton = DOM.mouseButton(e); if (!this._correctButton(e, eventButton)) { return; } this._lastPoint = point; this._eventButton = eventButton; }; MouseHandler.prototype.mousemoveWindow = function mousemoveWindow (e , point ) { var lastPoint = this._lastPoint; if (!lastPoint) { return; } e.preventDefault(); if (buttonStillPressed(e, this._eventButton)) { // Some browsers don't fire a `mouseup` when the mouseup occurs outside // the window or iframe: // https://github.com/mapbox/mapbox-gl-js/issues/4622 // // If the button is no longer pressed during this `mousemove` it may have // been released outside of the window or iframe. this.reset(); return; } if (!this._moved && point.dist(lastPoint) < this._clickTolerance) { return; } this._moved = true; this._lastPoint = point; // implemented by child class return this._move(lastPoint, point); }; MouseHandler.prototype.mouseupWindow = function mouseupWindow (e ) { if (!this._lastPoint) { return; } var eventButton = DOM.mouseButton(e); if (eventButton !== this._eventButton) { return; } if (this._moved) { DOM.suppressClick(); } this.reset(); }; MouseHandler.prototype.enable = function enable () { this._enabled = true; }; MouseHandler.prototype.disable = function disable () { this._enabled = false; this.reset(); }; MouseHandler.prototype.isEnabled = function isEnabled () { return this._enabled; }; MouseHandler.prototype.isActive = function isActive () { return this._active; }; var MousePanHandler = /*@__PURE__*/(function (MouseHandler) { function MousePanHandler () { MouseHandler.apply(this, arguments); } if ( MouseHandler ) MousePanHandler.__proto__ = MouseHandler; MousePanHandler.prototype = Object.create( MouseHandler && MouseHandler.prototype ); MousePanHandler.prototype.constructor = MousePanHandler; MousePanHandler.prototype.mousedown = function mousedown (e , point ) { MouseHandler.prototype.mousedown.call(this, e, point); if (this._lastPoint) { this._active = true; } }; MousePanHandler.prototype._correctButton = function _correctButton (e , button ) { return button === LEFT_BUTTON && !e.ctrlKey; }; MousePanHandler.prototype._move = function _move (lastPoint , point ) { return { around: point, panDelta: point.sub(lastPoint) }; }; return MousePanHandler; }(MouseHandler)); var MouseRotateHandler = /*@__PURE__*/(function (MouseHandler) { function MouseRotateHandler () { MouseHandler.apply(this, arguments); } if ( MouseHandler ) MouseRotateHandler.__proto__ = MouseHandler; MouseRotateHandler.prototype = Object.create( MouseHandler && MouseHandler.prototype ); MouseRotateHandler.prototype.constructor = MouseRotateHandler; MouseRotateHandler.prototype._correctButton = function _correctButton (e , button ) { return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON); }; MouseRotateHandler.prototype._move = function _move (lastPoint , point ) { var degreesPerPixelMoved = 0.8; var bearingDelta = (point.x - lastPoint.x) * degreesPerPixelMoved; if (bearingDelta) { this._active = true; return {bearingDelta: bearingDelta}; } }; MouseRotateHandler.prototype.contextmenu = function contextmenu (e ) { // prevent browser context menu when necessary; we don't allow it with rotation // because we can't discern rotation gesture start from contextmenu on Mac e.preventDefault(); }; return MouseRotateHandler; }(MouseHandler)); var MousePitchHandler = /*@__PURE__*/(function (MouseHandler) { function MousePitchHandler () { MouseHandler.apply(this, arguments); } if ( MouseHandler ) MousePitchHandler.__proto__ = MouseHandler; MousePitchHandler.prototype = Object.create( MouseHandler && MouseHandler.prototype ); MousePitchHandler.prototype.constructor = MousePitchHandler; MousePitchHandler.prototype._correctButton = function _correctButton (e , button ) { return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON); }; MousePitchHandler.prototype._move = function _move (lastPoint , point ) { var degreesPerPixelMoved = -0.5; var pitchDelta = (point.y - lastPoint.y) * degreesPerPixelMoved; if (pitchDelta) { this._active = true; return {pitchDelta: pitchDelta}; } }; MousePitchHandler.prototype.contextmenu = function contextmenu (e ) { // prevent browser context menu when necessary; we don't allow it with rotation // because we can't discern rotation gesture start from contextmenu on Mac e.preventDefault(); }; return MousePitchHandler; }(MouseHandler)); // var TouchPanHandler = function TouchPanHandler(options ) { this._minTouches = 1; this._clickTolerance = options.clickTolerance || 1; this.reset(); }; TouchPanHandler.prototype.reset = function reset () { this._active = false; this._touches = {}; this._sum = new performance.Point(0, 0); }; TouchPanHandler.prototype.touchstart = function touchstart (e , points , mapTouches ) { return this._calculateTransform(e, points, mapTouches); }; TouchPanHandler.prototype.touchmove = function touchmove (e , points , mapTouches ) { if (!this._active || mapTouches.length < this._minTouches) { return; } e.preventDefault(); return this._calculateTransform(e, points, mapTouches); }; TouchPanHandler.prototype.touchend = function touchend (e , points , mapTouches ) { this._calculateTransform(e, points, mapTouches); if (this._active && mapTouches.length < this._minTouches) { this.reset(); } }; TouchPanHandler.prototype.touchcancel = function touchcancel () { this.reset(); }; TouchPanHandler.prototype._calculateTransform = function _calculateTransform (e , points , mapTouches ) { if (mapTouches.length > 0) { this._active = true; } var touches = indexTouches(mapTouches, points); var touchPointSum = new performance.Point(0, 0); var touchDeltaSum = new performance.Point(0, 0); var touchDeltaCount = 0; for (var identifier in touches) { var point = touches[identifier]; var prevPoint = this._touches[identifier]; if (prevPoint) { touchPointSum._add(point); touchDeltaSum._add(point.sub(prevPoint)); touchDeltaCount++; touches[identifier] = point; } } this._touches = touches; if (touchDeltaCount < this._minTouches || !touchDeltaSum.mag()) { return; } var panDelta = touchDeltaSum.div(touchDeltaCount); this._sum._add(panDelta); if (this._sum.mag() < this._clickTolerance) { return; } var around = touchPointSum.div(touchDeltaCount); return { around: around, panDelta: panDelta }; }; TouchPanHandler.prototype.enable = function enable () { this._enabled = true; }; TouchPanHandler.prototype.disable = function disable () { this._enabled = false; this.reset(); }; TouchPanHandler.prototype.isEnabled = function isEnabled () { return this._enabled; }; TouchPanHandler.prototype.isActive = function isActive () { return this._active; }; // var TwoTouchHandler = function TwoTouchHandler() { this.reset(); }; TwoTouchHandler.prototype.reset = function reset () { this._active = false; delete this._firstTwoTouches; }; TwoTouchHandler.prototype._start = function _start (points ) {}; //eslint-disable-line TwoTouchHandler.prototype._move = function _move (points , pinchAround , e ) { return {}; }; //eslint-disable-line TwoTouchHandler.prototype.touchstart = function touchstart (e , points , mapTouches ) { //console.log(e.target, e.targetTouches.length ? e.targetTouches[0].target : null); //log('touchstart', points, e.target.innerHTML, e.targetTouches.length ? e.targetTouches[0].target.innerHTML: undefined); if (this._firstTwoTouches || mapTouches.length < 2) { return; } this._firstTwoTouches = [ mapTouches[0].identifier, mapTouches[1].identifier ]; // implemented by child classes this._start([points[0], points[1]]); }; TwoTouchHandler.prototype.touchmove = function touchmove (e , points , mapTouches ) { if (!this._firstTwoTouches) { return; } e.preventDefault(); var ref = this._firstTwoTouches; var idA = ref[0]; var idB = ref[1]; var a = getTouchById(mapTouches, points, idA); var b = getTouchById(mapTouches, points, idB); if (!a || !b) { return; } var pinchAround = this._aroundCenter ? null : a.add(b).div(2); // implemented by child classes return this._move([a, b], pinchAround, e); }; TwoTouchHandler.prototype.touchend = function touchend (e , points , mapTouches ) { if (!this._firstTwoTouches) { return; } var ref = this._firstTwoTouches; var idA = ref[0]; var idB = ref[1]; var a = getTouchById(mapTouches, points, idA); var b = getTouchById(mapTouches, points, idB); if (a && b) { return; } if (this._active) { DOM.suppressClick(); } this.reset(); }; TwoTouchHandler.prototype.touchcancel = function touchcancel () { this.reset(); }; TwoTouchHandler.prototype.enable = function enable (options ) { this._enabled = true; this._aroundCenter = !!options && options.around === 'center'; }; TwoTouchHandler.prototype.disable = function disable () { this._enabled = false; this.reset(); }; TwoTouchHandler.prototype.isEnabled = function isEnabled () { return this._enabled; }; TwoTouchHandler.prototype.isActive = function isActive () { return this._active; }; function getTouchById(mapTouches , points , identifier ) { for (var i = 0; i < mapTouches.length; i++) { if (mapTouches[i].identifier === identifier) { return points[i]; } } } /* ZOOM */ var ZOOM_THRESHOLD = 0.1; function getZoomDelta(distance, lastDistance) { return Math.log(distance / lastDistance) / Math.LN2; } var TouchZoomHandler = /*@__PURE__*/(function (TwoTouchHandler) { function TouchZoomHandler () { TwoTouchHandler.apply(this, arguments); } if ( TwoTouchHandler ) TouchZoomHandler.__proto__ = TwoTouchHandler; TouchZoomHandler.prototype = Object.create( TwoTouchHandler && TwoTouchHandler.prototype ); TouchZoomHandler.prototype.constructor = TouchZoomHandler; TouchZoomHandler.prototype.reset = function reset () { TwoTouchHandler.prototype.reset.call(this); delete this._distance; delete this._startDistance; }; TouchZoomHandler.prototype._start = function _start (points ) { this._startDistance = this._distance = points[0].dist(points[1]); }; TouchZoomHandler.prototype._move = function _move (points , pinchAround ) { var lastDistance = this._distance; this._distance = points[0].dist(points[1]); if (!this._active && Math.abs(getZoomDelta(this._distance, this._startDistance)) < ZOOM_THRESHOLD) { return; } this._active = true; return { zoomDelta: getZoomDelta(this._distance, lastDistance), pinchAround: pinchAround }; }; return TouchZoomHandler; }(TwoTouchHandler)); /* ROTATE */ var ROTATION_THRESHOLD = 25; // pixels along circumference of touch circle function getBearingDelta(a, b) { return a.angleWith(b) * 180 / Math.PI; } var TouchRotateHandler = /*@__PURE__*/(function (TwoTouchHandler) { function TouchRotateHandler () { TwoTouchHandler.apply(this, arguments); } if ( TwoTouchHandler ) TouchRotateHandler.__proto__ = TwoTouchHandler; TouchRotateHandler.prototype = Object.create( TwoTouchHandler && TwoTouchHandler.prototype ); TouchRotateHandler.prototype.constructor = TouchRotateHandler; TouchRotateHandler.prototype.reset = function reset () { TwoTouchHandler.prototype.reset.call(this); delete this._minDiameter; delete this._startVector; delete this._vector; }; TouchRotateHandler.prototype._start = function _start (points ) { this._startVector = this._vector = points[0].sub(points[1]); this._minDiameter = points[0].dist(points[1]); }; TouchRotateHandler.prototype._move = function _move (points , pinchAround ) { var lastVector = this._vector; this._vector = points[0].sub(points[1]); if (!this._active && this._isBelowThreshold(this._vector)) { return; } this._active = true; return { bearingDelta: getBearingDelta(this._vector, lastVector), pinchAround: pinchAround }; }; TouchRotateHandler.prototype._isBelowThreshold = function _isBelowThreshold (vector ) { /* * The threshold before a rotation actually happens is configured in * pixels alongth circumference of the circle formed by the two fingers. * This makes the threshold in degrees larger when the fingers are close * together and smaller when the fingers are far apart. * * Use the smallest diameter from the whole gesture to reduce sensitivity * when pinching in and out. */ this._minDiameter = Math.min(this._minDiameter, vector.mag()); var circumference = Math.PI * this._minDiameter; var threshold = ROTATION_THRESHOLD / circumference * 360; var bearingDeltaSinceStart = getBearingDelta(vector, this._startVector); return Math.abs(bearingDeltaSinceStart) < threshold; }; return TouchRotateHandler; }(TwoTouchHandler)); /* PITCH */ function isVertical(vector) { return Math.abs(vector.y) > Math.abs(vector.x); } var ALLOWED_SINGLE_TOUCH_TIME = 100; /** * The `TouchPitchHandler` allows the user to pitch the map by dragging up and down with two fingers. */ var TouchPitchHandler = /*@__PURE__*/(function (TwoTouchHandler) { function TouchPitchHandler () { TwoTouchHandler.apply(this, arguments); } if ( TwoTouchHandler ) TouchPitchHandler.__proto__ = TwoTouchHandler; TouchPitchHandler.prototype = Object.create( TwoTouchHandler && TwoTouchHandler.prototype ); TouchPitchHandler.prototype.constructor = TouchPitchHandler; TouchPitchHandler.prototype.reset = function reset () { TwoTouchHandler.prototype.reset.call(this); this._valid = undefined; delete this._firstMove; delete this._lastPoints; }; TouchPitchHandler.prototype._start = function _start (points ) { this._lastPoints = points; if (isVertical(points[0].sub(points[1]))) { // fingers are more horizontal than vertical this._valid = false; } }; TouchPitchHandler.prototype._move = function _move (points , center , e ) { var vectorA = points[0].sub(this._lastPoints[0]); var vectorB = points[1].sub(this._lastPoints[1]); this._valid = this.gestureBeginsVertically(vectorA, vectorB, e.timeStamp); if (!this._valid) { return; } this._lastPoints = points; this._active = true; var yDeltaAverage = (vectorA.y + vectorB.y) / 2; var degreesPerPixelMoved = -0.5; return { pitchDelta: yDeltaAverage * degreesPerPixelMoved }; }; TouchPitchHandler.prototype.gestureBeginsVertically = function gestureBeginsVertically (vectorA , vectorB , timeStamp ) { if (this._valid !== undefined) { return this._valid; } var threshold = 2; var movedA = vectorA.mag() >= threshold; var movedB = vectorB.mag() >= threshold; // neither finger has moved a meaningful amount, wait if (!movedA && !movedB) { return; } // One finger has moved and the other has not. // If enough time has passed, decide it is not a pitch. if (!movedA || !movedB) { if (this._firstMove === undefined) { this._firstMove = timeStamp; } if (timeStamp - this._firstMove < ALLOWED_SINGLE_TOUCH_TIME) { // still waiting for a movement from the second finger return undefined; } else { return false; } } var isSameDirection = vectorA.y > 0 === vectorB.y > 0; return isVertical(vectorA) && isVertical(vectorB) && isSameDirection; }; return TouchPitchHandler; }(TwoTouchHandler)); // var defaultOptions = { panStep: 100, bearingStep: 15, pitchStep: 10 }; /** * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using * the following keyboard shortcuts: * * - `=` / `+`: Increase the zoom level by 1. * - `Shift-=` / `Shift-+`: Increase the zoom level by 2. * - `-`: Decrease the zoom level by 1. * - `Shift--`: Decrease the zoom level by 2. * - Arrow keys: Pan by 100 pixels. * - `Shift+⇢`: Increase the rotation by 15 degrees. * - `Shift+⇠`: Decrease the rotation by 15 degrees. * - `Shift+⇡`: Increase the pitch by 10 degrees. * - `Shift+⇣`: Decrease the pitch by 10 degrees. */ var KeyboardHandler = function KeyboardHandler() { var stepOptions = defaultOptions; this._panStep = stepOptions.panStep; this._bearingStep = stepOptions.bearingStep; this._pitchStep = stepOptions.pitchStep; }; KeyboardHandler.prototype.reset = function reset () { this._active = false; }; KeyboardHandler.prototype.keydown = function keydown (e ) { var this$1 = this; if (e.altKey || e.ctrlKey || e.metaKey) { return; } var zoomDir = 0; var bearingDir = 0; var pitchDir = 0; var xDir = 0; var yDir = 0; switch (e.keyCode) { case 61: case 107: case 171: case 187: zoomDir = 1; break; case 189: case 109: case 173: zoomDir = -1; break; case 37: if (e.shiftKey) { bearingDir = -1; } else { e.preventDefault(); xDir = -1; } break; case 39: if (e.shiftKey) { bearingDir = 1; } else { e.preventDefault(); xDir = 1; } break; case 38: if (e.shiftKey) { pitchDir = 1; } else { e.preventDefault(); yDir = -1; } break; case 40: if (e.shiftKey) { pitchDir = -1; } else { e.preventDefault(); yDir = 1; } break; default: return; } return { cameraAnimation: function (map ) { var zoom = map.getZoom(); map.easeTo({ duration: 300, easeId: 'keyboardHandler', easing: easeOut, zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom, bearing: map.getBearing() + bearingDir * this$1._bearingStep, pitch: map.getPitch() + pitchDir * this$1._pitchStep, offset: [-xDir * this$1._panStep, -yDir * this$1._panStep], center: map.getCenter() }, {originalEvent: e}); } }; }; KeyboardHandler.prototype.enable = function enable () { this._enabled = true; }; KeyboardHandler.prototype.disable = function disable () { this._enabled = false; this.reset(); }; KeyboardHandler.prototype.isEnabled = function isEnabled () { return this._enabled; }; KeyboardHandler.prototype.isActive = function isActive () { return this._active; }; function easeOut(t ) { return t * (2 - t); } // // deltaY value for mouse scroll wheel identification var wheelZoomDelta = 4.000244140625; // These magic numbers control the rate of zoom. Trackpad events fire at a greater // frequency than mouse scroll wheel, so reduce the zoom rate per wheel tick var defaultZoomRate = 1 / 100; var wheelZoomRate = 1 / 450; // upper bound on how much we scale the map in any single render frame; this // is used to limit zoom rate in the case of very fast scrolling var maxScalePerFrame = 2; /** * The `ScrollZoomHandler` allows the user to zoom the map by scrolling. */ var ScrollZoomHandler = function ScrollZoomHandler(map , handler ) { this._map = map; this._el = map.getCanvasContainer(); this._handler = handler; this._delta = 0; this._defaultZoomRate = defaultZoomRate; this._wheelZoomRate = wheelZoomRate; performance.bindAll(['_onTimeout'], this); }; /** * Set the zoom rate of a trackpad * @param {number} [zoomRate=1/100] The rate used to scale trackpad movement to a zoom value. * @example * // Speed up trackpad zoom * map.scrollZoom.setZoomRate(1/25); */ ScrollZoomHandler.prototype.setZoomRate = function setZoomRate (zoomRate ) { this._defaultZoomRate = zoomRate; }; /** * Set the zoom rate of a mouse wheel * @param {number} [wheelZoomRate=1/450] The rate used to scale mouse wheel movement to a zoom value. * @example * // Slow down zoom of mouse wheel * map.scrollZoom.setWheelZoomRate(1/600); */ ScrollZoomHandler.prototype.setWheelZoomRate = function setWheelZoomRate (wheelZoomRate ) { this._wheelZoomRate = wheelZoomRate; }; /** * Returns a Boolean indicating whether the "scroll to zoom" interaction is enabled. * * @returns {boolean} `true` if the "scroll to zoom" interaction is enabled. */ ScrollZoomHandler.prototype.isEnabled = function isEnabled () { return !!this._enabled; }; /* * Active state is turned on and off with every scroll wheel event and is set back to false before the map * render is called, so _active is not a good candidate for determining if a scroll zoom animation is in * progress. */ ScrollZoomHandler.prototype.isActive = function isActive () { return !!this._active || this._finishTimeout !== undefined; }; ScrollZoomHandler.prototype.isZooming = function isZooming () { return !!this._zooming; }; /** * Enables the "scroll to zoom" interaction. * * @param {Object} [options] Options object. * @param {string} [options.around] If "center" is passed, map will zoom around center of map * * @example * map.scrollZoom.enable(); * @example * map.scrollZoom.enable({ around: 'center' }) */ ScrollZoomHandler.prototype.enable = function enable (options ) { if (this.isEnabled()) { return; } this._enabled = true; this._aroundCenter = options && options.around === 'center'; }; /** * Disables the "scroll to zoom" interaction. * * @example * map.scrollZoom.disable(); */ ScrollZoomHandler.prototype.disable = function disable () { if (!this.isEnabled()) { return; } this._enabled = false; }; ScrollZoomHandler.prototype.wheel = function wheel (e ) { if (!this.isEnabled()) { return; } // Remove `any` cast when https://github.com/facebook/flow/issues/4879 is fixed. var value = e.deltaMode === (performance.window.WheelEvent ).DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY; var now = performance.browser.now(), timeDelta = now - (this._lastWheelEventTime || 0); this._lastWheelEventTime = now; if (value !== 0 && (value % wheelZoomDelta) === 0) { // This one is definitely a mouse wheel event. this._type = 'wheel'; } else if (value !== 0 && Math.abs(value) < 4) { // This one is definitely a trackpad event because it is so small. this._type = 'trackpad'; } else if (timeDelta > 400) { // This is likely a new scroll action. this._type = null; this._lastValue = value; // Start a timeout in case this was a singular event, and dely it by up to 40ms. this._timeout = setTimeout(this._onTimeout, 40, e); } else if (!this._type) { // This is a repeating event, but we don't know the type of event just yet. // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode. this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel'; // Make sure our delayed event isn't fired again, because we accumulate // the previous event (which was less than 40ms ago) into this event. if (this._timeout) { clearTimeout(this._timeout); this._timeout = null; value += this._lastValue; } } // Slow down zoom if shift key is held for more precise zooming if (e.shiftKey && value) { value = value / 4; } // Only fire the callback if we actually know what type of scrolling device the user uses. if (this._type) { this._lastWheelEvent = e; this._delta -= value; if (!this._active) { this._start(e); } } e.preventDefault(); }; ScrollZoomHandler.prototype._onTimeout = function _onTimeout (initialEvent ) { this._type = 'wheel'; this._delta -= this._lastValue; if (!this._active) { this._start(initialEvent); } }; ScrollZoomHandler.prototype._start = function _start (e ) { if (!this._delta) { return; } if (this._frameId) { this._frameId = null; } this._active = true; if (!this.isZooming()) { this._zooming = true; } if (this._finishTimeout) { clearTimeout(this._finishTimeout); delete this._finishTimeout; } var pos = DOM.mousePos(this._el, e); this._around = performance.LngLat.convert(this._aroundCenter ? this._map.getCenter() : this._map.unproject(pos)); this._aroundPoint = this._map.transform.locationPoint(this._around); if (!this._frameId) { this._frameId = true; this._handler._triggerRenderFrame(); } }; ScrollZoomHandler.prototype.renderFrame = function renderFrame () { var this$1 = this; if (!this._frameId) { return; } this._frameId = null; if (!this.isActive()) { return; } var tr = this._map.transform; // if we've had scroll events since the last render frame, consume the // accumulated delta, and update the target zoom level accordingly if (this._delta !== 0) { // For trackpad events and single mouse wheel ticks, use the default zoom rate var zoomRate = (this._type === 'wheel' && Math.abs(this._delta) > wheelZoomDelta) ? this._wheelZoomRate : this._defaultZoomRate; // Scale by sigmoid of scroll wheel delta. var scale = maxScalePerFrame / (1 + Math.exp(-Math.abs(this._delta * zoomRate))); if (this._delta < 0 && scale !== 0) { scale = 1 / scale; } var fromScale = typeof this._targetZoom === 'number' ? tr.zoomScale(this._targetZoom) : tr.scale; this._targetZoom = Math.min(tr.maxZoom, Math.max(tr.minZoom, tr.scaleZoom(fromScale * scale))); // if this is a mouse wheel, refresh the starting zoom and easing // function we're using to smooth out the zooming between wheel // events if (this._type === 'wheel') { this._startZoom = tr.zoom; this._easing = this._smoothOutEasing(200); } this._delta = 0; } var targetZoom = typeof this._targetZoom === 'number' ? this._targetZoom : tr.zoom; var startZoom = this._startZoom; var easing = this._easing; var finished = false; var zoom; if (this._type === 'wheel' && startZoom && easing) { performance.assert(easing && typeof startZoom === 'number'); var t = Math.min((performance.browser.now() - this._lastWheelEventTime) / 200, 1); var k = easing(t); zoom = performance.number(startZoom, targetZoom, k); if (t < 1) { if (!this._frameId) { this._frameId = true; } } else { finished = true; } } else { zoom = targetZoom; finished = true; } this._active = true; if (finished) { this._active = false; this._finishTimeout = setTimeout(function () { this$1._zooming = false; this$1._handler._triggerRenderFrame(); delete this$1._targetZoom; delete this$1._finishTimeout; }, 200); } return { noInertia: true, needsRenderFrame: !finished, zoomDelta: zoom - tr.zoom, around: this._aroundPoint, originalEvent: this._lastWheelEvent }; }; ScrollZoomHandler.prototype._smoothOutEasing = function _smoothOutEasing (duration ) { var easing = performance.ease; if (this._prevEase) { var ease = this._prevEase, t = (performance.browser.now() - ease.start) / ease.duration, speed = ease.easing(t + 0.01) - ease.easing(t), // Quick hack to make new bezier that is continuous with last x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, y = Math.sqrt(0.27 * 0.27 - x * x); easing = performance.bezier(x, y, 0.25, 1); } this._prevEase = { start: performance.browser.now(), duration: duration, easing: easing }; return easing; }; ScrollZoomHandler.prototype.reset = function reset () { this._active = false; }; // /** * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by * double clicking or double tapping. */ var DoubleClickZoomHandler = function DoubleClickZoomHandler(clickZoom , TapZoom ) { this._clickZoom = clickZoom; this._tapZoom = TapZoom; }; /** * Enables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.enable(); */ DoubleClickZoomHandler.prototype.enable = function enable () { this._clickZoom.enable(); this._tapZoom.enable(); }; /** * Disables the "double click to zoom" interaction. * * @example * map.doubleClickZoom.disable(); */ DoubleClickZoomHandler.prototype.disable = function disable () { this._clickZoom.disable(); this._tapZoom.disable(); }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is enabled. * * @returns {boolean} `true` if the "double click to zoom" interaction is enabled. */ DoubleClickZoomHandler.prototype.isEnabled = function isEnabled () { return this._clickZoom.isEnabled() && this._tapZoom.isEnabled(); }; /** * Returns a Boolean indicating whether the "double click to zoom" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "double click to zoom" interaction is active. */ DoubleClickZoomHandler.prototype.isActive = function isActive () { return this._clickZoom.isActive() || this._tapZoom.isActive(); }; // var ClickZoomHandler = function ClickZoomHandler() { this.reset(); }; ClickZoomHandler.prototype.reset = function reset () { this._active = false; }; ClickZoomHandler.prototype.dblclick = function dblclick (e , point ) { e.preventDefault(); return { cameraAnimation: function (map ) { map.easeTo({ duration: 300, zoom: map.getZoom() + (e.shiftKey ? -1 : 1), around: map.unproject(point) }, {originalEvent: e}); } }; }; ClickZoomHandler.prototype.enable = function enable () { this._enabled = true; }; ClickZoomHandler.prototype.disable = function disable () { this._enabled = false; this.reset(); }; ClickZoomHandler.prototype.isEnabled = function isEnabled () { return this._enabled; }; ClickZoomHandler.prototype.isActive = function isActive () { return this._active; }; // var TapDragZoomHandler = function TapDragZoomHandler() { this._tap = new TapRecognizer({ numTouches: 1, numTaps: 1 }); this.reset(); }; TapDragZoomHandler.prototype.reset = function reset () { this._active = false; delete this._swipePoint; delete this._swipeTouch; delete this._tapTime; this._tap.reset(); }; TapDragZoomHandler.prototype.touchstart = function touchstart (e , points , mapTouches ) { if (this._swipePoint) { return; } if (this._tapTime && e.timeStamp - this._tapTime > MAX_TAP_INTERVAL) { this.reset(); } if (!this._tapTime) { this._tap.touchstart(e, points, mapTouches); } else if (mapTouches.length > 0) { this._swipePoint = points[0]; this._swipeTouch = mapTouches[0].identifier; } }; TapDragZoomHandler.prototype.touchmove = function touchmove (e , points , mapTouches ) { if (!this._tapTime) { this._tap.touchmove(e, points, mapTouches); } else if (this._swipePoint) { if (mapTouches[0].identifier !== this._swipeTouch) { return; } var newSwipePoint = points[0]; var dist = newSwipePoint.y - this._swipePoint.y; this._swipePoint = newSwipePoint; e.preventDefault(); this._active = true; return { zoomDelta: dist / 128 }; } }; TapDragZoomHandler.prototype.touchend = function touchend (e , points , mapTouches ) { if (!this._tapTime) { var point = this._tap.touchend(e, points, mapTouches); if (point) { this._tapTime = e.timeStamp; } } else if (this._swipePoint) { if (mapTouches.length === 0) { this.reset(); } } }; TapDragZoomHandler.prototype.touchcancel = function touchcancel () { this.reset(); }; TapDragZoomHandler.prototype.enable = function enable () { this._enabled = true; }; TapDragZoomHandler.prototype.disable = function disable () { this._enabled = false; this.reset(); }; TapDragZoomHandler.prototype.isEnabled = function isEnabled () { return this._enabled; }; TapDragZoomHandler.prototype.isActive = function isActive () { return this._active; }; // /** * The `DragPanHandler` allows the user to pan the map by clicking and dragging * the cursor. */ var DragPanHandler = function DragPanHandler(el , mousePan , touchPan ) { this._el = el; this._mousePan = mousePan; this._touchPan = touchPan; }; /** * Enables the "drag to pan" interaction. * * @param {Object} [options] Options object * @param {number} [options.linearity=0] factor used to scale the drag velocity * @param {Function} [options.easing=bezier(0, 0, 0.3, 1)] easing function applled to `map.panTo` when applying the drag. * @param {number} [options.maxSpeed=1400] the maximum value of the drag velocity. * @param {number} [options.deceleration=2500] the rate at which the speed reduces after the pan ends. * * @example * map.dragPan.enable(); * @example * map.dragPan.enable({ * linearity: 0.3, * easing: bezier(0, 0, 0.3, 1), * maxSpeed: 1400, * deceleration: 2500, * }); */ DragPanHandler.prototype.enable = function enable (options ) { this._inertiaOptions = options || {}; this._mousePan.enable(); this._touchPan.enable(); this._el.classList.add('mapboxgl-touch-drag-pan'); }; /** * Disables the "drag to pan" interaction. * * @example * map.dragPan.disable(); */ DragPanHandler.prototype.disable = function disable () { this._mousePan.disable(); this._touchPan.disable(); this._el.classList.remove('mapboxgl-touch-drag-pan'); }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is enabled. * * @returns {boolean} `true` if the "drag to pan" interaction is enabled. */ DragPanHandler.prototype.isEnabled = function isEnabled () { return this._mousePan.isEnabled() && this._touchPan.isEnabled(); }; /** * Returns a Boolean indicating whether the "drag to pan" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to pan" interaction is active. */ DragPanHandler.prototype.isActive = function isActive () { return this._mousePan.isActive() || this._touchPan.isActive(); }; // /** * The `DragRotateHandler` allows the user to rotate the map by clicking and * dragging the cursor while holding the right mouse button or `ctrl` key. */ var DragRotateHandler = function DragRotateHandler(options , mouseRotate , mousePitch ) { this._pitchWithRotate = options.pitchWithRotate; this._mouseRotate = mouseRotate; this._mousePitch = mousePitch; }; /** * Enables the "drag to rotate" interaction. * * @example * map.dragRotate.enable(); */ DragRotateHandler.prototype.enable = function enable () { this._mouseRotate.enable(); if (this._pitchWithRotate) { this._mousePitch.enable(); } }; /** * Disables the "drag to rotate" interaction. * * @example * map.dragRotate.disable(); */ DragRotateHandler.prototype.disable = function disable () { this._mouseRotate.disable(); this._mousePitch.disable(); }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is enabled. * * @returns {boolean} `true` if the "drag to rotate" interaction is enabled. */ DragRotateHandler.prototype.isEnabled = function isEnabled () { return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled()); }; /** * Returns a Boolean indicating whether the "drag to rotate" interaction is active, i.e. currently being used. * * @returns {boolean} `true` if the "drag to rotate" interaction is active. */ DragRotateHandler.prototype.isActive = function isActive () { return this._mouseRotate.isActive() || this._mousePitch.isActive(); }; // /** * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by * pinching on a touchscreen. * * They can zoom with one finger by double tapping and dragging. On the second tap, * hold the finger down and drag up or down to zoom in or out. */ var TouchZoomRotateHandler = function TouchZoomRotateHandler(el , touchZoom , touchRotate , tapDragZoom ) { this._el = el; this._touchZoom = touchZoom; this._touchRotate = touchRotate; this._tapDragZoom = tapDragZoom; this._rotationDisabled = false; this._enabled = true; }; /** * Enables the "pinch to rotate and zoom" interaction. * * @param {Object} [options] Options object. * @param {string} [options.around] If "center" is passed, map will zoom around the center * * @example * map.touchZoomRotate.enable(); * @example * map.touchZoomRotate.enable({ around: 'center' }); */ TouchZoomRotateHandler.prototype.enable = function enable (options ) { this._touchZoom.enable(options); if (!this._rotationDisabled) { this._touchRotate.enable(options); } this._tapDragZoom.enable(); this._el.classList.add('mapboxgl-touch-zoom-rotate'); }; /** * Disables the "pinch to rotate and zoom" interaction. * * @example * map.touchZoomRotate.disable(); */ TouchZoomRotateHandler.prototype.disable = function disable () { this._touchZoom.disable(); this._touchRotate.disable(); this._tapDragZoom.disable(); this._el.classList.remove('mapboxgl-touch-zoom-rotate'); }; /** * Returns a Boolean indicating whether the "pinch to rotate and zoom" interaction is enabled. * * @returns {boolean} `true` if the "pinch to rotate and zoom" interaction is enabled. */ TouchZoomRotateHandler.prototype.isEnabled = function isEnabled () { return this._touchZoom.isEnabled() && (this._rotationDisabled || this._touchRotate.isEnabled()) && this._tapDragZoom.isEnabled(); }; /** * Returns true if the handler is enabled and has detected the start of a zoom/rotate gesture. * * @returns {boolean} //eslint-disable-line */ TouchZoomRotateHandler.prototype.isActive = function isActive () { return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive(); }; /** * Disables the "pinch to rotate" interaction, leaving the "pinch to zoom" * interaction enabled. * * @example * map.touchZoomRotate.disableRotation(); */ TouchZoomRotateHandler.prototype.disableRotation = function disableRotation () { this._rotationDisabled = true; this._touchRotate.disable(); }; /** * Enables the "pinch to rotate" interaction. * * @example * map.touchZoomRotate.enable(); * map.touchZoomRotate.enableRotation(); */ TouchZoomRotateHandler.prototype.enableRotation = function enableRotation () { this._rotationDisabled = false; if (this._touchZoom.isEnabled()) { this._touchRotate.enable(); } }; // var isMoving = function (p) { return p.zoom || p.drag || p.pitch || p.rotate; }; var RenderFrameEvent = /*@__PURE__*/(function (Event) { function RenderFrameEvent () { Event.apply(this, arguments); }if ( Event ) RenderFrameEvent.__proto__ = Event; RenderFrameEvent.prototype = Object.create( Event && Event.prototype ); RenderFrameEvent.prototype.constructor = RenderFrameEvent; return RenderFrameEvent; }(performance.Event)); // Handlers interpret dom events and return camera changes that should be // applied to the map (`HandlerResult`s). The camera changes are all deltas. // The handler itself should have no knowledge of the map's current state. // This makes it easier to merge multiple results and keeps handlers simpler. // For example, if there is a mousedown and mousemove, the mousePan handler // would return a `panDelta` on the mousemove. // All handler methods that are called with events can optionally return a `HandlerResult`. function hasChange(result ) { return (result.panDelta && result.panDelta.mag()) || result.zoomDelta || result.bearingDelta || result.pitchDelta; } var HandlerManager = function HandlerManager(map , options ) { this._map = map; this._el = this._map.getCanvasContainer(); this._handlers = []; this._handlersById = {}; this._changes = []; this._inertia = new HandlerInertia(map); this._bearingSnap = options.bearingSnap; this._previousActiveHandlers = {}; // Track whether map is currently moving, to compute start/move/end events this._eventsInProgress = {}; this._addDefaultHandlers(options); performance.bindAll(['handleEvent', 'handleWindowEvent'], this); var el = this._el; this._listeners = [ // This needs to be `passive: true` so that a double tap fires two // pairs of touchstart/end events in iOS Safari 13. If this is set to // `passive: false` then the second pair of events is only fired if // preventDefault() is called on the first touchstart. Calling preventDefault() // undesirably prevents click events. [el, 'touchstart', {passive: true}], // This needs to be `passive: false` so that scrolls and pinches can be // prevented in browsers that don't support `touch-actions: none`, for example iOS Safari 12. [el, 'touchmove', {passive: false}], [el, 'touchend', undefined], [el, 'touchcancel', undefined], [el, 'mousedown', undefined], [el, 'mousemove', undefined], [el, 'mouseup', undefined], // Bind window-level event listeners for move and up/end events. In the absence of // the pointer capture API, which is not supported by all necessary platforms, // window-level event listeners give us the best shot at capturing events that // fall outside the map canvas element. Use `{capture: true}` for the move event // to prevent map move events from being fired during a drag. [performance.window.document, 'mousemove', {capture: true}], [performance.window.document, 'mouseup', undefined], [el, 'mouseover', undefined], [el, 'mouseout', undefined], [el, 'dblclick', undefined], [el, 'click', undefined], [el, 'keydown', {capture: false}], [el, 'keyup', undefined], [el, 'wheel', {passive: false}], [el, 'contextmenu', undefined], [performance.window, 'blur', undefined] ]; for (var i = 0, list = this._listeners; i < list.length; i += 1) { var ref = list[i]; var target = ref[0]; var type = ref[1]; var listenerOptions = ref[2]; DOM.addEventListener(target, type, target === performance.window.document ? this.handleWindowEvent : this.handleEvent, listenerOptions); } }; HandlerManager.prototype.destroy = function destroy () { for (var i = 0, list = this._listeners; i < list.length; i += 1) { var ref = list[i]; var target = ref[0]; var type = ref[1]; var listenerOptions = ref[2]; DOM.removeEventListener(target, type, target === performance.window.document ? this.handleWindowEvent : this.handleEvent, listenerOptions); } }; HandlerManager.prototype._addDefaultHandlers = function _addDefaultHandlers (options ) { var map = this._map; var el = map.getCanvasContainer(); this._add('mapEvent', new MapEventHandler(map, options)); var boxZoom = map.boxZoom = new BoxZoomHandler(map, options); this._add('boxZoom', boxZoom); var tapZoom = new TapZoomHandler(); var clickZoom = new ClickZoomHandler(); map.doubleClickZoom = new DoubleClickZoomHandler(clickZoom, tapZoom); this._add('tapZoom', tapZoom); this._add('clickZoom', clickZoom); var tapDragZoom = new TapDragZoomHandler(); this._add('tapDragZoom', tapDragZoom); var touchPitch = map.touchPitch = new TouchPitchHandler(); this._add('touchPitch', touchPitch); var mouseRotate = new MouseRotateHandler(options); var mousePitch = new MousePitchHandler(options); map.dragRotate = new DragRotateHandler(options, mouseRotate, mousePitch); this._add('mouseRotate', mouseRotate, ['mousePitch']); this._add('mousePitch', mousePitch, ['mouseRotate']); var mousePan = new MousePanHandler(options); var touchPan = new TouchPanHandler(options); map.dragPan = new DragPanHandler(el, mousePan, touchPan); this._add('mousePan', mousePan); this._add('touchPan', touchPan, ['touchZoom', 'touchRotate']); var touchRotate = new TouchRotateHandler(); var touchZoom = new TouchZoomHandler(); map.touchZoomRotate = new TouchZoomRotateHandler(el, touchZoom, touchRotate, tapDragZoom); this._add('touchRotate', touchRotate, ['touchPan', 'touchZoom']); this._add('touchZoom', touchZoom, ['touchPan', 'touchRotate']); var scrollZoom = map.scrollZoom = new ScrollZoomHandler(map, this); this._add('scrollZoom', scrollZoom, ['mousePan']); var keyboard = map.keyboard = new KeyboardHandler(); this._add('keyboard', keyboard); this._add('blockableMapEvent', new BlockableMapEventHandler(map)); for (var i = 0, list = ['boxZoom', 'doubleClickZoom', 'tapDragZoom', 'touchPitch', 'dragRotate', 'dragPan', 'touchZoomRotate', 'scrollZoom', 'keyboard']; i < list.length; i += 1) { var name = list[i]; if (options.interactive && (options )[name]) { (map )[name].enable((options )[name]); } } }; HandlerManager.prototype._add = function _add (handlerName , handler , allowed ) { this._handlers.push({handlerName: handlerName, handler: handler, allowed: allowed}); this._handlersById[handlerName] = handler; }; HandlerManager.prototype.stop = function stop (allowEndAnimation ) { // do nothing if this method was triggered by a gesture update if (this._updatingCamera) { return; } for (var i = 0, list = this._handlers; i < list.length; i += 1) { var ref = list[i]; var handler = ref.handler; handler.reset(); } this._inertia.clear(); this._fireEvents({}, {}, allowEndAnimation); this._changes = []; }; HandlerManager.prototype.isActive = function isActive () { for (var i = 0, list = this._handlers; i < list.length; i += 1) { var ref = list[i]; var handler = ref.handler; if (handler.isActive()) { return true; } } return false; }; HandlerManager.prototype.isZooming = function isZooming () { return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming(); }; HandlerManager.prototype.isRotating = function isRotating () { return !!this._eventsInProgress.rotate; }; HandlerManager.prototype.isMoving = function isMoving$1 () { return Boolean(isMoving(this._eventsInProgress)) || this.isZooming(); }; HandlerManager.prototype._blockedByActive = function _blockedByActive (activeHandlers , allowed , myName ) { for (var name in activeHandlers) { if (name === myName) { continue; } if (!allowed || allowed.indexOf(name) < 0) { return true; } } return false; }; HandlerManager.prototype.handleWindowEvent = function handleWindowEvent (e ) { this.handleEvent(e, ((e.type) + "Window")); }; HandlerManager.prototype._getMapTouches = function _getMapTouches (touches ) { var mapTouches = []; for (var i = 0, list = touches; i < list.length; i += 1) { var t = list[i]; var target = ((t.target ) ); if (this._el.contains(target)) { mapTouches.push(t); } } return ((mapTouches ) ); }; HandlerManager.prototype.handleEvent = function handleEvent (e , eventName ) { if (e.type === 'blur') { this.stop(true); return; } this._updatingCamera = true; performance.assert(e.timeStamp !== undefined); var inputEvent = e.type === 'renderFrame' ? undefined : ((e ) ); /* * We don't call e.preventDefault() for any events by default. * Handlers are responsible for calling it where necessary. */ var mergedHandlerResult = {needsRenderFrame: false}; var eventsInProgress = {}; var activeHandlers = {}; var mapTouches = e.touches ? this._getMapTouches(((e ) ).touches) : undefined; var points = mapTouches ? DOM.touchPos(this._el, mapTouches) : DOM.mousePos(this._el, ((e ) )); for (var i = 0, list = this._handlers; i < list.length; i += 1) { var ref = list[i]; var handlerName = ref.handlerName; var handler = ref.handler; var allowed = ref.allowed; if (!handler.isEnabled()) { continue; } var data = (void 0) ; if (this._blockedByActive(activeHandlers, allowed, handlerName)) { handler.reset(); } else { if ((handler )[eventName || e.type]) { data = (handler )[eventName || e.type](e, points, mapTouches); this.mergeHandlerResult(mergedHandlerResult, eventsInProgress, data, handlerName, inputEvent); if (data && data.needsRenderFrame) { this._triggerRenderFrame(); } } } if (data || handler.isActive()) { activeHandlers[handlerName] = handler; } } var deactivatedHandlers = {}; for (var name in this._previousActiveHandlers) { if (!activeHandlers[name]) { deactivatedHandlers[name] = inputEvent; } } this._previousActiveHandlers = activeHandlers; if (Object.keys(deactivatedHandlers).length || hasChange(mergedHandlerResult)) { this._changes.push([mergedHandlerResult, eventsInProgress, deactivatedHandlers]); this._triggerRenderFrame(); } if (Object.keys(activeHandlers).length || hasChange(mergedHandlerResult)) { this._map._stop(true); } this._updatingCamera = false; var cameraAnimation = mergedHandlerResult.cameraAnimation; if (cameraAnimation) { this._inertia.clear(); this._fireEvents({}, {}, true); this._changes = []; cameraAnimation(this._map); } }; HandlerManager.prototype.mergeHandlerResult = function mergeHandlerResult (mergedHandlerResult , eventsInProgress , handlerResult , name , e ) { if (!handlerResult) { return; } performance.extend(mergedHandlerResult, handlerResult); var eventData = {handlerName: name, originalEvent: handlerResult.originalEvent || e}; // track which handler changed which camera property if (handlerResult.zoomDelta !== undefined) { eventsInProgress.zoom = eventData; } if (handlerResult.panDelta !== undefined) { eventsInProgress.drag = eventData; } if (handlerResult.pitchDelta !== undefined) { eventsInProgress.pitch = eventData; } if (handlerResult.bearingDelta !== undefined) { eventsInProgress.rotate = eventData; } }; HandlerManager.prototype._applyChanges = function _applyChanges () { var combined = {}; var combinedEventsInProgress = {}; var combinedDeactivatedHandlers = {}; for (var i = 0, list = this._changes; i < list.length; i += 1) { var ref = list[i]; var change = ref[0]; var eventsInProgress = ref[1]; var deactivatedHandlers = ref[2]; if (change.panDelta) { combined.panDelta = (combined.panDelta || new performance.Point(0, 0))._add(change.panDelta); } if (change.zoomDelta) { combined.zoomDelta = (combined.zoomDelta || 0) + change.zoomDelta; } if (change.bearingDelta) { combined.bearingDelta = (combined.bearingDelta || 0) + change.bearingDelta; } if (change.pitchDelta) { combined.pitchDelta = (combined.pitchDelta || 0) + change.pitchDelta; } if (change.around !== undefined) { combined.around = change.around; } if (change.pinchAround !== undefined) { combined.pinchAround = change.pinchAround; } if (change.noInertia) { combined.noInertia = change.noInertia; } performance.extend(combinedEventsInProgress, eventsInProgress); performance.extend(combinedDeactivatedHandlers, deactivatedHandlers); } this._updateMapTransform(combined, combinedEventsInProgress, combinedDeactivatedHandlers); this._changes = []; }; HandlerManager.prototype._updateMapTransform = function _updateMapTransform (combinedResult , combinedEventsInProgress , deactivatedHandlers ) { var map = this._map; var tr = map.transform; if (!hasChange(combinedResult)) { return this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true); } var panDelta = combinedResult.panDelta; var zoomDelta = combinedResult.zoomDelta; var bearingDelta = combinedResult.bearingDelta; var pitchDelta = combinedResult.pitchDelta; var around = combinedResult.around; var pinchAround = combinedResult.pinchAround; if (pinchAround !== undefined) { around = pinchAround; } // stop any ongoing camera animations (easeTo, flyTo) map._stop(true); around = around || map.transform.centerPoint; var loc = tr.pointLocation(panDelta ? around.sub(panDelta) : around); if (bearingDelta) { tr.bearing += bearingDelta; } if (pitchDelta) { tr.pitch += pitchDelta; } if (zoomDelta) { tr.zoom += zoomDelta; } tr.setLocationAtPoint(loc, around); this._map._update(); if (!combinedResult.noInertia) { this._inertia.record(combinedResult); } this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true); }; HandlerManager.prototype._fireEvents = function _fireEvents (newEventsInProgress , deactivatedHandlers , allowEndAnimation ) { var this$1 = this; var wasMoving = isMoving(this._eventsInProgress); var nowMoving = isMoving(newEventsInProgress); var startEvents = {}; for (var eventName in newEventsInProgress) { var ref = newEventsInProgress[eventName]; var originalEvent = ref.originalEvent; if (!this._eventsInProgress[eventName]) { startEvents[(eventName + "start")] = originalEvent; } this._eventsInProgress[eventName] = newEventsInProgress[eventName]; } // fire start events only after this._eventsInProgress has been updated if (!wasMoving && nowMoving) { this._fireEvent('movestart', nowMoving.originalEvent); } for (var name in startEvents) { this._fireEvent(name, startEvents[name]); } if (nowMoving) { this._fireEvent('move', nowMoving.originalEvent); } for (var eventName$1 in newEventsInProgress) { var ref$1 = newEventsInProgress[eventName$1]; var originalEvent$1 = ref$1.originalEvent; this._fireEvent(eventName$1, originalEvent$1); } var endEvents = {}; var originalEndEvent; for (var eventName$2 in this._eventsInProgress) { var ref$2 = this._eventsInProgress[eventName$2]; var handlerName = ref$2.handlerName; var originalEvent$2 = ref$2.originalEvent; if (!this._handlersById[handlerName].isActive()) { delete this._eventsInProgress[eventName$2]; originalEndEvent = deactivatedHandlers[handlerName] || originalEvent$2; endEvents[(eventName$2 + "end")] = originalEndEvent; } } for (var name$1 in endEvents) { this._fireEvent(name$1, endEvents[name$1]); } var stillMoving = isMoving(this._eventsInProgress); if (allowEndAnimation && (wasMoving || nowMoving) && !stillMoving) { this._updatingCamera = true; var inertialEase = this._inertia._onMoveEnd(this._map.dragPan._inertiaOptions); var shouldSnapToNorth = function (bearing) { return bearing !== 0 && -this$1._bearingSnap < bearing && bearing < this$1._bearingSnap; }; if (inertialEase) { if (shouldSnapToNorth(inertialEase.bearing || this._map.getBearing())) { inertialEase.bearing = 0; } this._map.easeTo(inertialEase, {originalEvent: originalEndEvent}); } else { this._map.fire(new performance.Event('moveend', {originalEvent: originalEndEvent})); if (shouldSnapToNorth(this._map.getBearing())) { this._map.resetNorth(); } } this._updatingCamera = false; } }; HandlerManager.prototype._fireEvent = function _fireEvent (type , e) { this._map.fire(new performance.Event(type, e ? {originalEvent: e} : {})); }; HandlerManager.prototype._requestFrame = function _requestFrame () { var this$1 = this; this._map.triggerRepaint(); return this._map._renderTaskQueue.add(function (timeStamp) { delete this$1._frameId; this$1.handleEvent(new RenderFrameEvent('renderFrame', {timeStamp: timeStamp})); this$1._applyChanges(); }); }; HandlerManager.prototype._triggerRenderFrame = function _triggerRenderFrame () { if (this._frameId === undefined) { this._frameId = this._requestFrame(); } }; // /** * This is a private namespace for utility functions that will get automatically stripped * out in production builds. * * @private */ var Debug = { extend: function extend$1(dest ) { var sources = [], len = arguments.length - 1; while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ]; return performance.extend.apply(void 0, [ dest ].concat( sources )); }, run: function run(fn ) { fn(); }, logToElement: function logToElement(message , overwrite, id) { if ( overwrite === void 0 ) overwrite = false; if ( id === void 0 ) id = "log"; var el = performance.window.document.getElementById(id); if (el) { if (overwrite) { el.innerHTML = ''; } el.innerHTML += "
" + message; } } }; // /** * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo}, controlling the desired location, * zoom, bearing, and pitch of the camera. All properties are optional, and when a property is omitted, the current * camera value for that property will remain unchanged. * * @typedef {Object} CameraOptions * @property {LngLatLike} center The desired center. * @property {number} zoom The desired zoom level. * @property {number} bearing The desired bearing in degrees. The bearing is the compass direction that * is "up". For example, `bearing: 90` orients the map so that east is up. * @property {number} pitch The desired pitch in degrees. The pitch is the angle towards the horizon * measured in degrees with a range between 0 and 60 degrees. For example, pitch: 0 provides the appearance * of looking straight down at the map, while pitch: 60 tilts the user's perspective towards the horizon. * Increasing the pitch value is often used to display 3D objects. * @property {LngLatLike} around If `zoom` is specified, `around` determines the point around which the zoom is centered. * @property {PaddingOptions} padding Dimensions in pixels applied on each side of the viewport for shifting the vanishing point. * @example * // set the map's initial perspective with CameraOptions * var map = new mapboxgl.Map({ * container: 'map', * style: 'mapbox://styles/mapbox/streets-v11', * center: [-73.5804, 45.53483], * pitch: 60, * bearing: -60, * zoom: 10 * }); * @see [Set pitch and bearing](https://docs.mapbox.com/mapbox-gl-js/example/set-perspective/) * @see [Jump to a series of locations](https://docs.mapbox.com/mapbox-gl-js/example/jump-to/) * @see [Fly to a location](https://docs.mapbox.com/mapbox-gl-js/example/flyto/) * @see [Display buildings in 3D](https://docs.mapbox.com/mapbox-gl-js/example/3d-buildings/) */ /** * Options common to map movement methods that involve animation, such as {@link Map#panBy} and * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties * are optional. * * @typedef {Object} AnimationOptions * @property {number} duration The animation's duration, measured in milliseconds. * @property {Function} easing A function taking a time in the range 0..1 and returning a number where 0 is * the initial state and 1 is the final state. * @property {PointLike} offset of the target center relative to real map container center at the end of animation. * @property {boolean} animate If `false`, no animation will occur. * @property {boolean} essential If `true`, then the animation is considered essential and will not be affected by * [`prefers-reduced-motion`](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion). */ /** * Options for setting padding on calls to methods such as {@link Map#fitBounds}, {@link Map#fitScreenCoordinates}, and {@link Map#setPadding}. Adjust these options to set the amount of padding in pixels added to the edges of the canvas. Set a uniform padding on all edges or individual values for each edge. All properties of this object must be * non-negative integers. * * @typedef {Object} PaddingOptions * @property {number} top Padding in pixels from the top of the map canvas. * @property {number} bottom Padding in pixels from the bottom of the map canvas. * @property {number} left Padding in pixels from the left of the map canvas. * @property {number} right Padding in pixels from the right of the map canvas. * * @example * var bbox = [[-79, 43], [-73, 45]]; * map.fitBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * * @example * var bbox = [[-79, 43], [-73, 45]]; * map.fitBounds(bbox, { * padding: 20 * }); * @see [Fit to the bounds of a LineString](https://docs.mapbox.com/mapbox-gl-js/example/zoomto-linestring/) * @see [Fit a map to a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/fitbounds/) */ var Camera = /*@__PURE__*/(function (Evented) { function Camera(transform , options ) { Evented.call(this); this._moving = false; this._zooming = false; this.transform = transform; this._bearingSnap = options.bearingSnap; performance.bindAll(['_renderFrameCallback'], this); //addAssertions(this); } if ( Evented ) Camera.__proto__ = Evented; Camera.prototype = Object.create( Evented && Evented.prototype ); Camera.prototype.constructor = Camera; /** * Returns the map's geographical centerpoint. * * @memberof Map# * @returns The map's geographical centerpoint. * @example * // return a LngLat object such as {lng: 0, lat: 0} * var center = map.getCenter(); * // access longitude and latitude values directly * var {longitude, latitude} = map.getCenter(); * @see Tutorial: [Use Mapbox GL JS in a React app](https://docs.mapbox.com/help/tutorials/use-mapbox-gl-js-with-react/#store-the-new-coordinates) */ Camera.prototype.getCenter = function getCenter () { return new performance.LngLat(this.transform.center.lng, this.transform.center.lat); }; /** * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`. * * @memberof Map# * @param center The centerpoint to set. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * map.setCenter([-74, 38]); */ Camera.prototype.setCenter = function setCenter (center , eventData ) { return this.jumpTo({center: center}, eventData); }; /** * Pans the map by the specified offset. * * @memberof Map# * @param offset `x` and `y` coordinates by which to pan the map. * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.panBy = function panBy (offset , options , eventData ) { offset = performance.Point.convert(offset).mult(-1); return this.panTo(this.transform.center, performance.extend({offset: offset}, options), eventData); }; /** * Pans the map to the specified location with an animated transition. * * @memberof Map# * @param lnglat The location to pan the map to. * @param options Options describing the destination and animation of the transition. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * map.panTo([-74, 38]); * @example * // Specify that the panTo animation should last 5000 milliseconds. * map.panTo([-74, 38], {duration: 5000}); * @see [Update a feature in realtime](https://docs.mapbox.com/mapbox-gl-js/example/live-update-feature/) */ Camera.prototype.panTo = function panTo (lnglat , options , eventData ) { return this.easeTo(performance.extend({ center: lnglat }, options), eventData); }; /** * Returns the map's current zoom level. * * @memberof Map# * @returns The map's current zoom level. * @example * map.getZoom(); */ Camera.prototype.getZoom = function getZoom () { return this.transform.zoom; }; /** * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`. * * @memberof Map# * @param zoom The zoom level to set (0-20). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` * @example * // Zoom to the zoom level 5 without an animated transition * map.setZoom(5); */ Camera.prototype.setZoom = function setZoom (zoom , eventData ) { this.jumpTo({zoom: zoom}, eventData); return this; }; /** * Zooms the map to the specified zoom level, with an animated transition. * * @memberof Map# * @param zoom The zoom level to transition to. * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` * @example * // Zoom to the zoom level 5 without an animated transition * map.zoomTo(5); * // Zoom to the zoom level 8 with an animated transition * map.zoomTo(8, { * duration: 2000, * offset: [100, 50] * }); */ Camera.prototype.zoomTo = function zoomTo (zoom , options , eventData ) { return this.easeTo(performance.extend({ zoom: zoom }, options), eventData); }; /** * Increases the map's zoom level by 1. * * @memberof Map# * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` * @example * // zoom the map in one level with a custom animation duration * map.zoomIn({duration: 1000}); */ Camera.prototype.zoomIn = function zoomIn (options , eventData ) { this.zoomTo(this.getZoom() + 1, options, eventData); return this; }; /** * Decreases the map's zoom level by 1. * * @memberof Map# * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires move * @fires zoom * @fires moveend * @fires zoomend * @returns {Map} `this` * @example * // zoom the map out one level with a custom animation offset * map.zoomOut({offset: [80, 60]}); */ Camera.prototype.zoomOut = function zoomOut (options , eventData ) { this.zoomTo(this.getZoom() - 1, options, eventData); return this; }; /** * Returns the map's current bearing. The bearing is the compass direction that is "up"; for example, a bearing * of 90° orients the map so that east is up. * * @memberof Map# * @returns The map's current bearing. * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.getBearing = function getBearing () { return this.transform.bearing; }; /** * Sets the map's bearing (rotation). The bearing is the compass direction that is "up"; for example, a bearing * of 90° orients the map so that east is up. * * Equivalent to `jumpTo({bearing: bearing})`. * * @memberof Map# * @param bearing The desired bearing. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * // rotate the map to 90 degrees * map.setBearing(90); */ Camera.prototype.setBearing = function setBearing (bearing , eventData ) { this.jumpTo({bearing: bearing}, eventData); return this; }; /** * Returns the current padding applied around the map viewport. * * @memberof Map# * @returns The current padding around the map viewport. */ Camera.prototype.getPadding = function getPadding () { return this.transform.padding; }; /** * Sets the padding in pixels around the viewport. * * Equivalent to `jumpTo({padding: padding})`. * * @memberof Map# * @param padding The desired padding. Format: { left: number, right: number, top: number, bottom: number } * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * // Sets a left padding of 300px, and a top padding of 50px * map.setPadding({ left: 300, top: 50 }); */ Camera.prototype.setPadding = function setPadding (padding , eventData ) { this.jumpTo({padding: padding}, eventData); return this; }; /** * Rotates the map to the specified bearing, with an animated transition. The bearing is the compass direction * that is \"up\"; for example, a bearing of 90° orients the map so that east is up. * * @memberof Map# * @param bearing The desired bearing. * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.rotateTo = function rotateTo (bearing , options , eventData ) { return this.easeTo(performance.extend({ bearing: bearing }, options), eventData); }; /** * Rotates the map so that north is up (0° bearing), with an animated transition. * * @memberof Map# * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.resetNorth = function resetNorth (options , eventData ) { this.rotateTo(0, performance.extend({duration: 1000}, options), eventData); return this; }; /** * Rotates and pitches the map so that north is up (0° bearing) and pitch is 0°, with an animated transition. * * @memberof Map# * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.resetNorthPitch = function resetNorthPitch (options , eventData ) { this.easeTo(performance.extend({ bearing: 0, pitch: 0, duration: 1000 }, options), eventData); return this; }; /** * Snaps the map so that north is up (0° bearing), if the current bearing is close enough to it (i.e. within the * `bearingSnap` threshold). * * @memberof Map# * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.snapToNorth = function snapToNorth (options , eventData ) { if (Math.abs(this.getBearing()) < this._bearingSnap) { return this.resetNorth(options, eventData); } return this; }; /** * Returns the map's current pitch (tilt). * * @memberof Map# * @returns The map's current pitch, measured in degrees away from the plane of the screen. */ Camera.prototype.getPitch = function getPitch () { return this.transform.pitch; }; /** * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`. * * @memberof Map# * @param pitch The pitch to set, measured in degrees away from the plane of the screen (0-60). * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires pitchstart * @fires movestart * @fires moveend * @returns {Map} `this` */ Camera.prototype.setPitch = function setPitch (pitch , eventData ) { this.jumpTo({pitch: pitch}, eventData); return this; }; /** * @memberof Map# * @param {LngLatBoundsLike} bounds Calculate the center for these bounds in the viewport and use * the highest zoom level up to and including `Map#getMaxZoom()` that fits * in the viewport. LngLatBounds represent a box that is always axis-aligned with bearing 0. * @param options Options object * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds. * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined. * @example * var bbox = [[-79, 43], [-73, 45]]; * var newCameraTransform = map.cameraForBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ Camera.prototype.cameraForBounds = function cameraForBounds (bounds , options ) { bounds = performance.LngLatBounds.convert(bounds); return this._cameraForBoxAndBearing(bounds.getNorthWest(), bounds.getSouthEast(), 0, options); }; /** * Calculate the center of these two points in the viewport and use * the highest zoom level up to and including `Map#getMaxZoom()` that fits * the points in the viewport at the specified bearing. * @memberof Map# * @param {LngLatLike} p0 First point * @param {LngLatLike} p1 Second point * @param bearing Desired map bearing at end of animation, in degrees * @param options * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the camera would transition to the specified bounds. * @returns {CameraOptions | void} If map is able to fit to provided bounds, returns `CameraOptions` with * `center`, `zoom`, and `bearing`. If map is unable to fit, method will warn and return undefined. * @private * @example * var p0 = [-79, 43]; * var p1 = [-73, 45]; * var bearing = 90; * var newCameraTransform = map._cameraForBoxAndBearing(p0, p1, bearing, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ Camera.prototype._cameraForBoxAndBearing = function _cameraForBoxAndBearing (p0 , p1 , bearing , options ) { var defaultPadding = { top: 0, bottom: 0, right: 0, left: 0 }; options = performance.extend({ padding: defaultPadding, offset: [0, 0], maxZoom: this.transform.maxZoom }, options); if (typeof options.padding === 'number') { var p = options.padding; options.padding = { top: p, bottom: p, right: p, left: p }; } options.padding = performance.extend(defaultPadding, options.padding); var tr = this.transform; var edgePadding = tr.padding; // We want to calculate the upper right and lower left of the box defined by p0 and p1 // in a coordinate system rotate to match the destination bearing. var p0world = tr.project(performance.LngLat.convert(p0)); var p1world = tr.project(performance.LngLat.convert(p1)); var p0rotated = p0world.rotate(-bearing * Math.PI / 180); var p1rotated = p1world.rotate(-bearing * Math.PI / 180); var upperRight = new performance.Point(Math.max(p0rotated.x, p1rotated.x), Math.max(p0rotated.y, p1rotated.y)); var lowerLeft = new performance.Point(Math.min(p0rotated.x, p1rotated.x), Math.min(p0rotated.y, p1rotated.y)); // Calculate zoom: consider the original bbox and padding. var size = upperRight.sub(lowerLeft); var scaleX = (tr.width - (edgePadding.left + edgePadding.right + options.padding.left + options.padding.right)) / size.x; var scaleY = (tr.height - (edgePadding.top + edgePadding.bottom + options.padding.top + options.padding.bottom)) / size.y; if (scaleY < 0 || scaleX < 0) { performance.warnOnce( 'Map cannot fit within canvas with the given bounds, padding, and/or offset.' ); return; } var zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom); // Calculate center: apply the zoom, the configured offset, as well as offset that exists as a result of padding. var offset = performance.Point.convert(options.offset); var paddingOffsetX = (options.padding.left - options.padding.right) / 2; var paddingOffsetY = (options.padding.top - options.padding.bottom) / 2; var offsetAtInitialZoom = new performance.Point(offset.x + paddingOffsetX, offset.y + paddingOffsetY); var offsetAtFinalZoom = offsetAtInitialZoom.mult(tr.scale / tr.zoomScale(zoom)); var center = tr.unproject(p0world.add(p1world).div(2).sub(offsetAtFinalZoom)); return { center: center, zoom: zoom, bearing: bearing }; }; /** * Pans and zooms the map to contain its visible area within the specified geographical bounds. * This function will also reset the map's bearing to 0 if bearing is nonzero. * * @memberof Map# * @param bounds Center these bounds in the viewport and use the highest * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport. * @param {Object} [options] Options supports all properties from {@link AnimationOptions} and {@link CameraOptions} in addition to the fields below. * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {boolean} [options.linear=false] If `true`, the map transitions using * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See * those functions and {@link AnimationOptions} for information about options available. * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. * @param {Object} [eventData] Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * var bbox = [[-79, 43], [-73, 45]]; * map.fitBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see [Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/) */ Camera.prototype.fitBounds = function fitBounds (bounds , options , eventData ) { return this._fitInternal( this.cameraForBounds(bounds, options), options, eventData); }; /** * Pans, rotates and zooms the map to to fit the box made by points p0 and p1 * once the map is rotated to the specified bearing. To zoom without rotating, * pass in the current map bearing. * * @memberof Map# * @param p0 First point on screen, in pixel coordinates * @param p1 Second point on screen, in pixel coordinates * @param bearing Desired map bearing at end of animation, in degrees * @param options Options object * @param {number | PaddingOptions} [options.padding] The amount of padding in pixels to add to the given bounds. * @param {boolean} [options.linear=false] If `true`, the map transitions using * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See * those functions and {@link AnimationOptions} for information about options available. * @param {Function} [options.easing] An easing function for the animated transition. See {@link AnimationOptions}. * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires moveend * @returns {Map} `this` * @example * var p0 = [220, 400]; * var p1 = [500, 900]; * map.fitScreenCoordinates(p0, p1, map.getBearing(), { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see Used by {@link BoxZoomHandler} */ Camera.prototype.fitScreenCoordinates = function fitScreenCoordinates (p0 , p1 , bearing , options , eventData ) { return this._fitInternal( this._cameraForBoxAndBearing( this.transform.pointLocation(performance.Point.convert(p0)), this.transform.pointLocation(performance.Point.convert(p1)), bearing, options), options, eventData); }; Camera.prototype._fitInternal = function _fitInternal (calculatedOptions , options , eventData ) { // cameraForBounds warns + returns undefined if unable to fit: if (!calculatedOptions) { return this; } options = performance.extend(calculatedOptions, options); // Explictly remove the padding field because, calculatedOptions already accounts for padding by setting zoom and center accordingly. delete options.padding; return options.linear ? this.easeTo(options, eventData) : this.flyTo(options, eventData); }; /** * Changes any combination of center, zoom, bearing, and pitch, without * an animated transition. The map will retain its current values for any * details not specified in `options`. * * @memberof Map# * @param options Options object * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @example * // jump to coordinates at current zoom * map.jumpTo({center: [0, 0]}); * // jump with zoom, pitch, and bearing options * map.jumpTo({ * center: [0, 0], * zoom: 8, * pitch: 45, * bearing: 90 * }); * @see [Jump to a series of locations](https://docs.mapbox.com/mapbox-gl-js/example/jump-to/) * @see [Update a feature in realtime](https://docs.mapbox.com/mapbox-gl-js/example/live-update-feature/) */ Camera.prototype.jumpTo = function jumpTo (options , eventData ) { this.stop(); var tr = this.transform; var zoomChanged = false, bearingChanged = false, pitchChanged = false; if ('zoom' in options && tr.zoom !== +options.zoom) { zoomChanged = true; tr.zoom = +options.zoom; } if (options.center !== undefined) { tr.center = performance.LngLat.convert(options.center); } if ('bearing' in options && tr.bearing !== +options.bearing) { bearingChanged = true; tr.bearing = +options.bearing; } if ('pitch' in options && tr.pitch !== +options.pitch) { pitchChanged = true; tr.pitch = +options.pitch; } if (options.padding != null && !tr.isPaddingEqual(options.padding)) { tr.padding = options.padding; } this.fire(new performance.Event('movestart', eventData)) .fire(new performance.Event('move', eventData)); if (zoomChanged) { this.fire(new performance.Event('zoomstart', eventData)) .fire(new performance.Event('zoom', eventData)) .fire(new performance.Event('zoomend', eventData)); } if (bearingChanged) { this.fire(new performance.Event('rotatestart', eventData)) .fire(new performance.Event('rotate', eventData)) .fire(new performance.Event('rotateend', eventData)); } if (pitchChanged) { this.fire(new performance.Event('pitchstart', eventData)) .fire(new performance.Event('pitch', eventData)) .fire(new performance.Event('pitchend', eventData)); } return this.fire(new performance.Event('moveend', eventData)); }; /** * Changes any combination of `center`, `zoom`, `bearing`, `pitch`, and `padding` with an animated transition * between old and new values. The map will retain its current values for any * details not specified in `options`. * * Note: The transition will happen instantly if the user has enabled * the `reduced motion` accesibility feature enabled in their operating system, * unless `options` includes `essential: true`. * * @memberof Map# * @param options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires rotate * @fires move * @fires zoom * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ Camera.prototype.easeTo = function easeTo (options , eventData ) { var this$1 = this; this._stop(false, options.easeId); options = performance.extend({ offset: [0, 0], duration: 500, easing: performance.ease }, options); if (options.animate === false || (!options.essential && performance.browser.prefersReducedMotion)) { options.duration = 0; } var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding(), zoom = 'zoom' in options ? +options.zoom : startZoom, bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, pitch = 'pitch' in options ? +options.pitch : startPitch, padding = 'padding' in options ? options.padding : tr.padding; var offsetAsPoint = performance.Point.convert(options.offset); var pointAtOffset = tr.centerPoint.add(offsetAsPoint); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = performance.LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var finalScale = tr.zoomScale(zoom - startZoom); var around, aroundPoint; if (options.around) { around = performance.LngLat.convert(options.around); aroundPoint = tr.locationPoint(around); } var currently = { moving: this._moving, zooming: this._zooming, rotating: this._rotating, pitching: this._pitching }; this._zooming = this._zooming || (zoom !== startZoom); this._rotating = this._rotating || (startBearing !== bearing); this._pitching = this._pitching || (pitch !== startPitch); this._padding = !tr.isPaddingEqual(padding); this._easeId = options.easeId; this._prepareEase(eventData, options.noMoveStart, currently); this._ease(function (k) { if (this$1._zooming) { tr.zoom = performance.number(startZoom, zoom, k); } if (this$1._rotating) { tr.bearing = performance.number(startBearing, bearing, k); } if (this$1._pitching) { tr.pitch = performance.number(startPitch, pitch, k); } if (this$1._padding) { tr.interpolatePadding(startPadding, padding, k); // When padding is being applied, Transform#centerPoint is changing continously, // thus we need to recalculate offsetPoint every fra,e pointAtOffset = tr.centerPoint.add(offsetAsPoint); } if (around) { tr.setLocationAtPoint(around, aroundPoint); } else { var scale = tr.zoomScale(tr.zoom - startZoom); var base = zoom > startZoom ? Math.min(2, finalScale) : Math.max(0.5, finalScale); var speedup = Math.pow(base, 1 - k); var newCenter = tr.unproject(from.add(delta.mult(k * speedup)).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); } this$1._fireMoveEvents(eventData); }, function (interruptingEaseId ) { this$1._afterEase(eventData, interruptingEaseId); }, options); return this; }; Camera.prototype._prepareEase = function _prepareEase (eventData , noMoveStart , currently) { if ( currently === void 0 ) currently = {}; this._moving = true; if (!noMoveStart && !currently.moving) { this.fire(new performance.Event('movestart', eventData)); } if (this._zooming && !currently.zooming) { this.fire(new performance.Event('zoomstart', eventData)); } if (this._rotating && !currently.rotating) { this.fire(new performance.Event('rotatestart', eventData)); } if (this._pitching && !currently.pitching) { this.fire(new performance.Event('pitchstart', eventData)); } }; Camera.prototype._fireMoveEvents = function _fireMoveEvents (eventData ) { this.fire(new performance.Event('move', eventData)); if (this._zooming) { this.fire(new performance.Event('zoom', eventData)); } if (this._rotating) { this.fire(new performance.Event('rotate', eventData)); } if (this._pitching) { this.fire(new performance.Event('pitch', eventData)); } }; Camera.prototype._afterEase = function _afterEase (eventData , easeId ) { // if this easing is being stopped to start another easing with // the same id then don't fire any events to avoid extra start/stop events if (this._easeId && easeId && this._easeId === easeId) { return; } delete this._easeId; var wasZooming = this._zooming; var wasRotating = this._rotating; var wasPitching = this._pitching; this._moving = false; this._zooming = false; this._rotating = false; this._pitching = false; this._padding = false; if (wasZooming) { this.fire(new performance.Event('zoomend', eventData)); } if (wasRotating) { this.fire(new performance.Event('rotateend', eventData)); } if (wasPitching) { this.fire(new performance.Event('pitchend', eventData)); } this.fire(new performance.Event('moveend', eventData)); }; /** * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that * evokes flight. The animation seamlessly incorporates zooming and panning to help * the user maintain her bearings even after traversing a great distance. * * Note: The animation will be skipped, and this will behave equivalently to `jumpTo` * if the user has the `reduced motion` accesibility feature enabled in their operating system, * unless 'options' includes `essential: true`. * * @memberof Map# * @param {Object} options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions}, {@link AnimationOptions}, * and the following additional options. * @param {number} [options.curve=1.42] The zooming "curve" that will occur along the * flight path. A high value maximizes zooming for an exaggerated animation, while a low * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average * value selected by participants in the user study discussed in * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A * value of 1 would produce a circular motion. * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If * `options.curve` is specified, this option is ignored. * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span. * It does not correspond to a fixed physical distance, but varies by zoom level. * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored. * @param {number} [options.maxDuration] The animation's maximum duration, measured in milliseconds. * If duration exceeds maximum duration, it resets to 0. * @param eventData Additional properties to be added to event objects of events triggered by this method. * @fires movestart * @fires zoomstart * @fires pitchstart * @fires move * @fires zoom * @fires rotate * @fires pitch * @fires moveend * @fires zoomend * @fires pitchend * @returns {Map} `this` * @example * // fly with default options to null island * map.flyTo({center: [0, 0], zoom: 9}); * // using flyTo options * map.flyTo({ * center: [0, 0], * zoom: 9, * speed: 0.2, * curve: 1, * easing(t) { * return t; * } * }); * @see [Fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto/) * @see [Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/) * @see [Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/) */ Camera.prototype.flyTo = function flyTo (options , eventData ) { var this$1 = this; // Fall through to jumpTo if user has set prefers-reduced-motion if (!options.essential && performance.browser.prefersReducedMotion) { var coercedOptions = (performance.pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around']) ); return this.jumpTo(coercedOptions, eventData); } // This method implements an “optimal path” animation, as detailed in: // // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.” INFOVIS // ’03. pp. 15–22. . // // Where applicable, local variable documentation begins with the associated variable or // function in van Wijk (2003). this.stop(); options = performance.extend({ offset: [0, 0], speed: 1.2, curve: 1.42, easing: performance.ease }, options); var tr = this.transform, startZoom = this.getZoom(), startBearing = this.getBearing(), startPitch = this.getPitch(), startPadding = this.getPadding(); var zoom = 'zoom' in options ? performance.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; var pitch = 'pitch' in options ? +options.pitch : startPitch; var padding = 'padding' in options ? options.padding : tr.padding; var scale = tr.zoomScale(zoom - startZoom); var offsetAsPoint = performance.Point.convert(options.offset); var pointAtOffset = tr.centerPoint.add(offsetAsPoint); var locationAtOffset = tr.pointLocation(pointAtOffset); var center = performance.LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); var from = tr.project(locationAtOffset); var delta = tr.project(center).sub(from); var rho = options.curve; // w₀: Initial visible span, measured in pixels at the initial scale. var w0 = Math.max(tr.width, tr.height), // w₁: Final visible span, measured in pixels with respect to the initial scale. w1 = w0 / scale, // Length of the flight path as projected onto the ground plane, measured in pixels from // the world image origin at the initial scale. u1 = delta.mag(); if ('minZoom' in options) { var minZoom = performance.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); // wm: Maximum visible span, measured in pixels with respect to the initial // scale. var wMax = w0 / tr.zoomScale(minZoom - startZoom); rho = Math.sqrt(wMax / u1 * 2); } // ρ² var rho2 = rho * rho; /** * rᵢ: Returns the zoom-out factor at one end of the animation. * * @param i 0 for the ascent or 1 for the descent. * @private */ function r(i) { var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); return Math.log(Math.sqrt(b * b + 1) - b); } function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } function tanh(n) { return sinh(n) / cosh(n); } // r₀: Zoom-out factor during ascent. var r0 = r(0); // w(s): Returns the visible span on the ground, measured in pixels with respect to the // initial scale. Assumes an angular field of view of 2 arctan ½ ≈ 53°. var w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); }; // u(s): Returns the distance along the flight path as projected onto the ground plane, // measured in pixels from the world image origin at the initial scale. var u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; }; // S: Total length of the flight path, measured in ρ-screenfuls. var S = (r(1) - r0) / rho; // When u₀ = u₁, the optimal path doesn’t require both ascent and descent. if (Math.abs(u1) < 0.000001 || !isFinite(S)) { // Perform a more or less instantaneous transition if the path is too short. if (Math.abs(w0 - w1) < 0.000001) { return this.easeTo(options, eventData); } var k = w1 < w0 ? -1 : 1; S = Math.abs(Math.log(w1 / w0)) / rho; u = function() { return 0; }; w = function(s) { return Math.exp(k * rho * s); }; } if ('duration' in options) { options.duration = +options.duration; } else { var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed; options.duration = 1000 * S / V; } if (options.maxDuration && options.duration > options.maxDuration) { options.duration = 0; } this._zooming = true; this._rotating = (startBearing !== bearing); this._pitching = (pitch !== startPitch); this._padding = !tr.isPaddingEqual(padding); this._prepareEase(eventData, false); this._ease(function (k) { // s: The distance traveled along the flight path, measured in ρ-screenfuls. var s = k * S; var scale = 1 / w(s); tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale); if (this$1._rotating) { tr.bearing = performance.number(startBearing, bearing, k); } if (this$1._pitching) { tr.pitch = performance.number(startPitch, pitch, k); } if (this$1._padding) { tr.interpolatePadding(startPadding, padding, k); // When padding is being applied, Transform#centerPoint is changing continously, // thus we need to recalculate offsetPoint every frame pointAtOffset = tr.centerPoint.add(offsetAsPoint); } var newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); this$1._fireMoveEvents(eventData); }, function () { return this$1._afterEase(eventData); }, options); return this; }; Camera.prototype.isEasing = function isEasing () { return !!this._easeFrameId; }; /** * Stops any animated transition underway. * * @memberof Map# * @returns {Map} `this` */ Camera.prototype.stop = function stop () { return this._stop(); }; Camera.prototype._stop = function _stop (allowGestures , easeId ) { if (this._easeFrameId) { this._cancelRenderFrame(this._easeFrameId); delete this._easeFrameId; delete this._onEaseFrame; } if (this._onEaseEnd) { // The _onEaseEnd function might emit events which trigger new // animation, which sets a new _onEaseEnd. Ensure we don't delete // it unintentionally. var onEaseEnd = this._onEaseEnd; delete this._onEaseEnd; onEaseEnd.call(this, easeId); } if (!allowGestures) { var handlers = (this ).handlers; if (handlers) { handlers.stop(false); } } return this; }; Camera.prototype._ease = function _ease (frame , finish , options ) { if (options.animate === false || options.duration === 0) { frame(1); finish(); } else { this._easeStart = performance.browser.now(); this._easeOptions = options; this._onEaseFrame = frame; this._onEaseEnd = finish; this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); } }; // Callback for map._requestRenderFrame Camera.prototype._renderFrameCallback = function _renderFrameCallback () { var t = Math.min((performance.browser.now() - this._easeStart) / this._easeOptions.duration, 1); this._onEaseFrame(this._easeOptions.easing(t)); if (t < 1) { this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); } else { this.stop(); } }; // convert bearing so that it's numerically close to the current one so that it interpolates properly Camera.prototype._normalizeBearing = function _normalizeBearing (bearing , currentBearing ) { bearing = performance.wrap(bearing, -180, 180); var diff = Math.abs(bearing - currentBearing); if (Math.abs(bearing - 360 - currentBearing) < diff) { bearing -= 360; } if (Math.abs(bearing + 360 - currentBearing) < diff) { bearing += 360; } return bearing; }; // If a path crossing the antimeridian would be shorter, extend the final coordinate so that // interpolating between the two endpoints will cross it. Camera.prototype._normalizeCenter = function _normalizeCenter (center ) { var tr = this.transform; if (!tr.renderWorldCopies || tr.lngRange) { return; } var delta = center.lng - tr.center.lng; center.lng += delta > 180 ? -360 : delta < -180 ? 360 : 0; }; return Camera; }(performance.Evented)); // In debug builds, check that camera change events are fired in the correct order. // - ___start events needs to be fired before ___ and ___end events // - another ___start event can't be fired before a ___end event has been fired for the previous one function addAssertions(camera ) { //eslint-disable-line Debug.run(function () { var inProgress = {}; ['drag', 'zoom', 'rotate', 'pitch', 'move'].forEach(function (name) { inProgress[name] = false; camera.on((name + "start"), function () { performance.assert(!inProgress[name], ("\"" + name + "start\" fired twice without a \"" + name + "end\"")); inProgress[name] = true; performance.assert(inProgress.move); }); camera.on(name, function () { performance.assert(inProgress[name]); performance.assert(inProgress.move); }); camera.on((name + "end"), function () { performance.assert(inProgress.move); performance.assert(inProgress[name]); inProgress[name] = false; }); }); // Canary used to test whether this function is stripped in prod build canary = 'canary debug run'; }); } var canary; //eslint-disable-line // /** * An `AttributionControl` control presents the map's [attribution information](https://docs.mapbox.com/help/how-mapbox-works/attribution/). * * @implements {IControl} * @param {Object} [options] * @param {boolean} [options.compact] If `true`, force a compact attribution that shows the full attribution on mouse hover. If `false`, force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. **Attribution should not be collapsed if it can comfortably fit on the map. `compact` should only be used to modify default attribution when map size makes it impossible to fit [default attribution](https://docs.mapbox.com/help/how-mapbox-works/attribution/) and when the automatic compact resizing for default settings are not sufficient.** * @param {string | Array} [options.customAttribution] String or strings to show in addition to any other attributions. * @example * var map = new mapboxgl.Map({attributionControl: false}) * .addControl(new mapboxgl.AttributionControl({ * compact: true * })); */ var AttributionControl = function AttributionControl(options) { if ( options === void 0 ) options = {}; this.options = options; performance.bindAll([ '_updateEditLink', '_updateData', '_updateCompact' ], this); }; AttributionControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-right'; }; AttributionControl.prototype.onAdd = function onAdd (map ) { var compact = this.options && this.options.compact; this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); this._innerContainer = DOM.create('div', 'mapboxgl-ctrl-attrib-inner', this._container); if (compact) { this._container.classList.add('mapboxgl-compact'); } this._updateAttributions(); this._updateEditLink(); this._map.on('styledata', this._updateData); this._map.on('sourcedata', this._updateData); this._map.on('moveend', this._updateEditLink); if (compact === undefined) { this._map.on('resize', this._updateCompact); this._updateCompact(); } return this._container; }; AttributionControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('styledata', this._updateData); this._map.off('sourcedata', this._updateData); this._map.off('moveend', this._updateEditLink); this._map.off('resize', this._updateCompact); this._map = (undefined ); this._attribHTML = (undefined ); }; AttributionControl.prototype._updateEditLink = function _updateEditLink () { var editLink = this._editLink; if (!editLink) { editLink = this._editLink = (this._container.querySelector('.mapbox-improve-map') ); } var params = [ {key: "owner", value: this.styleOwner}, {key: "id", value: this.styleId}, {key: "access_token", value: this._map._requestManager._customAccessToken || performance.config.ACCESS_TOKEN} ]; if (editLink) { var paramString = params.reduce(function (acc, next, i) { if (next.value) { acc += (next.key) + "=" + (next.value) + (i < params.length - 1 ? '&' : ''); } return acc; }, "?"); editLink.href = (performance.config.FEEDBACK_URL) + "/" + paramString + (this._map._hash ? this._map._hash.getHashString(true) : ''); editLink.rel = "noopener nofollow"; } }; AttributionControl.prototype._updateData = function _updateData (e ) { if (e && (e.sourceDataType === 'metadata' || e.dataType === 'style')) { this._updateAttributions(); this._updateEditLink(); } }; AttributionControl.prototype._updateAttributions = function _updateAttributions () { if (!this._map.style) { return; } var attributions = []; if (this.options.customAttribution) { if (Array.isArray(this.options.customAttribution)) { attributions = attributions.concat( this.options.customAttribution.map(function (attribution) { if (typeof attribution !== 'string') { return ''; } return attribution; }) ); } else if (typeof this.options.customAttribution === 'string') { attributions.push(this.options.customAttribution); } } if (this._map.style.stylesheet) { var stylesheet = this._map.style.stylesheet; this.styleOwner = stylesheet.owner; this.styleId = stylesheet.id; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var sourceCache = sourceCaches[id]; if (sourceCache.used) { var source = sourceCache.getSource(); if (source.attribution && attributions.indexOf(source.attribution) < 0) { attributions.push(source.attribution); } } } // remove any entries that are substrings of another entry. // first sort by length so that substrings come first attributions.sort(function (a, b) { return a.length - b.length; }); attributions = attributions.filter(function (attrib, i) { for (var j = i + 1; j < attributions.length; j++) { if (attributions[j].indexOf(attrib) >= 0) { return false; } } return true; }); // check if attribution string is different to minimize DOM changes var attribHTML = attributions.join(' | '); if (attribHTML === this._attribHTML) { return; } this._attribHTML = attribHTML; if (attributions.length) { this._innerContainer.innerHTML = attribHTML; this._container.classList.remove('mapboxgl-attrib-empty'); } else { this._container.classList.add('mapboxgl-attrib-empty'); } // remove old DOM node from _editLink this._editLink = null; }; AttributionControl.prototype._updateCompact = function _updateCompact () { if (this._map.getCanvasContainer().offsetWidth <= 640) { this._container.classList.add('mapboxgl-compact'); } else { this._container.classList.remove('mapboxgl-compact'); } }; // /** * A `LogoControl` is a control that adds the Mapbox watermark * to the map as required by the [terms of service](https://www.mapbox.com/tos/) for Mapbox * vector tiles and core styles. * * @implements {IControl} * @private **/ var LogoControl = function LogoControl() { performance.bindAll(['_updateLogo'], this); performance.bindAll(['_updateCompact'], this); }; LogoControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl'); var anchor = DOM.create('a', 'mapboxgl-ctrl-logo'); anchor.target = "_blank"; anchor.rel = "noopener nofollow"; anchor.href = "https://www.mapbox.com/"; anchor.setAttribute("aria-label", this._map._getUIString('LogoControl.Title')); anchor.setAttribute("rel", "noopener nofollow"); this._container.appendChild(anchor); this._container.style.display = 'none'; this._map.on('sourcedata', this._updateLogo); this._updateLogo(); this._map.on('resize', this._updateCompact); this._updateCompact(); return this._container; }; LogoControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('sourcedata', this._updateLogo); this._map.off('resize', this._updateCompact); }; LogoControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; LogoControl.prototype._updateLogo = function _updateLogo (e ) { if (!e || e.sourceDataType === 'metadata') { this._container.style.display = this._logoRequired() ? 'block' : 'none'; } }; LogoControl.prototype._logoRequired = function _logoRequired () { if (!this._map.style) { return; } var sourceCaches = this._map.style.sourceCaches; for (var id in sourceCaches) { var source = sourceCaches[id].getSource(); if (source.mapbox_logo) { return true; } } return false; }; LogoControl.prototype._updateCompact = function _updateCompact () { var containerChildren = this._container.children; if (containerChildren.length) { var anchor = containerChildren[0]; if (this._map.getCanvasContainer().offsetWidth < 250) { anchor.classList.add('mapboxgl-compact'); } else { anchor.classList.remove('mapboxgl-compact'); } } }; // strict // can't mark opaque due to https://github.com/flowtype/flow-remove-types/pull/61 var TaskQueue = function TaskQueue(){ this._queue = []; this._id = 0; this._cleared = false; this._currentlyRunning = false; }; TaskQueue.prototype.add = function add (callback ) { var id = ++this._id; var queue = this._queue; queue.push({callback: callback, id: id, cancelled: false}); return id; }; TaskQueue.prototype.remove = function remove (id ) { var running = this._currentlyRunning; var queue = running ? this._queue.concat(running) : this._queue; for (var i = 0, list = queue; i < list.length; i += 1) { var task = list[i]; if (task.id === id) { task.cancelled = true; return; } } }; TaskQueue.prototype.run = function run (timeStamp) { if ( timeStamp === void 0 ) timeStamp = 0; performance.assert(!this._currentlyRunning); var queue = this._currentlyRunning = this._queue; // Tasks queued by callbacks in the current queue should be executed // on the next run, not the current run. this._queue = []; for (var i = 0, list = queue; i < list.length; i += 1) { var task = list[i]; if (task.cancelled) { continue; } task.callback(timeStamp); if (this._cleared) { break; } } this._cleared = false; this._currentlyRunning = false; }; TaskQueue.prototype.clear = function clear () { if (this._currentlyRunning) { this._cleared = true; } this._queue = []; }; var names = []; function add(proj) { names.push.apply(names, (proj.names || [])); } add(performance.tmerc); add(performance.etmerc); add(performance.utm); add(performance.sterea); add(performance.stere); add(performance.somerc); add(performance.omerc); add(performance.lcc); add(performance.krovak); add(performance.cass); add(performance.laea); add(performance.aea); add(performance.gnom); add(performance.cea); add(performance.eqc); add(performance.poly); add(performance.nzmg); add(performance.mill); add(performance.sinu); add(performance.moll); add(performance.eqdc); add(performance.vandg); add(performance.aeqd); add(performance.ortho$1); add(performance.qsc); add(performance.robin); add(performance.geocent); add(performance.tpers); add(performance.geos); function crsCheck(wkt) { var jsonObj = performance.parseCode(wkt); if (typeof jsonObj !== 'object') { console.error('The projection defs value is not valid'); } if (!performance.proj4.Proj.projections.get(jsonObj.projName)) { console.error(("The projection name " + (jsonObj.projName) + " is not supported.Perhaps values are " + (tryToPickProjection(jsonObj.projName).join(',')))); } } function tryToPickProjection(projName) { var fromNames = projName.split(/[\s_-]+/); var perhaps = new Set(); for (var index = 0; index < names.length; index++) { var name = names[index]; for (var j = 0; j < fromNames.length; j++) { if (name.toLowerCase().indexOf(fromNames[j].toLowerCase()) >= 0) { perhaps.add(name); } } } return perhaps.size > 0 ? Array.from(perhaps) : names; } // var CRS = function CRS(epsgCode, WKT, extent) { this.epsgCode = epsgCode; this.extent = extent; this.renderWorldCopies = true; if (Array.isArray(WKT)) { this.extent = WKT; WKT = null; } this.WKT = WKT || CRS.defaultWKTs[epsgCode]; // console.log(proj4.Proj(this.WKT)); if (this.WKT) { crsCheck(this.WKT); performance.proj4.defs(epsgCode, this.WKT); } var defs = performance.proj4.defs(epsgCode); if (!defs) { throw new Error((epsgCode + " was not defined,make sure the WKT param was not null")); } this.unit = defs.units || 'degree'; this.proj4Projection = performance.proj4(epsgCode); var leftBottomLngLat = this.proj4Projection.inverse([this.extent[0], this.extent[1]]); var rightTopLngLat = this.proj4Projection.inverse([this.extent[2], this.extent[3]]); this.lngLatExtent = leftBottomLngLat.concat( rightTopLngLat); this._id = performance.uniqueId(); CRS.set(this); }; CRS.prototype.getExtent = function getExtent () { if (!this._rectifyExtent) { var width = this.extent[2] - this.extent[0]; var height = this.extent[3] - this.extent[1]; if (width === height) { this._rectifyExtent = [this.extent[0], this.extent[1], this.extent[2], this.extent[3]]; } else { var a = Math.max(width, height); this._rectifyExtent = [this.extent[0], this.extent[3] - a, this.extent[0] + a, this.extent[3]]; } } return this._rectifyExtent; }; CRS.prototype.getLngLatCenter = function getLngLatCenter () { return [this.lngLatExtent[2] - (this.lngLatExtent[2] - this.lngLatExtent[0]) / 2, this.lngLatExtent[3] - (this.lngLatExtent[3] - this.lngLatExtent[1]) / 2]; }; CRS.prototype.getLngLatExtent = function getLngLatExtent () { if (!this._rectifyLngLatExtent) { var leftBottomLngLat = this.proj4Projection.inverse([this.extent[0], this.extent[1]]); var rightTopLngLat = this.proj4Projection.inverse([this.extent[2], this.extent[3]]); var width = rightTopLngLat[0] - leftBottomLngLat[0]; var height = rightTopLngLat[1] - leftBottomLngLat[1]; if (width === height) { this._rectifyLngLatExtent = [leftBottomLngLat[0], leftBottomLngLat[1], rightTopLngLat[0], rightTopLngLat[0]]; } else { var a = Math.max(width, height); this._rectifyLngLatExtent = [leftBottomLngLat[0], rightTopLngLat[1] - a, leftBottomLngLat[0] + a, rightTopLngLat[1]]; } } return this._rectifyLngLatExtent; }; CRS.prototype.getOrigin = function getOrigin () { return [this.extent[0], this.extent[3]]; }; CRS.prototype.getEpsgCode = function getEpsgCode () { return this.epsgCode; }; CRS.prototype.getUnit = function getUnit () { return this.unit; }; CRS.prototype.getWKT = function getWKT () { return this.WKT; }; CRS.prototype.getWidth = function getWidth () { return this._rectifyExtent[2] - this._rectifyExtent[0]; }; CRS.prototype.getHeight = function getHeight () { return this._rectifyExtent[3] - this._rectifyExtent[1]; }; CRS.prototype.getOriginX = function getOriginX () { return this._rectifyExtent[0]; }; CRS.prototype.getOriginY = function getOriginY () { return this._rectifyExtent[3]; }; CRS.prototype.toWGS84 = function toWGS84 (xy) { return this.proj4Projection.inverse(xy); }; CRS.prototype.fromWGS84 = function fromWGS84 (lngLat) { return this.proj4Projection.forward(lngLat); }; CRS.prototype.fromLngLat = function fromLngLat (lngLatLike) { var lngLat = performance.LngLat.convert(lngLatLike); var validLng = this.renderWorldCopies ? lngLat.lng:performance.clamp(lngLat.lng,-180,180); var forward = this.fromWGS84([validLng, lngLat.lat]); return { x: (forward[0] - this.getOriginX()) / this.getWidth(), y: (this.getOriginY() - forward[1]) / this.getHeight(), z: 0 }; }; CRS.prototype.toLngLat = function toLngLat (x, y) { var validX = this.renderWorldCopies ? x:performance.clamp(x,0,1); var inverse = this.toWGS84([validX * this.getWidth() + this.getOriginX(), this.getOriginY() - y * this.getHeight()]); return new performance.LngLat(inverse[0], inverse[1]); }; CRS.get = function (codeSpec) { for (var key in CRS) { if (CRS.hasOwnProperty(key)) { if (CRS[key].getEpsgCode && CRS[key].getEpsgCode() === codeSpec) { return CRS[key]; } } } return null; }; CRS.set = function (crs) { var key = crs.getEpsgCode().replace(":", "").toUpperCase(); CRS[key] = crs; }; CRS.defaultWKTs = { 'EPSG:4490': 'GEOGCS["China Geodetic Coordinate System 2000",DATUM["China_2000",SPHEROID["CGCS2000",6378137,298.257222101,AUTHORITY["EPSG","1024"]],AUTHORITY["EPSG","1043"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4490"]]', 'EPSG:4214': 'GEOGCS["Beijing 1954",DATUM["Beijing_1954",SPHEROID["Krassowsky 1940",6378245,298.3],TOWGS84[15.8,-154.4,-82.3,0,0,0,0]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4214"]]', 'EPSG:4610': 'GEOGCS["Xian 1980",DATUM["Xian_1980",SPHEROID["IAG 1975",6378140,298.257,AUTHORITY["EPSG","7049"]],AUTHORITY["EPSG","6610"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4610"]]' }; CRS.EPSG4326 = new CRS('EPSG:4326', [-180, -90, 180, 90]); CRS.EPSG4490 = new CRS('EPSG:4490', [-180, -90, 180, 90]); CRS.EPSG4214 = new CRS('EPSG:4214', [-180, -90, 180, 90]); CRS.EPSG4610 = new CRS('EPSG:4610', [-180, -90, 180, 90]);//new CRS('EPSG:4490', [73.62, 16.7, 134.77, 53.56]); CRS.EPSG3857 = new CRS('EPSG:3857', [-20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892]); // var defaultLocale = { 'FullscreenControl.Enter': 'Enter fullscreen', 'FullscreenControl.Exit': 'Exit fullscreen', 'GeolocateControl.FindMyLocation': 'Find my location', 'GeolocateControl.LocationNotAvailable': 'Location not available', 'LogoControl.Title': 'Mapbox logo', 'NavigationControl.ResetBearing': 'Reset bearing to north', 'NavigationControl.ZoomIn': 'Zoom in', 'NavigationControl.ZoomOut': 'Zoom out', 'ScaleControl.Feet': 'ft', 'ScaleControl.Meters': 'm', 'ScaleControl.Kilometers': 'km', 'ScaleControl.Miles': 'mi', 'ScaleControl.NauticalMiles': 'nm' }; // var HTMLImageElement = performance.window.HTMLImageElement; var HTMLElement = performance.window.HTMLElement; var ImageBitmap = performance.window.ImageBitmap; /* eslint-disable no-use-before-define */ /* eslint-enable no-use-before-define */ var defaultMinZoom = -2; var defaultMaxZoom = 22; // the default values, but also the valid range var defaultMinPitch = 0; var defaultMaxPitch = 60; var defaultOptions$1 = { center: [0, 0], zoom: 0, bearing: 0, pitch: 0, minZoom: defaultMinZoom, maxZoom: defaultMaxZoom, minPitch: defaultMinPitch, maxPitch: defaultMaxPitch, interactive: true, scrollZoom: true, boxZoom: true, dragRotate: true, dragPan: true, keyboard: true, doubleClickZoom: true, touchZoomRotate: true, touchPitch: true, bearingSnap: 7, clickTolerance: 3, pitchWithRotate: true, hash: false, attributionControl: true, failIfMajorPerformanceCaveat: false, preserveDrawingBuffer: false, trackResize: true, renderWorldCopies: true, refreshExpiredTiles: true, maxTileCacheSize: null, localIdeographFontFamily: 'sans-serif', transformRequest: null, accessToken: null, fadeDuration: 300, crossSourceCollisions: true }; /** * The `Map` object represents the map on your page. It exposes methods * and properties that enable you to programmatically change the map, * and fires events as users interact with it. * * You create a `Map` by specifying a `container` and other options. * Then Mapbox GL JS initializes the map on the page and returns your `Map` * object. * * @extends Evented * @param {Object} options * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`. The specified element must have no children. * @param {number} [options.minZoom=0] The minimum zoom level of the map (0-24). * @param {number} [options.maxZoom=22] The maximum zoom level of the map (0-24). * @param {number} [options.minPitch=0] The minimum pitch of the map (0-60). * @param {number} [options.maxPitch=60] The maximum pitch of the map (0-60). * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to * such JSON. * * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`, * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following * [the predefined Mapbox styles](https://www.mapbox.com/maps/): * * * `mapbox://styles/mapbox/streets-v11` * * `mapbox://styles/mapbox/outdoors-v11` * * `mapbox://styles/mapbox/light-v10` * * `mapbox://styles/mapbox/dark-v10` * * `mapbox://styles/mapbox/satellite-v9` * * `mapbox://styles/mapbox/satellite-streets-v11` * * `mapbox://styles/mapbox/navigation-preview-day-v4` * * `mapbox://styles/mapbox/navigation-preview-night-v4` * * `mapbox://styles/mapbox/navigation-guidance-day-v4` * * `mapbox://styles/mapbox/navigation-guidance-night-v4` * * Tilesets hosted with Mapbox can be style-optimized if you append `?optimize=true` to the end of your style URL, like `mapbox://styles/mapbox/streets-v11?optimize=true`. * Learn more about style-optimized vector tiles in our [API documentation](https://www.mapbox.com/api-documentation/maps/#retrieve-tiles). * * @param {(boolean|string)} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL. * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`. * An additional string may optionally be provided to indicate a parameter-styled hash, * e.g. http://path/to/my/page.html#map=2.59/39.26/53.07/-24.1/60&foo=bar, where foo * is a custom parameter and bar is an arbitrary hash distinct from the map hash. * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction. * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's * bearing will snap to north. For example, with a `bearingSnap` of 7, if the user rotates * the map within 7 degrees of north, the map will automatically snap to exact north. * @param {boolean} [options.pitchWithRotate=true] If `false`, the map's pitch (tilt) control with "drag to rotate" interaction will be disabled. * @param {number} [options.clickTolerance=3] The max number of pixels a user can shift the mouse pointer during a click for it to be considered a valid click (as opposed to a mouse drag). * @param {boolean} [options.attributionControl=true] If `true`, an {@link AttributionControl} will be added to the map. * @param {string | Array} [options.customAttribution] String or strings to show in an {@link AttributionControl}. Only applicable if `options.attributionControl` is `true`. * @param {string} [options.logoPosition='bottom-left'] A string representing the position of the Mapbox wordmark on the map. Valid options are `top-left`,`top-right`, `bottom-left`, `bottom-right`. * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox * GL JS would be dramatically worse than expected (i.e. a software renderer would be used). * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization. * @param {boolean} [options.antialias] If `true`, the gl context will be created with MSAA antialiasing, which can be useful for antialiasing custom layers. this is `false` by default as a performance optimization. * @param {boolean} [options.refreshExpiredTiles=true] If `false`, the map won't attempt to re-request tiles once they expire per their HTTP `cacheControl`/`expires` headers. * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds. * @param {boolean|Object} [options.scrollZoom=true] If `true`, the "scroll to zoom" interaction is enabled. An `Object` value is passed as options to {@link ScrollZoomHandler#enable}. * @param {boolean} [options.boxZoom=true] If `true`, the "box zoom" interaction is enabled (see {@link BoxZoomHandler}). * @param {boolean} [options.dragRotate=true] If `true`, the "drag to rotate" interaction is enabled (see {@link DragRotateHandler}). * @param {boolean|Object} [options.dragPan=true] If `true`, the "drag to pan" interaction is enabled. An `Object` value is passed as options to {@link DragPanHandler#enable}. * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see {@link KeyboardHandler}). * @param {boolean} [options.doubleClickZoom=true] If `true`, the "double click to zoom" interaction is enabled (see {@link DoubleClickZoomHandler}). * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the "pinch to rotate and zoom" interaction is enabled. An `Object` value is passed as options to {@link TouchZoomRotateHandler#enable}. * @param {boolean|Object} [options.touchPitch=true] If `true`, the "drag to pitch" interaction is enabled. An `Object` value is passed as options to {@link TouchPitchHandler#enable}. * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes. * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]` Note: Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. * @param {LngLatBoundsLike} [options.bounds] The initial bounds of the map. If `bounds` is specified, it overrides `center` and `zoom` constructor options. * @param {Object} [options.fitBoundsOptions] A {@link Map#fitBounds} options object to use _only_ when fitting the initial `bounds` provided above. * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`: * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire * container, there will be blank space beyond 180 and -180 degrees longitude. * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the * map and the other on the left edge of the map) at every zoom level. * @param {number} [options.maxTileCacheSize=null] The maximum number of tiles stored in the tile cache for a given source. If omitted, the cache will be dynamically sized based on the current viewport. * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). * Set to `false`, to enable font settings from the map's style for these glyph ranges. Note that [Mapbox Studio](https://studio.mapbox.com/) sets this value to `false` by default. * The purpose of this option is to avoid bandwidth-intensive glyph server requests. (See [Use locally generated ideographs](https://www.mapbox.com/mapbox-gl-js/example/local-ideographs).) * @param {RequestTransformFunction} [options.transformRequest=null] A callback run before the Map makes a request for an external URL. The callback can be used to modify the url, set headers, or set the credentials property for cross-origin requests. * Expected to return an object with a `url` property and optionally `headers` and `credentials` properties. * @param {boolean} [options.collectResourceTiming=false] If `true`, Resource Timing API information will be collected for requests made by GeoJSON and Vector Tile web workers (this information is normally inaccessible from the main Javascript thread). Information will be returned in a `resourceTiming` property of relevant `data` events. * @param {number} [options.fadeDuration=300] Controls the duration of the fade-in/fade-out animation for label collisions, in milliseconds. This setting affects all symbol layers. This setting does not affect the duration of runtime styling transitions or raster tile cross-fading. * @param {boolean} [options.crossSourceCollisions=true] If `true`, symbols from multiple sources can collide with each other during collision detection. If `false`, collision detection is run separately for the symbols in each source. * @param {string} [options.accessToken=null] If specified, map will use this token instead of the one defined in mapboxgl.accessToken. * @param {Object} [options.locale=null] A patch to apply to the default localization table for UI strings, e.g. control tooltips. The `locale` object maps namespaced UI string IDs to translated strings in the target language; see `src/ui/default_locale.js` for an example with all supported string IDs. The object may specify all UI strings (thereby adding support for a new translation) or only a subset of strings (thereby patching the default translation table). * @example * var map = new mapboxgl.Map({ * container: 'map', * center: [-122.420679, 37.772537], * zoom: 13, * style: style_object, * hash: true, * transformRequest: (url, resourceType)=> { * if(resourceType === 'Source' && url.startsWith('http://myHost')) { * return { * url: url.replace('http', 'https'), * headers: { 'my-custom-header': true}, * credentials: 'include' // Include cookies for cross-origin requests * } * } * } * }); * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ var Map = /*@__PURE__*/(function (Camera) { function Map(options ) { var this$1 = this; performance.PerformanceUtils.mark(performance.PerformanceMarkers.create); options = performance.extend({}, defaultOptions$1, options); if ( options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom ) { throw new Error("maxZoom must be greater than or equal to minZoom"); } if ( options.minPitch != null && options.maxPitch != null && options.minPitch > options.maxPitch ) { throw new Error( "maxPitch must be greater than or equal to minPitch" ); } if (options.minPitch != null && options.minPitch < defaultMinPitch) { throw new Error( ("minPitch must be greater than or equal to " + defaultMinPitch) ); } if (options.maxPitch != null && options.maxPitch > defaultMaxPitch) { throw new Error( ("maxPitch must be less than or equal to " + defaultMaxPitch) ); } var transform = new Transform( options.minZoom, options.maxZoom, options.minPitch, options.maxPitch, options.renderWorldCopies ); Camera.call(this, transform, options); this.transform = transform; this.crs = this.toCRS(options.crs); this.initCRS(this.crs); this._interactive = options.interactive; this._maxTileCacheSize = options.maxTileCacheSize; this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat; this._preserveDrawingBuffer = options.preserveDrawingBuffer; this._antialias = options.antialias; this._trackResize = options.trackResize; this._bearingSnap = options.bearingSnap; this._refreshExpiredTiles = options.refreshExpiredTiles; this._fadeDuration = options.fadeDuration; this._crossSourceCollisions = options.crossSourceCollisions; this._crossFadingFactor = 1; this._collectResourceTiming = options.collectResourceTiming; this._renderTaskQueue = new TaskQueue(); this._controls = []; this._markersCache = []; this._mapId = performance.uniqueId(); this._locale = performance.extend({}, defaultLocale, options.locale); this._requestManager = new performance.RequestManager( options.transformRequest, options.accessToken ); if (typeof options.container === "string") { this._container = performance.window.document.getElementById(options.container); if (!this._container) { throw new Error(("Container '" + (options.container) + "' not found.")); } } else if (options.container instanceof HTMLElement) { this._container = options.container; } else { throw new Error( "Invalid type: 'container' must be a String or HTMLElement." ); } if (options.maxBounds) { this.setMaxBounds(options.maxBounds); } performance.bindAll( [ "_onWindowOnline", "_onWindowResize", "_contextLost", "_contextRestored" ], this ); this._setupContainer(); this._setupPainter(); if (this.painter === undefined) { throw new Error("Failed to initialize WebGL."); } this.on("move", function () { return this$1._update(false); }); this.on("moveend", function () { return this$1._update(false); }); this.on("zoom", function () { return this$1._update(true); }); if (typeof performance.window !== "undefined") { performance.window.addEventListener("online", this._onWindowOnline, false); performance.window.addEventListener("resize", this._onWindowResize, false); performance.window.addEventListener( "orientationchange", this._onWindowResize, false ); } this.handlers = new HandlerManager(this, options); var hashName = (typeof options.hash === "string" && options.hash) || undefined; this._hash = options.hash && new Hash(hashName).addTo(this); // don't set position from options if set through hash if (!this._hash || !this._hash._onHashChange()) { this.jumpTo({ center: options.center, zoom: options.zoom, bearing: options.bearing, pitch: options.pitch, }); if (options.bounds) { this.resize(); this.fitBounds( options.bounds, performance.extend({}, options.fitBoundsOptions, { duration: 0 }) ); } } this.resize(); this._localIdeographFontFamily = options.localIdeographFontFamily; if (options.style) { this.setStyle(options.style, { localIdeographFontFamily: options.localIdeographFontFamily, }); } if (options.attributionControl) { this.addControl( new AttributionControl({ customAttribution: options.customAttribution, }) ); } this.addControl(new LogoControl(), options.logoPosition); this.on("style.load", function () { if (this$1.transform.unmodified) { this$1.jumpTo((this$1.style.stylesheet )); } }); this.on("data", function (event ) { this$1._update(event.dataType === "style"); this$1.fire(new performance.Event(((event.dataType) + "data"), event)); }); this.on("dataloading", function (event ) { this$1.fire(new performance.Event(((event.dataType) + "dataloading"), event)); }); } if ( Camera ) Map.__proto__ = Camera; Map.prototype = Object.create( Camera && Camera.prototype ); Map.prototype.constructor = Map; var prototypeAccessors = { showTileBoundaries: { configurable: true },showPadding: { configurable: true },showCollisionBoxes: { configurable: true },showOverdrawInspector: { configurable: true },repaint: { configurable: true },vertices: { configurable: true },version: { configurable: true } }; Map.prototype.toCRS = function toCRS (crs) { if (crs && "string" === typeof crs) { crs = CRS.get(crs); if (!crs) { throw new Error(("crs " + crs + " is not define")); return; } } return crs || CRS.EPSG3857; }; Map.prototype.getCRS = function getCRS () { return this.crs; }; /* * Returns a unique number for this map instance which is used for the MapLoadEvent * to make sure we only fire one event per instantiated map object. * @private * @returns {number} */ Map.prototype._getMapId = function _getMapId () { return this._mapId; }; /** * Adds an {@link IControl} to the map, calling `control.onAdd(this)`. * * @param {IControl} control The {@link IControl} to add. * @param {string} [position] position on the map to which the control will be added. * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`. * @returns {Map} `this` * @example * // Add zoom and rotation controls to the map. * map.addControl(new mapboxgl.NavigationControl()); * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) */ Map.prototype.addControl = function addControl (control , position ) { if (position === undefined && control.getDefaultPosition) { position = control.getDefaultPosition(); } if (position === undefined) { position = "top-right"; } if (!control || !control.onAdd) { return this.fire( new performance.ErrorEvent( new Error( "Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods." ) ) ); } var controlElement = control.onAdd(this); this._controls.push(control); var positionContainer = this._controlPositions[position]; if (position.indexOf("bottom") !== -1) { positionContainer.insertBefore( controlElement, positionContainer.firstChild ); } else { positionContainer.appendChild(controlElement); } return this; }; /** * Removes the control from the map. * * @param {IControl} control The {@link IControl} to remove. * @returns {Map} `this` * @example * // Define a new navigation control. * var navigation = new mapboxgl.NavigationControl(); * // Add zoom and rotation controls to the map. * map.addControl(navigation); * // Remove zoom and rotation controls from the map. * map.removeControl(navigation); */ Map.prototype.removeControl = function removeControl (control ) { if (!control || !control.onRemove) { return this.fire( new performance.ErrorEvent( new Error( "Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods." ) ) ); } var ci = this._controls.indexOf(control); if (ci > -1) { this._controls.splice(ci, 1); } control.onRemove(this); return this; }; /** * Resizes the map according to the dimensions of its * `container` element. * * Checks if the map container size changed and updates the map if it has changed. * This method must be called after the map's `container` is resized programmatically * or when the map is shown after being initially hidden with CSS. * * @param eventData Additional properties to be passed to `movestart`, `move`, `resize`, and `moveend` * events that get triggered as a result of resize. This can be useful for differentiating the * source of an event (for example, user-initiated or programmatically-triggered events). * @returns {Map} `this` * @example * // Resize the map when the map container is shown * // after being initially hidden with CSS. * var mapDiv = document.getElementById('map'); * if (mapDiv.style.visibility === true) map.resize(); */ Map.prototype.resize = function resize (eventData ) { var dimensions = this._containerDimensions(); var width = dimensions[0]; var height = dimensions[1]; this._resizeCanvas(width, height); this.transform.resize(width, height); this.painter.resize(width, height); var fireMoving = !this._moving; if (fireMoving) { this.stop(); this.fire(new performance.Event("movestart", eventData)).fire( new performance.Event("move", eventData) ); } this.fire(new performance.Event("resize", eventData)); if (fireMoving) { this.fire(new performance.Event("moveend", eventData)); } return this; }; /** * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region. * @returns {LngLatBounds} The geographical bounds of the map as {@link LngLatBounds}. * @example * var bounds = map.getBounds(); */ Map.prototype.getBounds = function getBounds () { return this.transform.getBounds(); }; /** * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. * @returns The map object. * @example * var maxBounds = map.getMaxBounds(); */ Map.prototype.getMaxBounds = function getMaxBounds () { return this.transform.getMaxBounds(); }; /** * Sets or clears the map's geographical bounds. * * Pan and zoom operations are constrained within these bounds. * If a pan or zoom is performed that would * display regions outside these bounds, the map will * instead display a position and zoom level * as close as possible to the operation's request while still * remaining within the bounds. * * @param {LngLatBoundsLike | null | undefined} bounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds. * @returns {Map} `this` * @example * // Define bounds that conform to the `LngLatBoundsLike` object. * var bounds = [ * [-74.04728, 40.68392], // [west, south] * [-73.91058, 40.87764] // [east, north] * ]; * // Set the map's max bounds. * map.setMaxBounds(bounds); */ Map.prototype.setMaxBounds = function setMaxBounds (bounds ) { this.transform.setMaxBounds(performance.LngLatBounds.convert(bounds)); return this._update(); }; /** * Sets or clears the map's minimum zoom level. * If the map's current zoom level is lower than the new minimum, * the map will zoom to the new minimum. * * It is not always possible to zoom out and reach the set `minZoom`. * Other factors such as map height may restrict zooming. For example, * if the map is 512px tall it will not be possible to zoom below zoom 0 * no matter what the `minZoom` is set to. * * @param {number | null | undefined} minZoom The minimum zoom level to set (-2 - 24). * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to -2). * @returns {Map} `this` * @example * map.setMinZoom(12.25); */ Map.prototype.setMinZoom = function setMinZoom (minZoom ) { minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom; if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) { this.transform.minZoom = minZoom; this._update(); if (this.getZoom() < minZoom) { this.setZoom(minZoom); } return this; } else { throw new Error( ("minZoom must be between " + defaultMinZoom + " and the current maxZoom, inclusive") ); } }; /** * Returns the map's minimum allowable zoom level. * * @returns {number} minZoom * @example * var minZoom = map.getMinZoom(); */ Map.prototype.getMinZoom = function getMinZoom () { return this.transform.minZoom; }; /** * Sets or clears the map's maximum zoom level. * If the map's current zoom level is higher than the new maximum, * the map will zoom to the new maximum. * * @param {number | null | undefined} maxZoom The maximum zoom level to set. * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 22). * @returns {Map} `this` * @example * map.setMaxZoom(18.75); */ Map.prototype.setMaxZoom = function setMaxZoom (maxZoom ) { maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom; if (maxZoom >= this.transform.minZoom) { this.transform.maxZoom = maxZoom; this._update(); if (this.getZoom() > maxZoom) { this.setZoom(maxZoom); } return this; } else { throw new Error("maxZoom must be greater than the current minZoom"); } }; /** * Returns the map's maximum allowable zoom level. * * @returns {number} maxZoom * @example * var maxZoom = map.getMaxZoom(); */ Map.prototype.getMaxZoom = function getMaxZoom () { return this.transform.maxZoom; }; /** * Sets or clears the map's minimum pitch. * If the map's current pitch is lower than the new minimum, * the map will pitch to the new minimum. * * @param {number | null | undefined} minPitch The minimum pitch to set (0-60). * If `null` or `undefined` is provided, the function removes the current minimum pitch (i.e. sets it to 0). * @returns {Map} `this` */ Map.prototype.setMinPitch = function setMinPitch (minPitch ) { minPitch = minPitch === null || minPitch === undefined ? defaultMinPitch : minPitch; if (minPitch < defaultMinPitch) { throw new Error( ("minPitch must be greater than or equal to " + defaultMinPitch) ); } if ( minPitch >= defaultMinPitch && minPitch <= this.transform.maxPitch ) { this.transform.minPitch = minPitch; this._update(); if (this.getPitch() < minPitch) { this.setPitch(minPitch); } return this; } else { throw new Error( ("minPitch must be between " + defaultMinPitch + " and the current maxPitch, inclusive") ); } }; /** * Returns the map's minimum allowable pitch. * * @returns {number} minPitch */ Map.prototype.getMinPitch = function getMinPitch () { return this.transform.minPitch; }; /** * Sets or clears the map's maximum pitch. * If the map's current pitch is higher than the new maximum, * the map will pitch to the new maximum. * * @param {number | null | undefined} maxPitch The maximum pitch to set. * If `null` or `undefined` is provided, the function removes the current maximum pitch (sets it to 60). * @returns {Map} `this` */ Map.prototype.setMaxPitch = function setMaxPitch (maxPitch ) { maxPitch = maxPitch === null || maxPitch === undefined ? defaultMaxPitch : maxPitch; if (maxPitch > defaultMaxPitch) { throw new Error( ("maxPitch must be less than or equal to " + defaultMaxPitch) ); } if (maxPitch >= this.transform.minPitch) { this.transform.maxPitch = maxPitch; this._update(); if (this.getPitch() > maxPitch) { this.setPitch(maxPitch); } return this; } else { throw new Error( "maxPitch must be greater than the current minPitch" ); } }; /** * Returns the map's maximum allowable pitch. * * @returns {number} maxPitch */ Map.prototype.getMaxPitch = function getMaxPitch () { return this.transform.maxPitch; }; /** * Returns the state of `renderWorldCopies`. If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`: * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire * container, there will be blank space beyond 180 and -180 degrees longitude. * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the * map and the other on the left edge of the map) at every zoom level. * @returns {boolean} renderWorldCopies * @example * var worldCopiesRendered = map.getRenderWorldCopies(); * @see [Render world copies](https://docs.mapbox.com/mapbox-gl-js/example/render-world-copies/) */ Map.prototype.getRenderWorldCopies = function getRenderWorldCopies () { return this.transform.renderWorldCopies; }; /** * Sets the state of `renderWorldCopies`. * * @param {boolean} renderWorldCopies If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`: * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire * container, there will be blank space beyond 180 and -180 degrees longitude. * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the * map and the other on the left edge of the map) at every zoom level. * * `undefined` is treated as `true`, `null` is treated as `false`. * @returns {Map} `this` * @example * map.setRenderWorldCopies(true); * @see [Render world copies](https://docs.mapbox.com/mapbox-gl-js/example/render-world-copies/) */ Map.prototype.setRenderWorldCopies = function setRenderWorldCopies (renderWorldCopies ) { this.transform.renderWorldCopies = renderWorldCopies; this.crs.renderWorldCopies = renderWorldCopies; return this._update(); }; /** * Returns a {@link Point} representing pixel coordinates, relative to the map's `container`, * that correspond to the specified geographical location. * * @param {LngLatLike} lnglat The geographical location to project. * @returns {Point} The {@link Point} corresponding to `lnglat`, relative to the map's `container`. * @example * var coordinate = [-122.420679, 37.772537]; * var point = map.project(coordinate); */ Map.prototype.project = function project (lnglat ) { return this.transform.locationPoint(performance.LngLat.convert(lnglat)); }; /** * Returns a {@link LngLat} representing geographical coordinates that correspond * to the specified pixel coordinates. * * @param {PointLike} point The pixel coordinates to unproject. * @returns {LngLat} The {@link LngLat} corresponding to `point`. * @example * map.on('click', function(e) { * // When the map is clicked, get the geographic coordinate. * var coordinate = map.unproject(e.point); * }); */ Map.prototype.unproject = function unproject (point ) { return this.transform.pointLocation(performance.Point.convert(point)); }; /** * Returns true if the map is panning, zooming, rotating, or pitching due to a camera animation or user gesture. * @returns {boolean} True if the map is moving. * @example * var isMoving = map.isMoving(); */ Map.prototype.isMoving = function isMoving () { return this._moving || this.handlers.isMoving(); }; /** * Returns true if the map is zooming due to a camera animation or user gesture. * @returns {boolean} True if the map is zooming. * @example * var isZooming = map.isZooming(); */ Map.prototype.isZooming = function isZooming () { return this._zooming || this.handlers.isZooming(); }; /** * Returns true if the map is rotating due to a camera animation or user gesture. * @returns {boolean} True if the map is rotating. * @example * map.isRotating(); */ Map.prototype.isRotating = function isRotating () { return this._rotating || this.handlers.isRotating(); }; Map.prototype._createDelegatedListener = function _createDelegatedListener (type , layerId , listener ) { var this$1 = this; var obj; if (type === "mouseenter" || type === "mouseover") { var mousein = false; var mousemove = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, { layers: [layerId] }) : []; if (!features.length) { mousein = false; } else if (!mousein) { mousein = true; listener.call( this$1, new MapMouseEvent(type, this$1, e.originalEvent, { features: features, }) ); } }; var mouseout = function () { mousein = false; }; return { layer: layerId, listener: listener, delegates: { mousemove: mousemove, mouseout: mouseout }, }; } else if (type === "mouseleave" || type === "mouseout") { var mousein$1 = false; var mousemove$1 = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, { layers: [layerId] }) : []; if (features.length) { mousein$1 = true; } else if (mousein$1) { mousein$1 = false; listener.call( this$1, new MapMouseEvent(type, this$1, e.originalEvent) ); } }; var mouseout$1 = function (e) { if (mousein$1) { mousein$1 = false; listener.call( this$1, new MapMouseEvent(type, this$1, e.originalEvent) ); } }; return { layer: layerId, listener: listener, delegates: { mousemove: mousemove$1, mouseout: mouseout$1 }, }; } else { var delegate = function (e) { var features = this$1.getLayer(layerId) ? this$1.queryRenderedFeatures(e.point, { layers: [layerId] }) : []; if (features.length) { // Here we need to mutate the original event, so that preventDefault works as expected. e.features = features; listener.call(this$1, e); delete e.features; } }; return { layer: layerId, listener: listener, delegates: ( obj = {}, obj[type] = delegate, obj ), }; } }; /** * Adds a listener for events of a specified type, optionally limited to features in a specified style layer. * * @param {string} type The event type to listen for. Events compatible with the optional `layerId` parameter are triggered * when the cursor enters a visible portion of the specified layer from outside that layer or outside the map canvas. * * | Event | Compatible with `layerId` | * |-----------------------------------------------------------|---------------------------| * | [`mousedown`](#map.event:mousedown) | yes | * | [`mouseup`](#map.event:mouseup) | yes | * | [`mouseover`](#map.event:mouseover) | yes | * | [`mouseout`](#map.event:mouseout) | yes | * | [`mousemove`](#map.event:mousemove) | yes | * | [`mouseenter`](#map.event:mouseenter) | yes (required) | * | [`mouseleave`](#map.event:mouseleave) | yes (required) | * | [`click`](#map.event:click) | yes | * | [`dblclick`](#map.event:dblclick) | yes | * | [`contextmenu`](#map.event:contextmenu) | yes | * | [`touchstart`](#map.event:touchstart) | yes | * | [`touchend`](#map.event:touchend) | yes | * | [`touchcancel`](#map.event:touchcancel) | yes | * | [`wheel`](#map.event:wheel) | | * | [`resize`](#map.event:resize) | | * | [`remove`](#map.event:remove) | | * | [`touchmove`](#map.event:touchmove) | | * | [`movestart`](#map.event:movestart) | | * | [`move`](#map.event:move) | | * | [`moveend`](#map.event:moveend) | | * | [`dragstart`](#map.event:dragstart) | | * | [`drag`](#map.event:drag) | | * | [`dragend`](#map.event:dragend) | | * | [`zoomstart`](#map.event:zoomstart) | | * | [`zoom`](#map.event:zoom) | | * | [`zoomend`](#map.event:zoomend) | | * | [`rotatestart`](#map.event:rotatestart) | | * | [`rotate`](#map.event:rotate) | | * | [`rotateend`](#map.event:rotateend) | | * | [`pitchstart`](#map.event:pitchstart) | | * | [`pitch`](#map.event:pitch) | | * | [`pitchend`](#map.event:pitchend) | | * | [`boxzoomstart`](#map.event:boxzoomstart) | | * | [`boxzoomend`](#map.event:boxzoomend) | | * | [`boxzoomcancel`](#map.event:boxzoomcancel) | | * | [`webglcontextlost`](#map.event:webglcontextlost) | | * | [`webglcontextrestored`](#map.event:webglcontextrestored) | | * | [`load`](#map.event:load) | | * | [`render`](#map.event:render) | | * | [`idle`](#map.event:idle) | | * | [`error`](#map.event:error) | | * | [`data`](#map.event:data) | | * | [`styledata`](#map.event:styledata) | | * | [`sourcedata`](#map.event:sourcedata) | | * | [`dataloading`](#map.event:dataloading) | | * | [`styledataloading`](#map.event:styledataloading) | | * | [`sourcedataloading`](#map.event:sourcedataloading) | | * | [`styleimagemissing`](#map.event:styleimagemissing) | | * * @param {string} layerId (optional) The ID of a style layer. Event will only be triggered if its location * is within a visible feature in this layer. The event will have a `features` property containing * an array of the matching features. If `layerId` is not supplied, the event will not have a `features` property. * Please note that many event types are not compatible with the optional `layerId` parameter. * @param {Function} listener The function to be called when the event is fired. * @returns {Map} `this` * @example * // Set an event listener that will fire * // when the map has finished loading * map.on('load', function() { * // Once the map has finished loading, * // add a new layer * map.addLayer({ * id: 'points-of-interest', * source: { * type: 'vector', * url: 'mapbox://mapbox.mapbox-streets-v8' * }, * 'source-layer': 'poi_label', * type: 'circle', * paint: { * // Mapbox Style Specification paint properties * }, * layout: { * // Mapbox Style Specification layout properties * } * }); * }); * @example * // Set an event listener that will fire * // when a feature on the countries layer of the map is clicked * map.on('click', 'countries', function(e) { * new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setHTML(`Country name: ${e.features[0].properties.name}`) * .addTo(map); * }); * @see [Display popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Center the map on a clicked symbol](https://docs.mapbox.com/mapbox-gl-js/example/center-on-symbol/) * @see [Create a hover effect](https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/) * @see [Create a draggable marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ Map.prototype.on = function on (type , layerId , listener ) { if (listener === undefined) { return Camera.prototype.on.call(this, type, layerId); } var delegatedListener = this._createDelegatedListener( type, layerId, listener ); this._delegatedListeners = this._delegatedListeners || {}; this._delegatedListeners[type] = this._delegatedListeners[type] || []; this._delegatedListeners[type].push(delegatedListener); for (var event in delegatedListener.delegates) { this.on((event ), delegatedListener.delegates[event]); } return this; }; /** * Adds a listener that will be called only once to a specified event type. * * @method * @name once * @memberof Map * @instance * @param {string} type The event type to add a listener for. * @param {Function} listener The function to be called when the event is fired. * The listener function is called with the data object passed to `fire`, * extended with `target` and `type` properties. * @returns {Map} `this` */ /** * Adds a listener that will be called only once to a specified event type occurring on features in a specified style layer. * * @param {string} type The event type to listen for; one of `'mousedown'`, `'mouseup'`, `'click'`, `'dblclick'`, * `'mousemove'`, `'mouseenter'`, `'mouseleave'`, `'mouseover'`, `'mouseout'`, `'contextmenu'`, `'touchstart'`, * `'touchend'`, or `'touchcancel'`. `mouseenter` and `mouseover` events are triggered when the cursor enters * a visible portion of the specified layer from outside that layer or outside the map canvas. `mouseleave` * and `mouseout` events are triggered when the cursor leaves a visible portion of the specified layer, or leaves * the map canvas. * @param {string} layerId The ID of a style layer. Only events whose location is within a visible * feature in this layer will trigger the listener. The event will have a `features` property containing * an array of the matching features. * @param {Function} listener The function to be called when the event is fired. * @returns {Map} `this` */ Map.prototype.once = function once (type , layerId , listener ) { if (listener === undefined) { return Camera.prototype.once.call(this, type, layerId); } var delegatedListener = this._createDelegatedListener( type, layerId, listener ); for (var event in delegatedListener.delegates) { this.once((event ), delegatedListener.delegates[event]); } return this; }; /** * Removes an event listener previously added with `Map#on`. * * @method * @name off * @memberof Map * @instance * @param {string} type The event type previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ /** * Removes an event listener for layer-specific events previously added with `Map#on`. * * @param {string} type The event type previously used to install the listener. * @param {string} layerId The layer ID previously used to install the listener. * @param {Function} listener The function previously installed as a listener. * @returns {Map} `this` */ Map.prototype.off = function off (type , layerId , listener ) { var this$1 = this; if (listener === undefined) { return Camera.prototype.off.call(this, type, layerId); } var removeDelegatedListener = function (delegatedListeners) { var listeners = delegatedListeners[type]; for (var i = 0; i < listeners.length; i++) { var delegatedListener = listeners[i]; if ( delegatedListener.layer === layerId && delegatedListener.listener === listener ) { for (var event in delegatedListener.delegates) { this$1.off( (event ), delegatedListener.delegates[event] ); } listeners.splice(i, 1); return this$1; } } }; if (this._delegatedListeners && this._delegatedListeners[type]) { removeDelegatedListener(this._delegatedListeners); } return this; }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2) * representing visible features that satisfy the query parameters. * * @param {PointLike|Array} [geometry] - The geometry of the query region: * either a single point or southwest and northeast points describing a bounding box. * Omitting this parameter (i.e. calling {@link Map#queryRenderedFeatures} with zero arguments, * or with only a `options` argument) is equivalent to passing a bounding box encompassing the entire * map viewport. * @param {Object} [options] Options object. * @param {Array} [options.layers] An array of [style layer IDs](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layer-id) for the query to inspect. * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked. * @param {Array} [options.filter] A [filter](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter) * to limit query results. * @param {boolean} [options.validate=true] Whether to check if the [options.filter] conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * * @returns {Array} An array of [GeoJSON](http://geojson.org/) * [feature objects](https://tools.ietf.org/html/rfc7946#section-3.2). * * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported). * * Each feature includes top-level `layer`, `source`, and `sourceLayer` properties. The `layer` property is an object * representing the style layer to which the feature belongs. Layout and paint properties in this object contain values * which are fully evaluated for the given zoom level and feature. * * Only features that are currently rendered are included. Some features will **not** be included, like: * * - Features from layers whose `visibility` property is `"none"`. * - Features from layers whose zoom range excludes the current zoom level. * - Symbol features that have been hidden due to text or icon collision. * * Features from all other layers are included, including features that may have no visible * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to * 0. * * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low * zoom levels) are returned only once (though subject to the following caveat). * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * * @example * // Find all features at a point * var features = map.queryRenderedFeatures( * [20, 35], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a static bounding box * var features = map.queryRenderedFeatures( * [[10, 20], [30, 50]], * { layers: ['my-layer-name'] } * ); * * @example * // Find all features within a bounding box around a point * var width = 10; * var height = 20; * var features = map.queryRenderedFeatures([ * [point.x - width / 2, point.y - height / 2], * [point.x + width / 2, point.y + height / 2] * ], { layers: ['my-layer-name'] }); * * @example * // Query all rendered features from a single layer * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] }); * @see [Get features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) */ Map.prototype.queryRenderedFeatures = function queryRenderedFeatures ( geometry , options ) { // The first parameter can be omitted entirely, making this effectively an overloaded method // with two signatures: // // queryRenderedFeatures(geometry: PointLike | [PointLike, PointLike], options?: Object) // queryRenderedFeatures(options?: Object) // // There no way to express that in a way that's compatible with both flow and documentation.js. // Related: https://github.com/facebook/flow/issues/1556 if (!this.style) { return []; } if ( options === undefined && geometry !== undefined && !(geometry instanceof performance.Point) && !Array.isArray(geometry) ) { options = (geometry ); geometry = undefined; } options = options || {}; geometry = geometry || [ [0, 0], [this.transform.width, this.transform.height] ]; var queryGeometry; if (geometry instanceof performance.Point || typeof geometry[0] === "number") { queryGeometry = [performance.Point.convert(geometry)]; } else { var tl = performance.Point.convert(geometry[0]); var br = performance.Point.convert(geometry[1]); queryGeometry = [ tl, new performance.Point(br.x, tl.y), br, new performance.Point(tl.x, br.y), tl ]; } return this.style.queryRenderedFeatures( queryGeometry, options, this.transform ); }; /** * Returns an array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2) * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters. * * @param {string} sourceId The ID of the vector tile or GeoJSON source to query. * @param {Object} [parameters] Options object. * @param {string} [parameters.sourceLayer] The name of the [source layer](https://docs.mapbox.com/help/glossary/source-layer/) * to query. *For vector tile sources, this parameter is required.* For GeoJSON sources, it is ignored. * @param {Array} [parameters.filter] A [filter](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter) * to limit query results. * @param {boolean} [parameters.validate=true] Whether to check if the [parameters.filter] conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * * @returns {Array} An array of [GeoJSON](http://geojson.org/) * [Feature objects](https://tools.ietf.org/html/rfc7946#section-3.2). * * In contrast to {@link Map#queryRenderedFeatures}, this function returns all features matching the query parameters, * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently * visible viewport. * * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple * tiles due to tile buffering. * * @example * // Find all features in one source layer in a vector source * var features = map.querySourceFeatures('your-source-id', { * sourceLayer: 'your-source-layer' * }); * * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) */ Map.prototype.querySourceFeatures = function querySourceFeatures ( sourceId , parameters ) { return this.style.querySourceFeatures(sourceId, parameters); }; /** * Updates the map's Mapbox style object with a new value. * * If a style is already set when this is used and options.diff is set to true, the map renderer will attempt to compare the given style * against the map's current state and perform only the changes necessary to make the map style match the desired state. Changes in sprites * (images used for icons and patterns) and glyphs (fonts for label text) **cannot** be diffed. If the sprites or fonts used in the current * style and the given style are different in any way, the map renderer will force a full update, removing the current style and building * the given one from scratch. * * * @param style A JSON object conforming to the schema described in the * [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON. * @param {Object} [options] Options object. * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style * and building the given one instead of attempting a diff-based update. * @param {string} [options.localIdeographFontFamily='sans-serif'] Defines a CSS * font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana' and 'Hangul Syllables' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). * Set to `false`, to enable font settings from the map's style for these glyph ranges. * Forces a full update. * @returns {Map} `this` * * @example * map.setStyle("mapbox://styles/mapbox/streets-v11"); * * @see [Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/) */ Map.prototype.setStyle = function setStyle ( style , options ) { options = performance.extend( {}, { localIdeographFontFamily: this._localIdeographFontFamily }, options ); if ( options.diff !== false && options.localIdeographFontFamily === this._localIdeographFontFamily && this.style && style ) { this._diffStyle(style, options); return this; } else { this._localIdeographFontFamily = options.localIdeographFontFamily; return this._updateStyle(style, options); } }; Map.prototype._getUIString = function _getUIString (key ) { var str = this._locale[key]; if (str == null) { throw new Error(("Missing UI string '" + key + "'")); } return str; }; Map.prototype._updateStyle = function _updateStyle ( style , options ) { if (this.style) { this.style.setEventedParent(null); this.style._remove(); } if (!style) { delete this.style; return this; } else { this.style = new Style(this, options || {}); } this.style.setEventedParent(this, { style: this.style }); if (typeof style === "string") { this.style.loadURL(style); } else { this.style.loadJSON(style); } return this; }; Map.prototype._lazyInitEmptyStyle = function _lazyInitEmptyStyle () { if (!this.style) { this.style = new Style(this, {}); this.style.setEventedParent(this, { style: this.style }); this.style.loadEmpty(); } }; Map.prototype._diffStyle = function _diffStyle ( style , options ) { var this$1 = this; if (typeof style === "string") { var url = this._requestManager.normalizeStyleURL(style); var request = this._requestManager.transformRequest( url, performance.ResourceType.Style ); performance.getJSON(request, function (error , json ) { if (error) { this$1.fire(new performance.ErrorEvent(error)); } else if (json) { this$1._updateDiff(json, options); } }); } else if (typeof style === "object") { this._updateDiff(style, options); } }; Map.prototype._updateDiff = function _updateDiff ( style , options ) { var vectorTileResources = style.sources; if (typeof style.sprite === "string") { var sprite = {}; for (var key in vectorTileResources) { sprite[key] = style.sprite; } style.sprite = sprite; } if (typeof style.glyphs === "string") { var glyphs = {}; for (var key$1 in vectorTileResources) { glyphs[key$1] = style.glyphs; } style.glyphs = glyphs; } try { if (this.style.setState(style)) { this._update(true); } } catch (e) { performance.warnOnce( ("Unable to perform style diff: " + (e.message || e.error || e) + ". Rebuilding the style from scratch.") ); this._updateStyle(style, options); } }; Map.prototype.addStyle = function addStyle ( style , before , minZoom , maxZoom ) { var this$1 = this; if (typeof style === "string") { this.fire(new performance.Event("dataloading", { dataType: "style" })); var request = this._requestManager.transformRequest( this._requestManager.normalizeStyleURL(style), performance.ResourceType.Style ); performance.getJSON(request, function (error , json ) { if (error) { this$1.fire(new performance.ErrorEvent(error)); } else if (json) { this$1._loadByAdd(json, before, minZoom, maxZoom); } }); } else { this._loadByAdd(JSON.parse(JSON.stringify(style)), before, minZoom, maxZoom); } }; Map.prototype._loadByAdd = function _loadByAdd (json, before, minZoom, maxZoom) { var this$1 = this; var vectorTileLayers = json.layers; var vectorTileResources = json.sources; var sprite = json.sprite || {}; var glyphs = json.glyphs || {}; for (var key in vectorTileResources) { this.addSource(key, vectorTileResources[key]); if (typeof sprite === "string") { this.style.addSprite(key, sprite); } else { sprite[key] && this.style.addSprite(key, sprite[key]); } if (typeof glyphs === "string") { this.style.addGlyphs(key, glyphs); } else { glyphs[key] && this.style.addGlyphs(key, glyphs[key]); } } vectorTileLayers.forEach(function (layer) { if (layer.type != "background") { this$1.addLayer(layer, before); if (!isNaN(minZoom) || !isNaN(maxZoom)) { this$1.setLayerZoomRange(layer.id, minZoom, maxZoom); } } }); }; /** * Returns the map's Mapbox [style](https://docs.mapbox.com/help/glossary/style/) object, a JSON object which can be used to recreate the map's style. * * @returns {Object} The map's style JSON object. * * @example * var styleJson = map.getStyle(); * */ Map.prototype.getStyle = function getStyle () { if (this.style) { return this.style.serialize(); } }; /** * Returns a Boolean indicating whether the map's style is fully loaded. * * @returns {boolean} A Boolean indicating whether the style is fully loaded. * * @example * var styleLoadStatus = map.isStyleLoaded(); */ Map.prototype.isStyleLoaded = function isStyleLoaded () { if (!this.style) { return performance.warnOnce("There is no style added to the map."); } return this.style.loaded(); }; /** * Adds a source to the map's style. * * @param {string} id The ID of the source to add. Must not conflict with existing sources. * @param {Object} source The source object, conforming to the * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or * {@link CanvasSourceOptions}. * @fires source.add * @returns {Map} `this` * @example * map.addSource('my-data', { * type: 'vector', * url: 'mapbox://myusername.tilesetid' * }); * @example * map.addSource('my-data', { * "type": "geojson", * "data": { * "type": "Feature", * "geometry": { * "type": "Point", * "coordinates": [-77.0323, 38.9131] * }, * "properties": { * "title": "Mapbox DC", * "marker-symbol": "monument" * } * } * }); * @see Vector source: [Show and hide layers](https://docs.mapbox.com/mapbox-gl-js/example/toggle-layers/) * @see GeoJSON source: [Add live realtime data](https://docs.mapbox.com/mapbox-gl-js/example/live-geojson/) * @see Raster DEM source: [Add hillshading](https://docs.mapbox.com/mapbox-gl-js/example/hillshade/) */ Map.prototype.addSource = function addSource (id , source ) { if ( this._mapCRS && "geojson" == source.type && source.data && !source.data.customprj ) { source.customprj = this.customConvertPoint; } this._lazyInitEmptyStyle(); this.style.addSource(id, source); return this._update(true); }; /** * Returns a Boolean indicating whether the source is loaded. Returns `true` if the source with * the given ID in the map's style has no outstanding network requests, otherwise `false`. * * @param {string} id The ID of the source to be checked. * @returns {boolean} A Boolean indicating whether the source is loaded. * @example * var sourceLoaded = map.isSourceLoaded('bathymetry-data'); */ Map.prototype.isSourceLoaded = function isSourceLoaded (id ) { var source = this.style && this.style.sourceCaches[id]; if (source === undefined) { this.fire( new performance.ErrorEvent(new Error(("There is no source with ID '" + id + "'"))) ); return; } return source.loaded(); }; /** * Returns a Boolean indicating whether all tiles in the viewport from all sources on * the style are loaded. * * @returns {boolean} A Boolean indicating whether all tiles are loaded. * @example * var tilesLoaded = map.areTilesLoaded(); */ Map.prototype.areTilesLoaded = function areTilesLoaded () { var sources = this.style && this.style.sourceCaches; for (var id in sources) { var source = sources[id]; var tiles = source._tiles; for (var t in tiles) { var tile = tiles[t]; if (!(tile.state === "loaded" || tile.state === "errored")) { return false; } } } return true; }; /** * Adds a [custom source type](#Custom Sources), making it available for use with * {@link Map#addSource}. * @private * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field. * @param {Function} SourceType A {@link Source} constructor. * @param {Function} callback Called when the source type is ready or with an error argument if there is an error. */ Map.prototype.addSourceType = function addSourceType (name , SourceType , callback ) { this._lazyInitEmptyStyle(); return this.style.addSourceType(name, SourceType, callback); }; /** * Removes a source from the map's style. * * @param {string} id The ID of the source to remove. * @returns {Map} `this` * @example * map.removeSource('bathymetry-data'); */ Map.prototype.removeSource = function removeSource (id ) { this.style.removeSource(id); return this._update(true); }; /** * Returns the source with the specified ID in the map's style. * * This method is often used to update a source using the instance members for the relevant * source type as defined in [Sources](#sources). * For example, setting the `data` for a GeoJSON source or updating the `url` and `coordinates` * of an image source. * * @param {string} id The ID of the source to get. * @returns {?Object} The style source with the specified ID or `undefined` if the ID * corresponds to no existing sources. * The shape of the object varies by source type. * A list of options for each source type is available on the Mapbox Style Specification's * [Sources](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/) page. * @example * var sourceObject = map.getSource('points'); * @see [Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Animate a point](https://docs.mapbox.com/mapbox-gl-js/example/animate-point-along-line/) * @see [Add live realtime data](https://docs.mapbox.com/mapbox-gl-js/example/live-geojson/) */ Map.prototype.getSource = function getSource (id ) { return this.style.getSource(id); }; // eslint-disable-next-line jsdoc/require-returns /** * Add an image to the style. This image can be displayed on the map like any other icon in the style's * [sprite](https://docs.mapbox.com/help/glossary/sprite/) using the image's ID with * [`icon-image`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image), * [`background-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-background-background-pattern), * [`fill-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern), * or [`line-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern). * A {@link Map.event:error} event will be fired if there is not enough space in the sprite to add this image. * * @param id The ID of the image. * @param image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. * @param options Options object. * @param options.pixelRatio The ratio of pixels in the image to physical pixels on the screen * @param options.sdf Whether the image should be interpreted as an SDF image * @param options.content `[x1, y1, x2, y2]` If `icon-text-fit` is used in a layer with this image, this option defines the part of the image that can be covered by the content in `text-field`. * @param options.stretchX `[[x1, x2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched horizontally. * @param options.stretchY `[[y1, y2], ...]` If `icon-text-fit` is used in a layer with this image, this option defines the part(s) of the image that can be stretched vertically. * * @example * // If the style's sprite does not already contain an image with ID 'cat', * // add the image 'cat-icon.png' to the style's sprite with the ID 'cat'. * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Cat_silhouette.svg/400px-Cat_silhouette.svg.png', function(error, image) { * if (error) throw error; * if (!map.hasImage('cat')) map.addImage('cat', image); * }); * * * // Add a stretchable image that can be used with `icon-text-fit` * // In this example, the image is 600px wide by 400px high. * map.loadImage('https://upload.wikimedia.org/wikipedia/commons/8/89/Black_and_White_Boxed_%28bordered%29.png', function(error, image) { * if (error) throw error; * if (!map.hasImage('border-image')) { * map.addImage('border-image', image, { * content: [16, 16, 300, 384], // place text over left half of image, avoiding the 16px border * stretchX: [[16, 584]], // stretch everything horizontally except the 16px border * stretchY: [[16, 384]], // stretch everything vertically except the 16px border * }); * } * }); * * * @see Use `HTMLImageElement`: [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) * @see Use `ImageData`: [Add a generated icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image-generated/) */ Map.prototype.addImage = function addImage ( id , image , ref ) { if ( ref === void 0 ) ref = {}; var pixelRatio = ref.pixelRatio; if ( pixelRatio === void 0 ) pixelRatio = 1; var sdf = ref.sdf; if ( sdf === void 0 ) sdf = false; var stretchX = ref.stretchX; var stretchY = ref.stretchY; var content = ref.content; this._lazyInitEmptyStyle(); var version = 0; if ( image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap) ) { var ref$1 = performance.browser.getImageData(image); var width = ref$1.width; var height = ref$1.height; var data = ref$1.data; this.style.addImage(id, { data: new performance.RGBAImage({ width: width, height: height }, data), pixelRatio: pixelRatio, stretchX: stretchX, stretchY: stretchY, content: content, sdf: sdf, version: version, }); } else if (image.width === undefined || image.height === undefined) { return this.fire( new performance.ErrorEvent( new Error( "Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, " + "or object with `width`, `height`, and `data` properties with the same format as `ImageData`" ) ) ); } else { var width$1 = image.width; var height$1 = image.height; var data$1 = image.data; var userImage = ((image ) ); this.style.addImage(id, { data: new performance.RGBAImage({ width: width$1, height: height$1 }, new Uint8Array(data$1)), pixelRatio: pixelRatio, stretchX: stretchX, stretchY: stretchY, content: content, sdf: sdf, version: version, userImage: userImage, }); if (userImage.onAdd) { userImage.onAdd(this, id); } } }; // eslint-disable-next-line jsdoc/require-returns /** * Update an existing image in a style. This image can be displayed on the map like any other icon in the style's * [sprite](https://docs.mapbox.com/help/glossary/sprite/) using the image's ID with * [`icon-image`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layout-symbol-icon-image), * [`background-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-background-background-pattern), * [`fill-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-fill-fill-pattern), * or [`line-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern). * * @param id The ID of the image. * @param image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. * * @example * // If an image with the ID 'cat' already exists in the style's sprite, * // replace that image with a new image, 'other-cat-icon.png'. * if (map.hasImage('cat')) map.updateImage('cat', './other-cat-icon.png'); */ Map.prototype.updateImage = function updateImage ( id , image ) { var existingImage = this.style.getImage(id); if (!existingImage) { return this.fire( new performance.ErrorEvent( new Error( "The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead." ) ) ); } var imageData = image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap) ? performance.browser.getImageData(image) : image; var width = imageData.width; var height = imageData.height; var data = imageData.data; if (width === undefined || height === undefined) { return this.fire( new performance.ErrorEvent( new Error( "Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, " + "or object with `width`, `height`, and `data` properties with the same format as `ImageData`" ) ) ); } if ( width !== existingImage.data.width || height !== existingImage.data.height ) { return this.fire( new performance.ErrorEvent( new Error( "The width and height of the updated image must be that same as the previous version of the image" ) ) ); } var copy = !( image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap) ); existingImage.data.replace(data, copy); this.style.updateImage(id, existingImage); }; /** * Check whether or not an image with a specific ID exists in the style. This checks both images * in the style's original [sprite](https://docs.mapbox.com/help/glossary/sprite/) and any images * that have been added at runtime using {@link Map#addImage}. * * @param id The ID of the image. * * @returns {boolean} A Boolean indicating whether the image exists. * @example * // Check if an image with the ID 'cat' exists in * // the style's sprite. * var catIconExists = map.hasImage('cat'); */ Map.prototype.hasImage = function hasImage (id ) { if (!id) { this.fire(new performance.ErrorEvent(new Error("Missing required image id"))); return false; } return !!this.style.getImage(id); }; /** * Remove an image from a style. This can be an image from the style's original * [sprite](https://docs.mapbox.com/help/glossary/sprite/) or any images * that have been added at runtime using {@link Map#addImage}. * * @param id The ID of the image. * * @example * // If an image with the ID 'cat' exists in * // the style's sprite, remove it. * if (map.hasImage('cat')) map.removeImage('cat'); */ Map.prototype.removeImage = function removeImage (id ) { this.style.removeImage(id); }; /** * Load an image from an external URL to be used with {@link Map#addImage}. External * domains must support [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS). * * @param {string} url The URL of the image file. Image file must be in png, webp, or jpg format. * @param {Function} callback Expecting `callback(error, data)`. Called when the image has loaded or with an error argument if there is an error. * * @example * // Load an image from an external URL. * map.loadImage('http://placekitten.com/50/50', function(error, image) { * if (error) throw error; * // Add the loaded image to the style's sprite with the ID 'kitten'. * map.addImage('kitten', image); * }); * * @see [Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) */ Map.prototype.loadImage = function loadImage (url , callback ) { performance.getImage( this._requestManager.transformRequest(url, performance.ResourceType.Image), callback ); }; /** * Returns an Array of strings containing the IDs of all images currently available in the map. * This includes both images from the style's original [sprite](https://docs.mapbox.com/help/glossary/sprite/) * and any images that have been added at runtime using {@link Map#addImage}. * * @returns {Array} An Array of strings containing the names of all sprites/images currently available in the map. * * @example * var allImages = map.listImages(); * */ Map.prototype.listImages = function listImages () { return this.style.listImages(); }; Map.prototype.listMarkers = function listMarkers () { return this._markersCache; }; /** * Adds a [Mapbox style layer](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers) * to the map's style. * * A layer defines how data from a specified source will be styled. Read more about layer types * and available paint and layout properties in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers). * * @param {Object | CustomLayerInterface} layer The layer to add, conforming to either the Mapbox Style Specification's [layer definition](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layers) or, less commonly, the {@link CustomLayerInterface} specification. * The Mapbox Style Specification's layer definition is appropriate for most layers. * * @param {string} layer.id A unique idenfier that you define. * @param {string} layer.type The type of layer (for example `fill` or `symbol`). * A list of layer types is available in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#type). * * (This can also be `custom`. For more information, see {@link CustomLayerInterface}.) * @param {string | Object} [layer.source] The data source for the layer. * Reference a source that has _already been defined_ using the source's unique id. * Reference a _new source_ using a source object (as defined in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/)) directly. * This is **required** for all `layer.type` options _except_ for `custom`. * @param {string} [layer.sourceLayer] (optional) The name of the [source layer](https://docs.mapbox.com/help/glossary/source-layer/) within the specified `layer.source` to use for this style layer. * This is only applicable for vector tile sources and is **required** when `layer.source` is of the type `vector`. * @param {array} [layer.filter] (optional) An expression specifying conditions on source features. * Only features that match the filter are displayed. * The Mapbox Style Specification includes more information on the limitations of the [`filter`](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter) parameter * and a complete list of available [expressions](https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/). * If no filter is provided, all features in the source (or source layer for vector tilesets) will be displayed. * @param {Object} [layer.paint] (optional) Paint properties for the layer. * Available paint properties vary by `layer.type`. * A full list of paint properties for each layer type is available in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/). * If no paint properties are specified, default values will be used. * @param {Object} [layer.layout] (optional) Layout properties for the layer. * Available layout properties vary by `layer.type`. * A full list of layout properties for each layer type is available in the [Mapbox Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/). * If no layout properties are specified, default values will be used. * @param {number} [layer.maxzoom] (optional) The maximum zoom level for the layer. * At zoom levels equal to or greater than the maxzoom, the layer will be hidden. * The value can be any number between `0` and `24` (inclusive). * If no maxzoom is provided, the layer will be visible at all zoom levels for which there are tiles available. * @param {number} [layer.minzoom] (optional) The minimum zoom level for the layer. * At zoom levels less than the minzoom, the layer will be hidden. * The value can be any number between `0` and `24` (inclusive). * If no minzoom is provided, the layer will be visible at all zoom levels for which there are tiles available. * @param {Object} [layer.metadata] (optional) Arbitrary properties useful to track with the layer, but do not influence rendering. * @param {string} [layer.renderingMode] This is only applicable for layers with the type `custom`. * See {@link CustomLayerInterface} for more information. * @param {string} [beforeId] The ID of an existing layer to insert the new layer before, * resulting in the new layer appearing visually beneath the existing layer. * If this argument is not specified, the layer will be appended to the end of the layers array * and appear visually above all other layers. * * @returns {Map} `this` * * @example * // Add a circle layer with a vector source * map.addLayer({ * id: 'points-of-interest', * source: { * type: 'vector', * url: 'mapbox://mapbox.mapbox-streets-v8' * }, * 'source-layer': 'poi_label', * type: 'circle', * paint: { * // Mapbox Style Specification paint properties * }, * layout: { * // Mapbox Style Specification layout properties * } * }); * * @example * // Define a source before using it to create a new layer * map.addSource('state-data', { * type: 'geojson', * data: 'path/to/data.geojson' * }); * * map.addLayer({ * id: 'states', * // References the GeoJSON source defined above * // and does not require a `source-layer` * source: 'state-data', * type: 'symbol', * layout: { * // Set the label content to the * // feature's `name` property * text-field: ['get', 'name'] * } * }); * * @example * // Add a new symbol layer before an existing layer * map.addLayer({ * id: 'states', * // References a source that's already been defined * source: 'state-data', * type: 'symbol', * layout: { * // Set the label content to the * // feature's `name` property * text-field: ['get', 'name'] * } * // Add the layer before the existing `cities` layer * }, 'cities'); * * @see [Create and style clusters](https://docs.mapbox.com/mapbox-gl-js/example/cluster/) * @see [Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/) * @see [Add a WMS source](https://docs.mapbox.com/mapbox-gl-js/example/wms/) */ Map.prototype.addLayer = function addLayer ( layer , beforeId ) { if ( typeof layer.source === "object" && this._mapCRS && layer.source && layer.source.type == "geojson" && layer.source.data && !layer.source.data.customprj ) { layer.source.customprj = this.customConvertPoint; } this._lazyInitEmptyStyle(); this.style.addLayer(layer, beforeId); return this._update(true); }; /** * Moves a layer to a different z-position. * * @param {string} id The ID of the layer to move. * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. When viewing the map, the `id` layer will appear beneath the `beforeId` layer. If `beforeId` is omitted, the layer will be appended to the end of the layers array and appear above all other layers on the map. * @returns {Map} `this` * * @example * // Move a layer with ID 'polygon' before the layer with ID 'country-label'. The `polygon` layer will appear beneath the `country-label` layer on the map. * map.moveLayer('polygon', 'country-label'); */ Map.prototype.moveLayer = function moveLayer (id , beforeId ) { this.style.moveLayer(id, beforeId); return this._update(true); }; // eslint-disable-next-line jsdoc/require-returns /** * Removes the layer with the given ID from the map's style. * * If no such layer exists, an `error` event is fired. * * @param {string} id id of the layer to remove * @fires error * * @example * // If a layer with ID 'state-data' exists, remove it. * if (map.getLayer('state-data')) map.removeLayer('state-data'); */ Map.prototype.removeLayer = function removeLayer (id ) { this.style.removeLayer(id); return this._update(true); }; /** * Returns the layer with the specified ID in the map's style. * * @param {string} id The ID of the layer to get. * @returns {?Object} The layer with the specified ID, or `undefined` * if the ID corresponds to no existing layers. * * @example * var stateDataLayer = map.getLayer('state-data'); * * @see [Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/) * @see [Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/) */ Map.prototype.getLayer = function getLayer (id ) { return this.style.getLayer(id); }; /** * Sets the zoom extent for the specified style layer. The zoom extent includes the * [minimum zoom level](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layer-minzoom) * and [maximum zoom level](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layer-maxzoom)) * at which the layer will be rendered. * * Note: For style layers using vector sources, style layers cannot be rendered at zoom levels lower than the * minimum zoom level of the _source layer_ because the data does not exist at those zoom levels. If the minimum * zoom level of the source layer is higher than the minimum zoom level defined in the style layer, the style * layer will not be rendered at all zoom levels in the zoom range. * * @param {string} layerId The ID of the layer to which the zoom extent will be applied. * @param {number} minzoom The minimum zoom to set (0-24). * @param {number} maxzoom The maximum zoom to set (0-24). * @returns {Map} `this` * * @example * map.setLayerZoomRange('my-layer', 2, 5); * */ Map.prototype.setLayerZoomRange = function setLayerZoomRange (layerId , minzoom , maxzoom ) { this.style.setLayerZoomRange(layerId, minzoom, maxzoom); return this._update(true); }; /** * Sets the filter for the specified style layer. * * Filters control which features a style layer renders from its source. * Any feature for which the filter expression evaluates to `true` will be * rendered on the map. Those that are false will be hidden. * * Use `setFilter` to show a subset of your source data. * * To clear the filter, pass `null` or `undefined` as the second parameter. * * @param {string} layerId The ID of the layer to which the filter will be applied. * @param {Array | null | undefined} filter The filter, conforming to the Mapbox Style Specification's * [filter definition](https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#filter). If `null` or `undefined` is provided, the function removes any existing filter from the layer. * @param {Object} [options] Options object. * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} `this` * * @example * // display only features with the 'name' property 'USA' * map.setFilter('my-layer', ['==', ['get', 'name'], 'USA']); * @example * // display only features with five or more 'available-spots' * map.setFilter('bike-docks', ['>=', ['get', 'available-spots'], 5]); * @example * // remove the filter for the 'bike-docks' style layer * map.setFilter('bike-docks', null); * * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) * @see Tutorial: [Show changes over time](https://docs.mapbox.com/help/tutorials/show-changes-over-time/) */ Map.prototype.setFilter = function setFilter ( layerId , filter , options ) { if ( options === void 0 ) options = {}; this.style.setFilter(layerId, filter, options); return this._update(true); }; /** * Returns the filter applied to the specified style layer. * * @param {string} layerId The ID of the style layer whose filter to get. * @returns {Array} The layer's filter. */ Map.prototype.getFilter = function getFilter (layerId ) { return this.style.getFilter(layerId); }; /** * Sets the value of a paint property in the specified style layer. * * @param {string} layerId The ID of the layer to set the paint property in. * @param {string} name The name of the paint property to set. * @param {*} value The value of the paint property to set. * Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @param {Object} [options] Options object. * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} `this` * @example * map.setPaintProperty('my-layer', 'fill-color', '#faafee'); * @see [Change a layer's color with buttons](https://www.mapbox.com/mapbox-gl-js/example/color-switcher/) * @see [Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/) * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ Map.prototype.setPaintProperty = function setPaintProperty ( layerId , name , value , options ) { if ( options === void 0 ) options = {}; this.style.setPaintProperty(layerId, name, value, options); return this._update(true); }; /** * Returns the value of a paint property in the specified style layer. * * @param {string} layerId The ID of the layer to get the paint property from. * @param {string} name The name of a paint property to get. * @returns {*} The value of the specified paint property. */ Map.prototype.getPaintProperty = function getPaintProperty (layerId , name ) { return this.style.getPaintProperty(layerId, name); }; /** * Sets the value of a layout property in the specified style layer. * * @param {string} layerId The ID of the layer to set the layout property in. * @param {string} name The name of the layout property to set. * @param {*} value The value of the layout property. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). * @param {Object} [options] Options object. * @param {boolean} [options.validate=true] Whether to check if `value` conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} `this` * @example * map.setLayoutProperty('my-layer', 'visibility', 'none'); * @see [Show and hide layers](https://docs.mapbox.com/mapbox-gl-js/example/toggle-layers/) */ Map.prototype.setLayoutProperty = function setLayoutProperty ( layerId , name , value , options ) { if ( options === void 0 ) options = {}; this.style.setLayoutProperty(layerId, name, value, options); return this._update(true); }; /** * Returns the value of a layout property in the specified style layer. * * @param {string} layerId The ID of the layer to get the layout property from. * @param {string} name The name of the layout property to get. * @returns {*} The value of the specified layout property. */ Map.prototype.getLayoutProperty = function getLayoutProperty (layerId , name ) { return this.style.getLayoutProperty(layerId, name); }; /** * Sets the any combination of light values. * * @param light Light properties to set. Must conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#light). * @param {Object} [options] Options object. * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} `this` * @example * var layerVisibility = map.getLayoutProperty('my-layer', 'visibility'); * @see [Show and hide layers](https://docs.mapbox.com/mapbox-gl-js/example/toggle-layers/) */ Map.prototype.setLight = function setLight (light , options) { if ( options === void 0 ) options = {}; this._lazyInitEmptyStyle(); this.style.setLight(light, options); return this._update(true); }; /** * Returns the value of the light object. * * @returns {Object} light Light properties of the style. */ Map.prototype.getLight = function getLight () { return this.style.getLight(); }; // eslint-disable-next-line jsdoc/require-returns /** * Sets the `state` of a feature. * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime. * When using this method, the `state` object is merged with any existing key-value pairs in the feature's state. * Features are identified by their `feature.id` attribute, which can be any number or string. * * This method can only be used with sources that have a `feature.id` attribute. The `feature.id` attribute can be defined in three ways: * - For vector or GeoJSON sources, including an `id` attribute in the original data file. * - For vector or GeoJSON sources, using the [`promoteId`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector-promoteId) option at the time the source is defined. * - For GeoJSON sources, using the [`generateId`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#geojson-generateId) option to auto-assign an `id` based on the feature's index in the source data. If you change feature data using `map.getSource('some id').setData(..)`, you may need to re-apply state taking into account updated `id` values. * * _Note: You can use the [`feature-state` expression](https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#feature-state) to access the values in a feature's state object for the purposes of styling._ * * @param {Object} feature Feature identifier. Feature objects returned from * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} feature.id Unique id of the feature. * @param {string} feature.source The id of the vector or GeoJSON source for the feature. * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.* * @param {Object} state A set of key-value pairs. The values should be valid JSON types. * * @example * // When the mouse moves over the `my-layer` layer, update * // the feature state for the feature under the mouse * map.on('mousemove', 'my-layer', function(e) { * if (e.features.length > 0) { * map.setFeatureState({ * source: 'my-source', * sourceLayer: 'my-source-layer', * id: e.features[0].id, * }, { * hover: true * }); * } * }); * * @see [Create a hover effect](https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/) * @see Tutorial: [Create interactive hover effects with Mapbox GL JS](https://docs.mapbox.com/help/tutorials/create-interactive-hover-effects-with-mapbox-gl-js/) */ Map.prototype.setFeatureState = function setFeatureState ( feature , state ) { this.style.setFeatureState(feature, state); return this._update(); }; // eslint-disable-next-line jsdoc/require-returns /** * Removes the `state` of a feature, setting it back to the default behavior. * If only a `target.source` is specified, it will remove the state for all features from that source. * If `target.id` is also specified, it will remove all keys for that feature's state. * If `key` is also specified, it removes only that key from that feature's state. * Features are identified by their `feature.id` attribute, which can be any number or string. * * @param {Object} target Identifier of where to remove state. It can be a source, a feature, or a specific key of feature. * Feature objects returned from {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} target.id (optional) Unique id of the feature. Optional if key is not specified. * @param {string} target.source The id of the vector or GeoJSON source for the feature. * @param {string} [target.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.* * @param {string} key (optional) The key in the feature state to reset. * * @example * // Reset the entire state object for all features * // in the `my-source` source * map.removeFeatureState({ * source: 'my-source' * }); * * @example * // When the mouse leaves the `my-layer` layer, * // reset the entire state object for the * // feature under the mouse * map.on('mouseleave', 'my-layer', function(e) { * map.removeFeatureState({ * source: 'my-source', * sourceLayer: 'my-source-layer', * id: e.features[0].id * }); * }); * * @example * // When the mouse leaves the `my-layer` layer, * // reset only the `hover` key-value pair in the * // state for the feature under the mouse * map.on('mouseleave', 'my-layer', function(e) { * map.removeFeatureState({ * source: 'my-source', * sourceLayer: 'my-source-layer', * id: e.features[0].id * }, 'hover'); * }); * */ Map.prototype.removeFeatureState = function removeFeatureState ( target , key ) { this.style.removeFeatureState(target, key); return this._update(); }; /** * Gets the `state` of a feature. * A feature's `state` is a set of user-defined key-value pairs that are assigned to a feature at runtime. * Features are identified by their `feature.id` attribute, which can be any number or string. * * _Note: To access the values in a feature's state object for the purposes of styling the feature, use the [`feature-state` expression](https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#feature-state)._ * * @param {Object} feature Feature identifier. Feature objects returned from * {@link Map#queryRenderedFeatures} or event handlers can be used as feature identifiers. * @param {string | number} feature.id Unique id of the feature. * @param {string} feature.source The id of the vector or GeoJSON source for the feature. * @param {string} [feature.sourceLayer] (optional) *For vector tile sources, `sourceLayer` is required.* * * @returns {Object} The state of the feature: a set of key-value pairs that was assigned to the feature at runtime. * * @example * // When the mouse moves over the `my-layer` layer, * // get the feature state for the feature under the mouse * map.on('mousemove', 'my-layer', function(e) { * if (e.features.length > 0) { * map.getFeatureState({ * source: 'my-source', * sourceLayer: 'my-source-layer' * id: e.features[0].id * }); * } * }); * */ Map.prototype.getFeatureState = function getFeatureState (feature ) { return this.style.getFeatureState(feature); }; /** * Returns the map's containing HTML element. * * @returns {HTMLElement} The map's container. */ Map.prototype.getContainer = function getContainer () { return this._container; }; /** * Returns the HTML element containing the map's `` element. * * If you want to add non-GL overlays to the map, you should append them to this element. * * This is the element to which event bindings for map interactivity (such as panning and zooming) are * attached. It will receive bubbled events from child elements such as the ``, but not from * map controls. * * @returns {HTMLElement} The container of the map's ``. * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) */ Map.prototype.getCanvasContainer = function getCanvasContainer () { return this._canvasContainer; }; /** * Returns the map's `` element. * * @returns {HTMLCanvasElement} The map's `` element. * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ Map.prototype.getCanvas = function getCanvas () { return this._canvas; }; Map.prototype._containerDimensions = function _containerDimensions () { var width = 0; var height = 0; if (this._container) { width = this._container.clientWidth || 400; height = this._container.clientHeight || 300; } return [width, height]; }; Map.prototype._detectMissingCSS = function _detectMissingCSS () { var computedColor = performance.window .getComputedStyle(this._missingCSSCanary) .getPropertyValue("background-color"); if (computedColor !== "rgb(250, 128, 114)") { performance.warnOnce( "This page appears to be missing CSS declarations for " + "Mapbox GL JS, which may cause the map to display incorrectly. " + "Please ensure your page includes mapbox-gl.css, as described " + "in https://www.mapbox.com/mapbox-gl-js/api/." ); } }; Map.prototype._setupContainer = function _setupContainer () { var container = this._container; container.classList.add("mapboxgl-map"); var missingCSSCanary = (this._missingCSSCanary = DOM.create( "div", "mapboxgl-canary", container )); missingCSSCanary.style.visibility = "hidden"; this._detectMissingCSS(); var canvasContainer = (this._canvasContainer = DOM.create( "div", "mapboxgl-canvas-container", container )); if (this._interactive) { canvasContainer.classList.add("mapboxgl-interactive"); } this._canvas = DOM.create("canvas", "mapboxgl-canvas", canvasContainer); this._canvas.addEventListener( "webglcontextlost", this._contextLost, false ); this._canvas.addEventListener( "webglcontextrestored", this._contextRestored, false ); this._canvas.setAttribute("tabindex", "0"); this._canvas.setAttribute("aria-label", "Map"); var dimensions = this._containerDimensions(); this._resizeCanvas(dimensions[0], dimensions[1]); var controlContainer = (this._controlContainer = DOM.create( "div", "mapboxgl-control-container", container )); var positions = (this._controlPositions = {}); ["top-left", "top-right", "bottom-left", "bottom-right"].forEach( function (positionName) { positions[positionName] = DOM.create( "div", ("mapboxgl-ctrl-" + positionName), controlContainer ); } ); }; Map.prototype._resizeCanvas = function _resizeCanvas (width , height ) { var pixelRatio = performance.browser.devicePixelRatio || 1; // Request the required canvas size taking the pixelratio into account. this._canvas.width = pixelRatio * width; this._canvas.height = pixelRatio * height; // Maintain the same canvas size, potentially downscaling it for HiDPI displays this._canvas.style.width = width + "px"; this._canvas.style.height = height + "px"; }; Map.prototype._setupPainter = function _setupPainter () { var attributes = performance.extend({}, mapboxGlSupported.webGLContextAttributes, { failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat, preserveDrawingBuffer: this._preserveDrawingBuffer, antialias: this._antialias || false, }); var gl = this._canvas.getContext("webgl", attributes) || this._canvas.getContext("experimental-webgl", attributes); if (!gl) { this.fire(new performance.ErrorEvent(new Error("Failed to initialize WebGL"))); return; } this.painter = new Painter(gl, this.transform); performance.webpSupported.testSupport(gl); }; Map.prototype._contextLost = function _contextLost (event ) { event.preventDefault(); if (this._frame) { this._frame.cancel(); this._frame = null; } this.fire(new performance.Event("webglcontextlost", { originalEvent: event })); }; Map.prototype._contextRestored = function _contextRestored (event ) { this._setupPainter(); this.resize(); this._update(); this.fire(new performance.Event("webglcontextrestored", { originalEvent: event })); }; /** * Returns a Boolean indicating whether the map is fully loaded. * * Returns `false` if the style is not yet fully loaded, * or if there has been a change to the sources or style that * has not yet fully loaded. * * @returns {boolean} A Boolean indicating whether the map is fully loaded. */ Map.prototype.loaded = function loaded () { return ( !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded() ); }; /** * Update this map's style and sources, and re-render the map. * * @param {boolean} updateStyle mark the map's style for reprocessing as * well as its sources * @returns {Map} this * @private */ Map.prototype._update = function _update (updateStyle ) { if (!this.style) { return this; } this._styleDirty = this._styleDirty || updateStyle; this._sourcesDirty = true; this.triggerRepaint(); return this; }; /** * Request that the given callback be executed during the next render * frame. Schedule a render frame if one is not already scheduled. * @returns An id that can be used to cancel the callback * @private */ Map.prototype._requestRenderFrame = function _requestRenderFrame (callback ) { this._update(); return this._renderTaskQueue.add(callback); }; Map.prototype._cancelRenderFrame = function _cancelRenderFrame (id ) { this._renderTaskQueue.remove(id); }; /** * Call when a (re-)render of the map is required: * - The style has changed (`setPaintProperty()`, etc.) * - Source data has changed (e.g. tiles have finished loading) * - The map has is moving (or just finished moving) * - A transition is in progress * * @param {number} paintStartTimeStamp The time when the animation frame began executing. * * @returns {Map} this * @private */ Map.prototype._render = function _render (paintStartTimeStamp ) { var this$1 = this; var gpuTimer, frameStartTime = 0; var extTimerQuery = this.painter.context.extTimerQuery; if (this.listens("gpu-timing-frame")) { gpuTimer = extTimerQuery.createQueryEXT(); extTimerQuery.beginQueryEXT( extTimerQuery.TIME_ELAPSED_EXT, gpuTimer ); frameStartTime = performance.browser.now(); } // A custom layer may have used the context asynchronously. Mark the state as dirty. this.painter.context.setDirty(); this.painter.setBaseState(); this._renderTaskQueue.run(paintStartTimeStamp); // A task queue callback may have fired a user event which may have removed the map if (this._removed) { return; } var crossFading = false; // If the style has changed, the map is being zoomed, or a transition or fade is in progress: // - Apply style changes (in a batch) // - Recalculate paint properties. if (this.style && this._styleDirty) { this._styleDirty = false; var zoom = this.transform.zoom; var now = performance.browser.now(); this.style.zoomHistory.update(zoom, now); var parameters = new performance.EvaluationParameters(zoom, { now: now, fadeDuration: this._fadeDuration, zoomHistory: this.style.zoomHistory, transition: this.style.getTransition(), }); var factor = parameters.crossFadingFactor(); if (factor !== 1 || factor !== this._crossFadingFactor) { crossFading = true; this._crossFadingFactor = factor; } this.style.update(parameters); } // If we are in _render for any reason other than an in-progress paint // transition, update source caches to check for and load any tiles we // need for the current transform if (this.style && this._sourcesDirty) { this._sourcesDirty = false; this.style._updateSources(this.transform); } this._placementDirty = this.style && this.style._updatePlacement( this.painter.transform, this.showCollisionBoxes, this._fadeDuration, this._crossSourceCollisions ); // Actually draw this.painter.render(this.style, { showTileBoundaries: this.showTileBoundaries, showOverdrawInspector: this._showOverdrawInspector, rotating: this.isRotating(), zooming: this.isZooming(), moving: this.isMoving(), fadeDuration: this._fadeDuration, showPadding: this.showPadding, gpuTiming: !!this.listens("gpu-timing-layer"), }); this.fire(new performance.Event("render")); if (this.loaded() && !this._loaded) { this._loaded = true; performance.PerformanceUtils.mark(performance.PerformanceMarkers.load); this.fire(new performance.Event("load")); } if (this.style && (this.style.hasTransitions() || crossFading)) { this._styleDirty = true; } if (this.style && !this._placementDirty) { // Since no fade operations are in progress, we can release // all tiles held for fading. If we didn't do this, the tiles // would just sit in the SourceCaches until the next render this.style._releaseSymbolFadeTiles(); } if (this.listens("gpu-timing-frame")) { var renderCPUTime = performance.browser.now() - frameStartTime; extTimerQuery.endQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer); setTimeout(function () { var renderGPUTime = extTimerQuery.getQueryObjectEXT( gpuTimer, extTimerQuery.QUERY_RESULT_EXT ) / (1000 * 1000); extTimerQuery.deleteQueryEXT(gpuTimer); this$1.fire( new performance.Event("gpu-timing-frame", { cpuTime: renderCPUTime, gpuTime: renderGPUTime, }) ); }, 50); // Wait 50ms to give time for all GPU calls to finish before querying } if (this.listens("gpu-timing-layer")) { // Resetting the Painter's per-layer timing queries here allows us to isolate // the queries to individual frames. var frameLayerQueries = this.painter.collectGpuTimers(); setTimeout(function () { var renderedLayerTimes = this$1.painter.queryGpuTimers( frameLayerQueries ); this$1.fire( new performance.Event("gpu-timing-layer", { layerTimes: renderedLayerTimes, }) ); }, 50); // Wait 50ms to give time for all GPU calls to finish before querying } // Schedule another render frame if it's needed. // // Even though `_styleDirty` and `_sourcesDirty` are reset in this // method, synchronous events fired during Style#update or // Style#_updateSources could have caused them to be set again. var somethingDirty = this._sourcesDirty || this._styleDirty || this._placementDirty; if (somethingDirty || this._repaint) { this.triggerRepaint(); } else if (!this.isMoving() && this.loaded()) { this.fire(new performance.Event("idle")); } if (this._loaded && !this._fullyLoaded && !somethingDirty) { this._fullyLoaded = true; performance.PerformanceUtils.mark(performance.PerformanceMarkers.fullLoad); } return this; }; /** * Clean up and release all internal resources associated with this map. * * This includes DOM elements, event bindings, web workers, and WebGL resources. * * Use this method when you are done using the map and wish to ensure that it no * longer consumes browser resources. Afterwards, you must not call any other * methods on the map. */ Map.prototype.remove = function remove () { if (this._hash) { this._hash.remove(); } for (var i = 0, list = this._controls; i < list.length; i += 1) { var control = list[i]; control.onRemove(this); } this._controls = []; this._markersCache = []; if (this._frame) { this._frame.cancel(); this._frame = null; } this._renderTaskQueue.clear(); this.painter.destroy(); this.handlers.destroy(); delete this.handlers; this.setStyle(null); if (typeof performance.window !== "undefined") { performance.window.removeEventListener("resize", this._onWindowResize, false); performance.window.removeEventListener( "orientationchange", this._onWindowResize, false ); performance.window.removeEventListener("online", this._onWindowOnline, false); } var extension = this.painter.context.gl.getExtension( "WEBGL_lose_context" ); if (extension) { extension.loseContext(); } removeNode(this._canvasContainer); removeNode(this._controlContainer); removeNode(this._missingCSSCanary); this._container.classList.remove("mapboxgl-map"); performance.PerformanceUtils.clearMetrics(); this._removed = true; this.fire(new performance.Event("remove")); }; /** * Trigger the rendering of a single frame. Use this method with custom layers to * repaint the map when the layer changes. Calling this multiple times before the * next frame is rendered will still result in only a single frame being rendered. * @example * map.triggerRepaint(); * @see [Add a 3D model](https://docs.mapbox.com/mapbox-gl-js/example/add-3d-model/) * @see [Add an animated icon to the map](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/) */ Map.prototype.triggerRepaint = function triggerRepaint () { var this$1 = this; if (this.style && !this._frame) { this._frame = performance.browser.frame(function (paintStartTimeStamp ) { performance.PerformanceUtils.frame(paintStartTimeStamp); this$1._frame = null; this$1._render(paintStartTimeStamp); }); } }; Map.prototype._onWindowOnline = function _onWindowOnline () { this._update(); }; Map.prototype._onWindowResize = function _onWindowResize (event ) { if (this._trackResize) { this.resize({ originalEvent: event })._update(); } }; /** * Gets and sets a Boolean indicating whether the map will render an outline * around each tile and the tile ID. These tile boundaries are useful for * debugging. * * The uncompressed file size of the first vector source is drawn in the top left * corner of each tile, next to the tile ID. * * @name showTileBoundaries * @type {boolean} * @instance * @memberof Map * @example * map.showTileBoundaries = true; */ prototypeAccessors.showTileBoundaries.get = function () { return !!this._showTileBoundaries; }; prototypeAccessors.showTileBoundaries.set = function (value ) { if (this._showTileBoundaries === value) { return; } this._showTileBoundaries = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will visualize * the padding offsets. * * @name showPadding * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showPadding.get = function () { return !!this._showPadding; }; prototypeAccessors.showPadding.set = function (value ) { if (this._showPadding === value) { return; } this._showPadding = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will render boxes * around all symbols in the data source, revealing which symbols * were rendered or which were hidden due to collisions. * This information is useful for debugging. * * @name showCollisionBoxes * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showCollisionBoxes.get = function () { return !!this._showCollisionBoxes; }; prototypeAccessors.showCollisionBoxes.set = function (value ) { if (this._showCollisionBoxes === value) { return; } this._showCollisionBoxes = value; if (value) { // When we turn collision boxes on we have to generate them for existing tiles // When we turn them off, there's no cost to leaving existing boxes in place this.style._generateCollisionBoxes(); } else { // Otherwise, call an update to remove collision boxes this._update(); } }; /* * Gets and sets a Boolean indicating whether the map should color-code * each fragment to show how many times it has been shaded. * White fragments have been shaded 8 or more times. * Black fragments have been shaded 0 times. * This information is useful for debugging. * * @name showOverdraw * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.showOverdrawInspector.get = function () { return !!this._showOverdrawInspector; }; prototypeAccessors.showOverdrawInspector.set = function (value ) { if (this._showOverdrawInspector === value) { return; } this._showOverdrawInspector = value; this._update(); }; /** * Gets and sets a Boolean indicating whether the map will * continuously repaint. This information is useful for analyzing performance. * * @name repaint * @type {boolean} * @instance * @memberof Map */ prototypeAccessors.repaint.get = function () { return !!this._repaint; }; prototypeAccessors.repaint.set = function (value ) { if (this._repaint !== value) { this._repaint = value; this.triggerRepaint(); } }; // show vertices prototypeAccessors.vertices.get = function () { return !!this._vertices; }; prototypeAccessors.vertices.set = function (value ) { this._vertices = value; this._update(); }; // for cache browser tests Map.prototype._setCacheLimits = function _setCacheLimits (limit , checkThreshold ) { performance.setCacheLimits(limit, checkThreshold); }; Map.prototype.setCRS = function setCRS (crs) { this.crs = this.toCRS(crs); this.initCRS(this.crs); var sourceCaches = this.style && this.style.sourceCaches; if (sourceCaches) { for (var id in sourceCaches) { var source = sourceCaches[id]._source; if (this._mapCRS && "geojson" == source.type) { this.style .getSource(id) .setCustomprj(this.customConvertPoint); } } } this._sourcesDirty = true; this._canvas && this.resize(); this._update(true); }; Map.prototype.initCRS = function initCRS (crs) { this._mapCRS = crs; this.transform.setCRS(crs); this._tileExtent = crs.getExtent(); var width = this._tileExtent[2] - this._tileExtent[0]; var height = this._tileExtent[3] - this._tileExtent[1]; var centerX = (this._tileExtent[2] + this._tileExtent[0]) / 2; var centerY = (this._tileExtent[3] + this._tileExtent[1]) / 2; var originX = this._tileExtent[0]; var originY = this._tileExtent[3]; performance.Feature.yLat = function (y, worldSize) { return originY - (y * height) / worldSize; }; performance.Feature.toLngLat = function (x, y) { var forward = crs.toWGS84([x * width + originX, originY - (y * height)]); return forward; }; this.mercatorZfromAltitude = performance.mercatorZfromAltitude; this.updateTransformByCRS( crs.getUnit(), originX, originY, centerX, centerY, width, height ); }; Map.prototype.updateTransformByCRS = function updateTransformByCRS (units, originX, originY, centerX, centerY, width, height) { this.transform.units = units; var customConvertPointObj = { toLngLat: function toLngLat(x, y, proj4Projection) { var forward = proj4Projection.inverse([x * "__width" + "__originX", "__originY" - y * "__height"]); return forward; }, projectXY: function projectXY(x, y, proj4Projection) { var forward = proj4Projection.forward([x, y]); return [(forward[0] - "__originX") / "__width", ("__originY" - forward[1]) / "__height"]; }, projectX: function projectX(x) { return (x - "__centerX") / "__width" + 0.5; }, projectY: function projectY(y) { y = 0.5 - ((y - "__centerY") / "__height"); return y < 0 ? 0 : y > 1 ? 1 : y; }, toY: function toY(y) { return (0.5 - y) * "__height" + "__centerY"; } }; function toString(obj, objName, param) { var value = ''; for (var key in obj) { if (Object.hasOwnProperty.call(obj, key)) { var element = obj[key]; value += key + ":" + element + ","; } } for (var key$1 in param) { if (Object.hasOwnProperty.call(param, key$1)) { var element$1 = "(" + (param[key$1]) + ")"; value = value.replace(new RegExp(("\"" + key$1 + "\""), 'g'), element$1); } } return (objName + "={" + value + "}"); } var str = toString(customConvertPointObj, 'customConvertPoint', { __width:width, __height:height, __centerX:centerX, __centerY:centerY, __originY:originY, __originX:originX }); this.customConvertPoint = performance.window.URL.createObjectURL( new Blob( [str], { type: 'text/javascript' } ) ); }; /** * The version of Mapbox GL JS in use as specified in package.json, CHANGELOG.md, and the GitHub release. * * @name version * @instance * @memberof Map * @var {string} version */ prototypeAccessors.version.get = function () { return performance.version; }; Object.defineProperties( Map.prototype, prototypeAccessors ); return Map; }(Camera)); function removeNode(node) { if (node.parentNode) { node.parentNode.removeChild(node); } } /** * Interface for interactive controls added to the map. This is a * specification for implementers to model: it is not * an exported method or class. * * Controls must implement `onAdd` and `onRemove`, and must own an * element, which is often a `div` element. To use Mapbox GL JS's * default control styling, add the `mapboxgl-ctrl` class to your control's * node. * * @interface IControl * @example * // Control implemented as ES6 class * class HelloWorldControl { * onAdd(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * } * * onRemove() { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * } * } * * // Control implemented as ES5 prototypical class * function HelloWorldControl() { } * * HelloWorldControl.prototype.onAdd = function(map) { * this._map = map; * this._container = document.createElement('div'); * this._container.className = 'mapboxgl-ctrl'; * this._container.textContent = 'Hello, world'; * return this._container; * }; * * HelloWorldControl.prototype.onRemove = function () { * this._container.parentNode.removeChild(this._container); * this._map = undefined; * }; */ /** * Register a control on the map and give it a chance to register event listeners * and resources. This method is called by {@link Map#addControl} * internally. * * @function * @memberof IControl * @instance * @name onAdd * @param {Map} map the Map this control will be added to * @returns {HTMLElement} The control's container element. This should * be created by the control and returned by onAdd without being attached * to the DOM: the map will insert the control's element into the DOM * as necessary. */ /** * Unregister a control on the map and give it a chance to detach event listeners * and resources. This method is called by {@link Map#removeControl} * internally. * * @function * @memberof IControl * @instance * @name onRemove * @param {Map} map the Map this control will be removed from * @returns {undefined} there is no required return value for this method */ /** * Optionally provide a default position for this control. If this method * is implemented and {@link Map#addControl} is called without the `position` * parameter, the value returned by getDefaultPosition will be used as the * control's position. * * @function * @memberof IControl * @instance * @name getDefaultPosition * @returns {string} a control position, one of the values valid in addControl. */ /** * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has * `x` and `y` properties representing screen coordinates in pixels. * * @typedef {Object} Point * @example * var point = new mapboxgl.Point(-77, 38); */ /** * A {@link Point} or an array of two numbers representing `x` and `y` screen coordinates in pixels. * * @typedef {(Point | Array)} PointLike * @example * var p1 = new mapboxgl.Point(-77, 38); // a PointLike which is a Point * var p2 = [-77, 38]; // a PointLike which is an array of two numbers */ // var defaultOptions$2 = { showCompass: true, showZoom: true, visualizePitch: false }; /** * A `NavigationControl` control contains zoom buttons and a compass. * * @implements {IControl} * @param {Object} [options] * @param {Boolean} [options.showCompass=true] If `true` the compass button is included. * @param {Boolean} [options.showZoom=true] If `true` the zoom-in and zoom-out buttons are included. * @param {Boolean} [options.visualizePitch=false] If `true` the pitch is visualized by rotating X-axis of compass. * @example * var nav = new mapboxgl.NavigationControl(); * map.addControl(nav, 'top-left'); * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) * @see [Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/) */ var NavigationControl = function NavigationControl(options ) { var this$1 = this; this.options = performance.extend({}, defaultOptions$2, options); this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-group'); this._container.addEventListener('contextmenu', function (e) { return e.preventDefault(); }); if (this.options.showZoom) { performance.bindAll([ '_setButtonTitle', '_updateZoomButtons' ], this); this._zoomInButton = this._createButton('mapboxgl-ctrl-zoom-in', function (e) { return this$1._map.zoomIn({}, {originalEvent: e}); }); DOM.create('span', "mapboxgl-ctrl-icon", this._zoomInButton).setAttribute('aria-hidden', true); this._zoomOutButton = this._createButton('mapboxgl-ctrl-zoom-out', function (e) { return this$1._map.zoomOut({}, {originalEvent: e}); }); DOM.create('span', "mapboxgl-ctrl-icon", this._zoomOutButton).setAttribute('aria-hidden', true); } if (this.options.showCompass) { performance.bindAll([ '_rotateCompassArrow' ], this); this._compass = this._createButton('mapboxgl-ctrl-compass', function (e) { if (this$1.options.visualizePitch) { this$1._map.resetNorthPitch({}, {originalEvent: e}); } else { this$1._map.resetNorth({}, {originalEvent: e}); } }); this._compassIcon = DOM.create('span', 'mapboxgl-ctrl-icon', this._compass); this._compassIcon.setAttribute('aria-hidden', true); } }; NavigationControl.prototype._updateZoomButtons = function _updateZoomButtons () { var zoom = this._map.getZoom(); this._zoomInButton.disabled = zoom === this._map.getMaxZoom(); this._zoomOutButton.disabled = zoom === this._map.getMinZoom(); }; NavigationControl.prototype._rotateCompassArrow = function _rotateCompassArrow () { var rotate = this.options.visualizePitch ? ("rotateX(" + (this._map.transform.pitch) + "deg) rotateZ(" + (this._map.transform.angle * (180 / Math.PI)) + "deg)") : ("rotate(" + (this._map.transform.angle) + "deg)"); this._compassIcon.style.transform = rotate; }; NavigationControl.prototype.onAdd = function onAdd (map ) { this._map = map; if (this.options.showZoom) { this._setButtonTitle(this._zoomInButton, 'ZoomIn'); this._setButtonTitle(this._zoomOutButton, 'ZoomOut'); this._map.on('zoom', this._updateZoomButtons); this._updateZoomButtons(); } if (this.options.showCompass) { this._setButtonTitle(this._compass, 'ResetBearing'); if (this.options.visualizePitch) { this._map.on('pitch', this._rotateCompassArrow); } this._map.on('rotate', this._rotateCompassArrow); this._rotateCompassArrow(); this._handler = new MouseRotateWrapper(this._map, this._compass, this.options.visualizePitch); } return this._container; }; NavigationControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); if (this.options.showZoom) { this._map.off('zoom', this._updateZoomButtons); } if (this.options.showCompass) { if (this.options.visualizePitch) { this._map.off('pitch', this._rotateCompassArrow); } this._map.off('rotate', this._rotateCompassArrow); this._handler.off(); delete this._handler; } delete this._map; }; NavigationControl.prototype._createButton = function _createButton (className , fn ) { var a = DOM.create('button', className, this._container); a.type = 'button'; a.addEventListener('click', fn); return a; }; NavigationControl.prototype._setButtonTitle = function _setButtonTitle (button , title ) { var str = this._map._getUIString(("NavigationControl." + title)); button.title = str; button.setAttribute('aria-label', str); }; var MouseRotateWrapper = function MouseRotateWrapper(map , element , pitch) { if ( pitch === void 0 ) pitch = false; this._clickTolerance = 10; this.element = element; this.mouseRotate = new MouseRotateHandler({clickTolerance: map.dragRotate._mouseRotate._clickTolerance}); this.map = map; if (pitch) { this.mousePitch = new MousePitchHandler({clickTolerance: map.dragRotate._mousePitch._clickTolerance}); } performance.bindAll(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend', 'reset'], this); DOM.addEventListener(element, 'mousedown', this.mousedown); DOM.addEventListener(element, 'touchstart', this.touchstart, {passive: false}); DOM.addEventListener(element, 'touchmove', this.touchmove); DOM.addEventListener(element, 'touchend', this.touchend); DOM.addEventListener(element, 'touchcancel', this.reset); }; MouseRotateWrapper.prototype.down = function down (e , point ) { this.mouseRotate.mousedown(e, point); if (this.mousePitch) { this.mousePitch.mousedown(e, point); } DOM.disableDrag(); }; MouseRotateWrapper.prototype.move = function move (e , point ) { var map = this.map; var r = this.mouseRotate.mousemoveWindow(e, point); if (r && r.bearingDelta) { map.setBearing(map.getBearing() + r.bearingDelta); } if (this.mousePitch) { var p = this.mousePitch.mousemoveWindow(e, point); if (p && p.pitchDelta) { map.setPitch(map.getPitch() + p.pitchDelta); } } }; MouseRotateWrapper.prototype.off = function off () { var element = this.element; DOM.removeEventListener(element, 'mousedown', this.mousedown); DOM.removeEventListener(element, 'touchstart', this.touchstart, {passive: false}); DOM.removeEventListener(element, 'touchmove', this.touchmove); DOM.removeEventListener(element, 'touchend', this.touchend); DOM.removeEventListener(element, 'touchcancel', this.reset); this.offTemp(); }; MouseRotateWrapper.prototype.offTemp = function offTemp () { DOM.enableDrag(); DOM.removeEventListener(performance.window, 'mousemove', this.mousemove); DOM.removeEventListener(performance.window, 'mouseup', this.mouseup); }; MouseRotateWrapper.prototype.mousedown = function mousedown (e ) { this.down(performance.extend({}, e, {ctrlKey: true, preventDefault: function () { return e.preventDefault(); }}), DOM.mousePos(this.element, e)); DOM.addEventListener(performance.window, 'mousemove', this.mousemove); DOM.addEventListener(performance.window, 'mouseup', this.mouseup); }; MouseRotateWrapper.prototype.mousemove = function mousemove (e ) { this.move(e, DOM.mousePos(this.element, e)); }; MouseRotateWrapper.prototype.mouseup = function mouseup (e ) { this.mouseRotate.mouseupWindow(e); if (this.mousePitch) { this.mousePitch.mouseupWindow(e); } this.offTemp(); }; MouseRotateWrapper.prototype.touchstart = function touchstart (e ) { if (e.targetTouches.length !== 1) { this.reset(); } else { this._startPos = this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0]; this.down((({type: 'mousedown', button: 0, ctrlKey: true, preventDefault: function () { return e.preventDefault(); }} ) ), this._startPos); } }; MouseRotateWrapper.prototype.touchmove = function touchmove (e ) { if (e.targetTouches.length !== 1) { this.reset(); } else { this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0]; this.move((({preventDefault: function () { return e.preventDefault(); }} ) ), this._lastPos); } }; MouseRotateWrapper.prototype.touchend = function touchend (e ) { if (e.targetTouches.length === 0 && this._startPos && this._lastPos && this._startPos.dist(this._lastPos) < this._clickTolerance) { this.element.click(); } this.reset(); }; MouseRotateWrapper.prototype.reset = function reset () { this.mouseRotate.reset(); if (this.mousePitch) { this.mousePitch.reset(); } delete this._startPos; delete this._lastPos; this.offTemp(); }; // /** * Given a LngLat, prior projected position, and a transform, return a new LngLat shifted * n × 360° east or west for some n ≥ 0 such that: * * * the projected location of the result is on screen, if possible, and secondarily: * * the difference between the projected location of the result and the prior position * is minimized. * * The object is to preserve perceived object constancy for Popups and Markers as much as * possible; they should avoid shifting large distances across the screen, even when the * map center changes by ±360° due to automatic wrapping, and when about to go off screen, * should wrap just enough to avoid doing so. * * @private */ function smartWrap(lngLat , priorPos , transform ) { lngLat = new performance.LngLat(lngLat.lng, lngLat.lat); // First, try shifting one world in either direction, and see if either is closer to the // prior position. This preserves object constancy when the map center is auto-wrapped // during animations. if (priorPos) { var left = new performance.LngLat(lngLat.lng - 360, lngLat.lat); var right = new performance.LngLat(lngLat.lng + 360, lngLat.lat); var delta = transform.locationPoint(lngLat).distSqr(priorPos); if (transform.locationPoint(left).distSqr(priorPos) < delta) { lngLat = left; } else if (transform.locationPoint(right).distSqr(priorPos) < delta) { lngLat = right; } } // Second, wrap toward the center until the new position is on screen, or we can't get // any closer. while (Math.abs(lngLat.lng - transform.center.lng) > 180) { var pos = transform.locationPoint(lngLat); if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) { break; } if (lngLat.lng > transform.center.lng) { lngLat.lng -= 360; } else { lngLat.lng += 360; } } return lngLat; } // var anchorTranslate = { 'center': 'translate(-50%,-50%)', 'top': 'translate(-50%,0)', 'top-left': 'translate(0,0)', 'top-right': 'translate(-100%,0)', 'bottom': 'translate(-50%,-100%)', 'bottom-left': 'translate(0,-100%)', 'bottom-right': 'translate(-100%,-100%)', 'left': 'translate(0,-50%)', 'right': 'translate(-100%,-50%)' }; function applyAnchorClass(element , anchor , prefix ) { var classList = element.classList; for (var key in anchorTranslate) { classList.remove(("mapboxgl-" + prefix + "-anchor-" + key)); } classList.add(("mapboxgl-" + prefix + "-anchor-" + anchor)); } // /** * Creates a marker component * @param {Object} [options] * @param {HTMLElement} [options.element] DOM element to use as a marker. The default is a light blue, droplet-shaped SVG marker. * @param {string} [options.anchor='center'] A string indicating the part of the Marker that should be positioned closest to the coordinate set via {@link Marker#setLngLat}. * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. * @param {PointLike} [options.offset] The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @param {string} [options.color='#3FB1CE'] The color to use for the default marker if options.element is not provided. The default is light blue. * @param {number} [options.scale=1] The scale to use for the default marker if options.element is not provided. The default scale corresponds to a height of `41px` and a width of `27px`. * @param {boolean} [options.draggable=false] A boolean indicating whether or not a marker is able to be dragged to a new position on the map. * @param {number} [options.rotation=0] The rotation angle of the marker in degrees, relative to its respective `rotationAlignment` setting. A positive value will rotate the marker clockwise. * @param {string} [options.pitchAlignment='auto'] `map` aligns the `Marker` to the plane of the map. `viewport` aligns the `Marker` to the plane of the viewport. `auto` automatically matches the value of `rotationAlignment`. * @param {string} [options.rotationAlignment='auto'] `map` aligns the `Marker`'s rotation relative to the map, maintaining a bearing as the map rotates. `viewport` aligns the `Marker`'s rotation relative to the viewport, agnostic to map rotations. `auto` is equivalent to `viewport`. * @example * var marker = new mapboxgl.Marker() * .setLngLat([30.5, 50.5]) * .addTo(map); * @see [Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/) * @see [Create a draggable Marker](https://www.mapbox.com/mapbox-gl-js/example/drag-a-marker/) */ var Marker = /*@__PURE__*/(function (Evented) { function Marker(options , legacyOptions ) { var this$1 = this; Evented.call(this); // For backward compatibility -- the constructor used to accept the element as a // required first argument, before it was made optional. if (options instanceof performance.window.HTMLElement || legacyOptions) { options = performance.extend({element: options}, legacyOptions); } performance.bindAll([ '_update', '_onMove', '_onUp', '_addDragHandler', '_onMapClick', '_onKeyPress' ], this); this._anchor = options && options.anchor || 'center'; this._color = options && options.color || '#3FB1CE'; this._scale = options && options.scale || 1; this._draggable = options && options.draggable || false; this._state = 'inactive'; this._rotation = options && options.rotation || 0; this._rotationAlignment = options && options.rotationAlignment || 'auto'; this._pitchAlignment = options && options.pitchAlignment && options.pitchAlignment !== 'auto' ? options.pitchAlignment : this._rotationAlignment; if (!options || !options.element) { this._defaultMarker = true; this._element = DOM.create('div'); this._element.setAttribute('aria-label', 'Map marker'); // create default map marker SVG var svg = DOM.createNS('http://www.w3.org/2000/svg', 'svg'); var defaultHeight = 41; var defaultWidth = 27; svg.setAttributeNS(null, 'display', 'block'); svg.setAttributeNS(null, 'height', (defaultHeight + "px")); svg.setAttributeNS(null, 'width', (defaultWidth + "px")); svg.setAttributeNS(null, 'viewBox', ("0 0 " + defaultWidth + " " + defaultHeight)); var markerLarge = DOM.createNS('http://www.w3.org/2000/svg', 'g'); markerLarge.setAttributeNS(null, 'stroke', 'none'); markerLarge.setAttributeNS(null, 'stroke-width', '1'); markerLarge.setAttributeNS(null, 'fill', 'none'); markerLarge.setAttributeNS(null, 'fill-rule', 'evenodd'); var page1 = DOM.createNS('http://www.w3.org/2000/svg', 'g'); page1.setAttributeNS(null, 'fill-rule', 'nonzero'); var shadow = DOM.createNS('http://www.w3.org/2000/svg', 'g'); shadow.setAttributeNS(null, 'transform', 'translate(3.0, 29.0)'); shadow.setAttributeNS(null, 'fill', '#000000'); var ellipses = [ {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '10.5', 'ry': '5.25002273'}, {'rx': '9.5', 'ry': '4.77275007'}, {'rx': '8.5', 'ry': '4.29549936'}, {'rx': '7.5', 'ry': '3.81822308'}, {'rx': '6.5', 'ry': '3.34094679'}, {'rx': '5.5', 'ry': '2.86367051'}, {'rx': '4.5', 'ry': '2.38636864'} ]; for (var i = 0, list = ellipses; i < list.length; i += 1) { var data = list[i]; var ellipse = DOM.createNS('http://www.w3.org/2000/svg', 'ellipse'); ellipse.setAttributeNS(null, 'opacity', '0.04'); ellipse.setAttributeNS(null, 'cx', '10.5'); ellipse.setAttributeNS(null, 'cy', '5.80029008'); ellipse.setAttributeNS(null, 'rx', data['rx']); ellipse.setAttributeNS(null, 'ry', data['ry']); shadow.appendChild(ellipse); } var background = DOM.createNS('http://www.w3.org/2000/svg', 'g'); background.setAttributeNS(null, 'fill', this._color); var bgPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); bgPath.setAttributeNS(null, 'd', 'M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z'); background.appendChild(bgPath); var border = DOM.createNS('http://www.w3.org/2000/svg', 'g'); border.setAttributeNS(null, 'opacity', '0.25'); border.setAttributeNS(null, 'fill', '#000000'); var borderPath = DOM.createNS('http://www.w3.org/2000/svg', 'path'); borderPath.setAttributeNS(null, 'd', 'M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z'); border.appendChild(borderPath); var maki = DOM.createNS('http://www.w3.org/2000/svg', 'g'); maki.setAttributeNS(null, 'transform', 'translate(6.0, 7.0)'); maki.setAttributeNS(null, 'fill', '#FFFFFF'); var circleContainer = DOM.createNS('http://www.w3.org/2000/svg', 'g'); circleContainer.setAttributeNS(null, 'transform', 'translate(8.0, 8.0)'); var circle1 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle1.setAttributeNS(null, 'fill', '#000000'); circle1.setAttributeNS(null, 'opacity', '0.25'); circle1.setAttributeNS(null, 'cx', '5.5'); circle1.setAttributeNS(null, 'cy', '5.5'); circle1.setAttributeNS(null, 'r', '5.4999962'); var circle2 = DOM.createNS('http://www.w3.org/2000/svg', 'circle'); circle2.setAttributeNS(null, 'fill', '#FFFFFF'); circle2.setAttributeNS(null, 'cx', '5.5'); circle2.setAttributeNS(null, 'cy', '5.5'); circle2.setAttributeNS(null, 'r', '5.4999962'); circleContainer.appendChild(circle1); circleContainer.appendChild(circle2); page1.appendChild(shadow); page1.appendChild(background); page1.appendChild(border); page1.appendChild(maki); page1.appendChild(circleContainer); svg.appendChild(page1); svg.setAttributeNS(null, 'height', ((defaultHeight * this._scale) + "px")); svg.setAttributeNS(null, 'width', ((defaultWidth * this._scale) + "px")); this._element.appendChild(svg); // if no element and no offset option given apply an offset for the default marker // the -14 as the y value of the default marker offset was determined as follows // // the marker tip is at the center of the shadow ellipse from the default svg // the y value of the center of the shadow ellipse relative to the svg top left is "shadow transform translate-y (29.0) + ellipse cy (5.80029008)" // offset to the svg center "height (41 / 2)" gives (29.0 + 5.80029008) - (41 / 2) and rounded for an integer pixel offset gives 14 // negative is used to move the marker up from the center so the tip is at the Marker lngLat this._offset = performance.Point.convert(options && options.offset || [0, -14]); } else { this._element = options.element; this._offset = performance.Point.convert(options && options.offset || [0, 0]); } this._element.classList.add('mapboxgl-marker'); this._element.addEventListener('dragstart', function (e ) { e.preventDefault(); }); this._element.addEventListener('mousedown', function (e ) { // prevent focusing on click e.preventDefault(); }); this._element.addEventListener('focus', function () { // revert the default scrolling action of the container var el = this$1._map.getContainer(); el.scrollTop = 0; el.scrollLeft = 0; }); applyAnchorClass(this._element, this._anchor, 'marker'); this._popup = null; } if ( Evented ) Marker.__proto__ = Evented; Marker.prototype = Object.create( Evented && Evented.prototype ); Marker.prototype.constructor = Marker; /** * Attaches the `Marker` to a `Map` object. * @param {Map} map The Mapbox GL JS map to add the marker to. * @returns {Marker} `this` * @example * var marker = new mapboxgl.Marker() * .setLngLat([30.5, 50.5]) * .addTo(map); // add the marker to the map */ Marker.prototype.addTo = function addTo (map ) { this.remove(); this._map = map; map.getCanvasContainer().appendChild(this._element); map.on('move', this._update); map.on('moveend', this._update); this.setDraggable(this._draggable); this._update(); // If we attached the `click` listener to the marker element, the popup // would close once the event propogated to `map` due to the // `Popup#_onClickClose` listener. this._map.on('click', this._onMapClick); if (this._map._markersCache) { this._map._markersCache.push(this); } return this; }; /** * Removes the marker from a map * @example * var marker = new mapboxgl.Marker().addTo(map); * marker.remove(); * @returns {Marker} `this` */ Marker.prototype.remove = function remove () { if (this._map) { this._map.off('click', this._onMapClick); this._map.off('move', this._update); this._map.off('moveend', this._update); this._map.off('mousedown', this._addDragHandler); this._map.off('touchstart', this._addDragHandler); this._map.off('mouseup', this._onUp); this._map.off('touchend', this._onUp); this._map.off('mousemove', this._onMove); this._map.off('touchmove', this._onMove); var m = this._map._markersCache.indexOf(this); if (m > -1) { this._map._markersCache.splice(m, 1); } delete this._map; } DOM.remove(this._element); if (this._popup) { this._popup.remove(); } return this; }; /** * Get the marker's geographical location. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Marker` wraps the anchor longitude across copies of the world to keep * the marker on screen. * * @returns {LngLat} A {@link LngLat} describing the marker's location. * @example * // Store the marker's longitude and latitude coordinates in a variable * var lngLat = marker.getLngLat(); * // Print the marker's longitude and latitude values in the console * console.log('Longitude: ' + lngLat.lng + ', Latitude: ' + lngLat.lat ) * @see [Create a draggable Marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-marker/) */ Marker.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Set the marker's geographical position and move it. * @param {LngLat} lnglat A {@link LngLat} describing where the marker should be located. * @returns {Marker} `this` * @example * // Create a new marker, set the longitude and latitude, and add it to the map * new mapboxgl.Marker() * .setLngLat([-65.017, -16.457]) * .addTo(map); * @see [Add custom icons with Markers](https://docs.mapbox.com/mapbox-gl-js/example/custom-marker-icons/) * @see [Create a draggable Marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-marker/) * @see [Add a marker using a place name](https://docs.mapbox.com/mapbox-gl-js/example/marker-from-geocode/) */ Marker.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = performance.LngLat.convert(lnglat); this._pos = null; if (this._popup) { this._popup.setLngLat(this._lngLat); } this._update(); return this; }; /** * Returns the `Marker`'s HTML element. * @returns {HTMLElement} element */ Marker.prototype.getElement = function getElement () { return this._element; }; /** * Binds a {@link Popup} to the {@link Marker}. * @param popup An instance of the {@link Popup} class. If undefined or null, any popup * set on this {@link Marker} instance is unset. * @returns {Marker} `this` * @example * var marker = new mapboxgl.Marker() * .setLngLat([0, 0]) * .setPopup(new mapboxgl.Popup().setHTML("

Hello World!

")) // add popup * .addTo(map); * @see [Attach a popup to a marker instance](https://docs.mapbox.com/mapbox-gl-js/example/set-popup/) */ Marker.prototype.setPopup = function setPopup (popup ) { if (this._popup) { this._popup.remove(); this._popup = null; this._element.removeEventListener('keypress', this._onKeyPress); if (!this._originalTabIndex) { this._element.removeAttribute('tabindex'); } } if (popup) { if (!('offset' in popup.options)) { var markerHeight = 41 - (5.8 / 2); var markerRadius = 13.5; var linearOffset = Math.sqrt(Math.pow(markerRadius, 2) / 2); popup.options.offset = this._defaultMarker ? { 'top': [0, 0], 'top-left': [0, 0], 'top-right': [0, 0], 'bottom': [0, -markerHeight], 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], 'left': [markerRadius, (markerHeight - markerRadius) * -1], 'right': [-markerRadius, (markerHeight - markerRadius) * -1] } : this._offset; } this._popup = popup; if (this._lngLat) { this._popup.setLngLat(this._lngLat); } this._originalTabIndex = this._element.getAttribute('tabindex'); if (!this._originalTabIndex) { this._element.setAttribute('tabindex', '0'); } this._element.addEventListener('keypress', this._onKeyPress); } return this; }; Marker.prototype._onKeyPress = function _onKeyPress (e ) { var code = e.code; var legacyCode = e.charCode || e.keyCode; if ( (code === 'Space') || (code === 'Enter') || (legacyCode === 32) || (legacyCode === 13) // space or enter ) { this.togglePopup(); } }; Marker.prototype._onMapClick = function _onMapClick (e ) { var targetElement = e.originalEvent.target; var element = this._element; if (this._popup && (targetElement === element || element.contains((targetElement )))) { this.togglePopup(); } }; /** * Returns the {@link Popup} instance that is bound to the {@link Marker}. * @returns {Popup} popup * @example * var marker = new mapboxgl.Marker() * .setLngLat([0, 0]) * .setPopup(new mapboxgl.Popup().setHTML("

Hello World!

")) * .addTo(map); * * console.log(marker.getPopup()); // return the popup instance */ Marker.prototype.getPopup = function getPopup () { return this._popup; }; /** * Opens or closes the {@link Popup} instance that is bound to the {@link Marker}, depending on the current state of the {@link Popup}. * @returns {Marker} `this` * @example * var marker = new mapboxgl.Marker() * .setLngLat([0, 0]) * .setPopup(new mapboxgl.Popup().setHTML("

Hello World!

")) * .addTo(map); * * marker.togglePopup(); // toggle popup open or closed */ Marker.prototype.togglePopup = function togglePopup () { var popup = this._popup; if (!popup) { return this; } else if (popup.isOpen()) { popup.remove(); } else { popup.addTo(this._map); } return this; }; Marker.prototype._update = function _update (e ) { if (!this._map) { return; } if (this._map.transform.renderWorldCopies) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } this._pos = this._map.project(this._lngLat)._add(this._offset); var rotation = ""; if (this._rotationAlignment === "viewport" || this._rotationAlignment === "auto") { rotation = "rotateZ(" + (this._rotation) + "deg)"; } else if (this._rotationAlignment === "map") { rotation = "rotateZ(" + (this._rotation - this._map.getBearing()) + "deg)"; } var pitch = ""; if (this._pitchAlignment === "viewport" || this._pitchAlignment === "auto") { pitch = "rotateX(0deg)"; } else if (this._pitchAlignment === "map") { pitch = "rotateX(" + (this._map.getPitch()) + "deg)"; } // because rounding the coordinates at every `move` event causes stuttered zooming // we only round them when _update is called with `moveend` or when its called with // no arguments (when the Marker is initialized or Marker#setLngLat is invoked). if (!e || e.type === "moveend") { this._pos = this._pos.round(); } DOM.setTransform(this._element, ((anchorTranslate[this._anchor]) + " translate(" + (this._pos.x) + "px, " + (this._pos.y) + "px) " + pitch + " " + rotation)); }; /** * Get the marker's offset. * @returns {Point} The marker's screen coordinates in pixels. */ Marker.prototype.getOffset = function getOffset () { return this._offset; }; /** * Sets the offset of the marker * @param {PointLike} offset The offset in pixels as a {@link PointLike} object to apply relative to the element's center. Negatives indicate left and up. * @returns {Marker} `this` */ Marker.prototype.setOffset = function setOffset (offset ) { this._offset = performance.Point.convert(offset); this._update(); return this; }; Marker.prototype._onMove = function _onMove (e ) { this._pos = e.point.sub(this._positionDelta); this._lngLat = this._map.unproject(this._pos); this.setLngLat(this._lngLat); // suppress click event so that popups don't toggle on drag this._element.style.pointerEvents = 'none'; // make sure dragstart only fires on the first move event after mousedown. // this can't be on mousedown because that event doesn't necessarily // imply that a drag is about to happen. if (this._state === 'pending') { this._state = 'active'; /** * Fired when dragging starts * * @event dragstart * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that is being dragged */ this.fire(new performance.Event('dragstart')); } /** * Fired while dragging * * @event drag * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that is being dragged */ this.fire(new performance.Event('drag')); }; Marker.prototype._onUp = function _onUp () { // revert to normal pointer event handling this._element.style.pointerEvents = 'auto'; this._positionDelta = null; this._map.off('mousemove', this._onMove); this._map.off('touchmove', this._onMove); // only fire dragend if it was preceded by at least one drag event if (this._state === 'active') { /** * Fired when the marker is finished being dragged * * @event dragend * @memberof Marker * @instance * @type {Object} * @property {Marker} marker object that was dragged */ this.fire(new performance.Event('dragend')); } this._state = 'inactive'; }; Marker.prototype._addDragHandler = function _addDragHandler (e ) { if (this._element.contains((e.originalEvent.target ))) { e.preventDefault(); // We need to calculate the pixel distance between the click point // and the marker position, with the offset accounted for. Then we // can subtract this distance from the mousemove event's position // to calculate the new marker position. // If we don't do this, the marker 'jumps' to the click position // creating a jarring UX effect. this._positionDelta = e.point.sub(this._pos).add(this._offset); this._state = 'pending'; this._map.on('mousemove', this._onMove); this._map.on('touchmove', this._onMove); this._map.once('mouseup', this._onUp); this._map.once('touchend', this._onUp); } }; /** * Sets the `draggable` property and functionality of the marker * @param {boolean} [shouldBeDraggable=false] Turns drag functionality on/off * @returns {Marker} `this` */ Marker.prototype.setDraggable = function setDraggable (shouldBeDraggable ) { this._draggable = !!shouldBeDraggable; // convert possible undefined value to false // handle case where map may not exist yet // e.g. when setDraggable is called before addTo if (this._map) { if (shouldBeDraggable) { this._map.on('mousedown', this._addDragHandler); this._map.on('touchstart', this._addDragHandler); } else { this._map.off('mousedown', this._addDragHandler); this._map.off('touchstart', this._addDragHandler); } } return this; }; /** * Returns true if the marker can be dragged * @returns {boolean} True if the marker is draggable. */ Marker.prototype.isDraggable = function isDraggable () { return this._draggable; }; /** * Sets the `rotation` property of the marker. * @param {number} [rotation=0] The rotation angle of the marker (clockwise, in degrees), relative to its respective {@link Marker#setRotationAlignment} setting. * @returns {Marker} `this` */ Marker.prototype.setRotation = function setRotation (rotation ) { this._rotation = rotation || 0; this._update(); return this; }; /** * Returns the current rotation angle of the marker (in degrees). * @returns {number} The current rotation angle of the marker. */ Marker.prototype.getRotation = function getRotation () { return this._rotation; }; /** * Sets the `rotationAlignment` property of the marker. * @param {string} [alignment='auto'] Sets the `rotationAlignment` property of the marker. * @returns {Marker} `this` */ Marker.prototype.setRotationAlignment = function setRotationAlignment (alignment ) { this._rotationAlignment = alignment || 'auto'; this._update(); return this; }; /** * Returns the current `rotationAlignment` property of the marker. * @returns {string} The current rotational alignment of the marker. */ Marker.prototype.getRotationAlignment = function getRotationAlignment () { return this._rotationAlignment; }; /** * Sets the `pitchAlignment` property of the marker. * @param {string} [alignment] Sets the `pitchAlignment` property of the marker. If alignment is 'auto', it will automatically match `rotationAlignment`. * @returns {Marker} `this` */ Marker.prototype.setPitchAlignment = function setPitchAlignment (alignment ) { this._pitchAlignment = alignment && alignment !== 'auto' ? alignment : this._rotationAlignment; this._update(); return this; }; /** * Returns the current `pitchAlignment` property of the marker. * @returns {string} The current pitch alignment of the marker in degrees. */ Marker.prototype.getPitchAlignment = function getPitchAlignment () { return this._pitchAlignment; }; return Marker; }(performance.Evented)); // var defaultOptions$3 = { positionOptions: { enableHighAccuracy: false, maximumAge: 0, timeout: 6000 /* 6 sec */ }, fitBoundsOptions: { maxZoom: 15 }, trackUserLocation: false, showAccuracyCircle: true, showUserLocation: true }; var supportsGeolocation; function checkGeolocationSupport(callback) { if (supportsGeolocation !== undefined) { callback(supportsGeolocation); } else if (performance.window.navigator.permissions !== undefined) { // navigator.permissions has incomplete browser support // http://caniuse.com/#feat=permissions-api // Test for the case where a browser disables Geolocation because of an // insecure origin performance.window.navigator.permissions.query({name: 'geolocation'}).then(function (p) { supportsGeolocation = p.state !== 'denied'; callback(supportsGeolocation); }); } else { supportsGeolocation = !!performance.window.navigator.geolocation; callback(supportsGeolocation); } } var numberOfWatches = 0; var noTimeout = false; /** * A `GeolocateControl` control provides a button that uses the browser's geolocation * API to locate the user on the map. * * Not all browsers support geolocation, * and some users may disable the feature. Geolocation support for modern * browsers including Chrome requires sites to be served over HTTPS. If * geolocation support is not available, the GeolocateControl will show * as disabled. * * The zoom level applied will depend on the accuracy of the geolocation provided by the device. * * The GeolocateControl has two modes. If `trackUserLocation` is `false` (default) the control acts as a button, which when pressed will set the map's camera to target the user location. If the user moves, the map won't update. This is most suited for the desktop. If `trackUserLocation` is `true` the control acts as a toggle button that when active the user's location is actively monitored for changes. In this mode the GeolocateControl has three interaction states: * * active - the map's camera automatically updates as the user's location changes, keeping the location dot in the center. Initial state and upon clicking the `GeolocateControl` button. * * passive - the user's location dot automatically updates, but the map's camera does not. Occurs upon the user initiating a map movement. * * disabled - occurs if Geolocation is not available, disabled or denied. * * These interaction states can't be controlled programmatically, rather they are set based on user interactions. * * @implements {IControl} * @param {Object} [options] * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A Geolocation API [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object. * @param {Object} [options.fitBoundsOptions={maxZoom: 15}] A {@link Map#fitBounds} options object to use when the map is panned and zoomed to the user's location. The default is to use a `maxZoom` of 15 to limit how far the map will zoom in for very accurate locations. * @param {Object} [options.trackUserLocation=false] If `true` the Geolocate Control becomes a toggle button and when active the map will receive updates to the user's location as it changes. * @param {Object} [options.showAccuracyCircle=true] By default, if showUserLocation is `true`, a transparent circle will be drawn around the user location indicating the accuracy (95% confidence level) of the user's location. Set to `false` to disable. Always disabled when showUserLocation is `false`. * @param {Object} [options.showUserLocation=true] By default a dot will be shown on the map at the user's location. Set to `false` to disable. * * @example * map.addControl(new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * })); * @see [Locate the user](https://www.mapbox.com/mapbox-gl-js/example/locate-user/) */ var GeolocateControl = /*@__PURE__*/(function (Evented) { function GeolocateControl(options ) { Evented.call(this); this.options = performance.extend({}, defaultOptions$3, options); performance.bindAll([ '_onSuccess', '_onError', '_onZoom', '_finish', '_setupUI', '_updateCamera', '_updateMarker' ], this); } if ( Evented ) GeolocateControl.__proto__ = Evented; GeolocateControl.prototype = Object.create( Evented && Evented.prototype ); GeolocateControl.prototype.constructor = GeolocateControl; GeolocateControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', "mapboxgl-ctrl mapboxgl-ctrl-group"); checkGeolocationSupport(this._setupUI); return this._container; }; GeolocateControl.prototype.onRemove = function onRemove () { // clear the geolocation watch if exists if (this._geolocationWatchID !== undefined) { performance.window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); } // clear the markers from the map if (this.options.showUserLocation && this._userLocationDotMarker) { this._userLocationDotMarker.remove(); } if (this.options.showAccuracyCircle && this._accuracyCircleMarker) { this._accuracyCircleMarker.remove(); } DOM.remove(this._container); this._map.off('zoom', this._onZoom); this._map = (undefined ); numberOfWatches = 0; noTimeout = false; }; /** * Check if the Geolocation API Position is outside the map's maxbounds. * * @param {Position} position the Geolocation API Position * @returns {boolean} Returns `true` if position is outside the map's maxbounds, otherwise returns `false`. * @private */ GeolocateControl.prototype._isOutOfMapMaxBounds = function _isOutOfMapMaxBounds (position ) { var bounds = this._map.getMaxBounds(); var coordinates = position.coords; return bounds && ( coordinates.longitude < bounds.getWest() || coordinates.longitude > bounds.getEast() || coordinates.latitude < bounds.getSouth() || coordinates.latitude > bounds.getNorth() ); }; GeolocateControl.prototype._setErrorState = function _setErrorState () { switch (this._watchState) { case 'WAITING_ACTIVE': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'ACTIVE_LOCK': this._watchState = 'ACTIVE_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'BACKGROUND': this._watchState = 'BACKGROUND_ERROR'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); // turn marker grey break; case 'ACTIVE_ERROR': break; default: performance.assert(false, ("Unexpected watchState " + (this._watchState))); } }; /** * When the Geolocation API returns a new location, update the GeolocateControl. * * @param {Position} position the Geolocation API Position * @private */ GeolocateControl.prototype._onSuccess = function _onSuccess (position ) { if (!this._map) { // control has since been removed return; } if (this._isOutOfMapMaxBounds(position)) { this._setErrorState(); this.fire(new performance.Event('outofmaxbounds', position)); this._updateMarker(); this._finish(); return; } if (this.options.trackUserLocation) { // keep a record of the position so that if the state is BACKGROUND and the user // clicks the button, we can move to ACTIVE_LOCK immediately without waiting for // watchPosition to trigger _onSuccess this._lastKnownPosition = position; switch (this._watchState) { case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'BACKGROUND': case 'BACKGROUND_ERROR': this._watchState = 'BACKGROUND'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; default: performance.assert(false, ("Unexpected watchState " + (this._watchState))); } } // if showUserLocation and the watch state isn't off then update the marker location if (this.options.showUserLocation && this._watchState !== 'OFF') { this._updateMarker(position); } // if in normal mode (not watch mode), or if in watch mode and the state is active watch // then update the camera if (!this.options.trackUserLocation || this._watchState === 'ACTIVE_LOCK') { this._updateCamera(position); } if (this.options.showUserLocation) { this._dotElement.classList.remove('mapboxgl-user-location-dot-stale'); } this.fire(new performance.Event('geolocate', position)); this._finish(); }; /** * Update the camera location to center on the current position * * @param {Position} position the Geolocation API Position * @private */ GeolocateControl.prototype._updateCamera = function _updateCamera (position ) { var center = new performance.LngLat(position.coords.longitude, position.coords.latitude); var radius = position.coords.accuracy; var bearing = this._map.getBearing(); var options = performance.extend({bearing: bearing}, this.options.fitBoundsOptions); this._map.fitBounds(center.toBounds(radius), options, { geolocateSource: true // tag this camera change so it won't cause the control to change to background state }); }; /** * Update the user location dot Marker to the current position * * @param {Position} [position] the Geolocation API Position * @private */ GeolocateControl.prototype._updateMarker = function _updateMarker (position ) { if (position) { var center = new performance.LngLat(position.coords.longitude, position.coords.latitude); this._accuracyCircleMarker.setLngLat(center).addTo(this._map); this._userLocationDotMarker.setLngLat(center).addTo(this._map); this._accuracy = position.coords.accuracy; if (this.options.showUserLocation && this.options.showAccuracyCircle) { this._updateCircleRadius(); } } else { this._userLocationDotMarker.remove(); this._accuracyCircleMarker.remove(); } }; GeolocateControl.prototype._updateCircleRadius = function _updateCircleRadius () { performance.assert(this._circleElement); var y = this._map._container.clientHeight / 2; var a = this._map.unproject([0, y]); var b = this._map.unproject([1, y]); var metersPerPixel = a.distanceTo(b); var circleDiameter = Math.ceil(2.0 * this._accuracy / metersPerPixel); this._circleElement.style.width = circleDiameter + "px"; this._circleElement.style.height = circleDiameter + "px"; }; GeolocateControl.prototype._onZoom = function _onZoom () { if (this.options.showUserLocation && this.options.showAccuracyCircle) { this._updateCircleRadius(); } }; GeolocateControl.prototype._onError = function _onError (error ) { if (!this._map) { // control has since been removed return; } if (this.options.trackUserLocation) { if (error.code === 1) { // PERMISSION_DENIED this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this._geolocateButton.disabled = true; var title = this._map._getUIString('GeolocateControl.LocationNotAvailable'); this._geolocateButton.title = title; this._geolocateButton.setAttribute('aria-label', title); if (this._geolocationWatchID !== undefined) { this._clearWatch(); } } else if (error.code === 3 && noTimeout) { // this represents a forced error state // this was triggered to force immediate geolocation when a watch is already present // see https://github.com/mapbox/mapbox-gl-js/issues/8214 // and https://w3c.github.io/geolocation-api/#example-5-forcing-the-user-agent-to-return-a-fresh-cached-position return; } else { this._setErrorState(); } } if (this._watchState !== 'OFF' && this.options.showUserLocation) { this._dotElement.classList.add('mapboxgl-user-location-dot-stale'); } this.fire(new performance.Event('error', error)); this._finish(); }; GeolocateControl.prototype._finish = function _finish () { if (this._timeoutId) { clearTimeout(this._timeoutId); } this._timeoutId = undefined; }; GeolocateControl.prototype._setupUI = function _setupUI (supported ) { var this$1 = this; this._container.addEventListener('contextmenu', function (e ) { return e.preventDefault(); }); this._geolocateButton = DOM.create('button', "mapboxgl-ctrl-geolocate", this._container); DOM.create('span', "mapboxgl-ctrl-icon", this._geolocateButton).setAttribute('aria-hidden', true); this._geolocateButton.type = 'button'; if (supported === false) { performance.warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.'); var title = this._map._getUIString('GeolocateControl.LocationNotAvailable'); this._geolocateButton.disabled = true; this._geolocateButton.title = title; this._geolocateButton.setAttribute('aria-label', title); } else { var title$1 = this._map._getUIString('GeolocateControl.FindMyLocation'); this._geolocateButton.title = title$1; this._geolocateButton.setAttribute('aria-label', title$1); } if (this.options.trackUserLocation) { this._geolocateButton.setAttribute('aria-pressed', 'false'); this._watchState = 'OFF'; } // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map if (this.options.showUserLocation) { this._dotElement = DOM.create('div', 'mapboxgl-user-location-dot'); this._userLocationDotMarker = new Marker(this._dotElement); this._circleElement = DOM.create('div', 'mapboxgl-user-location-accuracy-circle'); this._accuracyCircleMarker = new Marker({element: this._circleElement, pitchAlignment: 'map'}); if (this.options.trackUserLocation) { this._watchState = 'OFF'; } this._map.on('zoom', this._onZoom); } this._geolocateButton.addEventListener('click', this.trigger.bind(this)); this._setup = true; // when the camera is changed (and it's not as a result of the Geolocation Control) change // the watch mode to background watch, so that the marker is updated but not the camera. if (this.options.trackUserLocation) { this._map.on('movestart', function (event) { var fromResize = event.originalEvent && event.originalEvent.type === 'resize'; if (!event.geolocateSource && this$1._watchState === 'ACTIVE_LOCK' && !fromResize) { this$1._watchState = 'BACKGROUND'; this$1._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); this$1._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this$1.fire(new performance.Event('trackuserlocationend')); } }); } }; /** * Programmatically request and move the map to the user's location. * * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`. * @example * // Initialize the geolocate control. * var geolocate = new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * }); * // Add the control to the map. * map.addControl(geolocate); * map.on('load', function() { * geolocate.trigger(); * }); */ GeolocateControl.prototype.trigger = function trigger () { if (!this._setup) { performance.warnOnce('Geolocate control triggered before added to a map'); return false; } if (this.options.trackUserLocation) { // update watchState and do any outgoing state cleanup switch (this._watchState) { case 'OFF': // turn on the Geolocate Control this._watchState = 'WAITING_ACTIVE'; this.fire(new performance.Event('trackuserlocationstart')); break; case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': case 'BACKGROUND_ERROR': // turn off the Geolocate Control numberOfWatches--; noTimeout = false; this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active-error'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); this.fire(new performance.Event('trackuserlocationend')); break; case 'BACKGROUND': this._watchState = 'ACTIVE_LOCK'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); // set camera to last known location if (this._lastKnownPosition) { this._updateCamera(this._lastKnownPosition); } this.fire(new performance.Event('trackuserlocationstart')); break; default: performance.assert(false, ("Unexpected watchState " + (this._watchState))); } // incoming state setup switch (this._watchState) { case 'WAITING_ACTIVE': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_LOCK': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active'); break; case 'ACTIVE_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-active-error'); break; case 'BACKGROUND': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; case 'BACKGROUND_ERROR': this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background-error'); break; case 'OFF': break; default: performance.assert(false, ("Unexpected watchState " + (this._watchState))); } // manage geolocation.watchPosition / geolocation.clearWatch if (this._watchState === 'OFF' && this._geolocationWatchID !== undefined) { // clear watchPosition as we've changed to an OFF state this._clearWatch(); } else if (this._geolocationWatchID === undefined) { // enable watchPosition since watchState is not OFF and there is no watchPosition already running this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'true'); numberOfWatches++; var positionOptions; if (numberOfWatches > 1) { positionOptions = {maximumAge:600000, timeout:0}; noTimeout = true; } else { positionOptions = this.options.positionOptions; noTimeout = false; } this._geolocationWatchID = performance.window.navigator.geolocation.watchPosition( this._onSuccess, this._onError, positionOptions); } } else { performance.window.navigator.geolocation.getCurrentPosition( this._onSuccess, this._onError, this.options.positionOptions); // This timeout ensures that we still call finish() even if // the user declines to share their location in Firefox this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */); } return true; }; GeolocateControl.prototype._clearWatch = function _clearWatch () { performance.window.navigator.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'false'); if (this.options.showUserLocation) { this._updateMarker(null); } }; return GeolocateControl; }(performance.Evented)); /* Geolocate Control Watch States * This is the private state of the control. * * OFF * off/inactive * WAITING_ACTIVE * Geolocate Control was clicked but still waiting for Geolocation API response with user location * ACTIVE_LOCK * Showing the user location as a dot AND tracking the camera to be fixed to their location. If their location changes the map moves to follow. * ACTIVE_ERROR * There was en error from the Geolocation API while trying to show and track the user location. * BACKGROUND * Showing the user location as a dot but the camera doesn't follow their location as it changes. * BACKGROUND_ERROR * There was an error from the Geolocation API while trying to show (but not track) the user location. */ /** * Fired on each Geolocation API position update which returned as success. * * @event geolocate * @memberof GeolocateControl * @instance * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * @example * // Initialize the geolocate control. * var geolocate = new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * }); * // Add the control to the map. * map.addControl(geolocate); * // Set an event listener that fires * // when a geolocate event occurs. * geolocate.on('geolocate', function() { * console.log('A geolocate event has occurred.') * }); * */ /** * Fired on each Geolocation API position update which returned as an error. * * @event error * @memberof GeolocateControl * @instance * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * @example * // Initialize the geolocate control. * var geolocate = new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * }); * // Add the control to the map. * map.addControl(geolocate); * // Set an event listener that fires * // when an error event occurs. * geolocate.on('error', function() { * console.log('An error event has occurred.') * }); * */ /** * Fired on each Geolocation API position update which returned as success but user position is out of map maxBounds. * * @event outofmaxbounds * @memberof GeolocateControl * @instance * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) or [Geolocation.watchPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition). * @example * // Initialize the geolocate control. * var geolocate = new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * }); * // Add the control to the map. * map.addControl(geolocate); * // Set an event listener that fires * // when an outofmaxbounds event occurs. * geolocate.on('outofmaxbounds', function() { * console.log('An outofmaxbounds event has occurred.') * }); * */ /** * Fired when the Geolocate Control changes to the active lock state, which happens either upon first obtaining a successful Geolocation API position for the user (a geolocate event will follow), or the user clicks the geolocate button when in the background state which uses the last known position to recenter the map and enter active lock state (no geolocate event will follow unless the users's location changes). * * @event trackuserlocationstart * @memberof GeolocateControl * @instance * @example * // Initialize the geolocate control. * var geolocate = new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * }); * // Add the control to the map. * map.addControl(geolocate); * // Set an event listener that fires * // when a trackuserlocationstart event occurs. * geolocate.on('trackuserlocationstart', function() { * console.log('A trackuserlocationstart event has occurred.') * }); * */ /** * Fired when the Geolocate Control changes to the background state, which happens when a user changes the camera during an active position lock. This only applies when trackUserLocation is true. In the background state, the dot on the map will update with location updates but the camera will not. * * @event trackuserlocationend * @memberof GeolocateControl * @instance * @example * // Initialize the geolocate control. * var geolocate = new mapboxgl.GeolocateControl({ * positionOptions: { * enableHighAccuracy: true * }, * trackUserLocation: true * }); * // Add the control to the map. * map.addControl(geolocate); * // Set an event listener that fires * // when a trackuserlocationend event occurs. * geolocate.on('trackuserlocationend', function() { * console.log('A trackuserlocationend event has occurred.') * }); * */ // var defaultOptions$4 = { maxWidth: 100, unit: 'metric' }; /** * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground. * * @implements {IControl} * @param {Object} [options] * @param {number} [options.maxWidth='100'] The maximum length of the scale control in pixels. * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`). * @example * var scale = new mapboxgl.ScaleControl({ * maxWidth: 80, * unit: 'imperial' * }); * map.addControl(scale); * * scale.setUnit('metric'); */ var ScaleControl = function ScaleControl(options ) { this.options = performance.extend({}, defaultOptions$4, options); performance.bindAll([ '_onMove', 'setUnit' ], this); }; ScaleControl.prototype.getDefaultPosition = function getDefaultPosition () { return 'bottom-left'; }; ScaleControl.prototype._onMove = function _onMove () { updateScale(this._map, this._container, this.options); }; ScaleControl.prototype.onAdd = function onAdd (map ) { this._map = map; this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); this._map.on('move', this._onMove); this._onMove(); return this._container; }; ScaleControl.prototype.onRemove = function onRemove () { DOM.remove(this._container); this._map.off('move', this._onMove); this._map = (undefined ); }; /** * Set the scale's unit of the distance * * @param unit Unit of the distance (`'imperial'`, `'metric'` or `'nautical'`). */ ScaleControl.prototype.setUnit = function setUnit (unit ) { this.options.unit = unit; updateScale(this._map, this._container, this.options); }; function updateScale(map, container, options) { // A horizontal scale is imagined to be present at center of the map // container with maximum length (Default) as 100px. // Using spherical law of cosines approximation, the real distance is // found between the two coordinates. var maxWidth = options && options.maxWidth || 100; var centerPoint = map.project(map.crs.getLngLatCenter()); var left = map.unproject([centerPoint.x, centerPoint.y]); var right = map.unproject([centerPoint.x + maxWidth, centerPoint.y]); if (right.lng === left.lng) { right = map.unproject([centerPoint.x - maxWidth, centerPoint.y]); } var maxMeters = left.distanceTo(right); // The real distance corresponding to 100px scale length is rounded off to // near pretty number and the scale length for the same is found out. // Default unit of the scale is based on User's locale. if (options && options.unit === 'imperial') { var maxFeet = 3.2808 * maxMeters; if (maxFeet > 5280) { var maxMiles = maxFeet / 5280; setScale(container, maxWidth, maxMiles, map._getUIString('ScaleControl.Miles')); } else { setScale(container, maxWidth, maxFeet, map._getUIString('ScaleControl.Feet')); } } else if (options && options.unit === 'nautical') { var maxNauticals = maxMeters / 1852; setScale(container, maxWidth, maxNauticals, map._getUIString('ScaleControl.NauticalMiles')); } else if (maxMeters >= 1000) { setScale(container, maxWidth, maxMeters / 1000, map._getUIString('ScaleControl.Kilometers')); } else { setScale(container, maxWidth, maxMeters, map._getUIString('ScaleControl.Meters')); } } function setScale(container, maxWidth, maxDistance, unit) { var distance = getRoundNum(maxDistance); var ratio = distance / maxDistance; container.style.width = (maxWidth * ratio) + "px"; container.innerHTML = distance + " " + unit; } function getDecimalRoundNum(d) { var multiplier = Math.pow(10, Math.ceil(-Math.log(d) / Math.LN10)); return Math.round(d * multiplier) / multiplier; } function getRoundNum(num) { var pow10 = Math.pow(10, (("" + (Math.floor(num)))).length - 1); var d = num / pow10; d = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : d >= 1 ? 1 : getDecimalRoundNum(d); return pow10 * d; } // /** * A `FullscreenControl` control contains a button for toggling the map in and out of fullscreen mode. * * @implements {IControl} * @param {Object} [options] * @param {HTMLElement} [options.container] `container` is the [compatible DOM element](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullScreen#Compatible_elements) which should be made full screen. By default, the map container element will be made full screen. * * @example * map.addControl(new mapboxgl.FullscreenControl({container: document.querySelector('body')})); * @see [View a fullscreen map](https://www.mapbox.com/mapbox-gl-js/example/fullscreen/) */ var FullscreenControl = function FullscreenControl(options ) { this._fullscreen = false; if (options && options.container) { if (options.container instanceof performance.window.HTMLElement) { this._container = options.container; } else { performance.warnOnce('Full screen control \'container\' must be a DOM element.'); } } performance.bindAll([ '_onClickFullscreen', '_changeIcon' ], this); if ('onfullscreenchange' in performance.window.document) { this._fullscreenchange = 'fullscreenchange'; } else if ('onmozfullscreenchange' in performance.window.document) { this._fullscreenchange = 'mozfullscreenchange'; } else if ('onwebkitfullscreenchange' in performance.window.document) { this._fullscreenchange = 'webkitfullscreenchange'; } else if ('onmsfullscreenchange' in performance.window.document) { this._fullscreenchange = 'MSFullscreenChange'; } }; FullscreenControl.prototype.onAdd = function onAdd (map ) { this._map = map; if (!this._container) { this._container = this._map.getContainer(); } this._controlContainer = DOM.create('div', "mapboxgl-ctrl mapboxgl-ctrl-group"); if (this._checkFullscreenSupport()) { this._setupUI(); } else { this._controlContainer.style.display = 'none'; performance.warnOnce('This device does not support fullscreen mode.'); } return this._controlContainer; }; FullscreenControl.prototype.onRemove = function onRemove () { DOM.remove(this._controlContainer); this._map = (null ); performance.window.document.removeEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._checkFullscreenSupport = function _checkFullscreenSupport () { return !!( performance.window.document.fullscreenEnabled || (performance.window.document ).mozFullScreenEnabled || (performance.window.document ).msFullscreenEnabled || (performance.window.document ).webkitFullscreenEnabled ); }; FullscreenControl.prototype._setupUI = function _setupUI () { var button = this._fullscreenButton = DOM.create('button', ("mapboxgl-ctrl-fullscreen"), this._controlContainer); DOM.create('span', "mapboxgl-ctrl-icon", button).setAttribute('aria-hidden', true); button.type = 'button'; this._updateTitle(); this._fullscreenButton.addEventListener('click', this._onClickFullscreen); performance.window.document.addEventListener(this._fullscreenchange, this._changeIcon); }; FullscreenControl.prototype._updateTitle = function _updateTitle () { var title = this._getTitle(); this._fullscreenButton.setAttribute("aria-label", title); this._fullscreenButton.title = title; }; FullscreenControl.prototype._getTitle = function _getTitle () { return this._map._getUIString(this._isFullscreen() ? 'FullscreenControl.Exit' : 'FullscreenControl.Enter'); }; FullscreenControl.prototype._isFullscreen = function _isFullscreen () { return this._fullscreen; }; FullscreenControl.prototype._changeIcon = function _changeIcon () { var fullscreenElement = performance.window.document.fullscreenElement || (performance.window.document ).mozFullScreenElement || (performance.window.document ).webkitFullscreenElement || (performance.window.document ).msFullscreenElement; if ((fullscreenElement === this._container) !== this._fullscreen) { this._fullscreen = !this._fullscreen; this._fullscreenButton.classList.toggle("mapboxgl-ctrl-shrink"); this._fullscreenButton.classList.toggle("mapboxgl-ctrl-fullscreen"); this._updateTitle(); } }; FullscreenControl.prototype._onClickFullscreen = function _onClickFullscreen () { if (this._isFullscreen()) { if (performance.window.document.exitFullscreen) { (performance.window.document ).exitFullscreen(); } else if (performance.window.document.mozCancelFullScreen) { (performance.window.document ).mozCancelFullScreen(); } else if (performance.window.document.msExitFullscreen) { (performance.window.document ).msExitFullscreen(); } else if (performance.window.document.webkitCancelFullScreen) { (performance.window.document ).webkitCancelFullScreen(); } } else if (this._container.requestFullscreen) { this._container.requestFullscreen(); } else if ((this._container ).mozRequestFullScreen) { (this._container ).mozRequestFullScreen(); } else if ((this._container ).msRequestFullscreen) { (this._container ).msRequestFullscreen(); } else if ((this._container ).webkitRequestFullscreen) { (this._container ).webkitRequestFullscreen(); } }; // var defaultOptions$5 = { closeButton: true, closeOnClick: true, className: '', maxWidth: "240px", showArrow: true, contentClass: null }; /** * A popup component. * * @param {Object} [options] * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the * top right corner of the popup. * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the * map is clicked. * @param {boolean} [options.closeOnMove=false] If `true`, the popup will closed when the * map moves. * @param {string} [options.anchor] - A string indicating the part of the Popup that should * be positioned closest to the coordinate set via {@link Popup#setLngLat}. * Options are `'center'`, `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be * dynamically set to ensure the popup falls within the map container with a preference * for `'bottom'`. * @param {number|PointLike|Object} [options.offset] - * A pixel offset applied to the popup's location specified as: * - a single number specifying a distance from the popup's location * - a {@link PointLike} specifying a constant offset * - an object of {@link Point}s specifing an offset for each anchor position * Negative offsets indicate left and up. * @param {string} [options.className] Space-separated CSS class names to add to popup container * @param {string} [options.maxWidth='240px'] - * A string that sets the CSS property of the popup's maximum width, eg `'300px'`. * To ensure the popup resizes to fit its content, set this property to `'none'`. * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width * @example * var markerHeight = 50, markerRadius = 10, linearOffset = 25; * var popupOffsets = { * 'top': [0, 0], * 'top-left': [0,0], * 'top-right': [0,0], * 'bottom': [0, -markerHeight], * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], * 'left': [markerRadius, (markerHeight - markerRadius) * -1], * 'right': [-markerRadius, (markerHeight - markerRadius) * -1] * }; * var popup = new mapboxgl.Popup({offset: popupOffsets, className: 'my-class'}) * .setLngLat(e.lngLat) * .setHTML("

Hello World!

") * .setMaxWidth("300px") * .addTo(map); * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Attach a popup to a marker instance](https://www.mapbox.com/mapbox-gl-js/example/set-popup/) */ var Popup = /*@__PURE__*/(function (Evented) { function Popup(options ) { Evented.call(this); this.options = performance.extend(Object.create(defaultOptions$5), options); performance.bindAll(['_update', '_onClose', 'remove', '_onMouseMove', '_onMouseUp', '_onDrag'], this); } if ( Evented ) Popup.__proto__ = Evented; Popup.prototype = Object.create( Evented && Evented.prototype ); Popup.prototype.constructor = Popup; /** * Adds the popup to a map. * * @param {Map} map The Mapbox GL JS map to add the popup to. * @returns {Popup} `this` * @example * new mapboxgl.Popup() * .setLngLat([0, 0]) * .setHTML("

Null Island

") * .addTo(map); * @see [Display a popup](https://docs.mapbox.com/mapbox-gl-js/example/popup/) * @see [Display a popup on hover](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Show polygon information on click](https://docs.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/) */ Popup.prototype.addTo = function addTo (map ) { if (this._map) { this.remove(); } this._map = map; if (this.options.closeOnClick) { this._map.on('click', this._onClose); } if (this.options.closeOnMove) { this._map.on('move', this._onClose); } this._map.on('remove', this.remove); this._update(); if (this._trackPointer) { this._map.on('mousemove', this._onMouseMove); this._map.on('mouseup', this._onMouseUp); if (this._container) { this._container.classList.add('mapboxgl-popup-track-pointer'); } this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); } else { this._map.on('move', this._update); } /** * Fired when the popup is opened manually or programatically. * * @event open * @memberof Popup * @instance * @type {Object} * @property {Popup} popup object that was opened * * @example * // Create a popup * var popup = new mapboxgl.Popup(); * // Set an event listener that will fire * // any time the popup is opened * popup.on('open', function(){ * console.log('popup was opened'); * }); * */ this.fire(new performance.Event('open')); return this; }; /** * @returns {boolean} `true` if the popup is open, `false` if it is closed. */ Popup.prototype.isOpen = function isOpen () { return !!this._map; }; /** * Removes the popup from the map it has been added to. * * @example * var popup = new mapboxgl.Popup().addTo(map); * popup.remove(); * @returns {Popup} `this` */ Popup.prototype.remove = function remove () { if (this._content) { DOM.remove(this._content); } if (this._container) { DOM.remove(this._container); delete this._container; } if (this._map) { this._map.off('move', this._update); this._map.off('move', this._onClose); this._map.off('click', this._onClose); this._map.off('remove', this.remove); this._map.off('mousemove', this._onMouseMove); this._map.off('mouseup', this._onMouseUp); this._map.off('drag', this._onDrag); delete this._map; } /** * Fired when the popup is closed manually or programatically. * * @event close * @memberof Popup * @instance * @type {Object} * @property {Popup} popup object that was closed * * @example * // Create a popup * var popup = new mapboxgl.Popup(); * // Set an event listener that will fire * // any time the popup is closed * popup.on('close', function(){ * console.log('popup was closed'); * }); * */ this.fire(new performance.Event('close')); return this; }; /** * Returns the geographical location of the popup's anchor. * * The longitude of the result may differ by a multiple of 360 degrees from the longitude previously * set by `setLngLat` because `Popup` wraps the anchor longitude across copies of the world to keep * the popup on screen. * * @returns {LngLat} The geographical location of the popup's anchor. */ Popup.prototype.getLngLat = function getLngLat () { return this._lngLat; }; /** * Sets the geographical location of the popup's anchor, and moves the popup to it. Replaces trackPointer() behavior. * * @param lnglat The geographical location to set as the popup's anchor. * @returns {Popup} `this` */ Popup.prototype.setLngLat = function setLngLat (lnglat ) { this._lngLat = performance.LngLat.convert(lnglat); this._pos = null; this._trackPointer = false; this._update(); if (this._map) { this._map.on('move', this._update); this._map.off('mousemove', this._onMouseMove); if (this._container) { this._container.classList.remove('mapboxgl-popup-track-pointer'); } this._map._canvasContainer.classList.remove('mapboxgl-track-pointer'); } return this; }; /** * Tracks the popup anchor to the cursor position on screens with a pointer device (it will be hidden on touchscreens). Replaces the `setLngLat` behavior. * For most use cases, set `closeOnClick` and `closeButton` to `false`. * @example * var popup = new mapboxgl.Popup({ closeOnClick: false, closeButton: false }) * .setHTML("

Hello World!

") * .trackPointer() * .addTo(map); * @returns {Popup} `this` */ Popup.prototype.trackPointer = function trackPointer () { this._trackPointer = true; this._pos = null; this._update(); if (this._map) { this._map.off('move', this._update); this._map.on('mousemove', this._onMouseMove); this._map.on('drag', this._onDrag); if (this._container) { this._container.classList.add('mapboxgl-popup-track-pointer'); } this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); } return this; }; /** * Returns the `Popup`'s HTML element. * @example * // Change the `Popup` element's font size * var popup = new mapboxgl.Popup() * .setLngLat([-96, 37.8]) * .setHTML("

Hello World!

") * .addTo(map); * var popupElem = popup.getElement(); * popupElem.style.fontSize = "25px"; * @returns {HTMLElement} element */ Popup.prototype.getElement = function getElement () { return this._container; }; /** * Sets the popup's content to a string of text. * * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM, * so it cannot insert raw HTML. Use this method for security against XSS * if the popup content is user-provided. * * @param text Textual content for the popup. * @returns {Popup} `this` * @example * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setText('Hello, world!') * .addTo(map); */ Popup.prototype.setText = function setText (text ) { return this.setDOMContent(performance.window.document.createTextNode(text)); }; /** * Sets the popup's content to the HTML provided as a string. * * This method does not perform HTML filtering or sanitization, and must be * used only with trusted content. Consider {@link Popup#setText} if * the content is an untrusted text string. * * @param html A string representing HTML content for the popup. * @returns {Popup} `this` * @example * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setHTML("

Hello World!

") * .addTo(map); * @see [Display a popup](https://docs.mapbox.com/mapbox-gl-js/example/popup/) * @see [Display a popup on hover](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Attach a popup to a marker instance](https://docs.mapbox.com/mapbox-gl-js/example/set-popup/) */ Popup.prototype.setHTML = function setHTML (html ) { var frag = performance.window.document.createDocumentFragment(); var temp = performance.window.document.createElement('body'); var child; temp.innerHTML = html; while (true) { child = temp.firstChild; if (!child) { break; } frag.appendChild(child); } return this.setDOMContent(frag); }; /** * Returns the popup's maximum width. * * @returns {string} The maximum width of the popup. */ Popup.prototype.getMaxWidth = function getMaxWidth () { return this._container && this._container.style.maxWidth; }; /** * Sets the popup's maximum width. This is setting the CSS property `max-width`. * Available values can be found here: https://developer.mozilla.org/en-US/docs/Web/CSS/max-width * * @param maxWidth A string representing the value for the maximum width. * @returns {Popup} `this` */ Popup.prototype.setMaxWidth = function setMaxWidth (maxWidth ) { this.options.maxWidth = maxWidth; this._update(); return this; }; /** * Sets the popup's content to the element provided as a DOM node. * * @param htmlNode A DOM node to be used as content for the popup. * @returns {Popup} `this` * @example * // create an element with the popup content * var div = window.document.createElement('div'); * div.innerHTML = 'Hello, world!'; * var popup = new mapboxgl.Popup() * .setLngLat(e.lngLat) * .setDOMContent(div) * .addTo(map); */ Popup.prototype.setDOMContent = function setDOMContent (htmlNode ) { this._createContent(); this._content.appendChild(htmlNode); this._update(); return this; }; /** * Adds a CSS class to the popup container element. * * @param {string} className Non-empty string with CSS class name to add to popup container * * @example * let popup = new mapboxgl.Popup() * popup.addClassName('some-class') */ Popup.prototype.addClassName = function addClassName (className ) { if (this._container) { this._container.classList.add(className); } }; /** * Removes a CSS class from the popup container element. * * @param {string} className Non-empty string with CSS class name to remove from popup container * * @example * let popup = new mapboxgl.Popup() * popup.removeClassName('some-class') */ Popup.prototype.removeClassName = function removeClassName (className ) { if (this._container) { this._container.classList.remove(className); } }; /** * Add or remove the given CSS class on the popup container, depending on whether the container currently has that class. * * @param {string} className Non-empty string with CSS class name to add/remove * * @returns {boolean} if the class was removed return false, if class was added, then return true * * @example * let popup = new mapboxgl.Popup() * popup.toggleClassName('toggleClass') */ Popup.prototype.toggleClassName = function toggleClassName (className ) { if (this._container) { return this._container.classList.toggle(className); } }; Popup.prototype._createContent = function _createContent () { if (this._content) { DOM.remove(this._content); } var t = this.options.contentClass ? " " + this.options.contentClass : ""; this._content = DOM.create('div', 'mapboxgl-popup-content'+ t, this._container); // this._content = DOM.create('div', 'mapboxgl-popup-content', this._container); if (this.options.closeButton) { this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content); this._closeButton.type = 'button'; this._closeButton.setAttribute('aria-label', 'Close popup'); this._closeButton.innerHTML = '×'; this._closeButton.addEventListener('click', this._onClose); } }; Popup.prototype._onMouseUp = function _onMouseUp (event ) { this._update(event.point); }; Popup.prototype._onMouseMove = function _onMouseMove (event ) { this._update(event.point); }; Popup.prototype._onDrag = function _onDrag (event ) { this._update(event.point); }; Popup.prototype._update = function _update (cursor ) { var this$1 = this; var hasPosition = this._lngLat || this._trackPointer; if (!this._map || !hasPosition || !this._content) { return; } if (!this._container) { this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); this._container.appendChild(this._content); if (this.options.className) { this.options.className.split(' ').forEach(function (name) { return this$1._container.classList.add(name); }); } if (this._trackPointer) { this._container.classList.add('mapboxgl-popup-track-pointer'); } } if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) { this._container.style.maxWidth = this.options.maxWidth; } if (this._map.transform.renderWorldCopies && !this._trackPointer) { this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); } if (this._trackPointer && !cursor) { return; } var pos = this._pos = this._trackPointer && cursor ? cursor : this._map.project(this._lngLat); var anchor = this.options.anchor; var offset = normalizeOffset(this.options.offset); if (!anchor) { var width = this._container.offsetWidth; var height = this._container.offsetHeight; var anchorComponents; if (pos.y + offset.bottom.y < height) { anchorComponents = ['top']; } else if (pos.y > this._map.transform.height - height) { anchorComponents = ['bottom']; } else { anchorComponents = []; } if (pos.x < width / 2) { anchorComponents.push('left'); } else if (pos.x > this._map.transform.width - width / 2) { anchorComponents.push('right'); } if (anchorComponents.length === 0) { anchor = 'bottom'; } else { anchor = (anchorComponents.join('-') ); } } var offsetedPos = pos.add(offset[anchor]).round(); DOM.setTransform(this._container, ((anchorTranslate[anchor]) + " translate(" + (offsetedPos.x) + "px," + (offsetedPos.y) + "px)")); applyAnchorClass(this._container, anchor, 'popup'); }; Popup.prototype._onClose = function _onClose () { this.remove(); }; return Popup; }(performance.Evented)); function normalizeOffset(offset ) { if (!offset) { return normalizeOffset(new performance.Point(0, 0)); } else if (typeof offset === 'number') { // input specifies a radius from which to calculate offsets at all positions var cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); return { 'center': new performance.Point(0, 0), 'top': new performance.Point(0, offset), 'top-left': new performance.Point(cornerOffset, cornerOffset), 'top-right': new performance.Point(-cornerOffset, cornerOffset), 'bottom': new performance.Point(0, -offset), 'bottom-left': new performance.Point(cornerOffset, -cornerOffset), 'bottom-right': new performance.Point(-cornerOffset, -cornerOffset), 'left': new performance.Point(offset, 0), 'right': new performance.Point(-offset, 0) }; } else if (offset instanceof performance.Point || Array.isArray(offset)) { // input specifies a single offset to be applied to all positions var convertedOffset = performance.Point.convert(offset); return { 'center': convertedOffset, 'top': convertedOffset, 'top-left': convertedOffset, 'top-right': convertedOffset, 'bottom': convertedOffset, 'bottom-left': convertedOffset, 'bottom-right': convertedOffset, 'left': convertedOffset, 'right': convertedOffset }; } else { // input specifies an offset per position return { 'center': performance.Point.convert(offset['center'] || [0, 0]), 'top': performance.Point.convert(offset['top'] || [0, 0]), 'top-left': performance.Point.convert(offset['top-left'] || [0, 0]), 'top-right': performance.Point.convert(offset['top-right'] || [0, 0]), 'bottom': performance.Point.convert(offset['bottom'] || [0, 0]), 'bottom-left': performance.Point.convert(offset['bottom-left'] || [0, 0]), 'bottom-right': performance.Point.convert(offset['bottom-right'] || [0, 0]), 'left': performance.Point.convert(offset['left'] || [0, 0]), 'right': performance.Point.convert(offset['right'] || [0, 0]) }; } } // var exported = { proj4: performance.proj4, version: performance.version, supported: mapboxGlSupported, setRTLTextPlugin: performance.setRTLTextPlugin, getRTLTextPluginStatus: performance.getRTLTextPluginStatus, Map: Map, NavigationControl: NavigationControl, GeolocateControl: GeolocateControl, AttributionControl: AttributionControl, ScaleControl: ScaleControl, FullscreenControl: FullscreenControl, Popup: Popup, Marker: Marker, Style: Style, CRS: CRS, LngLat: performance.LngLat, LngLatBounds: performance.LngLatBounds, Point: performance.Point, MercatorCoordinate: performance.MercatorCoordinate, Evented: performance.Evented, config: performance.config, /** * Initializes resources like WebWorkers that can be shared across maps to lower load * times in some situations. `mapboxgl.workerUrl` and `mapboxgl.workerCount`, if being * used, must be set before `prewarm()` is called to have an effect. * * By default, the lifecycle of these resources is managed automatically, and they are * lazily initialized when a Map is first created. By invoking `prewarm()`, these * resources will be created ahead of time, and will not be cleared when the last Map * is removed from the page. This allows them to be re-used by new Map instances that * are created later. They can be manually cleared by calling * `mapboxgl.clearPrewarmedResources()`. This is only necessary if your web page remains * active but stops using maps altogether. * * This is primarily useful when using GL-JS maps in a single page app, wherein a user * would navigate between various views that can cause Map instances to constantly be * created and destroyed. * * @function prewarm * @example * mapboxgl.prewarm() */ prewarm: prewarm, /** * Clears up resources that have previously been created by `mapboxgl.prewarm()`. * Note that this is typically not necessary. You should only call this function * if you expect the user of your app to not return to a Map view at any point * in your application. * * @function clearPrewarmedResources * @example * mapboxgl.clearPrewarmedResources() */ clearPrewarmedResources: clearPrewarmedResources, /** * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/). * * @var {string} accessToken * @returns {string} The currently set access token. * @example * mapboxgl.accessToken = myAccessToken; * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) */ get accessToken() { return performance.config.ACCESS_TOKEN; }, set accessToken(token ) { performance.config.ACCESS_TOKEN = token; }, /** * Gets and sets the map's default API URL for requesting tiles, styles, sprites, and glyphs * * @var {string} baseApiUrl * @returns {string} The current base API URL. * @example * mapboxgl.baseApiUrl = 'https://api.mapbox.com'; */ get baseApiUrl() { return performance.config.API_URL; }, set baseApiUrl(url ) { performance.config.API_URL = url; }, /** * Gets and sets the number of web workers instantiated on a page with GL JS maps. * By default, it is set to half the number of CPU cores (capped at 6). * Make sure to set this property before creating any map instances for it to have effect. * * @var {string} workerCount * @returns {number} Number of workers currently configured. * @example * mapboxgl.workerCount = 2; */ get workerCount() { return WorkerPool.workerCount; }, set workerCount(count ) { WorkerPool.workerCount = count; }, /** * Gets and sets the maximum number of images (raster tiles, sprites, icons) to load in parallel, * which affects performance in raster-heavy maps. 16 by default. * * @var {string} maxParallelImageRequests * @returns {number} Number of parallel requests currently configured. * @example * mapboxgl.maxParallelImageRequests = 10; */ get maxParallelImageRequests() { return performance.config.MAX_PARALLEL_IMAGE_REQUESTS; }, set maxParallelImageRequests(numRequests ) { performance.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests; }, /** * Clears browser storage used by this library. Using this method flushes the Mapbox tile * cache that is managed by this library. Tiles may still be cached by the browser * in some cases. * * This API is supported on browsers where the [`Cache` API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) * is supported and enabled. This includes all major browsers when pages are served over * `https://`, except Internet Explorer and Edge Mobile. * * When called in unsupported browsers or environments (private or incognito mode), the * callback will be called with an error argument. * * @function clearStorage * @param {Function} callback Called with an error argument if there is an error. * @example * mapboxgl.clearStorage(); */ clearStorage: function clearStorage(callback ) { performance.clearTileCache(callback); }, workerUrl: '' }; //This gets automatically stripped out in production builds. Debug.extend(exported, {isSafari: performance.isSafari, getPerformanceMetrics: performance.PerformanceUtils.getPerformanceMetrics}); // canary assert: used to confirm that asserts have been removed from production build performance.assert(true, 'canary assert'); return exported; }); // if (window) { window.mapboxgl =mapboxgl; } return mapboxgl; }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwYm94LWdsLWVuaGFuY2UtZGV2LmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYXNzZXJ0L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9hc3NlcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC91bml0YmV6aWVyL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCIuLi9zcmMvdXRpbC9icm93c2VyL3dpbmRvdy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvZGVlcF9lcXVhbC5qcyIsIi4uL3NyYy91dGlsL3V0aWwuanMiLCIuLi9zcmMvdXRpbC9icm93c2VyLmpzIiwiLi4vc3JjL3V0aWwvY29uZmlnLmpzIiwiLi4vc3JjL3V0aWwvd2VicF9zdXBwb3J0ZWQuanMiLCIuLi9zcmMvdXRpbC9za3VfdG9rZW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2dsb2JhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29uc3RhbnRzL3ZhbHVlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29uc3RhbnRzL1ByaW1lTWVyaWRpYW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbnN0YW50cy91bml0cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvbWF0Y2guanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2pTdHJpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvd2t0LXBhcnNlci9wYXJzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvd2t0LXBhcnNlci9wcm9jZXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3drdC1wYXJzZXIvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2RlZnMuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3BhcnNlQ29kZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvZXh0ZW5kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vbXNmbnouanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9zaWduLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vYWRqdXN0X2xvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL3RzZm56LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vcGhpMnouanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL21lcmMuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL2xvbmdsYXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb25zdGFudHMvRWxsaXBzb2lkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9kZXJpdmVDb25zdGFudHMuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbnN0YW50cy9EYXR1bS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvZGF0dW0uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL25hZGdyaWQuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL1Byb2ouanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2RhdHVtVXRpbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2RhdHVtX3RyYW5zZm9ybS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvYWRqdXN0X2F4aXMuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi90b1BvaW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jaGVja1Nhbml0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvdHJhbnNmb3JtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb3JlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21ncnMvbWdycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvUG9pbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9wal9lbmZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vcGpfbWxmbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL3BqX2ludl9tbGZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy90bWVyYy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL3NpbmguanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9oeXBvdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL2xvZzFweS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL2FzaW5oeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL2dhdGcuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9jbGVucy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL2Nvc2guanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9jbGVuc19jbXBseC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvcHJvamVjdGlvbnMvZXRtZXJjLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vYWRqdXN0X3pvbmUuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL3V0bS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL3NyYXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL2dhdXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9zdGVyZWEuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL3N0ZXJlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9zb21lcmMuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL29tZXJjLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9sY2MuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL2tyb3Zhay5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL21sZm4uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9lMGZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vZTFmbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL2UyZm4uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9lM2ZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vZ04uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9hZGp1c3RfbGF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9jb21tb24vaW1sZm4uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL2Nhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9xc2Zuei5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvcHJvamVjdGlvbnMvbGFlYS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvY29tbW9uL2FzaW56LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9hZWEuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL2dub20uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL2NvbW1vbi9pcXNmbnouanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL2NlYS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvcHJvamVjdGlvbnMvZXFjLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9wb2x5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9uem1nLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9taWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9zaW51LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9tb2xsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9lcWRjLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy92YW5kZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvcHJvamVjdGlvbnMvYWVxZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvcHJvamVjdGlvbnMvb3J0aG8uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL3FzYy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9qNC9saWIvcHJvamVjdGlvbnMvcm9iaW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL2dlb2NlbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvajQvbGliL3Byb2plY3Rpb25zL3RwZXJzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9nZW9zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L3Byb2pzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb2o0L2xpYi9pbmRleC5qcyIsIi4uL3NyYy91dGlsL21hcGJveC5qcyIsIi4uL3NyYy91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyIsIi4uL3NyYy91dGlsL29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydGVkLmpzIiwiLi4vc3JjL3V0aWwvYWpheC5qcyIsIi4uL25vZGVfbW9kdWxlcy9ncmlkLWluZGV4L2dyaWQtaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvY3NzY29sb3JwYXJzZXIvY3NzY29sb3JwYXJzZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9leHRlbmQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3Njb3BlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvY29sbGF0b3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3ZhbHVlcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGl0ZXJhbC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vcnVudGltZV9lcnJvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9mb3JtYXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2ltYWdlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2VyY2lvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZXZhbHVhdGlvbl9jb250ZXh0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb2xsYXRvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvd2l0aGluLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pc19jb25zdGFudC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvdmFyLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9wYXJzaW5nX2NvbnRleHQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3N0b3BzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zdGVwLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvY29sb3Jfc3BhY2VzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29hbGVzY2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2xldC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvYXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2luLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbmRleF9vZi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbWF0Y2guanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Nhc2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3NsaWNlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jb21wYXJpc29uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9udW1iZXJfZm9ybWF0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9sZW5ndGguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9yZXN1bHQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2dldF90eXBlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZnVuY3Rpb24vaW5kZXguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzIiwiLi4vc3JjL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyIsIi4uL3NyYy91dGlsL2ltYWdlLmpzIiwiLi4vc3JjL3V0aWwvZXZlbnRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfb2JqZWN0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfYXJyYXkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9udW1iZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9mdW5jdGlvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9ib29sZWFuLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfY29sb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9lbnVtLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXIvaW5kZXguanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9maWx0ZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9wcm9wZXJ0eS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9zdHJpbmcuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9zb3VyY2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9saWdodC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Zvcm1hdHRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2ltYWdlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfc3RyaW5nb2JqZWN0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9nbHlwaHNfdXJsLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGVfc3R5bGUubWluLmpzIiwiLi4vc3JjL3N0eWxlL3ZhbGlkYXRlX3N0eWxlLmpzIiwiLi4vc3JjL3N0eWxlL3pvb21faGlzdG9yeS5qcyIsIi4uL3NyYy91dGlsL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jay5qcyIsIi4uL3NyYy91dGlsL3NjcmlwdF9kZXRlY3Rpb24uanMiLCIuLi9zcmMvc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyIsIi4uL3NyYy9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMiLCIuLi9zcmMvc3R5bGUvcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy91dGlsL3N0cnVjdF9hcnJheS5qcyIsIi4uL3NyYy9kYXRhL2FycmF5X3R5cGVzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2NpcmNsZV9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL2RhdGEvc2VnbWVudC5qcyIsIi4uL3NyYy9zaGFkZXJzL2VuY29kZV9hdHRyaWJ1dGUuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvcGF0dGVybl9hdHRyaWJ1dGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL211cm11cmhhc2gtanMvbXVybXVyaGFzaDNfZ2MuanMiLCIuLi9ub2RlX21vZHVsZXMvbXVybXVyaGFzaC1qcy9tdXJtdXJoYXNoMl9nYy5qcyIsIi4uL25vZGVfbW9kdWxlcy9tdXJtdXJoYXNoLWpzL2luZGV4LmpzIiwiLi4vc3JjL2RhdGEvZmVhdHVyZV9wb3NpdGlvbl9tYXAuanMiLCIuLi9zcmMvcmVuZGVyL3VuaWZvcm1fYmluZGluZy5qcyIsIi4uL3NyYy9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyIsIi4uL3NyYy9kYXRhL2luZGV4X2FycmF5X3R5cGUuanMiLCIuLi9zcmMvZGF0YS9leHRlbnQuanMiLCIuLi9zcmMvZGF0YS9sb2FkX2dlb21ldHJ5LmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMiLCIuLi9zcmMvc3R5bGUvcXVlcnlfdXRpbHMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9jb21tb24uanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0MmQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0NC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWM0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vcXVhdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3F1YXQyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMi5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvaGVhdG1hcF9idWNrZXQuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3V0aWwvY29sb3JfcmFtcC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2F0dHJpYnV0ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvZWFyY3V0L3NyYy9lYXJjdXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcXVpY2tzZWxlY3QvaW5kZXguanMiLCIuLi9zcmMvdXRpbC9jbGFzc2lmeV9yaW5ncy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9wYXR0ZXJuX2J1Y2tldF9mZWF0dXJlcy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2J1Y2tldC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL18vQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCIuLi9zcmMvXy9AbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCIuLi9zcmMvXy9AbWFwYm94L3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlLmpzIiwiLi4vc3JjL18vQG1hcGJveC92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9saW5lX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9hdHRyaWJ1dGVzX2V4dC5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9zeW1ib2xfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9zeW1ib2wvdHJhbnNmb3JtX3RleHQuanMiLCIuLi9zcmMvc3ltYm9sL21lcmdlbGluZXMuanMiLCIuLi9zcmMvdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi5qcyIsIi4uL3NyYy9zeW1ib2wvb25lX2VtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlL3BhcnNlX2dseXBoX3BiZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3RwYWNrL2luZGV4Lm1qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfYXRsYXMuanMiLCIuLi9zcmMvc3ltYm9sL3NoYXBpbmcuanMiLCIuLi9zcmMvc3ltYm9sL2FuY2hvci5qcyIsIi4uL3NyYy9zeW1ib2wvc3ltYm9sX3NpemUuanMiLCIuLi9zcmMvc3ltYm9sL2NoZWNrX21heF9hbmdsZS5qcyIsIi4uL3NyYy9zeW1ib2wvZ2V0X2FuY2hvcnMuanMiLCIuLi9zcmMvc3ltYm9sL2NsaXBfbGluZS5qcyIsIi4uL3NyYy9zeW1ib2wvcXVhZHMuanMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3RpbnlxdWV1ZS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2ZpbmRfcG9sZV9vZl9pbmFjY2Vzc2liaWxpdHkuanMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9sYXlvdXQuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyIsIi4uL3NyYy91dGlsL3Jlc29sdmVfdG9rZW5zLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL2Zvcm1hdF9zZWN0aW9uX292ZXJyaWRlLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlL2NyZWF0ZV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9yZW5kZXIvdGV4dHVyZS5qcyIsIi4uL3NyYy91dGlsL3Rocm90dGxlZF9pbnZva2VyLmpzIiwiLi4vc3JjL3V0aWwvYWN0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC93aG9vdHMtanMvaW5kZXgubWpzIiwiLi4vc3JjL2dlby9sbmdfbGF0X2JvdW5kcy5qcyIsIi4uL3NyYy9nZW8vbG5nX2xhdC5qcyIsIi4uL3NyYy9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9pZC5qcyIsIi4uL3NyYy9kYXRhL2RlbV9kYXRhLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0LmpzIiwiLi4vc3JjL3V0aWwvZGljdGlvbmFyeV9jb2Rlci5qcyIsIi4uL3NyYy91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbi5qcyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlX3N0YXRlLmpzIiwiLi4vc3JjL2RhdGEvZmVhdHVyZV9pbmRleC5qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvcmVmX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvdXRpbC9wZXJmb3JtYW5jZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2dyb3VwX2J5X2xheW91dC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllcl9pbmRleC5qcyIsIi4uL3NyYy9yZW5kZXIvZ2x5cGhfYXRsYXMuanMiLCIuLi9zcmMvc291cmNlL3dvcmtlcl90aWxlLmpzIiwiLi4vc3JjL3NvdXJjZS92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfd29ya2VyX3NvdXJjZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L2dlb2pzb24tcmV3aW5kL2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9nZW9qc29uX3dyYXBwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy92dC1wYmYvbGliL2dlb2pzb25fd3JhcHBlci5qcyIsIi4uL25vZGVfbW9kdWxlcy92dC1wYmYvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy9zb3J0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvcmFuZ2UuanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy93aXRoaW4uanMiLCIuLi9ub2RlX21vZHVsZXMva2RidXNoL3NyYy9pbmRleC5qcyIsIi4uL3NyYy9fL3N1cGVyY2x1c3Rlci9pbmRleC5qcyIsIi4uL3NyYy9fL2dlb2pzb24tdnQvc3JjL3NpbXBsaWZ5LmpzIiwiLi4vc3JjL18vZ2VvanNvbi12dC9zcmMvZmVhdHVyZS5qcyIsIi4uL3NyYy9fL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCIuLi9zcmMvXy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwiLi4vc3JjL18vZ2VvanNvbi12dC9zcmMvd3JhcC5qcyIsIi4uL3NyYy9fL2dlb2pzb24tdnQvc3JjL3RyYW5zZm9ybS5qcyIsIi4uL3NyYy9fL2dlb2pzb24tdnQvc3JjL3RpbGUuanMiLCIuLi9zcmMvXy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIi4uL3NyYy9zb3VyY2UvZ2VvanNvbl93b3JrZXJfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS93b3JrZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkL2luZGV4LmpzIiwiLi4vc3JjL3V0aWwvZG9tLmpzIiwiLi4vc3JjL3N0eWxlL2xvYWRfc3ByaXRlLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2ltYWdlLmpzIiwiLi4vc3JjL3JlbmRlci9pbWFnZV9tYW5hZ2VyLmpzIiwiLi4vc3JjL3JlbmRlci9pbWFnZV9tYW5hZ2VyX2ZhY3RvcnkuanMiLCIuLi9zcmMvc3R5bGUvbG9hZF9nbHlwaF9yYW5nZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3Rpbnktc2RmL2luZGV4LmpzIiwiLi4vc3JjL3JlbmRlci9nbHlwaF9tYW5hZ2VyLmpzIiwiLi4vc3JjL3JlbmRlci9nbHlwaF9tYW5hZ2VyX2ZhY3RvcnkuanMiLCIuLi9zcmMvc3R5bGUvbGlnaHQuanMiLCIuLi9zcmMvcmVuZGVyL2xpbmVfYXRsYXMuanMiLCIuLi9zcmMvdXRpbC9kaXNwYXRjaGVyLmpzIiwiLi4vc3JjL3NvdXJjZS9sb2FkX3RpbGVqc29uLmpzIiwiLi4vc3JjL3NvdXJjZS90aWxlX2JvdW5kcy5qcyIsIi4uL3NyYy9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fc291cmNlLmpzIiwiLi4vc3JjL2RhdGEvcmFzdGVyX2JvdW5kc19hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL3NvdXJjZS9pbWFnZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3ZpZGVvX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvY2FudmFzX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2Uvc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9xdWVyeV9mZWF0dXJlcy5qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9jYWNoZS5qcyIsIi4uL3NyYy9nbC9pbmRleF9idWZmZXIuanMiLCIuLi9zcmMvZ2wvdmVydGV4X2J1ZmZlci5qcyIsIi4uL3NyYy9nbC92YWx1ZS5qcyIsIi4uL3NyYy9nbC9mcmFtZWJ1ZmZlci5qcyIsIi4uL3NyYy9nbC9kZXB0aF9tb2RlLmpzIiwiLi4vc3JjL2dsL3N0ZW5jaWxfbW9kZS5qcyIsIi4uL3NyYy9nbC9jb2xvcl9tb2RlLmpzIiwiLi4vc3JjL2dsL2N1bGxfZmFjZV9tb2RlLmpzIiwiLi4vc3JjL2dsL2NvbnRleHQuanMiLCIuLi9zcmMvc291cmNlL3NvdXJjZV9jYWNoZS5qcyIsIi4uL3NyYy91dGlsL2Jyb3dzZXIvd2ViX3dvcmtlci5qcyIsIi4uL3NyYy91dGlsL3dvcmtlcl9wb29sLmpzIiwiLi4vc3JjL3V0aWwvZ2xvYmFsX3dvcmtlcl9wb29sLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZGVyZWYuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9lbXB0eS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2RpZmYuanMiLCIuLi9zcmMvc3ltYm9sL3BhdGhfaW50ZXJwb2xhdG9yLmpzIiwiLi4vc3JjL3N5bWJvbC9ncmlkX2luZGV4LmpzIiwiLi4vc3JjL3N5bWJvbC9wcm9qZWN0aW9uLmpzIiwiLi4vc3JjL3N5bWJvbC9jb2xsaXNpb25faW5kZXguanMiLCIuLi9zcmMvc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzIiwiLi4vc3JjL3N5bWJvbC9wbGFjZW1lbnQuanMiLCIuLi9zcmMvc3R5bGUvcGF1c2VhYmxlX3BsYWNlbWVudC5qcyIsIi4uL3NyYy9zeW1ib2wvY3Jvc3NfdGlsZV9zeW1ib2xfaW5kZXguanMiLCIuLi9zcmMvc3R5bGUvc3R5bGUuanMiLCIuLi9zcmMvZGF0YS9wb3NfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9zaGFkZXJzL3NoYWRlcnMuanMiLCIuLi9zcmMvcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QuanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vcGF0dGVybi5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9maWxsX2V4dHJ1c2lvbl9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2ZpbGxfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jb2xsaXNpb25fcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9kZWJ1Z19wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NsaXBwaW5nX21hc2tfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vaGlsbHNoYWRlX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vbGluZV9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3N5bWJvbF9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2NvbGxpc2lvbl9kZWJ1Zy5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19zeW1ib2wuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY2lyY2xlLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2hlYXRtYXAuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfbGluZS5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19maWxsLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2ZpbGxfZXh0cnVzaW9uLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2hpbGxzaGFkZS5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19yYXN0ZXIuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfYmFja2dyb3VuZC5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19kZWJ1Zy5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19jdXN0b20uanMiLCIuLi9zcmMvcmVuZGVyL3BhaW50ZXIuanMiLCIuLi9zcmMvdXRpbC9wcmltaXRpdmVzLmpzIiwiLi4vc3JjL2dlby9lZGdlX2luc2V0cy5qcyIsIi4uL3NyYy9nZW8vdHJhbnNmb3JtLmpzIiwiLi4vc3JjL3V0aWwvdGhyb3R0bGUuanMiLCIuLi9zcmMvdWkvaGFzaC5qcyIsIi4uL3NyYy91aS9oYW5kbGVyX2luZXJ0aWEuanMiLCIuLi9zcmMvdWkvZXZlbnRzLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvbWFwX2V2ZW50LmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvYm94X3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9oYW5kbGVyX3V0aWwuanMiLCIuLi9zcmMvdWkvaGFuZGxlci90YXBfcmVjb2duaXplci5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3RhcF96b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvbW91c2UuanMiLCIuLi9zcmMvdWkvaGFuZGxlci90b3VjaF9wYW4uanMiLCIuLi9zcmMvdWkvaGFuZGxlci90b3VjaF96b29tX3JvdGF0ZS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL2tleWJvYXJkLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2Nyb2xsX3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9zaGltL2RibGNsaWNrX3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9jbGlja196b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdGFwX2RyYWdfem9vbS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3NoaW0vZHJhZ19wYW4uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9zaGltL2RyYWdfcm90YXRlLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS90b3VjaF96b29tX3JvdGF0ZS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyX21hbmFnZXIuanMiLCIuLi9zcmMvdXRpbC9kZWJ1Zy5qcyIsIi4uL3NyYy91aS9jYW1lcmEuanMiLCIuLi9zcmMvdWkvY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvbG9nb19jb250cm9sLmpzIiwiLi4vc3JjL3V0aWwvdGFza19xdWV1ZS5qcyIsIi4uL3NyYy9nZW8vY3JzX2NoZWNrLmpzIiwiLi4vc3JjL2dlby9jcnMuanMiLCIuLi9zcmMvdWkvZGVmYXVsdF9sb2NhbGUuanMiLCIuLi9zcmMvdWkvbWFwLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sLmpzIiwiLi4vc3JjL3V0aWwvc21hcnRfd3JhcC5qcyIsIi4uL3NyYy91aS9hbmNob3IuanMiLCIuLi9zcmMvdWkvbWFya2VyLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZ2VvbG9jYXRlX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvY29udHJvbC9zY2FsZV9jb250cm9sLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZnVsbHNjcmVlbl9jb250cm9sLmpzIiwiLi4vc3JjL3VpL3BvcHVwLmpzIiwiLi4vc3JjL2luZGV4LmpzIiwiLi4vcm9sbHVwL21hcGJveGdsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIGNvbXBhcmUgYW5kIGlzQnVmZmVyIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvYmxvYi82ODBlOWU1ZTQ4OGYyMmFhYzI3NTk5YTU3ZGM4NDRhNjMxNTkyOGRkL2luZGV4LmpzXG4vLyBvcmlnaW5hbCBub3RpY2U6XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiB0eXBlb2YgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGIpO1xuICB9XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xufVxuXG4vLyBiYXNlZCBvbiBub2RlIGFzc2VydCwgb3JpZ2luYWwgbm90aWNlOlxuLy8gTkI6IFRoZSBVUkwgdG8gdGhlIENvbW1vbkpTIHNwZWMgaXMga2VwdCBqdXN0IGZvciB0cmFkaXRpb24uXG4vLyAgICAgbm9kZS1hc3NlcnQgaGFzIGV2b2x2ZWQgYSBsb3Qgc2luY2UgdGhlbiwgYm90aCBpbiBBUEkgYW5kIGJlaGF2aW9yLlxuXG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbn0oKSk7XG5mdW5jdGlvbiBwVG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG59XG5mdW5jdGlvbiBpc1ZpZXcoYXJyYnVmKSB7XG4gIGlmIChpc0J1ZmZlcihhcnJidWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO1xuICB9XG4gIGlmICghYXJyYnVmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnJidWYgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChhcnJidWYuYnVmZmVyICYmIGFycmJ1Zi5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87XG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL2Jsb2IvYWRlZWVlYzhiZmNjNjA2OGIxODdkN2Q5ZmIzZDViYjFkM2EzMDg5OS9pbXBsZW1lbnRhdGlvbi5qc1xuZnVuY3Rpb24gZ2V0TmFtZShmdW5jKSB7XG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMpIHtcbiAgICByZXR1cm4gZnVuYy5uYW1lO1xuICB9XG4gIHZhciBzdHIgPSBmdW5jLnRvU3RyaW5nKCk7XG4gIHZhciBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBnZXROYW1lKHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMgfHwgIXV0aWwuaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWwuaW5zcGVjdChzb21ldGhpbmcpO1xuICB9XG4gIHZhciByYXduYW1lID0gZ2V0TmFtZShzb21ldGhpbmcpO1xuICB2YXIgbmFtZSA9IHJhd25hbWUgPyAnOiAnICsgcmF3bmFtZSA6ICcnO1xuICByZXR1cm4gJ1tGdW5jdGlvbicgKyAgbmFtZSArICddJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmFjdHVhbCksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuZXhwZWN0ZWQpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGRlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBTdHJpY3RFcXVhbCcsIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoKGFjdHVhbCA9PT0gbnVsbCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyBJZiBib3RoIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mIHR5cGVkIGFycmF5cywgd3JhcCB0aGVpciB1bmRlcmx5aW5nXG4gIC8vIEFycmF5QnVmZmVycyBpbiBhIEJ1ZmZlciBlYWNoIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlXG4gIC8vIFRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIHRoZSBhcnJheXMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGNoZWNrZWQgYnlcbiAgLy8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAoYWthIHBUb1N0cmluZykuIE5ldmVyIHBlcmZvcm0gYmluYXJ5XG4gIC8vIGNvbXBhcmlzb25zIGZvciBGbG9hdCpBcnJheXMsIHRob3VnaCwgc2luY2UgZS5nLiArMCA9PT0gLTAgYnV0IHRoZWlyXG4gIC8vIGJpdCBwYXR0ZXJucyBhcmUgbm90IGlkZW50aWNhbC5cbiAgfSBlbHNlIGlmIChpc1ZpZXcoYWN0dWFsKSAmJiBpc1ZpZXcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgcFRvU3RyaW5nKGFjdHVhbCkgPT09IHBUb1N0cmluZyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgICAgICAgYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSkge1xuICAgIHJldHVybiBjb21wYXJlKG5ldyBVaW50OEFycmF5KGFjdHVhbC5idWZmZXIpLFxuICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGV4cGVjdGVkLmJ1ZmZlcikpID09PSAwO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAhPT0gaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG1lbW9zID0gbWVtb3MgfHwge2FjdHVhbDogW10sIGV4cGVjdGVkOiBbXX07XG5cbiAgICB2YXIgYWN0dWFsSW5kZXggPSBtZW1vcy5hY3R1YWwuaW5kZXhPZihhY3R1YWwpO1xuICAgIGlmIChhY3R1YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gbWVtb3MuZXhwZWN0ZWQuaW5kZXhPZihleHBlY3RlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb3MuYWN0dWFsLnB1c2goYWN0dWFsKTtcbiAgICBtZW1vcy5leHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcblxuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSB7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5mdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBTdHJpY3RFcXVhbCcsIG5vdERlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn1cblxuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWdub3JlLiAgVGhlIGluc3RhbmNlb2YgY2hlY2sgZG9lc24ndCB3b3JrIGZvciBhcnJvdyBmdW5jdGlvbnMuXG4gIH1cblxuICBpZiAoRXJyb3IuaXNQcm90b3R5cGVPZihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3RyeUJsb2NrKGJsb2NrKSB7XG4gIHZhciBlcnJvcjtcbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHR5cGVvZiBibG9jayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYmxvY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIGFjdHVhbCA9IF90cnlCbG9jayhibG9jayk7XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICB2YXIgdXNlclByb3ZpZGVkTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJztcbiAgdmFyIGlzVW53YW50ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgdXRpbC5pc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyhmYWxzZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHRocm93IGVycjsgfTtcblxuLy8gRXhwb3NlIGEgc3RyaWN0IG9ubHkgdmFyaWFudCBvZiBhc3NlcnRcbmZ1bmN0aW9uIHN0cmljdCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBzdHJpY3QpO1xufVxuYXNzZXJ0LnN0cmljdCA9IG9iamVjdEFzc2lnbihzdHJpY3QsIGFzc2VydCwge1xuICBlcXVhbDogYXNzZXJ0LnN0cmljdEVxdWFsLFxuICBkZWVwRXF1YWw6IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwsXG4gIG5vdEVxdWFsOiBhc3NlcnQubm90U3RyaWN0RXF1YWwsXG4gIG5vdERlZXBFcXVhbDogYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbFxufSk7XG5hc3NlcnQuc3RyaWN0LnN0cmljdCA9IGFzc2VydC5zdHJpY3Q7XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuIiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSXG4gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUlxuICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sXG4gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIFBvcnRlZCBmcm9tIFdlYmtpdFxuICogaHR0cDovL3N2bi53ZWJraXQub3JnL3JlcG9zaXRvcnkvd2Via2l0L3RydW5rL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1VuaXRCZXppZXIuaFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gVW5pdEJlemllcjtcblxuZnVuY3Rpb24gVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBvbHlub21pYWwgY29lZmZpY2llbnRzLCBpbXBsaWNpdCBmaXJzdCBhbmQgbGFzdCBjb250cm9sIHBvaW50cyBhcmUgKDAsMCkgYW5kICgxLDEpLlxuICAgIHRoaXMuY3ggPSAzLjAgKiBwMXg7XG4gICAgdGhpcy5ieCA9IDMuMCAqIChwMnggLSBwMXgpIC0gdGhpcy5jeDtcbiAgICB0aGlzLmF4ID0gMS4wIC0gdGhpcy5jeCAtIHRoaXMuYng7XG5cbiAgICB0aGlzLmN5ID0gMy4wICogcDF5O1xuICAgIHRoaXMuYnkgPSAzLjAgKiAocDJ5IC0gcDF5KSAtIHRoaXMuY3k7XG4gICAgdGhpcy5heSA9IDEuMCAtIHRoaXMuY3kgLSB0aGlzLmJ5O1xuXG4gICAgdGhpcy5wMXggPSBwMXg7XG4gICAgdGhpcy5wMXkgPSBwMnk7XG4gICAgdGhpcy5wMnggPSBwMng7XG4gICAgdGhpcy5wMnkgPSBwMnk7XG59XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlWCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAvLyBgYXggdF4zICsgYnggdF4yICsgY3ggdCcgZXhwYW5kZWQgdXNpbmcgSG9ybmVyJ3MgcnVsZS5cbiAgICByZXR1cm4gKCh0aGlzLmF4ICogdCArIHRoaXMuYngpICogdCArIHRoaXMuY3gpICogdDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlWSA9IGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gKCh0aGlzLmF5ICogdCArIHRoaXMuYnkpICogdCArIHRoaXMuY3kpICogdDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgzLjAgKiB0aGlzLmF4ICogdCArIDIuMCAqIHRoaXMuYngpICogdCArIHRoaXMuY3g7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZUN1cnZlWCA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICBpZiAodHlwZW9mIGVwc2lsb24gPT09ICd1bmRlZmluZWQnKSBlcHNpbG9uID0gMWUtNjtcblxuICAgIHZhciB0MCwgdDEsIHQyLCB4MiwgaTtcblxuICAgIC8vIEZpcnN0IHRyeSBhIGZldyBpdGVyYXRpb25zIG9mIE5ld3RvbidzIG1ldGhvZCAtLSBub3JtYWxseSB2ZXJ5IGZhc3QuXG4gICAgZm9yICh0MiA9IHgsIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cbiAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0MikgLSB4O1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIpIDwgZXBzaWxvbikgcmV0dXJuIHQyO1xuXG4gICAgICAgIHZhciBkMiA9IHRoaXMuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWCh0Mik7XG4gICAgICAgIGlmIChNYXRoLmFicyhkMikgPCAxZS02KSBicmVhaztcblxuICAgICAgICB0MiA9IHQyIC0geDIgLyBkMjtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJpc2VjdGlvbiBtZXRob2QgZm9yIHJlbGlhYmlsaXR5LlxuICAgIHQwID0gMC4wO1xuICAgIHQxID0gMS4wO1xuICAgIHQyID0geDtcblxuICAgIGlmICh0MiA8IHQwKSByZXR1cm4gdDA7XG4gICAgaWYgKHQyID4gdDEpIHJldHVybiB0MTtcblxuICAgIHdoaWxlICh0MCA8IHQxKSB7XG5cbiAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0Mik7XG4gICAgICAgIGlmIChNYXRoLmFicyh4MiAtIHgpIDwgZXBzaWxvbikgcmV0dXJuIHQyO1xuXG4gICAgICAgIGlmICh4ID4geDIpIHtcbiAgICAgICAgICAgIHQwID0gdDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0MSA9IHQyO1xuICAgICAgICB9XG5cbiAgICAgICAgdDIgPSAodDEgLSB0MCkgKiAwLjUgKyB0MDtcbiAgICB9XG5cbiAgICAvLyBGYWlsdXJlLlxuICAgIHJldHVybiB0Mjtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlID0gZnVuY3Rpb24oeCwgZXBzaWxvbikge1xuICAgIHJldHVybiB0aGlzLnNhbXBsZUN1cnZlWSh0aGlzLnNvbHZlQ3VydmVYKHgsIGVwc2lsb24pKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKlxuICogQSBzdGFuZGFsb25lIHBvaW50IGdlb21ldHJ5IHdpdGggdXNlZnVsIGFjY2Vzc29yLCBjb21wYXJpc29uLCBhbmRcbiAqIG1vZGlmaWNhdGlvbiBtZXRob2RzLlxuICpcbiAqIEBjbGFzcyBQb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IHggdGhlIHgtY29vcmRpbmF0ZS4gdGhpcyBjb3VsZCBiZSBsb25naXR1ZGUgb3Igc2NyZWVuXG4gKiBwaXhlbHMsIG9yIGFueSBvdGhlciBzb3J0IG9mIHVuaXQuXG4gKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlLiB0aGlzIGNvdWxkIGJlIGxhdGl0dWRlIG9yIHNjcmVlblxuICogcGl4ZWxzLCBvciBhbnkgb3RoZXIgc29ydCBvZiB1bml0LlxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludCA9IG5ldyBQb2ludCgtNzcsIDM4KTtcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbn1cblxuUG9pbnQucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgdGhpcyBwb2ludCwgcmV0dXJuaW5nIGEgbmV3IHBvaW50IHRoYXQgY2FuIGJlIG1vZGlmaWVkXG4gICAgICogd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9sZCBvbmUuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHRoZSBjbG9uZVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIHRvIGFub3RoZXIgcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgdG8gZnJvbSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBzdWI6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0QnlQb2ludDogICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgZGl2QnlQb2ludDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2QnlQb2ludChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBhIGZhY3RvcixcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBrIGZhY3RvclxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IGEgZmFjdG9yLFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IGsgZmFjdG9yXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIGRpdjogICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGspOyB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcG9pbnQgYXJvdW5kIHRoZSAwLCAwIG9yaWdpbiBieSBhbiBhbmdsZSBhLFxuICAgICAqIGdpdmVuIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYSBhbmdsZSB0byByb3RhdGUgYXJvdW5kLCBpbiByYWRpYW5zXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcG9pbnQgYXJvdW5kIHAgcG9pbnQgYnkgYW4gYW5nbGUgYSxcbiAgICAgKiBnaXZlbiBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGEgYW5nbGUgdG8gcm90YXRlIGFyb3VuZCwgaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgUG9pbnQgdG8gcm90YXRlIGFyb3VuZFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICByb3RhdGVBcm91bmQ6ICBmdW5jdGlvbihhLHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlQXJvdW5kKGEscCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0aGlzIHBvaW50IGJ5IGEgNHgxIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPn0gbSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgbWF0TXVsdDogZnVuY3Rpb24obSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KG0pOyB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoaXMgcG9pbnQgYnV0IGFzIGEgdW5pdCB2ZWN0b3IgZnJvbSAwLCAwLCBtZWFuaW5nXG4gICAgICogdGhhdCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcmVzdWx0aW5nIHBvaW50IHRvIHRoZSAwLCAwXG4gICAgICogY29vcmRpbmF0ZSB3aWxsIGJlIGVxdWFsIHRvIDEgYW5kIHRoZSBhbmdsZSBmcm9tIHRoZSByZXN1bHRpbmdcbiAgICAgKiBwb2ludCB0byB0aGUgMCwgMCBjb29yZGluYXRlIHdpbGwgYmUgdGhlIHNhbWUgYXMgYmVmb3JlLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSB1bml0IHZlY3RvciBwb2ludFxuICAgICAqL1xuICAgIHVuaXQ6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIGEgcGVycGVuZGljdWxhciBwb2ludCwgd2hlcmUgdGhlIG5ldyB5IGNvb3JkaW5hdGVcbiAgICAgKiBpcyB0aGUgb2xkIHggY29vcmRpbmF0ZSBhbmQgdGhlIG5ldyB4IGNvb3JkaW5hdGUgaXMgdGhlIG9sZCB5XG4gICAgICogY29vcmRpbmF0ZSBtdWx0aXBsaWVkIGJ5IC0xXG4gICAgICogQHJldHVybiB7UG9pbnR9IHBlcnBlbmRpY3VsYXIgcG9pbnRcbiAgICAgKi9cbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGlzIHBvaW50IHdpdGggdGhlIHggJiB5IGNvb3JkaW5hdGVzXG4gICAgICogcm91bmRlZCB0byBpbnRlZ2Vycy5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcm91bmRlZCBwb2ludFxuICAgICAqL1xuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBtYWdpdHVkZSBvZiB0aGlzIHBvaW50OiB0aGlzIGlzIHRoZSBFdWNsaWRlYW5cbiAgICAgKiBkaXN0YW5jZSBmcm9tIHRoZSAwLCAwIGNvb3JkaW5hdGUgdG8gdGhpcyBwb2ludCdzIHggYW5kIHlcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IG1hZ25pdHVkZVxuICAgICAqL1xuICAgIG1hZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSnVkZ2Ugd2hldGhlciB0aGlzIHBvaW50IGlzIGVxdWFsIHRvIGFub3RoZXIgcG9pbnQsIHJldHVybmluZ1xuICAgICAqIHRydWUgb3IgZmFsc2UuXG4gICAgICogQHBhcmFtIHtQb2ludH0gb3RoZXIgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gd2hldGhlciB0aGUgcG9pbnRzIGFyZSBlcXVhbFxuICAgICAqL1xuICAgIGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gb3RoZXIueCAmJlxuICAgICAgICAgICAgICAgdGhpcy55ID09PSBvdGhlci55O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50XG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQsXG4gICAgICogd2l0aG91dCB0aGUgc3F1YXJlIHJvb3Qgc3RlcC4gVXNlZnVsIGlmIHlvdSdyZSBjb21wYXJpbmdcbiAgICAgKiByZWxhdGl2ZSBkaXN0YW5jZXMuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgZGlzdFNxcjogZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB0aGlzLngsXG4gICAgICAgICAgICBkeSA9IHAueSAtIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFuZ2xlIGZyb20gdGhlIDAsIDAgY29vcmRpbmF0ZSB0byB0aGlzIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgICAqL1xuICAgIGFuZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFuZ2xlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gYiB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGVUbzogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnkgLSBiLnksIHRoaXMueCAtIGIueCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCBhbm90aGVyIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gYiB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGVXaXRoOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChiLngsIGIueSk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICogRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvclxuICAgICAqIHRoZSBjcm9zcyBwcm9kdWN0IGEgeCBiID0gfGF8fGJ8c2luKM64KSBmb3IgzrguXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHggdGhlIHgtY29vcmRpbmF0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBhbmdsZSBpbiByYWRpYW5zXG4gICAgICovXG4gICAgYW5nbGVXaXRoU2VwOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgdGhpcy54ICogeSAtIHRoaXMueSAqIHgsXG4gICAgICAgICAgICB0aGlzLnggKiB4ICsgdGhpcy55ICogeSk7XG4gICAgfSxcblxuICAgIF9tYXRNdWx0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZhciB4ID0gbVswXSAqIHRoaXMueCArIG1bMV0gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gbVsyXSAqIHRoaXMueCArIG1bM10gKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCArPSBwLng7XG4gICAgICAgIHRoaXMueSArPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAtPSBwLng7XG4gICAgICAgIHRoaXMueSAtPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdDogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggKj0gaztcbiAgICAgICAgdGhpcy55ICo9IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAvPSBrO1xuICAgICAgICB0aGlzLnkgLz0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0QnlQb2ludDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKj0gcC54O1xuICAgICAgICB0aGlzLnkgKj0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdkJ5UG9pbnQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC89IHAueDtcbiAgICAgICAgdGhpcy55IC89IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF91bml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGl2KHRoaXMubWFnKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3BlcnA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy54O1xuICAgICAgICB0aGlzLnggPSAteTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGU6IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gY29zICogdGhpcy54IC0gc2luICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IHNpbiAqIHRoaXMueCArIGNvcyAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGVBcm91bmQ6IGZ1bmN0aW9uKGFuZ2xlLCBwKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gcC54ICsgY29zICogKHRoaXMueCAtIHAueCkgLSBzaW4gKiAodGhpcy55IC0gcC55KSxcbiAgICAgICAgICAgIHkgPSBwLnkgKyBzaW4gKiAodGhpcy54IC0gcC54KSArIGNvcyAqICh0aGlzLnkgLSBwLnkpO1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcG9pbnQgZnJvbSBhbiBhcnJheSBpZiBuZWNlc3NhcnksIG90aGVyd2lzZSBpZiB0aGUgaW5wdXRcbiAqIGlzIGFscmVhZHkgYSBQb2ludCwgb3IgYW4gdW5rbm93biB0eXBlLCByZXR1cm4gaXQgdW5jaGFuZ2VkXG4gKiBAcGFyYW0ge0FycmF5PE51bWJlcj58UG9pbnR8Kn0gYSBhbnkga2luZCBvZiBpbnB1dCB2YWx1ZVxuICogQHJldHVybiB7UG9pbnR9IGNvbnN0cnVjdGVkIHBvaW50LCBvciBwYXNzZWQtdGhyb3VnaCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKiAvLyB0aGlzXG4gKiB2YXIgcG9pbnQgPSBQb2ludC5jb252ZXJ0KFswLCAxXSk7XG4gKiAvLyBpcyBlcXVpdmFsZW50IHRvXG4gKiB2YXIgcG9pbnQgPSBuZXcgUG9pbnQoMCwgMSk7XG4gKi9cblBvaW50LmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmIChhIGluc3RhbmNlb2YgUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYVswXSwgYVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbiIsIi8vIEBmbG93XG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbmltcG9ydCB0eXBlIHtXaW5kb3d9IGZyb20gJy4uLy4uL3R5cGVzL3dpbmRvdyc7XG5cbi8vIHNoaW0gd2luZG93IGZvciB0aGUgY2FzZSBvZiByZXF1aXJpbmcgdGhlIGJyb3dzZXIgYnVuZGxlIGluIE5vZGVcbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IChzZWxmOiBXaW5kb3cpIDogKCh7fTogYW55KTogV2luZG93KTtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogRGVlcGx5IGNvbXBhcmVzIHR3byBvYmplY3QgbGl0ZXJhbHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVlcEVxdWFsKGE6ID9taXhlZCwgYjogP21peGVkKTogYm9vbGVhbiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgYSAhPT0gbnVsbCAmJiBiICE9PSBudWxsKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiBiID09PSAnb2JqZWN0JykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZXBFcXVhbDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBVbml0QmV6aWVyIGZyb20gJ0BtYXBib3gvdW5pdGJlemllcic7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuXG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcblxuLy8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgbm90IGF2YWlsYWJsZSBpbiBJRVxuZXhwb3J0IGNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG4vKipcbiAqIEBtb2R1bGUgdXRpbFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIEdpdmVuIGEgdmFsdWUgYHRgIHRoYXQgdmFyaWVzIGJldHdlZW4gMCBhbmQgMSwgcmV0dXJuXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHRoYXQgZWFzZXMgYmV0d2VlbiAwIGFuZCAxIGluIGEgcGxlYXNpbmdcbiAqIGN1YmljIGluLW91dCBmYXNoaW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlYXNlQ3ViaWNJbk91dCh0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0IDw9IDApIHJldHVybiAwO1xuICAgIGlmICh0ID49IDEpIHJldHVybiAxO1xuICAgIGNvbnN0IHQyID0gdCAqIHQsXG4gICAgICAgIHQzID0gdDIgKiB0O1xuICAgIHJldHVybiA0ICogKHQgPCAwLjUgPyB0MyA6IDMgKiAodCAtIHQyKSArIHQzIC0gMC43NSk7XG59XG5cbi8qKlxuICogR2l2ZW4gZ2l2ZW4gKHgsIHkpLCAoeDEsIHkxKSBjb250cm9sIHBvaW50cyBmb3IgYSBiZXppZXIgY3VydmUsXG4gKiByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGludGVycG9sYXRlcyBhbG9uZyB0aGF0IGN1cnZlLlxuICpcbiAqIEBwYXJhbSBwMXggY29udHJvbCBwb2ludCAxIHggY29vcmRpbmF0ZVxuICogQHBhcmFtIHAxeSBjb250cm9sIHBvaW50IDEgeSBjb29yZGluYXRlXG4gKiBAcGFyYW0gcDJ4IGNvbnRyb2wgcG9pbnQgMiB4IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMnkgY29udHJvbCBwb2ludCAyIHkgY29vcmRpbmF0ZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllcihwMXg6IG51bWJlciwgcDF5OiBudW1iZXIsIHAyeDogbnVtYmVyLCBwMnk6IG51bWJlcik6ICh0OiBudW1iZXIpID0+IG51bWJlciB7XG4gICAgY29uc3QgYmV6aWVyID0gbmV3IFVuaXRCZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBiZXppZXIuc29sdmUodCk7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBBIGRlZmF1bHQgYmV6aWVyLWN1cnZlIHBvd2VyZWQgZWFzaW5nIGZ1bmN0aW9uIHdpdGhcbiAqIGNvbnRyb2wgcG9pbnRzICgwLjI1LCAwLjEpIGFuZCAoMC4yNSwgMSlcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgZWFzZSA9IGJlemllcigwLjI1LCAwLjEsIDAuMjUsIDEpO1xuXG4vKipcbiAqIGNvbnN0cmFpbiBuIHRvIHRoZSBnaXZlbiByYW5nZSB2aWEgbWluICsgbWF4XG4gKlxuICogQHBhcmFtIG4gdmFsdWVcbiAqIEBwYXJhbSBtaW4gdGhlIG1pbmltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHRoZSBjbGFtcGVkIHZhbHVlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAobjogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xufVxuXG4vKipcbiAqIGNvbnN0cmFpbiBuIHRvIHRoZSBnaXZlbiByYW5nZSwgZXhjbHVkaW5nIHRoZSBtaW5pbXVtLCB2aWEgbW9kdWxhciBhcml0aG1ldGljXG4gKlxuICogQHBhcmFtIG4gdmFsdWVcbiAqIEBwYXJhbSBtaW4gdGhlIG1pbmltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWQsIGV4Y2x1c2l2ZVxuICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZCwgaW5jbHVzaXZlXG4gKiBAcmV0dXJucyBjb25zdHJhaW5lZCBudW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKG46IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBkID0gbWF4IC0gbWluO1xuICAgIGNvbnN0IHcgPSAoKG4gLSBtaW4pICUgZCArIGQpICUgZCArIG1pbjtcbiAgICByZXR1cm4gKHcgPT09IG1pbikgPyBtYXggOiB3O1xufVxuXG4vKlxuICogQ2FsbCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgYXJndW1lbnRzLFxuICogY2FsbGluZyBgY2FsbGJhY2tgIHdpdGggdGhlIGNvbXBsZXRlZCByZXN1bHRzIG9mIGFsbCBjYWxscy5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgaW5wdXQgdG8gZWFjaCBjYWxsIG9mIHRoZSBhc3luYyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBhbiBhc3luYyBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAoZGF0YSwgY2FsbGJhY2spXG4gKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsYmFjayBydW4gYWZ0ZXIgYWxsIGFzeW5jIHdvcmsgaXMgZG9uZS5cbiAqIGNhbGxlZCB3aXRoIGFuIGFycmF5LCBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIGVhY2ggYXN5bmMgY2FsbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3luY0FsbDxJdGVtLCBSZXN1bHQ+KFxuICAgIGFycmF5OiBBcnJheTxJdGVtPixcbiAgICBmbjogKGl0ZW06IEl0ZW0sIGZuQ2FsbGJhY2s6IENhbGxiYWNrPFJlc3VsdD4pID0+IHZvaWQsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PFJlc3VsdD4+XG4pIHtcbiAgICBpZiAoIWFycmF5Lmxlbmd0aCkgeyByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pOyB9XG4gICAgbGV0IHJlbWFpbmluZyA9IGFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5KGFycmF5Lmxlbmd0aCk7XG4gICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICBhcnJheS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGZuKGl0ZW0sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICByZXN1bHRzW2ldID0gKChyZXN1bHQ6IGFueSk6IFJlc3VsdCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMTIzXG4gICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09IDApIGNhbGxiYWNrKGVycm9yLCByZXN1bHRzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBQb2x5ZmlsbCBmb3IgT2JqZWN0LnZhbHVlcy4gTm90IGZ1bGx5IHNwZWMgY29tcGxpYW50LCBidXQgd2UgZG9uJ3RcbiAqIG5lZWQgaXQgdG8gYmUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlczxUPihvYmo6IHtba2V5OiBzdHJpbmddOiBUfSk6IEFycmF5PFQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG9ialtrXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qXG4gKiBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGtleXMgaW4gb25lIG9iamVjdCBhbmQgdGhlIGtleXNcbiAqIGluIGFub3RoZXIgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIGtleXMgZGlmZmVyZW5jZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtleXNEaWZmZXJlbmNlPFMsIFQ+KG9iajoge1trZXk6IHN0cmluZ106IFN9LCBvdGhlcjoge1trZXk6IHN0cmluZ106IFR9KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IFtdO1xuICAgIGZvciAoY29uc3QgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCEoaSBpbiBvdGhlcikpIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2UucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGRlc3RpbmF0aW9uIG9iamVjdCBhbmQgb3B0aW9uYWxseSBtYW55IHNvdXJjZSBvYmplY3RzLFxuICogY29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbi5cbiAqIFRoZSBsYXN0IHNvdXJjZSBvYmplY3QgZ2l2ZW4gb3ZlcnJpZGVzIHByb3BlcnRpZXMgZnJvbSBwcmV2aW91c1xuICogc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gc291cmNlcyBzb3VyY2VzIGZyb20gd2hpY2ggcHJvcGVydGllcyBhcmUgcHVsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKGRlc3Q6IE9iamVjdCwgLi4uc291cmNlczogQXJyYXk8P09iamVjdD4pOiBPYmplY3Qge1xuICAgIGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrIGluIHNyYykge1xuICAgICAgICAgICAgZGVzdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3QgYW5kIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXMgc3RyaW5ncywgcmV0dXJuIHZlcnNpb25cbiAqIG9mIHRoYXQgb2JqZWN0IHdpdGggb25seSB0aG9zZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBzcmMgdGhlIG9iamVjdFxuICogQHBhcmFtIHByb3BlcnRpZXMgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgY2hvc2VuXG4gKiB0byBhcHBlYXIgb24gdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKiBAcmV0dXJucyBvYmplY3Qgd2l0aCBsaW1pdGVkIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvbyA9IHsgbmFtZTogJ0NoYXJsaWUnLCBhZ2U6IDEwIH07XG4gKiB2YXIganVzdE5hbWUgPSBwaWNrKGZvbywgWyduYW1lJ10pO1xuICogLy8ganVzdE5hbWUgPSB7IG5hbWU6ICdDaGFybGllJyB9XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGljayhzcmM6IE9iamVjdCwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPik6IE9iamVjdCB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICBpZiAoayBpbiBzcmMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5sZXQgaWQgPSAxO1xuXG4vKipcbiAqIFJldHVybiBhIHVuaXF1ZSBudW1lcmljIGlkLCBzdGFydGluZyBhdCAxIGFuZCBpbmNyZW1lbnRpbmcgd2l0aFxuICogZWFjaCBjYWxsLlxuICpcbiAqIEByZXR1cm5zIHVuaXF1ZSBudW1lcmljIGlkLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGlkKys7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcmFuZG9tIFVVSUQgKHY0KS4gVGFrZW4gZnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vamVkLzk4Mjg4M1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQoKTogc3RyaW5nIHtcbiAgICBmdW5jdGlvbiBiKGEpIHtcbiAgICAgICAgcmV0dXJuIGEgPyAoYSBeIE1hdGgucmFuZG9tKCkgKiAxNiA+PiBhIC8gNCkudG9TdHJpbmcoMTYpIDpcbiAgICAgICAgLy8kRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSB0aGUgaW1wbGllZCBhcnJheSBsaXRlcmFsIGNvbnZlcnNpb24gaGVyZVxuICAgICAgICAgICAgKFsxZTddICsgLVsxZTNdICsgLTRlMyArIC04ZTMgKyAtMWUxMSkucmVwbGFjZSgvWzAxOF0vZywgYik7XG4gICAgfVxuICAgIHJldHVybiBiKCk7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBhIHBvd2VyIG9mIHR3b1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG93ZXJPZlR3byh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMikgJSAxID09PSAwO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgbmV4dCBwb3dlciBvZiB0d28sIG9yIHRoZSBpbnB1dCB2YWx1ZSBpZiBhbHJlYWR5IGEgcG93ZXIgb2YgdHdvXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFBvd2VyT2ZUd28odmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHZhbHVlIDw9IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLmNlaWwoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHN0cmluZyB0byBtYXRjaCBVVUlEKHY0KSBvZiB0aGVcbiAqIGZvcm06IHh4eHh4eHh4LXh4eHgtNHh4eC1bODlhYl14eHgteHh4eHh4eHh4eHh4XG4gKiBAcGFyYW0gc3RyIHN0cmluZyB0byB2YWxpZGF0ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVV1aWQoc3RyOiA/c3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0ciA/IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzRdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pLnRlc3Qoc3RyKSA6IGZhbHNlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lcyBhcyBzdHJpbmdzLCByZXBsYWNlIGFsbCBvZiB0aGVtXG4gKiB3aXRoIGJvdW5kIHZlcnNpb25zIHRoYXQgd2lsbCBhbHdheXMgcmVmZXIgdG8gYGNvbnRleHRgIGFzIGB0aGlzYC4gVGhpc1xuICogaXMgdXNlZnVsIGZvciBjbGFzc2VzIHdoZXJlIG90aGVyd2lzZSBldmVudCBiaW5kaW5ncyB3b3VsZCByZWFzc2lnblxuICogYHRoaXNgIHRvIHRoZSBldmVudGVkIG9iamVjdCBvciBzb21lIG90aGVyIHZhbHVlOiB0aGlzIGxldHMgeW91IGVuc3VyZVxuICogdGhlIGB0aGlzYCB2YWx1ZSBhbHdheXMuXG4gKlxuICogQHBhcmFtIGZucyBsaXN0IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lc1xuICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBNeUNsYXNzKCkge1xuICogICBiaW5kQWxsKFsnb250aW1lciddLCB0aGlzKTtcbiAqICAgdGhpcy5uYW1lID0gJ1RvbSc7XG4gKiB9XG4gKiBNeUNsYXNzLnByb3RvdHlwZS5vbnRpbWVyID0gZnVuY3Rpb24oKSB7XG4gKiAgIGFsZXJ0KHRoaXMubmFtZSk7XG4gKiB9O1xuICogdmFyIG15Q2xhc3MgPSBuZXcgTXlDbGFzcygpO1xuICogc2V0VGltZW91dChteUNsYXNzLm9udGltZXIsIDEwMCk7XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEFsbChmbnM6IEFycmF5PHN0cmluZz4sIGNvbnRleHQ6IE9iamVjdCk6IHZvaWQge1xuICAgIGZucy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICBpZiAoIWNvbnRleHRbZm5dKSB7IHJldHVybjsgfVxuICAgICAgICBjb250ZXh0W2ZuXSA9IGNvbnRleHRbZm5dLmJpbmQoY29udGV4dCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgc3RyaW5nIGVuZHMgd2l0aCBhIHBhcnRpY3VsYXIgc3Vic3RyaW5nXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZzogc3RyaW5nLCBzdWZmaXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdHJpbmcuaW5kZXhPZihzdWZmaXgsIHN0cmluZy5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9iamVjdCBieSBtYXBwaW5nIGFsbCB0aGUgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdCB3aGlsZVxuICogcHJlc2VydmluZyB0aGVpciBrZXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPYmplY3QoaW5wdXQ6IE9iamVjdCwgaXRlcmF0b3I6IEZ1bmN0aW9uLCBjb250ZXh0PzogT2JqZWN0KTogT2JqZWN0IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICBvdXRwdXRba2V5XSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IGJ5IGZpbHRlcmluZyBvdXQgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0KGlucHV0OiBPYmplY3QsIGl0ZXJhdG9yOiBGdW5jdGlvbiwgY29udGV4dD86IE9iamVjdCk6IE9iamVjdCB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KSkge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBpbnB1dFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5cbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2RlZXBfZXF1YWwnO1xuZXhwb3J0IHtkZWVwRXF1YWx9O1xuXG4vKipcbiAqIERlZXBseSBjbG9uZXMgdHdvIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lPFQ+KGlucHV0OiBUKTogVCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoY2xvbmUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkge1xuICAgICAgICByZXR1cm4gKChtYXBPYmplY3QoaW5wdXQsIGNsb25lKTogYW55KTogVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0d28gYXJyYXlzIGhhdmUgYXQgbGVhc3Qgb25lIGNvbW1vbiBlbGVtZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheXNJbnRlcnNlY3Q8VD4oYTogQXJyYXk8VD4sIGI6IEFycmF5PFQ+KTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBhLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChiLmluZGV4T2YoYVtsXSkgPj0gMCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQcmludCBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY29uc29sZSBhbmQgZW5zdXJlIGR1cGxpY2F0ZSB3YXJuaW5nIG1lc3NhZ2VzXG4gKiBhcmUgbm90IHByaW50ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd2Fybk9uY2VIaXN0b3J5OiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PbmNlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdKSB7XG4gICAgICAgIC8vIGNvbnNvbGUgaXNuJ3QgZGVmaW5lZCBpbiBzb21lIFdlYldvcmtlcnMsIHNlZSAjMjU1OFxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdID0gdHJ1ZTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGlmIHRoZSBwcm92aWRlZCBQb2ludHMgYXJlIGluIGEgY291bnRlciBjbG9ja3dpc2UgKHRydWUpIG9yIGNsb2Nrd2lzZSAoZmFsc2UpIG9yZGVyXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHRydWUgZm9yIGEgY291bnRlciBjbG9ja3dpc2Ugc2V0IG9mIHBvaW50c1xuICovXG4vLyBodHRwOi8vYnJ5Y2Vib2UuY29tLzIwMDYvMTAvMjMvbGluZS1zZWdtZW50LWludGVyc2VjdGlvbi1hbGdvcml0aG0vXG5leHBvcnQgZnVuY3Rpb24gaXNDb3VudGVyQ2xvY2t3aXNlKGE6IFBvaW50LCBiOiBQb2ludCwgYzogUG9pbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGMueSAtIGEueSkgKiAoYi54IC0gYS54KSA+IChiLnkgLSBhLnkpICogKGMueCAtIGEueCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2lnbmVkIGFyZWEgZm9yIHRoZSBwb2x5Z29uIHJpbmcuICBQb3N0aXZlIGFyZWFzIGFyZSBleHRlcmlvciByaW5ncyBhbmRcbiAqIGhhdmUgYSBjbG9ja3dpc2Ugd2luZGluZy4gIE5lZ2F0aXZlIGFyZWFzIGFyZSBpbnRlcmlvciByaW5ncyBhbmQgaGF2ZSBhIGNvdW50ZXIgY2xvY2t3aXNlXG4gKiBvcmRlcmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHJpbmcgRXh0ZXJpb3Igb3IgaW50ZXJpb3IgcmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlU2lnbmVkQXJlYShyaW5nOiBBcnJheTxQb2ludD4pOiBudW1iZXIge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxLCBwMjsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgc3VtICs9IChwMi54IC0gcDEueCkgKiAocDEueSArIHAyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vKipcbiAqIERldGVjdHMgY2xvc2VkIHBvbHlnb25zLCBmaXJzdCArIGxhc3QgcG9pbnQgYXJlIGVxdWFsXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBwb2ludHMgYXJyYXkgb2YgcG9pbnRzXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvaW50cyBhcmUgYSBjbG9zZWQgcG9seWdvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDbG9zZWRQb2x5Z29uKHBvaW50czogQXJyYXk8UG9pbnQ+KTogYm9vbGVhbiB7XG4gICAgLy8gSWYgaXQgaXMgMiBwb2ludHMgdGhhdCBhcmUgdGhlIHNhbWUgdGhlbiBpdCBpcyBhIHBvaW50XG4gICAgLy8gSWYgaXQgaXMgMyBwb2ludHMgd2l0aCBzdGFydCBhbmQgZW5kIHRoZSBzYW1lIHRoZW4gaXQgaXMgYSBsaW5lXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCA0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwMSA9IHBvaW50c1swXTtcbiAgICBjb25zdCBwMiA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoTWF0aC5hYnMocDEueCAtIHAyLngpID4gMCB8fFxuICAgICAgICBNYXRoLmFicyhwMS55IC0gcDIueSkgPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBwb2x5Z29uIHNpbXBsaWZpY2F0aW9uIGNhbiBwcm9kdWNlIHBvbHlnb25zIHdpdGggemVybyBhcmVhIGFuZCBtb3JlIHRoYW4gMyBwb2ludHNcbiAgICByZXR1cm4gTWF0aC5hYnMoY2FsY3VsYXRlU2lnbmVkQXJlYShwb2ludHMpKSA+IDAuMDE7XG59XG5cbi8qKlxuICogQ29udmVydHMgc3BoZXJpY2FsIGNvb3JkaW5hdGVzIHRvIGNhcnRlc2lhbiBjb29yZGluYXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHNwaGVyaWNhbCBTcGhlcmljYWwgY29vcmRpbmF0ZXMsIGluIFtyYWRpYWwsIGF6aW11dGhhbCwgcG9sYXJdXG4gKiBAcmV0dXJuIGNhcnRlc2lhbiBjb29yZGluYXRlcyBpbiBbeCwgeSwgel1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3BoZXJpY2FsVG9DYXJ0ZXNpYW4oW3IsIGF6aW11dGhhbCwgcG9sYXJdOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0ge1xuICAgIC8vIFdlIGFic3RyYWN0IFwibm9ydGhcIi9cInVwXCIgKGNvbXBhc3Mtd2lzZSkgdG8gYmUgMMKwIHdoZW4gcmVhbGx5IHRoaXMgaXMgOTDCsCAoz4AvMik6XG4gICAgLy8gY29ycmVjdCBmb3IgdGhhdCBoZXJlXG4gICAgYXppbXV0aGFsICs9IDkwO1xuXG4gICAgLy8gQ29udmVydCBhemltdXRoYWwgYW5kIHBvbGFyIGFuZ2xlcyB0byByYWRpYW5zXG4gICAgYXppbXV0aGFsICo9IE1hdGguUEkgLyAxODA7XG4gICAgcG9sYXIgKj0gTWF0aC5QSSAvIDE4MDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHIgKiBNYXRoLmNvcyhhemltdXRoYWwpICogTWF0aC5zaW4ocG9sYXIpLFxuICAgICAgICB5OiByICogTWF0aC5zaW4oYXppbXV0aGFsKSAqIE1hdGguc2luKHBvbGFyKSxcbiAgICAgICAgejogciAqIE1hdGguY29zKHBvbGFyKVxuICAgIH07XG59XG5cbi8qIGdsb2JhbCBzZWxmLCBXb3JrZXJHbG9iYWxTY29wZSAqL1xuLyoqXG4gKiAgUmV0dW5zIHRydWUgaWYgdGhlIHdoZW4gcnVuIGluIHRoZSB3ZWItd29ya2VyIGNvbnRleHQuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXb3JrZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgZGF0YSBmcm9tICdDYWNoZS1Db250cm9sJyBoZWFkZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gY2FjaGVDb250cm9sIFZhbHVlIG9mICdDYWNoZS1Db250cm9sJyBoZWFkZXJcbiAqIEByZXR1cm4gb2JqZWN0IGNvbnRhaW5pbmcgcGFyc2VkIGhlYWRlciBpbmZvLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNhY2hlQ29udHJvbChjYWNoZUNvbnRyb2w6IHN0cmluZyk6IE9iamVjdCB7XG4gICAgLy8gVGFrZW4gZnJvbSBbV3JlY2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9oYXBpanMvd3JlY2spXG4gICAgY29uc3QgcmUgPSAvKD86XnwoPzpcXHMqXFwsXFxzKikpKFteXFx4MDAtXFx4MjBcXChcXCk8PkBcXCw7XFw6XFxcXFwiXFwvXFxbXFxdXFw/XFw9XFx7XFx9XFx4N0ZdKykoPzpcXD0oPzooW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKXwoPzpcXFwiKCg/OlteXCJcXFxcXXxcXFxcLikqKVxcXCIpKSk/L2c7XG5cbiAgICBjb25zdCBoZWFkZXIgPSB7fTtcbiAgICBjYWNoZUNvbnRyb2wucmVwbGFjZShyZSwgKCQwLCAkMSwgJDIsICQzKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gJDIgfHwgJDM7XG4gICAgICAgIGhlYWRlclskMV0gPSB2YWx1ZSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB0cnVlO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG5cbiAgICBpZiAoaGVhZGVyWydtYXgtYWdlJ10pIHtcbiAgICAgICAgY29uc3QgbWF4QWdlID0gcGFyc2VJbnQoaGVhZGVyWydtYXgtYWdlJ10sIDEwKTtcbiAgICAgICAgaWYgKGlzTmFOKG1heEFnZSkpIGRlbGV0ZSBoZWFkZXJbJ21heC1hZ2UnXTtcbiAgICAgICAgZWxzZSBoZWFkZXJbJ21heC1hZ2UnXSA9IG1heEFnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyO1xufVxuXG5sZXQgX2lzU2FmYXJpID0gbnVsbDtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiBydW4gaW4gV2ViS2l0IGRlcml2ZWQgYnJvd3NlcnMuXG4gKiBUaGlzIGlzIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGZvciBhIG1lbW9yeSBsZWFrIGluIFNhZmFyaSBjYXVzZWQgYnkgdXNpbmcgVHJhbnNmZXJhYmxlIG9iamVjdHMgdG9cbiAqIHRyYW5zZmVyIGRhdGEgYmV0d2VlbiBXZWJXb3JrZXJzIGFuZCB0aGUgbWFpbiB0aHJlYWQuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvODc3MVxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB0aGUgdW5kZXJseWluZyBTYWZhcmkgaXNzdWUgaXMgZml4ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBzY29wZSB7V2luZG93T3JXb3JrZXJHbG9iYWxTY29wZX0gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggb24gdGhlIG1haW4gdGhyZWFkIGFuZCBXZWJXb3JrZXIgY29udGV4dCxcbiAqICAgICAgbGV0IHRoZSBjYWxsaW5nIHNjb3BlIHBhc3MgaW4gdGhlIGdsb2JhbCBzY29wZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmYXJpKHNjb3BlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoX2lzU2FmYXJpID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdXNlckFnZW50ID0gc2NvcGUubmF2aWdhdG9yID8gc2NvcGUubmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG4gICAgICAgIF9pc1NhZmFyaSA9ICEhc2NvcGUuc2FmYXJpIHx8XG4gICAgICAgICEhKHVzZXJBZ2VudCAmJiAoL1xcYihpUGFkfGlQaG9uZXxpUG9kKVxcYi8udGVzdCh1c2VyQWdlbnQpIHx8ICghIXVzZXJBZ2VudC5tYXRjaCgnU2FmYXJpJykgJiYgIXVzZXJBZ2VudC5tYXRjaCgnQ2hyb21lJykpKSk7XG4gICAgfVxuICAgIHJldHVybiBfaXNTYWZhcmk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9yYWdlQXZhaWxhYmxlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSB3aW5kb3dbdHlwZV07XG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbSgnX21hcGJveF90ZXN0XycsIDEpO1xuICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oJ19tYXBib3hfdGVzdF8nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0Jhc2U2NC9CYXNlNjRfZW5jb2RpbmdfYW5kX2RlY29kaW5nI1RoZV9Vbmljb2RlX1Byb2JsZW1cbi8vVW5pY29kZSBjb21wbGlhbnQgYmFzZTY0IGVuY29kZXIgZm9yIHN0cmluZ3NcbmV4cG9ydCBmdW5jdGlvbiBiNjRFbmNvZGVVbmljb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5idG9hKFxuICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLFxuICAgICAgICAgICAgKG1hdGNoLCBwMSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKE51bWJlcignMHgnICsgcDEpKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICApO1xufVxuXG4vLyBVbmljb2RlIGNvbXBsaWFudCBkZWNvZGVyIGZvciBiYXNlNjQtZW5jb2RlZCBzdHJpbmdzXG5leHBvcnQgZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQod2luZG93LmF0b2Ioc3RyKS5zcGxpdCgnJykubWFwKChjKSA9PiB7XG4gICAgICAgIHJldHVybiAnJScgKyAoJzAwJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgfSkuam9pbignJykpO1xufVxuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xuXG5jb25zdCBub3cgPSB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/XG4gICAgd2luZG93LnBlcmZvcm1hbmNlLm5vdy5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSkgOlxuICAgIERhdGUubm93LmJpbmQoRGF0ZSk7XG5cbmNvbnN0IHJhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuY29uc3QgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbmxldCBsaW5rRWw7XG5cbmxldCByZWR1Y2VkTW90aW9uUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGV4cG9ydGVkID0ge1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgZnVuY3Rpb24gdGhhdCBvdXRwdXRzIG1pbGxpc2Vjb25kczogZWl0aGVyIHBlcmZvcm1hbmNlLm5vdygpXG4gICAgICogb3IgYSBmYWxsYmFjayB0byBEYXRlLm5vdygpXG4gICAgICovXG4gICAgbm93LFxuXG4gICAgZnJhbWUoZm46IChwYWludFN0YXJ0VGltZXN0YW1wOiBudW1iZXIpID0+IHZvaWQpOiBDYW5jZWxhYmxlIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSByYWYoZm4pO1xuICAgICAgICByZXR1cm4ge2NhbmNlbDogKCkgPT4gY2FuY2VsKGZyYW1lKX07XG4gICAgfSxcblxuICAgIGdldEltYWdlRGF0YShpbWc6IENhbnZhc0ltYWdlU291cmNlLCBwYWRkaW5nPzogbnVtYmVyID0gMCk6IEltYWdlRGF0YSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGNyZWF0ZSBjYW52YXMgMmQgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0SW1hZ2VEYXRhKC1wYWRkaW5nLCAtcGFkZGluZywgaW1nLndpZHRoICsgMiAqIHBhZGRpbmcsIGltZy5oZWlnaHQgKyAyICogcGFkZGluZyk7XG4gICAgfSxcblxuICAgIHJlc29sdmVVUkwocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbGlua0VsKSBsaW5rRWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rRWwuaHJlZiA9IHBhdGg7XG4gICAgICAgIHJldHVybiBsaW5rRWwuaHJlZjtcbiAgICB9LFxuXG4gICAgaGFyZHdhcmVDb25jdXJyZW5jeTogd2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgfHwgNCxcblxuICAgIGdldCBkZXZpY2VQaXhlbFJhdGlvKCkgeyByZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW87IH0sXG4gICAgZ2V0IHByZWZlcnNSZWR1Y2VkTW90aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXdpbmRvdy5tYXRjaE1lZGlhKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vTGF6aWx5IGluaXRpYWxpemUgbWVkaWEgcXVlcnlcbiAgICAgICAgaWYgKHJlZHVjZWRNb3Rpb25RdWVyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZWR1Y2VkTW90aW9uUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkdWNlZE1vdGlvblF1ZXJ5Lm1hdGNoZXM7XG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbnR5cGUgQ29uZmlnID0ge3xcbiAgQVBJX1VSTDogc3RyaW5nLFxuICBFVkVOVFNfVVJMOiA/c3RyaW5nLFxuICBGRUVEQkFDS19VUkw6IHN0cmluZyxcbiAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IGJvb2xlYW4sXG4gIEFDQ0VTU19UT0tFTjogP3N0cmluZyxcbiAgTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTOiBudW1iZXJcbnx9O1xuXG5jb25zdCBjb25maWc6IENvbmZpZyA9IHtcbiAgICBBUElfVVJMOiAnaHR0cHM6Ly9hcGkubWFwYm94LmNvbScsXG4gICAgZ2V0IEVWRU5UU19VUkwoKSB7XG4gICAgICAgIGlmICghdGhpcy5BUElfVVJMKSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIGlmICh0aGlzLkFQSV9VUkwuaW5kZXhPZignaHR0cHM6Ly9hcGkubWFwYm94LmNuJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnaHR0cHM6Ly9ldmVudHMubWFwYm94LmNuL2V2ZW50cy92Mic7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5BUElfVVJMLmluZGV4T2YoJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20nKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICdodHRwczovL2V2ZW50cy5tYXBib3guY29tL2V2ZW50cy92Mic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRkVFREJBQ0tfVVJMOiAnaHR0cHM6Ly9hcHBzLm1hcGJveC5jb20vZmVlZGJhY2snLFxuICAgIFJFUVVJUkVfQUNDRVNTX1RPS0VOOiB0cnVlLFxuICAgIEFDQ0VTU19UT0tFTjogbnVsbCxcbiAgICBNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM6IDE2XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG4iLCIvLyBAZmxvdyBzdHJpY3RcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdyc7XG5cbmNvbnN0IGV4cG9ydGVkID0ge1xuICAgIHN1cHBvcnRlZDogZmFsc2UsXG4gICAgdGVzdFN1cHBvcnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuXG5sZXQgZ2xGb3JUZXN0aW5nO1xubGV0IHdlYnBDaGVja0NvbXBsZXRlID0gZmFsc2U7XG5sZXQgd2VicEltZ1Rlc3Q7XG5sZXQgd2VicEltZ1Rlc3RPbmxvYWRDb21wbGV0ZSA9IGZhbHNlO1xuXG5pZiAod2luZG93LmRvY3VtZW50KSB7XG4gICAgd2VicEltZ1Rlc3QgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgd2VicEltZ1Rlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChnbEZvclRlc3RpbmcpIHRlc3RXZWJwVGV4dHVyZVVwbG9hZChnbEZvclRlc3RpbmcpO1xuICAgICAgICBnbEZvclRlc3RpbmcgPSBudWxsO1xuICAgICAgICB3ZWJwSW1nVGVzdE9ubG9hZENvbXBsZXRlID0gdHJ1ZTtcbiAgICB9O1xuICAgIHdlYnBJbWdUZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2VicENoZWNrQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICBnbEZvclRlc3RpbmcgPSBudWxsO1xuICAgIH07XG4gICAgd2VicEltZ1Rlc3Quc3JjID0gJ2RhdGE6aW1hZ2Uvd2VicDtiYXNlNjQsVWtsR1JoNEFBQUJYUlVKUVZsQTRUQkVBQUFBdkFRQUFBQWZRLy83M3YvK0JpT2gvQUFBPSc7XG59XG5cbmZ1bmN0aW9uIHRlc3RTdXBwb3J0KGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBpZiAod2VicENoZWNrQ29tcGxldGUgfHwgIXdlYnBJbWdUZXN0KSByZXR1cm47XG5cbiAgICAvLyBIVE1MSW1hZ2VFbGVtZW50LmNvbXBsZXRlIGlzIHNldCB3aGVuIGFuIGltYWdlIGlzIGRvbmUgbG9hZGluZyBpdCdzIHNvdXJjZVxuICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBub3QuXG4gICAgLy8gSXQncyBwb3NzaWJsZSBmb3IgYW4gZXJyb3IgdG8gc2V0IEhUTUxJbWFnZUVsZW1lbnQuY29tcGxldGUgdG8gdHJ1ZSB3aGljaCB3b3VsZCB0cmlnZ2VyXG4gICAgLy8gdGVzdFdlYnBUZXh0dXJlVXBsb2FkIGFuZCBtaXN0YWtlbmx5IHNldCBleHBvcnRlZC5zdXBwb3J0ZWQgdG8gdHJ1ZSBpbiBicm93c2VycyB3aGljaCBkb24ndCBzdXBwb3J0IHdlYnBcbiAgICAvLyBUbyBhdm9pZCB0aGlzLCB3ZSBzZXQgYSBmbGFnIGluIHRoZSBpbWFnZSdzIG9ubG9hZCBoYW5kbGVyIGFuZCBvbmx5IGNhbGwgdGVzdFdlYnBUZXh0dXJlVXBsb2FkXG4gICAgLy8gYWZ0ZXIgYSBzdWNjZXNzZnVsIGltYWdlIGxvYWQgZXZlbnQuXG4gICAgaWYgKHdlYnBJbWdUZXN0T25sb2FkQ29tcGxldGUpIHtcbiAgICAgICAgdGVzdFdlYnBUZXh0dXJlVXBsb2FkKGdsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnbEZvclRlc3RpbmcgPSBnbDtcblxuICAgIH1cbn1cblxuZnVuY3Rpb24gdGVzdFdlYnBUZXh0dXJlVXBsb2FkKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICAvLyBFZGdlIDE4IHN1cHBvcnRzIFdlYlAgYnV0IG5vdCB1cGxvYWRpbmcgYSBXZWJQIGltYWdlIHRvIGEgZ2wgdGV4dHVyZVxuICAgIC8vIFRlc3Qgc3VwcG9ydCBmb3IgdGhpcyBiZWZvcmUgYWxsb3dpbmcgV2ViUCBpbWFnZXMuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzc2NzFcbiAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB3ZWJwSW1nVGVzdCk7XG5cbiAgICAgICAgLy8gVGhlIGVycm9yIGRvZXMgbm90IGdldCB0cmlnZ2VyZWQgaW4gRWRnZSBpZiB0aGUgY29udGV4dCBpcyBsb3N0XG4gICAgICAgIGlmIChnbC5pc0NvbnRleHRMb3N0KCkpIHJldHVybjtcblxuICAgICAgICBleHBvcnRlZC5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQ2F0Y2ggXCJVbnNwZWNpZmllZCBFcnJvci5cIiBpbiBFZGdlIDE4LlxuICAgIH1cblxuICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG5cbiAgICB3ZWJwQ2hlY2tDb21wbGV0ZSA9IHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG4vKioqKiogU1RBUlQgV0FSTklORyAtIElGIFlPVSBVU0UgVEhJUyBDT0RFIFdJVEggTUFQQk9YIE1BUFBJTkcgQVBJUywgUkVNT1ZBTCBPUlxuKiBNT0RJRklDQVRJT04gT0YgVEhFIEZPTExPV0lORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqXG4qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkIHRvIGFjY2VzcyBNYXBib3gncyBNYXBwaW5nIEFQSXMuIFJlbW92YWwgb3IgbW9kaWZpY2F0aW9uXG4qIG9mIHRoaXMgY29kZSB3aGVuIHVzZWQgd2l0aCBNYXBib3gncyBNYXBwaW5nIEFQSXMgY2FuIHJlc3VsdCBpbiBoaWdoZXIgZmVlcyBhbmQvb3JcbiogdGVybWluYXRpb24gb2YgeW91ciBhY2NvdW50IHdpdGggTWFwYm94LlxuKlxuKiBVbmRlciB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UsIHlvdSBtYXkgbm90IHVzZSB0aGlzIGNvZGUgdG8gYWNjZXNzIE1hcGJveFxuKiBNYXBwaW5nIEFQSXMgb3RoZXIgdGhhbiB0aHJvdWdoIE1hcGJveCBTREtzLlxuKlxuKiBUaGUgTWFwcGluZyBBUElzIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2FwaS9tYXBzLyNtYXBzXG4qIGFuZCB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UgYXJlIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5tYXBib3guY29tL3Rvcy9cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudHlwZSBTa3VUb2tlbk9iamVjdCA9IHt8XG4gICAgdG9rZW46IHN0cmluZyxcbiAgICB0b2tlbkV4cGlyZXNBdDogbnVtYmVyXG58fTtcblxuY29uc3QgU0tVX0lEID0gJzAxJztcblxuZnVuY3Rpb24gY3JlYXRlU2t1VG9rZW4oKTogU2t1VG9rZW5PYmplY3Qge1xuICAgIC8vIFNLVV9JRCBhbmQgVE9LRU5fVkVSU0lPTiBhcmUgc3BlY2lmaWVkIGJ5IGFuIGludGVybmFsIHNjaGVtYSBhbmQgc2hvdWxkIG5vdCBjaGFuZ2VcbiAgICBjb25zdCBUT0tFTl9WRVJTSU9OID0gJzEnO1xuICAgIGNvbnN0IGJhc2U2MmNoYXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcbiAgICAvLyBzZXNzaW9uUmFuZG9taXplciBpcyBhIHJhbmRvbWl6ZWQgMTAtZGlnaXQgYmFzZS02MiBudW1iZXJcbiAgICBsZXQgc2Vzc2lvblJhbmRvbWl6ZXIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgc2Vzc2lvblJhbmRvbWl6ZXIgKz0gYmFzZTYyY2hhcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNjIpXTtcbiAgICB9XG4gICAgY29uc3QgZXhwaXJhdGlvbiA9IDEyICogNjAgKiA2MCAqIDEwMDA7IC8vIDEyIGhvdXJzXG4gICAgY29uc3QgdG9rZW4gPSBbVE9LRU5fVkVSU0lPTiwgU0tVX0lELCBzZXNzaW9uUmFuZG9taXplcl0uam9pbignJyk7XG4gICAgY29uc3QgdG9rZW5FeHBpcmVzQXQgPSBEYXRlLm5vdygpICsgZXhwaXJhdGlvbjtcblxuICAgIHJldHVybiB7dG9rZW4sIHRva2VuRXhwaXJlc0F0fTtcbn1cblxuZXhwb3J0IHtjcmVhdGVTa3VUb2tlbiwgU0tVX0lEfTtcblxuLyoqKioqIEVORCBXQVJOSU5HIC0gUkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhFXG5QUkVDRURJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKi9cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZnMpIHtcbiAgZGVmcygnRVBTRzo0MzI2JywgXCIrdGl0bGU9V0dTIDg0IChsb25nL2xhdCkgK3Byb2o9bG9uZ2xhdCArZWxscHM9V0dTODQgK2RhdHVtPVdHUzg0ICt1bml0cz1kZWdyZWVzXCIpO1xuICBkZWZzKCdFUFNHOjQyNjknLCBcIit0aXRsZT1OQUQ4MyAobG9uZy9sYXQpICtwcm9qPWxvbmdsYXQgK2E9NjM3ODEzNy4wICtiPTYzNTY3NTIuMzE0MTQwMzYgK2VsbHBzPUdSUzgwICtkYXR1bT1OQUQ4MyArdW5pdHM9ZGVncmVlc1wiKTtcbiAgZGVmcygnRVBTRzozODU3JywgXCIrdGl0bGU9V0dTIDg0IC8gUHNldWRvLU1lcmNhdG9yICtwcm9qPW1lcmMgK2E9NjM3ODEzNyArYj02Mzc4MTM3ICtsYXRfdHM9MC4wICtsb25fMD0wLjAgK3hfMD0wLjAgK3lfMD0wICtrPTEuMCArdW5pdHM9bSArbmFkZ3JpZHM9QG51bGwgK25vX2RlZnNcIik7XG5cbiAgZGVmcy5XR1M4NCA9IGRlZnNbJ0VQU0c6NDMyNiddO1xuICBkZWZzWydFUFNHOjM3ODUnXSA9IGRlZnNbJ0VQU0c6Mzg1NyddOyAvLyBtYWludGFpbiBiYWNrd2FyZCBjb21wYXQsIG9mZmljaWFsIGNvZGUgaXMgMzg1N1xuICBkZWZzLkdPT0dMRSA9IGRlZnNbJ0VQU0c6Mzg1NyddO1xuICBkZWZzWydFUFNHOjkwMDkxMyddID0gZGVmc1snRVBTRzozODU3J107XG4gIGRlZnNbJ0VQU0c6MTAyMTEzJ10gPSBkZWZzWydFUFNHOjM4NTcnXTtcbn1cbiIsImV4cG9ydCB2YXIgUEpEXzNQQVJBTSA9IDE7XG5leHBvcnQgdmFyIFBKRF83UEFSQU0gPSAyO1xuZXhwb3J0IHZhciBQSkRfR1JJRFNISUZUID0gMztcbmV4cG9ydCB2YXIgUEpEX1dHUzg0ID0gNDsgLy8gV0dTODQgb3IgZXF1aXZhbGVudFxuZXhwb3J0IHZhciBQSkRfTk9EQVRVTSA9IDU7IC8vIFdHUzg0IG9yIGVxdWl2YWxlbnRcbmV4cG9ydCB2YXIgU1JTX1dHUzg0X1NFTUlNQUpPUiA9IDYzNzgxMzcuMDsgIC8vIG9ubHkgdXNlZCBpbiBncmlkIHNoaWZ0IHRyYW5zZm9ybXNcbmV4cG9ydCB2YXIgU1JTX1dHUzg0X1NFTUlNSU5PUiA9IDYzNTY3NTIuMzE0OyAgLy8gb25seSB1c2VkIGluIGdyaWQgc2hpZnQgdHJhbnNmb3Jtc1xuZXhwb3J0IHZhciBTUlNfV0dTODRfRVNRVUFSRUQgPSAwLjAwNjY5NDM3OTk5MDE0MTMxNjU7IC8vIG9ubHkgdXNlZCBpbiBncmlkIHNoaWZ0IHRyYW5zZm9ybXNcbmV4cG9ydCB2YXIgU0VDX1RPX1JBRCA9IDQuODQ4MTM2ODExMDk1MzU5OTM1ODk5MTQxMDIzNTdlLTY7XG5leHBvcnQgdmFyIEhBTEZfUEkgPSBNYXRoLlBJLzI7XG4vLyBlbGxpcG9pZCBwal9zZXRfZWxsLmNcbmV4cG9ydCB2YXIgU0lYVEggPSAwLjE2NjY2NjY2NjY2NjY2NjY2Njc7XG4vKiAxLzYgKi9cbmV4cG9ydCB2YXIgUkE0ID0gMC4wNDcyMjIyMjIyMjIyMjIyMjIyMjtcbi8qIDE3LzM2MCAqL1xuZXhwb3J0IHZhciBSQTYgPSAwLjAyMjE1NjA4NDY1NjA4NDY1NjA4O1xuZXhwb3J0IHZhciBFUFNMTiA9IDEuMGUtMTA7XG4vLyB5b3UnZCB0aGluayB5b3UgY291bGQgdXNlIE51bWJlci5FUFNJTE9OIGFib3ZlIGJ1dCB0aGF0IG1ha2VzXG4vLyBNb2xsd2VpZGUgZ2V0IGludG8gYW4gaW5maW5hdGUgbG9vcC5cblxuZXhwb3J0IHZhciBEMlIgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTc3O1xuZXhwb3J0IHZhciBSMkQgPSA1Ny4yOTU3Nzk1MTMwODIzMjA4ODtcbmV4cG9ydCB2YXIgRk9SVFBJID0gTWF0aC5QSS80O1xuZXhwb3J0IHZhciBUV09fUEkgPSBNYXRoLlBJICogMjtcbi8vIFNQSSBpcyBzbGlnaHRseSBncmVhdGVyIHRoYW4gTWF0aC5QSSwgc28gdmFsdWVzIHRoYXQgZXhjZWVkIHRoZSAtMTgwLi4xODBcbi8vIGRlZ3JlZSByYW5nZSBieSBhIHRpbnkgYW1vdW50IGRvbid0IGdldCB3cmFwcGVkLiBUaGlzIHByZXZlbnRzIHBvaW50cyB0aGF0XG4vLyBoYXZlIGRyaWZ0ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbiBhbG9uZyB0aGUgMTgwdGggbWVyaWRpYW4gKGR1ZSB0b1xuLy8gZmxvYXRpbmcgcG9pbnQgZXJyb3IpIGZyb20gY2hhbmdpbmcgdGhlaXIgc2lnbi5cbmV4cG9ydCB2YXIgU1BJID0gMy4xNDE1OTI2NTM1OTtcbiIsInZhciBleHBvcnRzID0ge307XG5leHBvcnQge2V4cG9ydHMgYXMgZGVmYXVsdH07XG5cbmV4cG9ydHMuZ3JlZW53aWNoID0gMC4wOyAvL1wiMGRFXCIsXG5leHBvcnRzLmxpc2JvbiA9IC05LjEzMTkwNjExMTExMTsgLy9cIjlkMDcnNTQuODYyXFxcIldcIixcbmV4cG9ydHMucGFyaXMgPSAyLjMzNzIyOTE2NjY2NzsgLy9cIjJkMjAnMTQuMDI1XFxcIkVcIixcbmV4cG9ydHMuYm9nb3RhID0gLTc0LjA4MDkxNjY2NjY2NzsgLy9cIjc0ZDA0JzUxLjNcXFwiV1wiLFxuZXhwb3J0cy5tYWRyaWQgPSAtMy42ODc5Mzg4ODg4ODk7IC8vXCIzZDQxJzE2LjU4XFxcIldcIixcbmV4cG9ydHMucm9tZSA9IDEyLjQ1MjMzMzMzMzMzMzsgLy9cIjEyZDI3JzguNFxcXCJFXCIsXG5leHBvcnRzLmJlcm4gPSA3LjQzOTU4MzMzMzMzMzsgLy9cIjdkMjYnMjIuNVxcXCJFXCIsXG5leHBvcnRzLmpha2FydGEgPSAxMDYuODA3NzE5NDQ0NDQ0OyAvL1wiMTA2ZDQ4JzI3Ljc5XFxcIkVcIixcbmV4cG9ydHMuZmVycm8gPSAtMTcuNjY2NjY2NjY2NjY3OyAvL1wiMTdkNDAnV1wiLFxuZXhwb3J0cy5icnVzc2VscyA9IDQuMzY3OTc1OyAvL1wiNGQyMic0LjcxXFxcIkVcIixcbmV4cG9ydHMuc3RvY2tob2xtID0gMTguMDU4Mjc3Nzc3Nzc4OyAvL1wiMThkMycyOS44XFxcIkVcIixcbmV4cG9ydHMuYXRoZW5zID0gMjMuNzE2MzM3NTsgLy9cIjIzZDQyJzU4LjgxNVxcXCJFXCIsXG5leHBvcnRzLm9zbG8gPSAxMC43MjI5MTY2NjY2Njc7IC8vXCIxMGQ0MycyMi41XFxcIkVcIlxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICBmdDoge3RvX21ldGVyOiAwLjMwNDh9LFxuICAndXMtZnQnOiB7dG9fbWV0ZXI6IDEyMDAgLyAzOTM3fVxufTtcbiIsInZhciBpZ25vcmVkQ2hhciA9IC9bXFxzX1xcLVxcL1xcKFxcKV0vZztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1hdGNoKG9iaiwga2V5KSB7XG4gIGlmIChvYmpba2V5XSkge1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfVxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIHZhciBsa2V5ID0ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZShpZ25vcmVkQ2hhciwgJycpO1xuICB2YXIgaSA9IC0xO1xuICB2YXIgdGVzdGtleSwgcHJvY2Vzc2VkS2V5O1xuICB3aGlsZSAoKytpIDwga2V5cy5sZW5ndGgpIHtcbiAgICB0ZXN0a2V5ID0ga2V5c1tpXTtcbiAgICBwcm9jZXNzZWRLZXkgPSB0ZXN0a2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZShpZ25vcmVkQ2hhciwgJycpO1xuICAgIGlmIChwcm9jZXNzZWRLZXkgPT09IGxrZXkpIHtcbiAgICAgIHJldHVybiBvYmpbdGVzdGtleV07XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge0QyUn0gZnJvbSAnLi9jb25zdGFudHMvdmFsdWVzJztcbmltcG9ydCBQcmltZU1lcmlkaWFuIGZyb20gJy4vY29uc3RhbnRzL1ByaW1lTWVyaWRpYW4nO1xuaW1wb3J0IHVuaXRzIGZyb20gJy4vY29uc3RhbnRzL3VuaXRzJztcbmltcG9ydCBtYXRjaCBmcm9tICcuL21hdGNoJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVmRGF0YSkge1xuICB2YXIgc2VsZiA9IHt9O1xuICB2YXIgcGFyYW1PYmogPSBkZWZEYXRhLnNwbGl0KCcrJykubWFwKGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gdi50cmltKCk7XG4gIH0pLmZpbHRlcihmdW5jdGlvbihhKSB7XG4gICAgcmV0dXJuIGE7XG4gIH0pLnJlZHVjZShmdW5jdGlvbihwLCBhKSB7XG4gICAgdmFyIHNwbGl0ID0gYS5zcGxpdCgnPScpO1xuICAgIHNwbGl0LnB1c2godHJ1ZSk7XG4gICAgcFtzcGxpdFswXS50b0xvd2VyQ2FzZSgpXSA9IHNwbGl0WzFdO1xuICAgIHJldHVybiBwO1xuICB9LCB7fSk7XG4gIHZhciBwYXJhbU5hbWUsIHBhcmFtVmFsLCBwYXJhbU91dG5hbWU7XG4gIHZhciBwYXJhbXMgPSB7XG4gICAgcHJvajogJ3Byb2pOYW1lJyxcbiAgICBkYXR1bTogJ2RhdHVtQ29kZScsXG4gICAgcmY6IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHNlbGYucmYgPSBwYXJzZUZsb2F0KHYpO1xuICAgIH0sXG4gICAgbGF0XzA6IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHNlbGYubGF0MCA9IHYgKiBEMlI7XG4gICAgfSxcbiAgICBsYXRfMTogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi5sYXQxID0gdiAqIEQyUjtcbiAgICB9LFxuICAgIGxhdF8yOiBmdW5jdGlvbih2KSB7XG4gICAgICBzZWxmLmxhdDIgPSB2ICogRDJSO1xuICAgIH0sXG4gICAgbGF0X3RzOiBmdW5jdGlvbih2KSB7XG4gICAgICBzZWxmLmxhdF90cyA9IHYgKiBEMlI7XG4gICAgfSxcbiAgICBsb25fMDogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi5sb25nMCA9IHYgKiBEMlI7XG4gICAgfSxcbiAgICBsb25fMTogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi5sb25nMSA9IHYgKiBEMlI7XG4gICAgfSxcbiAgICBsb25fMjogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi5sb25nMiA9IHYgKiBEMlI7XG4gICAgfSxcbiAgICBhbHBoYTogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi5hbHBoYSA9IHBhcnNlRmxvYXQodikgKiBEMlI7XG4gICAgfSxcbiAgICBnYW1tYTogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi5yZWN0aWZpZWRfZ3JpZF9hbmdsZSA9IHBhcnNlRmxvYXQodik7XG4gICAgfSxcbiAgICBsb25jOiBmdW5jdGlvbih2KSB7XG4gICAgICBzZWxmLmxvbmdjID0gdiAqIEQyUjtcbiAgICB9LFxuICAgIHhfMDogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi54MCA9IHBhcnNlRmxvYXQodik7XG4gICAgfSxcbiAgICB5XzA6IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHNlbGYueTAgPSBwYXJzZUZsb2F0KHYpO1xuICAgIH0sXG4gICAga18wOiBmdW5jdGlvbih2KSB7XG4gICAgICBzZWxmLmswID0gcGFyc2VGbG9hdCh2KTtcbiAgICB9LFxuICAgIGs6IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHNlbGYuazAgPSBwYXJzZUZsb2F0KHYpO1xuICAgIH0sXG4gICAgYTogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi5hID0gcGFyc2VGbG9hdCh2KTtcbiAgICB9LFxuICAgIGI6IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHNlbGYuYiA9IHBhcnNlRmxvYXQodik7XG4gICAgfSxcbiAgICByX2E6IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5SX0EgPSB0cnVlO1xuICAgIH0sXG4gICAgem9uZTogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi56b25lID0gcGFyc2VJbnQodiwgMTApO1xuICAgIH0sXG4gICAgc291dGg6IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi51dG1Tb3V0aCA9IHRydWU7XG4gICAgfSxcbiAgICB0b3dnczg0OiBmdW5jdGlvbih2KSB7XG4gICAgICBzZWxmLmRhdHVtX3BhcmFtcyA9IHYuc3BsaXQoXCIsXCIpLm1hcChmdW5jdGlvbihhKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGEpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB0b19tZXRlcjogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi50b19tZXRlciA9IHBhcnNlRmxvYXQodik7XG4gICAgfSxcbiAgICB1bml0czogZnVuY3Rpb24odikge1xuICAgICAgc2VsZi51bml0cyA9IHY7XG4gICAgICB2YXIgdW5pdCA9IG1hdGNoKHVuaXRzLCB2KTtcbiAgICAgIGlmICh1bml0KSB7XG4gICAgICAgIHNlbGYudG9fbWV0ZXIgPSB1bml0LnRvX21ldGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgZnJvbV9ncmVlbndpY2g6IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHNlbGYuZnJvbV9ncmVlbndpY2ggPSB2ICogRDJSO1xuICAgIH0sXG4gICAgcG06IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciBwbSA9IG1hdGNoKFByaW1lTWVyaWRpYW4sIHYpO1xuICAgICAgc2VsZi5mcm9tX2dyZWVud2ljaCA9IChwbSA/IHBtIDogcGFyc2VGbG9hdCh2KSkgKiBEMlI7XG4gICAgfSxcbiAgICBuYWRncmlkczogZnVuY3Rpb24odikge1xuICAgICAgaWYgKHYgPT09ICdAbnVsbCcpIHtcbiAgICAgICAgc2VsZi5kYXR1bUNvZGUgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2VsZi5uYWRncmlkcyA9IHY7XG4gICAgICB9XG4gICAgfSxcbiAgICBheGlzOiBmdW5jdGlvbih2KSB7XG4gICAgICB2YXIgbGVnYWxBeGlzID0gXCJld25zdWRcIjtcbiAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMyAmJiBsZWdhbEF4aXMuaW5kZXhPZih2LnN1YnN0cigwLCAxKSkgIT09IC0xICYmIGxlZ2FsQXhpcy5pbmRleE9mKHYuc3Vic3RyKDEsIDEpKSAhPT0gLTEgJiYgbGVnYWxBeGlzLmluZGV4T2Yodi5zdWJzdHIoMiwgMSkpICE9PSAtMSkge1xuICAgICAgICBzZWxmLmF4aXMgPSB2O1xuICAgICAgfVxuICAgIH0sXG4gICAgYXBwcm94OiBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuYXBwcm94ID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGZvciAocGFyYW1OYW1lIGluIHBhcmFtT2JqKSB7XG4gICAgcGFyYW1WYWwgPSBwYXJhbU9ialtwYXJhbU5hbWVdO1xuICAgIGlmIChwYXJhbU5hbWUgaW4gcGFyYW1zKSB7XG4gICAgICBwYXJhbU91dG5hbWUgPSBwYXJhbXNbcGFyYW1OYW1lXTtcbiAgICAgIGlmICh0eXBlb2YgcGFyYW1PdXRuYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBhcmFtT3V0bmFtZShwYXJhbVZhbCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2VsZltwYXJhbU91dG5hbWVdID0gcGFyYW1WYWw7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2VsZltwYXJhbU5hbWVdID0gcGFyYW1WYWw7XG4gICAgfVxuICB9XG4gIGlmKHR5cGVvZiBzZWxmLmRhdHVtQ29kZSA9PT0gJ3N0cmluZycgJiYgc2VsZi5kYXR1bUNvZGUgIT09IFwiV0dTODRcIil7XG4gICAgc2VsZi5kYXR1bUNvZGUgPSBzZWxmLmRhdHVtQ29kZS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBzZWxmO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgcGFyc2VTdHJpbmc7XG5cbnZhciBORVVUUkFMID0gMTtcbnZhciBLRVlXT1JEID0gMjtcbnZhciBOVU1CRVIgPSAzO1xudmFyIFFVT1RFRCA9IDQ7XG52YXIgQUZURVJRVU9URSA9IDU7XG52YXIgRU5ERUQgPSAtMTtcbnZhciB3aGl0ZXNwYWNlID0gL1xccy87XG52YXIgbGF0aW4gPSAvW0EtWmEtel0vO1xudmFyIGtleXdvcmQgPSAvW0EtWmEtejg0X10vO1xudmFyIGVuZFRoaW5ncyA9IC9bLFxcXV0vO1xudmFyIGRpZ2V0cyA9IC9bXFxkXFwuRVxcLVxcK10vO1xuLy8gY29uc3QgaWdub3JlZENoYXIgPSAvW1xcc19cXC1cXC9cXChcXCldL2c7XG5mdW5jdGlvbiBQYXJzZXIodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSBzdHJpbmcnKTtcbiAgfVxuICB0aGlzLnRleHQgPSB0ZXh0LnRyaW0oKTtcbiAgdGhpcy5sZXZlbCA9IDA7XG4gIHRoaXMucGxhY2UgPSAwO1xuICB0aGlzLnJvb3QgPSBudWxsO1xuICB0aGlzLnN0YWNrID0gW107XG4gIHRoaXMuY3VycmVudE9iamVjdCA9IG51bGw7XG4gIHRoaXMuc3RhdGUgPSBORVVUUkFMO1xufVxuUGFyc2VyLnByb3RvdHlwZS5yZWFkQ2hhcmljdGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjaGFyID0gdGhpcy50ZXh0W3RoaXMucGxhY2UrK107XG4gIGlmICh0aGlzLnN0YXRlICE9PSBRVU9URUQpIHtcbiAgICB3aGlsZSAod2hpdGVzcGFjZS50ZXN0KGNoYXIpKSB7XG4gICAgICBpZiAodGhpcy5wbGFjZSA+PSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoYXIgPSB0aGlzLnRleHRbdGhpcy5wbGFjZSsrXTtcbiAgICB9XG4gIH1cbiAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgY2FzZSBORVVUUkFMOlxuICAgICAgcmV0dXJuIHRoaXMubmV1dHJhbChjaGFyKTtcbiAgICBjYXNlIEtFWVdPUkQ6XG4gICAgICByZXR1cm4gdGhpcy5rZXl3b3JkKGNoYXIpXG4gICAgY2FzZSBRVU9URUQ6XG4gICAgICByZXR1cm4gdGhpcy5xdW90ZWQoY2hhcik7XG4gICAgY2FzZSBBRlRFUlFVT1RFOlxuICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJxdW90ZShjaGFyKTtcbiAgICBjYXNlIE5VTUJFUjpcbiAgICAgIHJldHVybiB0aGlzLm51bWJlcihjaGFyKTtcbiAgICBjYXNlIEVOREVEOlxuICAgICAgcmV0dXJuO1xuICB9XG59O1xuUGFyc2VyLnByb3RvdHlwZS5hZnRlcnF1b3RlID0gZnVuY3Rpb24oY2hhcikge1xuICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgIHRoaXMud29yZCArPSAnXCInO1xuICAgIHRoaXMuc3RhdGUgPSBRVU9URUQ7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbmRUaGluZ3MudGVzdChjaGFyKSkge1xuICAgIHRoaXMud29yZCA9IHRoaXMud29yZC50cmltKCk7XG4gICAgdGhpcy5hZnRlckl0ZW0oY2hhcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignaGF2blxcJ3QgaGFuZGxlZCBcIicgK2NoYXIgKyAnXCIgaW4gYWZ0ZXJxdW90ZSB5ZXQsIGluZGV4ICcgKyB0aGlzLnBsYWNlKTtcbn07XG5QYXJzZXIucHJvdG90eXBlLmFmdGVySXRlbSA9IGZ1bmN0aW9uKGNoYXIpIHtcbiAgaWYgKGNoYXIgPT09ICcsJykge1xuICAgIGlmICh0aGlzLndvcmQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY3VycmVudE9iamVjdC5wdXNoKHRoaXMud29yZCk7XG4gICAgfVxuICAgIHRoaXMud29yZCA9IG51bGw7XG4gICAgdGhpcy5zdGF0ZSA9IE5FVVRSQUw7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjaGFyID09PSAnXScpIHtcbiAgICB0aGlzLmxldmVsLS07XG4gICAgaWYgKHRoaXMud29yZCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5jdXJyZW50T2JqZWN0LnB1c2godGhpcy53b3JkKTtcbiAgICAgIHRoaXMud29yZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBORVVUUkFMO1xuICAgIHRoaXMuY3VycmVudE9iamVjdCA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRPYmplY3QpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBFTkRFRDtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG5QYXJzZXIucHJvdG90eXBlLm51bWJlciA9IGZ1bmN0aW9uKGNoYXIpIHtcbiAgaWYgKGRpZ2V0cy50ZXN0KGNoYXIpKSB7XG4gICAgdGhpcy53b3JkICs9IGNoYXI7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbmRUaGluZ3MudGVzdChjaGFyKSkge1xuICAgIHRoaXMud29yZCA9IHBhcnNlRmxvYXQodGhpcy53b3JkKTtcbiAgICB0aGlzLmFmdGVySXRlbShjaGFyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdoYXZuXFwndCBoYW5kbGVkIFwiJyArY2hhciArICdcIiBpbiBudW1iZXIgeWV0LCBpbmRleCAnICsgdGhpcy5wbGFjZSk7XG59O1xuUGFyc2VyLnByb3RvdHlwZS5xdW90ZWQgPSBmdW5jdGlvbihjaGFyKSB7XG4gIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgdGhpcy5zdGF0ZSA9IEFGVEVSUVVPVEU7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMud29yZCArPSBjaGFyO1xuICByZXR1cm47XG59O1xuUGFyc2VyLnByb3RvdHlwZS5rZXl3b3JkID0gZnVuY3Rpb24oY2hhcikge1xuICBpZiAoa2V5d29yZC50ZXN0KGNoYXIpKSB7XG4gICAgdGhpcy53b3JkICs9IGNoYXI7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjaGFyID09PSAnWycpIHtcbiAgICB2YXIgbmV3T2JqZWN0cyA9IFtdO1xuICAgIG5ld09iamVjdHMucHVzaCh0aGlzLndvcmQpO1xuICAgIHRoaXMubGV2ZWwrKztcbiAgICBpZiAodGhpcy5yb290ID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJvb3QgPSBuZXdPYmplY3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRPYmplY3QucHVzaChuZXdPYmplY3RzKTtcbiAgICB9XG4gICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuY3VycmVudE9iamVjdCk7XG4gICAgdGhpcy5jdXJyZW50T2JqZWN0ID0gbmV3T2JqZWN0cztcbiAgICB0aGlzLnN0YXRlID0gTkVVVFJBTDtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVuZFRoaW5ncy50ZXN0KGNoYXIpKSB7XG4gICAgdGhpcy5hZnRlckl0ZW0oY2hhcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignaGF2blxcJ3QgaGFuZGxlZCBcIicgK2NoYXIgKyAnXCIgaW4ga2V5d29yZCB5ZXQsIGluZGV4ICcgKyB0aGlzLnBsYWNlKTtcbn07XG5QYXJzZXIucHJvdG90eXBlLm5ldXRyYWwgPSBmdW5jdGlvbihjaGFyKSB7XG4gIGlmIChsYXRpbi50ZXN0KGNoYXIpKSB7XG4gICAgdGhpcy53b3JkID0gY2hhcjtcbiAgICB0aGlzLnN0YXRlID0gS0VZV09SRDtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICB0aGlzLndvcmQgPSAnJztcbiAgICB0aGlzLnN0YXRlID0gUVVPVEVEO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZGlnZXRzLnRlc3QoY2hhcikpIHtcbiAgICB0aGlzLndvcmQgPSBjaGFyO1xuICAgIHRoaXMuc3RhdGUgPSBOVU1CRVI7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbmRUaGluZ3MudGVzdChjaGFyKSkge1xuICAgIHRoaXMuYWZ0ZXJJdGVtKGNoYXIpO1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2hhdm5cXCd0IGhhbmRsZWQgXCInICtjaGFyICsgJ1wiIGluIG5ldXRyYWwgeWV0LCBpbmRleCAnICsgdGhpcy5wbGFjZSk7XG59O1xuUGFyc2VyLnByb3RvdHlwZS5vdXRwdXQgPSBmdW5jdGlvbigpIHtcbiAgd2hpbGUgKHRoaXMucGxhY2UgPCB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgdGhpcy5yZWFkQ2hhcmljdGVyKCk7XG4gIH1cbiAgaWYgKHRoaXMuc3RhdGUgPT09IEVOREVEKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBwYXJzZSBzdHJpbmcgXCInICt0aGlzLnRleHQgKyAnXCIuIFN0YXRlIGlzICcgKyB0aGlzLnN0YXRlKTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHR4dCkge1xuICB2YXIgcGFyc2VyID0gbmV3IFBhcnNlcih0eHQpO1xuICByZXR1cm4gcGFyc2VyLm91dHB1dCgpO1xufVxuIiwiXG5cbmZ1bmN0aW9uIG1hcGl0KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgdmFsdWUudW5zaGlmdChrZXkpO1xuICAgIGtleSA9IG51bGw7XG4gIH1cbiAgdmFyIHRoaW5nID0ga2V5ID8ge30gOiBvYmo7XG5cbiAgdmFyIG91dCA9IHZhbHVlLnJlZHVjZShmdW5jdGlvbihuZXdPYmosIGl0ZW0pIHtcbiAgICBzRXhwcihpdGVtLCBuZXdPYmopO1xuICAgIHJldHVybiBuZXdPYmpcbiAgfSwgdGhpbmcpO1xuICBpZiAoa2V5KSB7XG4gICAgb2JqW2tleV0gPSBvdXQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNFeHByKHYsIG9iaikge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICBvYmpbdl0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIga2V5ID0gdi5zaGlmdCgpO1xuICBpZiAoa2V5ID09PSAnUEFSQU1FVEVSJykge1xuICAgIGtleSA9IHYuc2hpZnQoKTtcbiAgfVxuICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2WzBdKSkge1xuICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgIHNFeHByKHZbMF0sIG9ialtrZXldKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb2JqW2tleV0gPSB2WzBdO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXYubGVuZ3RoKSB7XG4gICAgb2JqW2tleV0gPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoa2V5ID09PSAnVE9XR1M4NCcpIHtcbiAgICBvYmpba2V5XSA9IHY7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChrZXkgPT09ICdBWElTJykge1xuICAgIGlmICghKGtleSBpbiBvYmopKSB7XG4gICAgICBvYmpba2V5XSA9IFtdO1xuICAgIH1cbiAgICBvYmpba2V5XS5wdXNoKHYpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgIG9ialtrZXldID0ge307XG4gIH1cblxuICB2YXIgaTtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlICdVTklUJzpcbiAgICBjYXNlICdQUklNRU0nOlxuICAgIGNhc2UgJ1ZFUlRfREFUVU0nOlxuICAgICAgb2JqW2tleV0gPSB7XG4gICAgICAgIG5hbWU6IHZbMF0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgY29udmVydDogdlsxXVxuICAgICAgfTtcbiAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICBzRXhwcih2WzJdLCBvYmpba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgY2FzZSAnU1BIRVJPSUQnOlxuICAgIGNhc2UgJ0VMTElQU09JRCc6XG4gICAgICBvYmpba2V5XSA9IHtcbiAgICAgICAgbmFtZTogdlswXSxcbiAgICAgICAgYTogdlsxXSxcbiAgICAgICAgcmY6IHZbMl1cbiAgICAgIH07XG4gICAgICBpZiAodi5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgc0V4cHIodlszXSwgb2JqW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIGNhc2UgJ1BST0pFQ1RFRENSUyc6XG4gICAgY2FzZSAnUFJPSkNSUyc6XG4gICAgY2FzZSAnR0VPR0NTJzpcbiAgICBjYXNlICdHRU9DQ1MnOlxuICAgIGNhc2UgJ1BST0pDUyc6XG4gICAgY2FzZSAnTE9DQUxfQ1MnOlxuICAgIGNhc2UgJ0dFT0RDUlMnOlxuICAgIGNhc2UgJ0dFT0RFVElDQ1JTJzpcbiAgICBjYXNlICdHRU9ERVRJQ0RBVFVNJzpcbiAgICBjYXNlICdFREFUVU0nOlxuICAgIGNhc2UgJ0VOR0lORUVSSU5HREFUVU0nOlxuICAgIGNhc2UgJ1ZFUlRfQ1MnOlxuICAgIGNhc2UgJ1ZFUlRDUlMnOlxuICAgIGNhc2UgJ1ZFUlRJQ0FMQ1JTJzpcbiAgICBjYXNlICdDT01QRF9DUyc6XG4gICAgY2FzZSAnQ09NUE9VTkRDUlMnOlxuICAgIGNhc2UgJ0VOR0lORUVSSU5HQ1JTJzpcbiAgICBjYXNlICdFTkdDUlMnOlxuICAgIGNhc2UgJ0ZJVFRFRF9DUyc6XG4gICAgY2FzZSAnTE9DQUxfREFUVU0nOlxuICAgIGNhc2UgJ0RBVFVNJzpcbiAgICAgIHZbMF0gPSBbJ25hbWUnLCB2WzBdXTtcbiAgICAgIG1hcGl0KG9iaiwga2V5LCB2KTtcbiAgICAgIHJldHVybjtcbiAgICBkZWZhdWx0OlxuICAgICAgaSA9IC0xO1xuICAgICAgd2hpbGUgKCsraSA8IHYubGVuZ3RoKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2W2ldKSkge1xuICAgICAgICAgIHJldHVybiBzRXhwcih2LCBvYmpba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXBpdChvYmosIGtleSwgdik7XG4gIH1cbn1cbiIsInZhciBEMlIgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTc3O1xuaW1wb3J0IHBhcnNlciBmcm9tICcuL3BhcnNlcic7XG5pbXBvcnQge3NFeHByfSBmcm9tICcuL3Byb2Nlc3MnO1xuXG5cblxuZnVuY3Rpb24gcmVuYW1lKG9iaiwgcGFyYW1zKSB7XG4gIHZhciBvdXROYW1lID0gcGFyYW1zWzBdO1xuICB2YXIgaW5OYW1lID0gcGFyYW1zWzFdO1xuICBpZiAoIShvdXROYW1lIGluIG9iaikgJiYgKGluTmFtZSBpbiBvYmopKSB7XG4gICAgb2JqW291dE5hbWVdID0gb2JqW2luTmFtZV07XG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDMpIHtcbiAgICAgIG9ialtvdXROYW1lXSA9IHBhcmFtc1syXShvYmpbb3V0TmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkMnIoaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0ICogRDJSO1xufVxuXG5mdW5jdGlvbiBjbGVhbldLVCh3a3QpIHtcbiAgaWYgKHdrdC50eXBlID09PSAnR0VPR0NTJykge1xuICAgIHdrdC5wcm9qTmFtZSA9ICdsb25nbGF0JztcbiAgfSBlbHNlIGlmICh3a3QudHlwZSA9PT0gJ0xPQ0FMX0NTJykge1xuICAgIHdrdC5wcm9qTmFtZSA9ICdpZGVudGl0eSc7XG4gICAgd2t0LmxvY2FsID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIHdrdC5QUk9KRUNUSU9OID09PSAnb2JqZWN0Jykge1xuICAgICAgd2t0LnByb2pOYW1lID0gT2JqZWN0LmtleXMod2t0LlBST0pFQ1RJT04pWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB3a3QucHJvak5hbWUgPSB3a3QuUFJPSkVDVElPTjtcbiAgICB9XG4gIH1cbiAgaWYgKHdrdC5BWElTKSB7XG4gICAgdmFyIGF4aXNPcmRlciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHdrdC5BWElTLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgIHZhciBheGlzID0gW3drdC5BWElTW2ldWzBdLnRvTG93ZXJDYXNlKCksIHdrdC5BWElTW2ldWzFdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgaWYgKGF4aXNbMF0uaW5kZXhPZignbm9ydGgnKSAhPT0gLTEgfHwgKChheGlzWzBdID09PSAneScgfHwgYXhpc1swXSA9PT0gJ2xhdCcpICYmIGF4aXNbMV0gPT09ICdub3J0aCcpKSB7XG4gICAgICAgIGF4aXNPcmRlciArPSAnbic7XG4gICAgICB9IGVsc2UgaWYgKGF4aXNbMF0uaW5kZXhPZignc291dGgnKSAhPT0gLTEgfHwgKChheGlzWzBdID09PSAneScgfHwgYXhpc1swXSA9PT0gJ2xhdCcpICYmIGF4aXNbMV0gPT09ICdzb3V0aCcpKSB7XG4gICAgICAgIGF4aXNPcmRlciArPSAncyc7XG4gICAgICB9IGVsc2UgaWYgKGF4aXNbMF0uaW5kZXhPZignZWFzdCcpICE9PSAtMSB8fCAoKGF4aXNbMF0gPT09ICd4JyB8fCBheGlzWzBdID09PSAnbG9uJykgJiYgYXhpc1sxXSA9PT0gJ2Vhc3QnKSkge1xuICAgICAgICBheGlzT3JkZXIgKz0gJ2UnO1xuICAgICAgfSBlbHNlIGlmIChheGlzWzBdLmluZGV4T2YoJ3dlc3QnKSAhPT0gLTEgfHwgKChheGlzWzBdID09PSAneCcgfHwgYXhpc1swXSA9PT0gJ2xvbicpICYmIGF4aXNbMV0gPT09ICd3ZXN0JykpIHtcbiAgICAgICAgYXhpc09yZGVyICs9ICd3JztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGF4aXNPcmRlci5sZW5ndGggPT09IDIpIHtcbiAgICAgIGF4aXNPcmRlciArPSAndSc7XG4gICAgfVxuICAgIGlmIChheGlzT3JkZXIubGVuZ3RoID09PSAzKSB7XG4gICAgICB3a3QuYXhpcyA9IGF4aXNPcmRlcjtcbiAgICB9XG4gIH1cbiAgaWYgKHdrdC5VTklUKSB7XG4gICAgd2t0LnVuaXRzID0gd2t0LlVOSVQubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh3a3QudW5pdHMgPT09ICdtZXRyZScpIHtcbiAgICAgIHdrdC51bml0cyA9ICdtZXRlcic7XG4gICAgfVxuICAgIGlmICh3a3QuVU5JVC5jb252ZXJ0KSB7XG4gICAgICBpZiAod2t0LnR5cGUgPT09ICdHRU9HQ1MnKSB7XG4gICAgICAgIGlmICh3a3QuREFUVU0gJiYgd2t0LkRBVFVNLlNQSEVST0lEKSB7XG4gICAgICAgICAgd2t0LnRvX21ldGVyID0gd2t0LlVOSVQuY29udmVydCp3a3QuREFUVU0uU1BIRVJPSUQuYTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2t0LnRvX21ldGVyID0gd2t0LlVOSVQuY29udmVydDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGdlb2djcyA9IHdrdC5HRU9HQ1M7XG4gIGlmICh3a3QudHlwZSA9PT0gJ0dFT0dDUycpIHtcbiAgICBnZW9nY3MgPSB3a3Q7XG4gIH1cbiAgaWYgKGdlb2djcykge1xuICAgIC8vaWYod2t0LkdFT0dDUy5QUklNRU0mJndrdC5HRU9HQ1MuUFJJTUVNLmNvbnZlcnQpe1xuICAgIC8vICB3a3QuZnJvbV9ncmVlbndpY2g9d2t0LkdFT0dDUy5QUklNRU0uY29udmVydCpEMlI7XG4gICAgLy99XG4gICAgaWYgKGdlb2djcy5EQVRVTSkge1xuICAgICAgd2t0LmRhdHVtQ29kZSA9IGdlb2djcy5EQVRVTS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdrdC5kYXR1bUNvZGUgPSBnZW9nY3MubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAod2t0LmRhdHVtQ29kZS5zbGljZSgwLCAyKSA9PT0gJ2RfJykge1xuICAgICAgd2t0LmRhdHVtQ29kZSA9IHdrdC5kYXR1bUNvZGUuc2xpY2UoMik7XG4gICAgfVxuICAgIGlmICh3a3QuZGF0dW1Db2RlID09PSAnbmV3X3plYWxhbmRfZ2VvZGV0aWNfZGF0dW1fMTk0OScgfHwgd2t0LmRhdHVtQ29kZSA9PT0gJ25ld196ZWFsYW5kXzE5NDknKSB7XG4gICAgICB3a3QuZGF0dW1Db2RlID0gJ256Z2Q0OSc7XG4gICAgfVxuICAgIGlmICh3a3QuZGF0dW1Db2RlID09PSAnd2dzXzE5ODQnIHx8IHdrdC5kYXR1bUNvZGUgPT09ICd3b3JsZF9nZW9kZXRpY19zeXN0ZW1fMTk4NCcpIHtcbiAgICAgIGlmICh3a3QuUFJPSkVDVElPTiA9PT0gJ01lcmNhdG9yX0F1eGlsaWFyeV9TcGhlcmUnKSB7XG4gICAgICAgIHdrdC5zcGhlcmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgd2t0LmRhdHVtQ29kZSA9ICd3Z3M4NCc7XG4gICAgfVxuICAgIGlmICh3a3QuZGF0dW1Db2RlLnNsaWNlKC02KSA9PT0gJ19mZXJybycpIHtcbiAgICAgIHdrdC5kYXR1bUNvZGUgPSB3a3QuZGF0dW1Db2RlLnNsaWNlKDAsIC0gNik7XG4gICAgfVxuICAgIGlmICh3a3QuZGF0dW1Db2RlLnNsaWNlKC04KSA9PT0gJ19qYWthcnRhJykge1xuICAgICAgd2t0LmRhdHVtQ29kZSA9IHdrdC5kYXR1bUNvZGUuc2xpY2UoMCwgLSA4KTtcbiAgICB9XG4gICAgaWYgKH53a3QuZGF0dW1Db2RlLmluZGV4T2YoJ2JlbGdlJykpIHtcbiAgICAgIHdrdC5kYXR1bUNvZGUgPSAncm5iNzInO1xuICAgIH1cbiAgICBpZiAoZ2VvZ2NzLkRBVFVNICYmIGdlb2djcy5EQVRVTS5TUEhFUk9JRCkge1xuICAgICAgd2t0LmVsbHBzID0gZ2VvZ2NzLkRBVFVNLlNQSEVST0lELm5hbWUucmVwbGFjZSgnXzE5JywgJycpLnJlcGxhY2UoL1tDY11sYXJrZVxcXzE4LywgJ2NscmsnKTtcbiAgICAgIGlmICh3a3QuZWxscHMudG9Mb3dlckNhc2UoKS5zbGljZSgwLCAxMykgPT09ICdpbnRlcm5hdGlvbmFsJykge1xuICAgICAgICB3a3QuZWxscHMgPSAnaW50bCc7XG4gICAgICB9XG5cbiAgICAgIHdrdC5hID0gZ2VvZ2NzLkRBVFVNLlNQSEVST0lELmE7XG4gICAgICB3a3QucmYgPSBwYXJzZUZsb2F0KGdlb2djcy5EQVRVTS5TUEhFUk9JRC5yZiwgMTApO1xuICAgIH1cblxuICAgIGlmIChnZW9nY3MuREFUVU0gJiYgZ2VvZ2NzLkRBVFVNLlRPV0dTODQpIHtcbiAgICAgIHdrdC5kYXR1bV9wYXJhbXMgPSBnZW9nY3MuREFUVU0uVE9XR1M4NDtcbiAgICB9XG4gICAgaWYgKH53a3QuZGF0dW1Db2RlLmluZGV4T2YoJ29zZ2JfMTkzNicpKSB7XG4gICAgICB3a3QuZGF0dW1Db2RlID0gJ29zZ2IzNic7XG4gICAgfVxuICAgIGlmICh+d2t0LmRhdHVtQ29kZS5pbmRleE9mKCdvc25pXzE5NTInKSkge1xuICAgICAgd2t0LmRhdHVtQ29kZSA9ICdvc25pNTInO1xuICAgIH1cbiAgICBpZiAofndrdC5kYXR1bUNvZGUuaW5kZXhPZigndG02NScpXG4gICAgICB8fCB+d2t0LmRhdHVtQ29kZS5pbmRleE9mKCdnZW9kZXRpY19kYXR1bV9vZl8xOTY1JykpIHtcbiAgICAgIHdrdC5kYXR1bUNvZGUgPSAnaXJlNjUnO1xuICAgIH1cbiAgICBpZiAod2t0LmRhdHVtQ29kZSA9PT0gJ2NoMTkwMysnKSB7XG4gICAgICB3a3QuZGF0dW1Db2RlID0gJ2NoMTkwMyc7XG4gICAgfVxuICAgIGlmICh+d2t0LmRhdHVtQ29kZS5pbmRleE9mKCdpc3JhZWwnKSkge1xuICAgICAgd2t0LmRhdHVtQ29kZSA9ICdpc3I5Myc7XG4gICAgfVxuICB9XG4gIGlmICh3a3QuYiAmJiAhaXNGaW5pdGUod2t0LmIpKSB7XG4gICAgd2t0LmIgPSB3a3QuYTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvTWV0ZXIoaW5wdXQpIHtcbiAgICB2YXIgcmF0aW8gPSB3a3QudG9fbWV0ZXIgfHwgMTtcbiAgICByZXR1cm4gaW5wdXQgKiByYXRpbztcbiAgfVxuICB2YXIgcmVuYW1lciA9IGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gcmVuYW1lKHdrdCwgYSk7XG4gIH07XG4gIHZhciBsaXN0ID0gW1xuICAgIFsnc3RhbmRhcmRfcGFyYWxsZWxfMScsICdTdGFuZGFyZF9QYXJhbGxlbF8xJ10sXG4gICAgWydzdGFuZGFyZF9wYXJhbGxlbF8xJywgJ0xhdGl0dWRlIG9mIDFzdCBzdGFuZGFyZCBwYXJhbGxlbCddLFxuICAgIFsnc3RhbmRhcmRfcGFyYWxsZWxfMicsICdTdGFuZGFyZF9QYXJhbGxlbF8yJ10sXG4gICAgWydzdGFuZGFyZF9wYXJhbGxlbF8yJywgJ0xhdGl0dWRlIG9mIDJuZCBzdGFuZGFyZCBwYXJhbGxlbCddLFxuICAgIFsnZmFsc2VfZWFzdGluZycsICdGYWxzZV9FYXN0aW5nJ10sXG4gICAgWydmYWxzZV9lYXN0aW5nJywgJ0ZhbHNlIGVhc3RpbmcnXSxcbiAgICBbJ2ZhbHNlLWVhc3RpbmcnLCAnRWFzdGluZyBhdCBmYWxzZSBvcmlnaW4nXSxcbiAgICBbJ2ZhbHNlX25vcnRoaW5nJywgJ0ZhbHNlX05vcnRoaW5nJ10sXG4gICAgWydmYWxzZV9ub3J0aGluZycsICdGYWxzZSBub3J0aGluZyddLFxuICAgIFsnZmFsc2Vfbm9ydGhpbmcnLCAnTm9ydGhpbmcgYXQgZmFsc2Ugb3JpZ2luJ10sXG4gICAgWydjZW50cmFsX21lcmlkaWFuJywgJ0NlbnRyYWxfTWVyaWRpYW4nXSxcbiAgICBbJ2NlbnRyYWxfbWVyaWRpYW4nLCAnTG9uZ2l0dWRlIG9mIG5hdHVyYWwgb3JpZ2luJ10sXG4gICAgWydjZW50cmFsX21lcmlkaWFuJywgJ0xvbmdpdHVkZSBvZiBmYWxzZSBvcmlnaW4nXSxcbiAgICBbJ2xhdGl0dWRlX29mX29yaWdpbicsICdMYXRpdHVkZV9PZl9PcmlnaW4nXSxcbiAgICBbJ2xhdGl0dWRlX29mX29yaWdpbicsICdDZW50cmFsX1BhcmFsbGVsJ10sXG4gICAgWydsYXRpdHVkZV9vZl9vcmlnaW4nLCAnTGF0aXR1ZGUgb2YgbmF0dXJhbCBvcmlnaW4nXSxcbiAgICBbJ2xhdGl0dWRlX29mX29yaWdpbicsICdMYXRpdHVkZSBvZiBmYWxzZSBvcmlnaW4nXSxcbiAgICBbJ3NjYWxlX2ZhY3RvcicsICdTY2FsZV9GYWN0b3InXSxcbiAgICBbJ2swJywgJ3NjYWxlX2ZhY3RvciddLFxuICAgIFsnbGF0aXR1ZGVfb2ZfY2VudGVyJywgJ0xhdGl0dWRlX09mX0NlbnRlciddLFxuICAgIFsnbGF0aXR1ZGVfb2ZfY2VudGVyJywgJ0xhdGl0dWRlX29mX2NlbnRlciddLFxuICAgIFsnbGF0MCcsICdsYXRpdHVkZV9vZl9jZW50ZXInLCBkMnJdLFxuICAgIFsnbG9uZ2l0dWRlX29mX2NlbnRlcicsICdMb25naXR1ZGVfT2ZfQ2VudGVyJ10sXG4gICAgWydsb25naXR1ZGVfb2ZfY2VudGVyJywgJ0xvbmdpdHVkZV9vZl9jZW50ZXInXSxcbiAgICBbJ2xvbmdjJywgJ2xvbmdpdHVkZV9vZl9jZW50ZXInLCBkMnJdLFxuICAgIFsneDAnLCAnZmFsc2VfZWFzdGluZycsIHRvTWV0ZXJdLFxuICAgIFsneTAnLCAnZmFsc2Vfbm9ydGhpbmcnLCB0b01ldGVyXSxcbiAgICBbJ2xvbmcwJywgJ2NlbnRyYWxfbWVyaWRpYW4nLCBkMnJdLFxuICAgIFsnbGF0MCcsICdsYXRpdHVkZV9vZl9vcmlnaW4nLCBkMnJdLFxuICAgIFsnbGF0MCcsICdzdGFuZGFyZF9wYXJhbGxlbF8xJywgZDJyXSxcbiAgICBbJ2xhdDEnLCAnc3RhbmRhcmRfcGFyYWxsZWxfMScsIGQycl0sXG4gICAgWydsYXQyJywgJ3N0YW5kYXJkX3BhcmFsbGVsXzInLCBkMnJdLFxuICAgIFsnYXppbXV0aCcsICdBemltdXRoJ10sXG4gICAgWydhbHBoYScsICdhemltdXRoJywgZDJyXSxcbiAgICBbJ3Nyc0NvZGUnLCAnbmFtZSddXG4gIF07XG4gIGxpc3QuZm9yRWFjaChyZW5hbWVyKTtcbiAgaWYgKCF3a3QubG9uZzAgJiYgd2t0LmxvbmdjICYmICh3a3QucHJvak5hbWUgPT09ICdBbGJlcnNfQ29uaWNfRXF1YWxfQXJlYScgfHwgd2t0LnByb2pOYW1lID09PSAnTGFtYmVydF9BemltdXRoYWxfRXF1YWxfQXJlYScpKSB7XG4gICAgd2t0LmxvbmcwID0gd2t0LmxvbmdjO1xuICB9XG4gIGlmICghd2t0LmxhdF90cyAmJiB3a3QubGF0MSAmJiAod2t0LnByb2pOYW1lID09PSAnU3RlcmVvZ3JhcGhpY19Tb3V0aF9Qb2xlJyB8fCB3a3QucHJvak5hbWUgPT09ICdQb2xhciBTdGVyZW9ncmFwaGljICh2YXJpYW50IEIpJykpIHtcbiAgICB3a3QubGF0MCA9IGQycih3a3QubGF0MSA+IDAgPyA5MCA6IC05MCk7XG4gICAgd2t0LmxhdF90cyA9IHdrdC5sYXQxO1xuICB9XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih3a3QpIHtcbiAgdmFyIGxpc3AgPSBwYXJzZXIod2t0KTtcbiAgdmFyIHR5cGUgPSBsaXNwLnNoaWZ0KCk7XG4gIHZhciBuYW1lID0gbGlzcC5zaGlmdCgpO1xuICBsaXNwLnVuc2hpZnQoWyduYW1lJywgbmFtZV0pO1xuICBsaXNwLnVuc2hpZnQoWyd0eXBlJywgdHlwZV0pO1xuICB2YXIgb2JqID0ge307XG4gIHNFeHByKGxpc3AsIG9iaik7XG4gIGNsZWFuV0tUKG9iaik7XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZ2xvYmFscyBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgcGFyc2VQcm9qIGZyb20gJy4vcHJvalN0cmluZyc7XG5pbXBvcnQgd2t0IGZyb20gJ3drdC1wYXJzZXInO1xuXG5mdW5jdGlvbiBkZWZzKG5hbWUpIHtcbiAgLypnbG9iYWwgY29uc29sZSovXG4gIHZhciB0aGF0ID0gdGhpcztcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICB2YXIgZGVmID0gYXJndW1lbnRzWzFdO1xuICAgIGlmICh0eXBlb2YgZGVmID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGRlZi5jaGFyQXQoMCkgPT09ICcrJykge1xuICAgICAgICBkZWZzW25hbWVdID0gcGFyc2VQcm9qKGFyZ3VtZW50c1sxXSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZGVmc1tuYW1lXSA9IHdrdChhcmd1bWVudHNbMV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWZzW25hbWVdID0gZGVmO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLm1hcChmdW5jdGlvbih2KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgICAgZGVmcy5hcHBseSh0aGF0LCB2KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWZzKHYpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAobmFtZSBpbiBkZWZzKSB7XG4gICAgICAgIHJldHVybiBkZWZzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgnRVBTRycgaW4gbmFtZSkge1xuICAgICAgZGVmc1snRVBTRzonICsgbmFtZS5FUFNHXSA9IG5hbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKCdFU1JJJyBpbiBuYW1lKSB7XG4gICAgICBkZWZzWydFU1JJOicgKyBuYW1lLkVTUkldID0gbmFtZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoJ0lBVTIwMDAnIGluIG5hbWUpIHtcbiAgICAgIGRlZnNbJ0lBVTIwMDA6JyArIG5hbWUuSUFVMjAwMF0gPSBuYW1lO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuXG59XG5nbG9iYWxzKGRlZnMpO1xuZXhwb3J0IGRlZmF1bHQgZGVmcztcbiIsImltcG9ydCBkZWZzIGZyb20gJy4vZGVmcyc7XG5pbXBvcnQgd2t0IGZyb20gJ3drdC1wYXJzZXInO1xuaW1wb3J0IHByb2pTdHIgZnJvbSAnLi9wcm9qU3RyaW5nJztcbmltcG9ydCBtYXRjaCBmcm9tICcuL21hdGNoJztcbmZ1bmN0aW9uIHRlc3RPYmooY29kZSl7XG4gIHJldHVybiB0eXBlb2YgY29kZSA9PT0gJ3N0cmluZyc7XG59XG5mdW5jdGlvbiB0ZXN0RGVmKGNvZGUpe1xuICByZXR1cm4gY29kZSBpbiBkZWZzO1xufVxudmFyIGNvZGVXb3JkcyA9IFsnUFJPSkVDVEVEQ1JTJywgJ1BST0pDUlMnLCAnR0VPR0NTJywnR0VPQ0NTJywnUFJPSkNTJywnTE9DQUxfQ1MnLCAnR0VPRENSUycsICdHRU9ERVRJQ0NSUycsICdHRU9ERVRJQ0RBVFVNJywgJ0VOR0NSUycsICdFTkdJTkVFUklOR0NSUyddO1xuZnVuY3Rpb24gdGVzdFdLVChjb2RlKXtcbiAgcmV0dXJuIGNvZGVXb3Jkcy5zb21lKGZ1bmN0aW9uICh3b3JkKSB7XG4gICAgcmV0dXJuIGNvZGUuaW5kZXhPZih3b3JkKSA+IC0xO1xuICB9KTtcbn1cbnZhciBjb2RlcyA9IFsnMzg1NycsICc5MDA5MTMnLCAnMzc4NScsICcxMDIxMTMnXTtcbmZ1bmN0aW9uIGNoZWNrTWVyY2F0b3IoaXRlbSkge1xuICB2YXIgYXV0aCA9IG1hdGNoKGl0ZW0sICdhdXRob3JpdHknKTtcbiAgaWYgKCFhdXRoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjb2RlID0gbWF0Y2goYXV0aCwgJ2Vwc2cnKTtcbiAgcmV0dXJuIGNvZGUgJiYgY29kZXMuaW5kZXhPZihjb2RlKSA+IC0xO1xufVxuZnVuY3Rpb24gY2hlY2tQcm9qU3RyKGl0ZW0pIHtcbiAgdmFyIGV4dCA9IG1hdGNoKGl0ZW0sICdleHRlbnNpb24nKTtcbiAgaWYgKCFleHQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIG1hdGNoKGV4dCwgJ3Byb2o0Jyk7XG59XG5mdW5jdGlvbiB0ZXN0UHJvaihjb2RlKXtcbiAgcmV0dXJuIGNvZGVbMF0gPT09ICcrJztcbn1cbmZ1bmN0aW9uIHBhcnNlKGNvZGUpe1xuICBpZiAodGVzdE9iaihjb2RlKSkge1xuICAgIC8vY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBXS1Qgc3RyaW5nXG4gICAgaWYgKHRlc3REZWYoY29kZSkpIHtcbiAgICAgIHJldHVybiBkZWZzW2NvZGVdO1xuICAgIH1cbiAgICBpZiAodGVzdFdLVChjb2RlKSkge1xuICAgICAgdmFyIG91dCA9IHdrdChjb2RlKTtcbiAgICAgIC8vIHRlc3Qgb2Ygc3BldGlhbCBjYXNlLCBkdWUgdG8gdGhpcyBiZWluZyBhIHZlcnkgY29tbW9uIGFuZCBvZnRlbiBtYWxmb3JtZWRcbiAgICAgIGlmIChjaGVja01lcmNhdG9yKG91dCkpIHtcbiAgICAgICAgcmV0dXJuIGRlZnNbJ0VQU0c6Mzg1NyddO1xuICAgICAgfVxuICAgICAgdmFyIG1heWJlUHJvalN0ciA9IGNoZWNrUHJvalN0cihvdXQpO1xuICAgICAgaWYgKG1heWJlUHJvalN0cikge1xuICAgICAgICByZXR1cm4gcHJvalN0cihtYXliZVByb2pTdHIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgaWYgKHRlc3RQcm9qKGNvZGUpKSB7XG4gICAgICByZXR1cm4gcHJvalN0cihjb2RlKTtcbiAgICB9XG4gIH1lbHNle1xuICAgIHJldHVybiBjb2RlO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVzdGluYXRpb24sIHNvdXJjZSkge1xuICBkZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uIHx8IHt9O1xuICB2YXIgdmFsdWUsIHByb3BlcnR5O1xuICBpZiAoIXNvdXJjZSkge1xuICAgIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgfVxuICBmb3IgKHByb3BlcnR5IGluIHNvdXJjZSkge1xuICAgIHZhbHVlID0gc291cmNlW3Byb3BlcnR5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25bcHJvcGVydHldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVjY2VudCwgc2lucGhpLCBjb3NwaGkpIHtcbiAgdmFyIGNvbiA9IGVjY2VudCAqIHNpbnBoaTtcbiAgcmV0dXJuIGNvc3BoaSAvIChNYXRoLnNxcnQoMSAtIGNvbiAqIGNvbikpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg8MCA/IC0xIDogMTtcbn0iLCJcbmltcG9ydCB7VFdPX1BJLCBTUEl9IGZyb20gJy4uL2NvbnN0YW50cy92YWx1ZXMnO1xuaW1wb3J0IHNpZ24gZnJvbSAnLi9zaWduJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gKE1hdGguYWJzKHgpIDw9IFNQSSkgPyB4IDogKHggLSAoc2lnbih4KSAqIFRXT19QSSkpO1xufVxuIiwiaW1wb3J0IHtIQUxGX1BJfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZWNjZW50LCBwaGksIHNpbnBoaSkge1xuICB2YXIgY29uID0gZWNjZW50ICogc2lucGhpO1xuICB2YXIgY29tID0gMC41ICogZWNjZW50O1xuICBjb24gPSBNYXRoLnBvdygoKDEgLSBjb24pIC8gKDEgKyBjb24pKSwgY29tKTtcbiAgcmV0dXJuIChNYXRoLnRhbigwLjUgKiAoSEFMRl9QSSAtIHBoaSkpIC8gY29uKTtcbn1cbiIsImltcG9ydCB7SEFMRl9QSX0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVjY2VudCwgdHMpIHtcbiAgdmFyIGVjY250aCA9IDAuNSAqIGVjY2VudDtcbiAgdmFyIGNvbiwgZHBoaTtcbiAgdmFyIHBoaSA9IEhBTEZfUEkgLSAyICogTWF0aC5hdGFuKHRzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gMTU7IGkrKykge1xuICAgIGNvbiA9IGVjY2VudCAqIE1hdGguc2luKHBoaSk7XG4gICAgZHBoaSA9IEhBTEZfUEkgLSAyICogTWF0aC5hdGFuKHRzICogKE1hdGgucG93KCgoMSAtIGNvbikgLyAoMSArIGNvbikpLCBlY2NudGgpKSkgLSBwaGk7XG4gICAgcGhpICs9IGRwaGk7XG4gICAgaWYgKE1hdGguYWJzKGRwaGkpIDw9IDAuMDAwMDAwMDAwMSkge1xuICAgICAgcmV0dXJuIHBoaTtcbiAgICB9XG4gIH1cbiAgLy9jb25zb2xlLmxvZyhcInBoaTJ6IGhhcyBOb0NvbnZlcmdlbmNlXCIpO1xuICByZXR1cm4gLTk5OTk7XG59XG4iLCJpbXBvcnQgbXNmbnogZnJvbSAnLi4vY29tbW9uL21zZm56JztcblxuaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuaW1wb3J0IHRzZm56IGZyb20gJy4uL2NvbW1vbi90c2Zueic7XG5pbXBvcnQgcGhpMnogZnJvbSAnLi4vY29tbW9uL3BoaTJ6JztcbmltcG9ydCB7Rk9SVFBJLCBSMkQsIEVQU0xOLCBIQUxGX1BJfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICB2YXIgY29uID0gdGhpcy5iIC8gdGhpcy5hO1xuICB0aGlzLmVzID0gMSAtIGNvbiAqIGNvbjtcbiAgaWYoISgneDAnIGluIHRoaXMpKXtcbiAgICB0aGlzLngwID0gMDtcbiAgfVxuICBpZighKCd5MCcgaW4gdGhpcykpe1xuICAgIHRoaXMueTAgPSAwO1xuICB9XG4gIHRoaXMuZSA9IE1hdGguc3FydCh0aGlzLmVzKTtcbiAgaWYgKHRoaXMubGF0X3RzKSB7XG4gICAgaWYgKHRoaXMuc3BoZXJlKSB7XG4gICAgICB0aGlzLmswID0gTWF0aC5jb3ModGhpcy5sYXRfdHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuazAgPSBtc2Zueih0aGlzLmUsIE1hdGguc2luKHRoaXMubGF0X3RzKSwgTWF0aC5jb3ModGhpcy5sYXRfdHMpKTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKCF0aGlzLmswKSB7XG4gICAgICBpZiAodGhpcy5rKSB7XG4gICAgICAgIHRoaXMuazAgPSB0aGlzLms7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5rMCA9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qIE1lcmNhdG9yIGZvcndhcmQgZXF1YXRpb25zLS1tYXBwaW5nIGxhdCxsb25nIHRvIHgseVxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIGxvbiA9IHAueDtcbiAgdmFyIGxhdCA9IHAueTtcbiAgLy8gY29udmVydCB0byByYWRpYW5zXG4gIGlmIChsYXQgKiBSMkQgPiA5MCAmJiBsYXQgKiBSMkQgPCAtOTAgJiYgbG9uICogUjJEID4gMTgwICYmIGxvbiAqIFIyRCA8IC0xODApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciB4LCB5O1xuICBpZiAoTWF0aC5hYnMoTWF0aC5hYnMobGF0KSAtIEhBTEZfUEkpIDw9IEVQU0xOKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKHRoaXMuc3BoZXJlKSB7XG4gICAgICB4ID0gdGhpcy54MCArIHRoaXMuYSAqIHRoaXMuazAgKiBhZGp1c3RfbG9uKGxvbiAtIHRoaXMubG9uZzApO1xuICAgICAgeSA9IHRoaXMueTAgKyB0aGlzLmEgKiB0aGlzLmswICogTWF0aC5sb2coTWF0aC50YW4oRk9SVFBJICsgMC41ICogbGF0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHNpbnBoaSA9IE1hdGguc2luKGxhdCk7XG4gICAgICB2YXIgdHMgPSB0c2Zueih0aGlzLmUsIGxhdCwgc2lucGhpKTtcbiAgICAgIHggPSB0aGlzLngwICsgdGhpcy5hICogdGhpcy5rMCAqIGFkanVzdF9sb24obG9uIC0gdGhpcy5sb25nMCk7XG4gICAgICB5ID0gdGhpcy55MCAtIHRoaXMuYSAqIHRoaXMuazAgKiBNYXRoLmxvZyh0cyk7XG4gICAgfVxuICAgIHAueCA9IHg7XG4gICAgcC55ID0geTtcbiAgICByZXR1cm4gcDtcbiAgfVxufVxuXG4vKiBNZXJjYXRvciBpbnZlcnNlIGVxdWF0aW9ucy0tbWFwcGluZyB4LHkgdG8gbGF0L2xvbmdcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuXG4gIHZhciB4ID0gcC54IC0gdGhpcy54MDtcbiAgdmFyIHkgPSBwLnkgLSB0aGlzLnkwO1xuICB2YXIgbG9uLCBsYXQ7XG5cbiAgaWYgKHRoaXMuc3BoZXJlKSB7XG4gICAgbGF0ID0gSEFMRl9QSSAtIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoLXkgLyAodGhpcy5hICogdGhpcy5rMCkpKTtcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgdHMgPSBNYXRoLmV4cCgteSAvICh0aGlzLmEgKiB0aGlzLmswKSk7XG4gICAgbGF0ID0gcGhpMnoodGhpcy5lLCB0cyk7XG4gICAgaWYgKGxhdCA9PT0gLTk5OTkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyB4IC8gKHRoaXMuYSAqIHRoaXMuazApKTtcblxuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJNZXJjYXRvclwiLCBcIlBvcHVsYXIgVmlzdWFsaXNhdGlvbiBQc2V1ZG8gTWVyY2F0b3JcIiwgXCJNZXJjYXRvcl8xU1BcIiwgXCJNZXJjYXRvcl9BdXhpbGlhcnlfU3BoZXJlXCIsIFwibWVyY1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vbm8tb3AgZm9yIGxvbmdsYXRcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHkocHQpIHtcbiAgcmV0dXJuIHB0O1xufVxuZXhwb3J0IHtpZGVudGl0eSBhcyBmb3J3YXJkfTtcbmV4cG9ydCB7aWRlbnRpdHkgYXMgaW52ZXJzZX07XG5leHBvcnQgdmFyIG5hbWVzID0gW1wibG9uZ2xhdFwiLCBcImlkZW50aXR5XCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBpZGVudGl0eSxcbiAgaW52ZXJzZTogaWRlbnRpdHksXG4gIG5hbWVzOiBuYW1lc1xufTtcbiIsImltcG9ydCBtZXJjIGZyb20gXCIuL3Byb2plY3Rpb25zL21lcmNcIjtcbmltcG9ydCBsb25nbGF0IGZyb20gXCIuL3Byb2plY3Rpb25zL2xvbmdsYXRcIjtcbnZhciBwcm9qcyA9IFttZXJjLCBsb25nbGF0XTtcbnZhciBuYW1lcyA9IHt9O1xudmFyIHByb2pTdG9yZSA9IFtdO1xuXG5mdW5jdGlvbiBhZGQocHJvaiwgaSkge1xuICB2YXIgbGVuID0gcHJvalN0b3JlLmxlbmd0aDtcbiAgaWYgKCFwcm9qLm5hbWVzKSB7XG4gICAgY29uc29sZS5sb2coaSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvalN0b3JlW2xlbl0gPSBwcm9qO1xuICBwcm9qLm5hbWVzLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgIG5hbWVzW24udG9Mb3dlckNhc2UoKV0gPSBsZW47XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IHthZGR9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5hbWUpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBuID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAodHlwZW9mIG5hbWVzW25dICE9PSAndW5kZWZpbmVkJyAmJiBwcm9qU3RvcmVbbmFtZXNbbl1dKSB7XG4gICAgcmV0dXJuIHByb2pTdG9yZVtuYW1lc1tuXV07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBwcm9qcy5mb3JFYWNoKGFkZCk7XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gIHN0YXJ0OiBzdGFydCxcbiAgYWRkOiBhZGQsXG4gIGdldDogZ2V0XG59O1xuIiwidmFyIGV4cG9ydHMgPSB7fTtcbmV4cG9ydCB7ZXhwb3J0cyBhcyBkZWZhdWx0fTtcbmV4cG9ydHMuTUVSSVQgPSB7XG4gIGE6IDYzNzgxMzcuMCxcbiAgcmY6IDI5OC4yNTcsXG4gIGVsbGlwc2VOYW1lOiBcIk1FUklUIDE5ODNcIlxufTtcblxuZXhwb3J0cy5TR1M4NSA9IHtcbiAgYTogNjM3ODEzNi4wLFxuICByZjogMjk4LjI1NyxcbiAgZWxsaXBzZU5hbWU6IFwiU292aWV0IEdlb2RldGljIFN5c3RlbSA4NVwiXG59O1xuXG5leHBvcnRzLkdSUzgwID0ge1xuICBhOiA2Mzc4MTM3LjAsXG4gIHJmOiAyOTguMjU3MjIyMTAxLFxuICBlbGxpcHNlTmFtZTogXCJHUlMgMTk4MChJVUdHLCAxOTgwKVwiXG59O1xuXG5leHBvcnRzLklBVTc2ID0ge1xuICBhOiA2Mzc4MTQwLjAsXG4gIHJmOiAyOTguMjU3LFxuICBlbGxpcHNlTmFtZTogXCJJQVUgMTk3NlwiXG59O1xuXG5leHBvcnRzLmFpcnkgPSB7XG4gIGE6IDYzNzc1NjMuMzk2LFxuICBiOiA2MzU2MjU2LjkxMCxcbiAgZWxsaXBzZU5hbWU6IFwiQWlyeSAxODMwXCJcbn07XG5cbmV4cG9ydHMuQVBMNCA9IHtcbiAgYTogNjM3ODEzNyxcbiAgcmY6IDI5OC4yNSxcbiAgZWxsaXBzZU5hbWU6IFwiQXBwbC4gUGh5c2ljcy4gMTk2NVwiXG59O1xuXG5leHBvcnRzLk5XTDlEID0ge1xuICBhOiA2Mzc4MTQ1LjAsXG4gIHJmOiAyOTguMjUsXG4gIGVsbGlwc2VOYW1lOiBcIk5hdmFsIFdlYXBvbnMgTGFiLiwgMTk2NVwiXG59O1xuXG5leHBvcnRzLm1vZF9haXJ5ID0ge1xuICBhOiA2Mzc3MzQwLjE4OSxcbiAgYjogNjM1NjAzNC40NDYsXG4gIGVsbGlwc2VOYW1lOiBcIk1vZGlmaWVkIEFpcnlcIlxufTtcblxuZXhwb3J0cy5hbmRyYWUgPSB7XG4gIGE6IDYzNzcxMDQuNDMsXG4gIHJmOiAzMDAuMCxcbiAgZWxsaXBzZU5hbWU6IFwiQW5kcmFlIDE4NzYgKERlbi4sIEljbG5kLilcIlxufTtcblxuZXhwb3J0cy5hdXN0X1NBID0ge1xuICBhOiA2Mzc4MTYwLjAsXG4gIHJmOiAyOTguMjUsXG4gIGVsbGlwc2VOYW1lOiBcIkF1c3RyYWxpYW4gTmF0bCAmIFMuIEFtZXIuIDE5NjlcIlxufTtcblxuZXhwb3J0cy5HUlM2NyA9IHtcbiAgYTogNjM3ODE2MC4wLFxuICByZjogMjk4LjI0NzE2NzQyNzAsXG4gIGVsbGlwc2VOYW1lOiBcIkdSUyA2NyhJVUdHIDE5NjcpXCJcbn07XG5cbmV4cG9ydHMuYmVzc2VsID0ge1xuICBhOiA2Mzc3Mzk3LjE1NSxcbiAgcmY6IDI5OS4xNTI4MTI4LFxuICBlbGxpcHNlTmFtZTogXCJCZXNzZWwgMTg0MVwiXG59O1xuXG5leHBvcnRzLmJlc3NfbmFtID0ge1xuICBhOiA2Mzc3NDgzLjg2NSxcbiAgcmY6IDI5OS4xNTI4MTI4LFxuICBlbGxpcHNlTmFtZTogXCJCZXNzZWwgMTg0MSAoTmFtaWJpYSlcIlxufTtcblxuZXhwb3J0cy5jbHJrNjYgPSB7XG4gIGE6IDYzNzgyMDYuNCxcbiAgYjogNjM1NjU4My44LFxuICBlbGxpcHNlTmFtZTogXCJDbGFya2UgMTg2NlwiXG59O1xuXG5leHBvcnRzLmNscms4MCA9IHtcbiAgYTogNjM3ODI0OS4xNDUsXG4gIHJmOiAyOTMuNDY2MyxcbiAgZWxsaXBzZU5hbWU6IFwiQ2xhcmtlIDE4ODAgbW9kLlwiXG59O1xuXG5leHBvcnRzLmNscms4MGlnbiA9IHtcbiAgYTogNjM3ODI0OS4yLFxuICBiOiA2MzU2NTE1LFxuICByZjogMjkzLjQ2NjAyMTMsXG4gIGVsbGlwc2VOYW1lOiBcIkNsYXJrZSAxODgwIChJR04pXCJcbn07XG5cbmV4cG9ydHMuY2xyazU4ID0ge1xuICBhOiA2Mzc4MjkzLjY0NTIwODc1OSxcbiAgcmY6IDI5NC4yNjA2NzYzNjkyNjU0LFxuICBlbGxpcHNlTmFtZTogXCJDbGFya2UgMTg1OFwiXG59O1xuXG5leHBvcnRzLkNQTSA9IHtcbiAgYTogNjM3NTczOC43LFxuICByZjogMzM0LjI5LFxuICBlbGxpcHNlTmFtZTogXCJDb21tLiBkZXMgUG9pZHMgZXQgTWVzdXJlcyAxNzk5XCJcbn07XG5cbmV4cG9ydHMuZGVsbWJyID0ge1xuICBhOiA2Mzc2NDI4LjAsXG4gIHJmOiAzMTEuNSxcbiAgZWxsaXBzZU5hbWU6IFwiRGVsYW1icmUgMTgxMCAoQmVsZ2l1bSlcIlxufTtcblxuZXhwb3J0cy5lbmdlbGlzID0ge1xuICBhOiA2Mzc4MTM2LjA1LFxuICByZjogMjk4LjI1NjYsXG4gIGVsbGlwc2VOYW1lOiBcIkVuZ2VsaXMgMTk4NVwiXG59O1xuXG5leHBvcnRzLmV2cnN0MzAgPSB7XG4gIGE6IDYzNzcyNzYuMzQ1LFxuICByZjogMzAwLjgwMTcsXG4gIGVsbGlwc2VOYW1lOiBcIkV2ZXJlc3QgMTgzMFwiXG59O1xuXG5leHBvcnRzLmV2cnN0NDggPSB7XG4gIGE6IDYzNzczMDQuMDYzLFxuICByZjogMzAwLjgwMTcsXG4gIGVsbGlwc2VOYW1lOiBcIkV2ZXJlc3QgMTk0OFwiXG59O1xuXG5leHBvcnRzLmV2cnN0NTYgPSB7XG4gIGE6IDYzNzczMDEuMjQzLFxuICByZjogMzAwLjgwMTcsXG4gIGVsbGlwc2VOYW1lOiBcIkV2ZXJlc3QgMTk1NlwiXG59O1xuXG5leHBvcnRzLmV2cnN0NjkgPSB7XG4gIGE6IDYzNzcyOTUuNjY0LFxuICByZjogMzAwLjgwMTcsXG4gIGVsbGlwc2VOYW1lOiBcIkV2ZXJlc3QgMTk2OVwiXG59O1xuXG5leHBvcnRzLmV2cnN0U1MgPSB7XG4gIGE6IDYzNzcyOTguNTU2LFxuICByZjogMzAwLjgwMTcsXG4gIGVsbGlwc2VOYW1lOiBcIkV2ZXJlc3QgKFNhYmFoICYgU2FyYXdhaylcIlxufTtcblxuZXhwb3J0cy5mc2NocjYwID0ge1xuICBhOiA2Mzc4MTY2LjAsXG4gIHJmOiAyOTguMyxcbiAgZWxsaXBzZU5hbWU6IFwiRmlzY2hlciAoTWVyY3VyeSBEYXR1bSkgMTk2MFwiXG59O1xuXG5leHBvcnRzLmZzY2hyNjBtID0ge1xuICBhOiA2Mzc4MTU1LjAsXG4gIHJmOiAyOTguMyxcbiAgZWxsaXBzZU5hbWU6IFwiRmlzY2hlciAxOTYwXCJcbn07XG5cbmV4cG9ydHMuZnNjaHI2OCA9IHtcbiAgYTogNjM3ODE1MC4wLFxuICByZjogMjk4LjMsXG4gIGVsbGlwc2VOYW1lOiBcIkZpc2NoZXIgMTk2OFwiXG59O1xuXG5leHBvcnRzLmhlbG1lcnQgPSB7XG4gIGE6IDYzNzgyMDAuMCxcbiAgcmY6IDI5OC4zLFxuICBlbGxpcHNlTmFtZTogXCJIZWxtZXJ0IDE5MDZcIlxufTtcblxuZXhwb3J0cy5ob3VnaCA9IHtcbiAgYTogNjM3ODI3MC4wLFxuICByZjogMjk3LjAsXG4gIGVsbGlwc2VOYW1lOiBcIkhvdWdoXCJcbn07XG5cbmV4cG9ydHMuaW50bCA9IHtcbiAgYTogNjM3ODM4OC4wLFxuICByZjogMjk3LjAsXG4gIGVsbGlwc2VOYW1lOiBcIkludGVybmF0aW9uYWwgMTkwOSAoSGF5Zm9yZClcIlxufTtcblxuZXhwb3J0cy5rYXVsYSA9IHtcbiAgYTogNjM3ODE2My4wLFxuICByZjogMjk4LjI0LFxuICBlbGxpcHNlTmFtZTogXCJLYXVsYSAxOTYxXCJcbn07XG5cbmV4cG9ydHMubGVyY2ggPSB7XG4gIGE6IDYzNzgxMzkuMCxcbiAgcmY6IDI5OC4yNTcsXG4gIGVsbGlwc2VOYW1lOiBcIkxlcmNoIDE5NzlcIlxufTtcblxuZXhwb3J0cy5tcHJ0cyA9IHtcbiAgYTogNjM5NzMwMC4wLFxuICByZjogMTkxLjAsXG4gIGVsbGlwc2VOYW1lOiBcIk1hdXBlcnRpdXMgMTczOFwiXG59O1xuXG5leHBvcnRzLm5ld19pbnRsID0ge1xuICBhOiA2Mzc4MTU3LjUsXG4gIGI6IDYzNTY3NzIuMixcbiAgZWxsaXBzZU5hbWU6IFwiTmV3IEludGVybmF0aW9uYWwgMTk2N1wiXG59O1xuXG5leHBvcnRzLnBsZXNzaXMgPSB7XG4gIGE6IDYzNzY1MjMuMCxcbiAgcmY6IDYzNTU4NjMuMCxcbiAgZWxsaXBzZU5hbWU6IFwiUGxlc3NpcyAxODE3IChGcmFuY2UpXCJcbn07XG5cbmV4cG9ydHMua3Jhc3MgPSB7XG4gIGE6IDYzNzgyNDUuMCxcbiAgcmY6IDI5OC4zLFxuICBlbGxpcHNlTmFtZTogXCJLcmFzc292c2t5LCAxOTQyXCJcbn07XG5cbmV4cG9ydHMuU0Vhc2lhID0ge1xuICBhOiA2Mzc4MTU1LjAsXG4gIGI6IDYzNTY3NzMuMzIwNSxcbiAgZWxsaXBzZU5hbWU6IFwiU291dGhlYXN0IEFzaWFcIlxufTtcblxuZXhwb3J0cy53YWxiZWNrID0ge1xuICBhOiA2Mzc2ODk2LjAsXG4gIGI6IDYzNTU4MzQuODQ2NyxcbiAgZWxsaXBzZU5hbWU6IFwiV2FsYmVja1wiXG59O1xuXG5leHBvcnRzLldHUzYwID0ge1xuICBhOiA2Mzc4MTY1LjAsXG4gIHJmOiAyOTguMyxcbiAgZWxsaXBzZU5hbWU6IFwiV0dTIDYwXCJcbn07XG5cbmV4cG9ydHMuV0dTNjYgPSB7XG4gIGE6IDYzNzgxNDUuMCxcbiAgcmY6IDI5OC4yNSxcbiAgZWxsaXBzZU5hbWU6IFwiV0dTIDY2XCJcbn07XG5cbmV4cG9ydHMuV0dTNyA9IHtcbiAgYTogNjM3ODEzNS4wLFxuICByZjogMjk4LjI2LFxuICBlbGxpcHNlTmFtZTogXCJXR1MgNzJcIlxufTtcblxuZXhwb3J0IHZhciBXR1M4NCA9IGV4cG9ydHMuV0dTODQgPSB7XG4gIGE6IDYzNzgxMzcuMCxcbiAgcmY6IDI5OC4yNTcyMjM1NjMsXG4gIGVsbGlwc2VOYW1lOiBcIldHUyA4NFwiXG59O1xuXG5leHBvcnRzLnNwaGVyZSA9IHtcbiAgYTogNjM3MDk5Ny4wLFxuICBiOiA2MzcwOTk3LjAsXG4gIGVsbGlwc2VOYW1lOiBcIk5vcm1hbCBTcGhlcmUgKHI9NjM3MDk5NylcIlxufTtcbiIsImltcG9ydCB7U0lYVEgsIFJBNCwgUkE2LCBFUFNMTn0gZnJvbSAnLi9jb25zdGFudHMvdmFsdWVzJztcbmltcG9ydCB7ZGVmYXVsdCBhcyBFbGxpcHNvaWQsIFdHUzg0fSBmcm9tICcuL2NvbnN0YW50cy9FbGxpcHNvaWQnO1xuaW1wb3J0IG1hdGNoIGZyb20gJy4vbWF0Y2gnO1xuXG5leHBvcnQgZnVuY3Rpb24gZWNjZW50cmljaXR5KGEsIGIsIHJmLCBSX0EpIHtcbiAgdmFyIGEyID0gYSAqIGE7IC8vIHVzZWQgaW4gZ2VvY2VudHJpY1xuICB2YXIgYjIgPSBiICogYjsgLy8gdXNlZCBpbiBnZW9jZW50cmljXG4gIHZhciBlcyA9IChhMiAtIGIyKSAvIGEyOyAvLyBlIF4gMlxuICB2YXIgZSA9IDA7XG4gIGlmIChSX0EpIHtcbiAgICBhICo9IDEgLSBlcyAqIChTSVhUSCArIGVzICogKFJBNCArIGVzICogUkE2KSk7XG4gICAgYTIgPSBhICogYTtcbiAgICBlcyA9IDA7XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguc3FydChlcyk7IC8vIGVjY2VudHJpY2l0eVxuICB9XG4gIHZhciBlcDIgPSAoYTIgLSBiMikgLyBiMjsgLy8gdXNlZCBpbiBnZW9jZW50cmljXG4gIHJldHVybiB7XG4gICAgZXM6IGVzLFxuICAgIGU6IGUsXG4gICAgZXAyOiBlcDJcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzcGhlcmUoYSwgYiwgcmYsIGVsbHBzLCBzcGhlcmUpIHtcbiAgaWYgKCFhKSB7IC8vIGRvIHdlIGhhdmUgYW4gZWxsaXBzb2lkP1xuICAgIHZhciBlbGxpcHNlID0gbWF0Y2goRWxsaXBzb2lkLCBlbGxwcyk7XG4gICAgaWYgKCFlbGxpcHNlKSB7XG4gICAgICBlbGxpcHNlID0gV0dTODQ7XG4gICAgfVxuICAgIGEgPSBlbGxpcHNlLmE7XG4gICAgYiA9IGVsbGlwc2UuYjtcbiAgICByZiA9IGVsbGlwc2UucmY7XG4gIH1cblxuICBpZiAocmYgJiYgIWIpIHtcbiAgICBiID0gKDEuMCAtIDEuMCAvIHJmKSAqIGE7XG4gIH1cbiAgaWYgKHJmID09PSAwIHx8IE1hdGguYWJzKGEgLSBiKSA8IEVQU0xOKSB7XG4gICAgc3BoZXJlID0gdHJ1ZTtcbiAgICBiID0gYTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGE6IGEsXG4gICAgYjogYixcbiAgICByZjogcmYsXG4gICAgc3BoZXJlOiBzcGhlcmVcbiAgfTtcbn1cbiIsInZhciBleHBvcnRzID0ge307XG5leHBvcnQge2V4cG9ydHMgYXMgZGVmYXVsdH07XG5leHBvcnRzLndnczg0ID0ge1xuICB0b3dnczg0OiBcIjAsMCwwXCIsXG4gIGVsbGlwc2U6IFwiV0dTODRcIixcbiAgZGF0dW1OYW1lOiBcIldHUzg0XCJcbn07XG5cbmV4cG9ydHMuY2gxOTAzID0ge1xuICB0b3dnczg0OiBcIjY3NC4zNzQsMTUuMDU2LDQwNS4zNDZcIixcbiAgZWxsaXBzZTogXCJiZXNzZWxcIixcbiAgZGF0dW1OYW1lOiBcInN3aXNzXCJcbn07XG5cbmV4cG9ydHMuZ2dyczg3ID0ge1xuICB0b3dnczg0OiBcIi0xOTkuODcsNzQuNzksMjQ2LjYyXCIsXG4gIGVsbGlwc2U6IFwiR1JTODBcIixcbiAgZGF0dW1OYW1lOiBcIkdyZWVrX0dlb2RldGljX1JlZmVyZW5jZV9TeXN0ZW1fMTk4N1wiXG59O1xuXG5leHBvcnRzLm5hZDgzID0ge1xuICB0b3dnczg0OiBcIjAsMCwwXCIsXG4gIGVsbGlwc2U6IFwiR1JTODBcIixcbiAgZGF0dW1OYW1lOiBcIk5vcnRoX0FtZXJpY2FuX0RhdHVtXzE5ODNcIlxufTtcblxuZXhwb3J0cy5uYWQyNyA9IHtcbiAgbmFkZ3JpZHM6IFwiQGNvbnVzLEBhbGFza2EsQG50djJfMC5nc2IsQG50djFfY2FuLmRhdFwiLFxuICBlbGxpcHNlOiBcImNscms2NlwiLFxuICBkYXR1bU5hbWU6IFwiTm9ydGhfQW1lcmljYW5fRGF0dW1fMTkyN1wiXG59O1xuXG5leHBvcnRzLnBvdHNkYW0gPSB7XG4gIHRvd2dzODQ6IFwiNTk4LjEsNzMuNyw0MTguMiwwLjIwMiwwLjA0NSwtMi40NTUsNi43XCIsXG4gIGVsbGlwc2U6IFwiYmVzc2VsXCIsXG4gIGRhdHVtTmFtZTogXCJQb3RzZGFtIFJhdWVuYmVyZyAxOTUwIERIRE5cIlxufTtcblxuZXhwb3J0cy5jYXJ0aGFnZSA9IHtcbiAgdG93Z3M4NDogXCItMjYzLjAsNi4wLDQzMS4wXCIsXG4gIGVsbGlwc2U6IFwiY2xhcms4MFwiLFxuICBkYXR1bU5hbWU6IFwiQ2FydGhhZ2UgMTkzNCBUdW5pc2lhXCJcbn07XG5cbmV4cG9ydHMuaGVybWFubnNrb2dlbCA9IHtcbiAgdG93Z3M4NDogXCI1NzcuMzI2LDkwLjEyOSw0NjMuOTE5LDUuMTM3LDEuNDc0LDUuMjk3LDIuNDIzMlwiLFxuICBlbGxpcHNlOiBcImJlc3NlbFwiLFxuICBkYXR1bU5hbWU6IFwiSGVybWFubnNrb2dlbFwiXG59O1xuXG5leHBvcnRzLm9zbmk1MiA9IHtcbiAgdG93Z3M4NDogXCI0ODIuNTMwLC0xMzAuNTk2LDU2NC41NTcsLTEuMDQyLC0wLjIxNCwtMC42MzEsOC4xNVwiLFxuICBlbGxpcHNlOiBcImFpcnlcIixcbiAgZGF0dW1OYW1lOiBcIklyaXNoIE5hdGlvbmFsXCJcbn07XG5cbmV4cG9ydHMuaXJlNjUgPSB7XG4gIHRvd2dzODQ6IFwiNDgyLjUzMCwtMTMwLjU5Niw1NjQuNTU3LC0xLjA0MiwtMC4yMTQsLTAuNjMxLDguMTVcIixcbiAgZWxsaXBzZTogXCJtb2RfYWlyeVwiLFxuICBkYXR1bU5hbWU6IFwiSXJlbGFuZCAxOTY1XCJcbn07XG5cbmV4cG9ydHMucmFzc2FkaXJhbiA9IHtcbiAgdG93Z3M4NDogXCItMTMzLjYzLC0xNTcuNSwtMTU4LjYyXCIsXG4gIGVsbGlwc2U6IFwiaW50bFwiLFxuICBkYXR1bU5hbWU6IFwiUmFzc2FkaXJhblwiXG59O1xuXG5leHBvcnRzLm56Z2Q0OSA9IHtcbiAgdG93Z3M4NDogXCI1OS40NywtNS4wNCwxODcuNDQsMC40NywtMC4xLDEuMDI0LC00LjU5OTNcIixcbiAgZWxsaXBzZTogXCJpbnRsXCIsXG4gIGRhdHVtTmFtZTogXCJOZXcgWmVhbGFuZCBHZW9kZXRpYyBEYXR1bSAxOTQ5XCJcbn07XG5cbmV4cG9ydHMub3NnYjM2ID0ge1xuICB0b3dnczg0OiBcIjQ0Ni40NDgsLTEyNS4xNTcsNTQyLjA2MCwwLjE1MDIsMC4yNDcwLDAuODQyMSwtMjAuNDg5NFwiLFxuICBlbGxpcHNlOiBcImFpcnlcIixcbiAgZGF0dW1OYW1lOiBcIkFpcnkgMTgzMFwiXG59O1xuXG5leHBvcnRzLnNfanRzayA9IHtcbiAgdG93Z3M4NDogXCI1ODksNzYsNDgwXCIsXG4gIGVsbGlwc2U6ICdiZXNzZWwnLFxuICBkYXR1bU5hbWU6ICdTLUpUU0sgKEZlcnJvKSdcbn07XG5cbmV4cG9ydHMuYmVkdWFyYW0gPSB7XG4gIHRvd2dzODQ6ICctMTA2LC04NywxODgnLFxuICBlbGxpcHNlOiAnY2xyazgwJyxcbiAgZGF0dW1OYW1lOiAnQmVkdWFyYW0nXG59O1xuXG5leHBvcnRzLmd1bnVuZ19zZWdhcmEgPSB7XG4gIHRvd2dzODQ6ICctNDAzLDY4NCw0MScsXG4gIGVsbGlwc2U6ICdiZXNzZWwnLFxuICBkYXR1bU5hbWU6ICdHdW51bmcgU2VnYXJhIEpha2FydGEnXG59O1xuXG5leHBvcnRzLnJuYjcyID0ge1xuICB0b3dnczg0OiBcIjEwNi44NjksLTUyLjI5NzgsMTAzLjcyNCwtMC4zMzY1NywwLjQ1Njk1NSwtMS44NDIxOCwxXCIsXG4gIGVsbGlwc2U6IFwiaW50bFwiLFxuICBkYXR1bU5hbWU6IFwiUmVzZWF1IE5hdGlvbmFsIEJlbGdlIDE5NzJcIlxufTtcbiIsImltcG9ydCB7UEpEXzNQQVJBTSwgUEpEXzdQQVJBTSwgUEpEX0dSSURTSElGVCwgUEpEX1dHUzg0LCBQSkRfTk9EQVRVTSwgU0VDX1RPX1JBRH0gZnJvbSAnLi9jb25zdGFudHMvdmFsdWVzJztcblxuZnVuY3Rpb24gZGF0dW0oZGF0dW1Db2RlLCBkYXR1bV9wYXJhbXMsIGEsIGIsIGVzLCBlcDIsIG5hZGdyaWRzKSB7XG4gIHZhciBvdXQgPSB7fTtcblxuICBpZiAoZGF0dW1Db2RlID09PSB1bmRlZmluZWQgfHwgZGF0dW1Db2RlID09PSAnbm9uZScpIHtcbiAgICBvdXQuZGF0dW1fdHlwZSA9IFBKRF9OT0RBVFVNO1xuICB9IGVsc2Uge1xuICAgIG91dC5kYXR1bV90eXBlID0gUEpEX1dHUzg0O1xuICB9XG5cbiAgaWYgKGRhdHVtX3BhcmFtcykge1xuICAgIG91dC5kYXR1bV9wYXJhbXMgPSBkYXR1bV9wYXJhbXMubWFwKHBhcnNlRmxvYXQpO1xuICAgIGlmIChvdXQuZGF0dW1fcGFyYW1zWzBdICE9PSAwIHx8IG91dC5kYXR1bV9wYXJhbXNbMV0gIT09IDAgfHwgb3V0LmRhdHVtX3BhcmFtc1syXSAhPT0gMCkge1xuICAgICAgb3V0LmRhdHVtX3R5cGUgPSBQSkRfM1BBUkFNO1xuICAgIH1cbiAgICBpZiAob3V0LmRhdHVtX3BhcmFtcy5sZW5ndGggPiAzKSB7XG4gICAgICBpZiAob3V0LmRhdHVtX3BhcmFtc1szXSAhPT0gMCB8fCBvdXQuZGF0dW1fcGFyYW1zWzRdICE9PSAwIHx8IG91dC5kYXR1bV9wYXJhbXNbNV0gIT09IDAgfHwgb3V0LmRhdHVtX3BhcmFtc1s2XSAhPT0gMCkge1xuICAgICAgICBvdXQuZGF0dW1fdHlwZSA9IFBKRF83UEFSQU07XG4gICAgICAgIG91dC5kYXR1bV9wYXJhbXNbM10gKj0gU0VDX1RPX1JBRDtcbiAgICAgICAgb3V0LmRhdHVtX3BhcmFtc1s0XSAqPSBTRUNfVE9fUkFEO1xuICAgICAgICBvdXQuZGF0dW1fcGFyYW1zWzVdICo9IFNFQ19UT19SQUQ7XG4gICAgICAgIG91dC5kYXR1bV9wYXJhbXNbNl0gPSAob3V0LmRhdHVtX3BhcmFtc1s2XSAvIDEwMDAwMDAuMCkgKyAxLjA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG5hZGdyaWRzKSB7XG4gICAgb3V0LmRhdHVtX3R5cGUgPSBQSkRfR1JJRFNISUZUO1xuICAgIG91dC5ncmlkcyA9IG5hZGdyaWRzO1xuICB9XG4gIG91dC5hID0gYTsgLy9kYXR1bSBvYmplY3QgYWxzbyB1c2VzIHRoZXNlIHZhbHVlc1xuICBvdXQuYiA9IGI7XG4gIG91dC5lcyA9IGVzO1xuICBvdXQuZXAyID0gZXAyO1xuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBkYXR1bTtcbiIsIi8qKlxuICogUmVzb3VyY2VzIGZvciBkZXRhaWxzIG9mIE5UdjIgZmlsZSBmb3JtYXRzOlxuICogLSBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNDAxMjcyMDQ4MjJpZl8vaHR0cDovL3d3dy5tZ3MuZ292Lm9uLmNhOjgwL3N0ZHByb2Rjb25zdW1lL2dyb3Vwcy9jb250ZW50L0BtZ3MvQGlhbmRpdC9kb2N1bWVudHMvcmVzb3VyY2VsaXN0L3N0ZWwwMl8wNDc0NDcucGRmXG4gKiAtIGh0dHA6Ly9taW1ha2EuY29tL2hlbHAvZ3MvaHRtbC8wMDRfTlRWMiUyMERhdGElMjBGb3JtYXQuaHRtXG4gKi9cblxudmFyIGxvYWRlZE5hZGdyaWRzID0ge307XG5cbi8qKlxuICogTG9hZCBhIGJpbmFyeSBOVHYyIGZpbGUgKC5nc2IpIHRvIGEga2V5IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBwcm9qIHN0cmluZyBsaWtlICtuYWRncmlkcz08a2V5Pi4gUGFzcyB0aGUgTlR2MiBmaWxlXG4gKiBhcyBhbiBBcnJheUJ1ZmZlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbmFkZ3JpZChrZXksIGRhdGEpIHtcbiAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcoZGF0YSk7XG4gIHZhciBpc0xpdHRsZUVuZGlhbiA9IGRldGVjdExpdHRsZUVuZGlhbih2aWV3KTtcbiAgdmFyIGhlYWRlciA9IHJlYWRIZWFkZXIodmlldywgaXNMaXR0bGVFbmRpYW4pO1xuICBpZiAoaGVhZGVyLm5TdWJncmlkcyA+IDEpIHtcbiAgICBjb25zb2xlLmxvZygnT25seSBzaW5nbGUgTlR2MiBzdWJncmlkcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCwgc3Vic2VxdWVudCBzdWIgZ3JpZHMgYXJlIGlnbm9yZWQnKTtcbiAgfVxuICB2YXIgc3ViZ3JpZHMgPSByZWFkU3ViZ3JpZHModmlldywgaGVhZGVyLCBpc0xpdHRsZUVuZGlhbik7XG4gIHZhciBuYWRncmlkID0ge2hlYWRlcjogaGVhZGVyLCBzdWJncmlkczogc3ViZ3JpZHN9O1xuICBsb2FkZWROYWRncmlkc1trZXldID0gbmFkZ3JpZDtcbiAgcmV0dXJuIG5hZGdyaWQ7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBwcm9qNCB2YWx1ZSBmb3IgbmFkZ3JpZHMsIHJldHVybiBhbiBhcnJheSBvZiBsb2FkZWQgZ3JpZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hZGdyaWRzKG5hZGdyaWRzKSB7XG4gIC8vIEZvcm1hdCBkZXRhaWxzOiBodHRwOi8vcHJvai5tYXB0b29scy5vcmcvZ2VuX3Bhcm1zLmh0bWxcbiAgaWYgKG5hZGdyaWRzID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIG51bGw7IH1cbiAgdmFyIGdyaWRzID0gbmFkZ3JpZHMuc3BsaXQoJywnKTtcbiAgcmV0dXJuIGdyaWRzLm1hcChwYXJzZU5hZGdyaWRTdHJpbmcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5hZGdyaWRTdHJpbmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBvcHRpb25hbCA9IHZhbHVlWzBdID09PSAnQCc7XG4gIGlmIChvcHRpb25hbCkge1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICByZXR1cm4ge25hbWU6ICdudWxsJywgbWFuZGF0b3J5OiAhb3B0aW9uYWwsIGdyaWQ6IG51bGwsIGlzTnVsbDogdHJ1ZX07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiB2YWx1ZSxcbiAgICBtYW5kYXRvcnk6ICFvcHRpb25hbCxcbiAgICBncmlkOiBsb2FkZWROYWRncmlkc1t2YWx1ZV0gfHwgbnVsbCxcbiAgICBpc051bGw6IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNlY29uZHNUb1JhZGlhbnMoc2Vjb25kcykge1xuICByZXR1cm4gKHNlY29uZHMgLyAzNjAwKSAqIE1hdGguUEkgLyAxODA7XG59XG5cbmZ1bmN0aW9uIGRldGVjdExpdHRsZUVuZGlhbih2aWV3KSB7XG4gIHZhciBuRmllbGRzID0gdmlldy5nZXRJbnQzMig4LCBmYWxzZSk7XG4gIGlmIChuRmllbGRzID09PSAxMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBuRmllbGRzID0gdmlldy5nZXRJbnQzMig4LCB0cnVlKTtcbiAgaWYgKG5GaWVsZHMgIT09IDExKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZGV0ZWN0IG5hZGdyaWQgZW5kaWFuLW5lc3MsIGRlZmF1bHRpbmcgdG8gbGl0dGxlLWVuZGlhbicpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkSGVhZGVyKHZpZXcsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHJldHVybiB7XG4gICAgbkZpZWxkczogdmlldy5nZXRJbnQzMig4LCBpc0xpdHRsZUVuZGlhbiksXG4gICAgblN1YmdyaWRGaWVsZHM6IHZpZXcuZ2V0SW50MzIoMjQsIGlzTGl0dGxlRW5kaWFuKSxcbiAgICBuU3ViZ3JpZHM6IHZpZXcuZ2V0SW50MzIoNDAsIGlzTGl0dGxlRW5kaWFuKSxcbiAgICBzaGlmdFR5cGU6IGRlY29kZVN0cmluZyh2aWV3LCA1NiwgNTYgKyA4KS50cmltKCksXG4gICAgZnJvbVNlbWlNYWpvckF4aXM6IHZpZXcuZ2V0RmxvYXQ2NCgxMjAsIGlzTGl0dGxlRW5kaWFuKSxcbiAgICBmcm9tU2VtaU1pbm9yQXhpczogdmlldy5nZXRGbG9hdDY0KDEzNiwgaXNMaXR0bGVFbmRpYW4pLFxuICAgIHRvU2VtaU1ham9yQXhpczogdmlldy5nZXRGbG9hdDY0KDE1MiwgaXNMaXR0bGVFbmRpYW4pLFxuICAgIHRvU2VtaU1pbm9yQXhpczogdmlldy5nZXRGbG9hdDY0KDE2OCwgaXNMaXR0bGVFbmRpYW4pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZWNvZGVTdHJpbmcodmlldywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSh2aWV3LmJ1ZmZlci5zbGljZShzdGFydCwgZW5kKSkpO1xufVxuXG5mdW5jdGlvbiByZWFkU3ViZ3JpZHModmlldywgaGVhZGVyLCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgZ3JpZE9mZnNldCA9IDE3NjtcbiAgdmFyIGdyaWRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVyLm5TdWJncmlkczsgaSsrKSB7XG4gICAgdmFyIHN1YkhlYWRlciA9IHJlYWRHcmlkSGVhZGVyKHZpZXcsIGdyaWRPZmZzZXQsIGlzTGl0dGxlRW5kaWFuKTtcbiAgICB2YXIgbm9kZXMgPSByZWFkR3JpZE5vZGVzKHZpZXcsIGdyaWRPZmZzZXQsIHN1YkhlYWRlciwgaXNMaXR0bGVFbmRpYW4pO1xuICAgIHZhciBsbmdDb2x1bW5Db3VudCA9IE1hdGgucm91bmQoXG4gICAgICAxICsgKHN1YkhlYWRlci51cHBlckxvbmdpdHVkZSAtIHN1YkhlYWRlci5sb3dlckxvbmdpdHVkZSkgLyBzdWJIZWFkZXIubG9uZ2l0dWRlSW50ZXJ2YWwpO1xuICAgIHZhciBsYXRDb2x1bW5Db3VudCA9IE1hdGgucm91bmQoXG4gICAgICAxICsgKHN1YkhlYWRlci51cHBlckxhdGl0dWRlIC0gc3ViSGVhZGVyLmxvd2VyTGF0aXR1ZGUpIC8gc3ViSGVhZGVyLmxhdGl0dWRlSW50ZXJ2YWwpO1xuICAgIC8vIFByb2o0IG9wZXJhdGVzIG9uIHJhZGlhbnMgd2hlcmVhcyB0aGUgY29vcmRpbmF0ZXMgYXJlIGluIHNlY29uZHMgaW4gdGhlIGdyaWRcbiAgICBncmlkcy5wdXNoKHtcbiAgICAgIGxsOiBbc2Vjb25kc1RvUmFkaWFucyhzdWJIZWFkZXIubG93ZXJMb25naXR1ZGUpLCBzZWNvbmRzVG9SYWRpYW5zKHN1YkhlYWRlci5sb3dlckxhdGl0dWRlKV0sXG4gICAgICBkZWw6IFtzZWNvbmRzVG9SYWRpYW5zKHN1YkhlYWRlci5sb25naXR1ZGVJbnRlcnZhbCksIHNlY29uZHNUb1JhZGlhbnMoc3ViSGVhZGVyLmxhdGl0dWRlSW50ZXJ2YWwpXSxcbiAgICAgIGxpbTogW2xuZ0NvbHVtbkNvdW50LCBsYXRDb2x1bW5Db3VudF0sXG4gICAgICBjb3VudDogc3ViSGVhZGVyLmdyaWROb2RlQ291bnQsXG4gICAgICBjdnM6IG1hcE5vZGVzKG5vZGVzKVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBncmlkcztcbn1cblxuZnVuY3Rpb24gbWFwTm9kZXMobm9kZXMpIHtcbiAgcmV0dXJuIG5vZGVzLm1hcChmdW5jdGlvbiAocikge3JldHVybiBbc2Vjb25kc1RvUmFkaWFucyhyLmxvbmdpdHVkZVNoaWZ0KSwgc2Vjb25kc1RvUmFkaWFucyhyLmxhdGl0dWRlU2hpZnQpXTt9KTtcbn1cblxuZnVuY3Rpb24gcmVhZEdyaWRIZWFkZXIodmlldywgb2Zmc2V0LCBpc0xpdHRsZUVuZGlhbikge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGRlY29kZVN0cmluZyh2aWV3LCBvZmZzZXQgKyA4LCBvZmZzZXQgKyAxNikudHJpbSgpLFxuICAgIHBhcmVudDogZGVjb2RlU3RyaW5nKHZpZXcsIG9mZnNldCArIDI0LCBvZmZzZXQgKyAyNCArIDgpLnRyaW0oKSxcbiAgICBsb3dlckxhdGl0dWRlOiB2aWV3LmdldEZsb2F0NjQob2Zmc2V0ICsgNzIsIGlzTGl0dGxlRW5kaWFuKSxcbiAgICB1cHBlckxhdGl0dWRlOiB2aWV3LmdldEZsb2F0NjQob2Zmc2V0ICsgODgsIGlzTGl0dGxlRW5kaWFuKSxcbiAgICBsb3dlckxvbmdpdHVkZTogdmlldy5nZXRGbG9hdDY0KG9mZnNldCArIDEwNCwgaXNMaXR0bGVFbmRpYW4pLFxuICAgIHVwcGVyTG9uZ2l0dWRlOiB2aWV3LmdldEZsb2F0NjQob2Zmc2V0ICsgMTIwLCBpc0xpdHRsZUVuZGlhbiksXG4gICAgbGF0aXR1ZGVJbnRlcnZhbDogdmlldy5nZXRGbG9hdDY0KG9mZnNldCArIDEzNiwgaXNMaXR0bGVFbmRpYW4pLFxuICAgIGxvbmdpdHVkZUludGVydmFsOiB2aWV3LmdldEZsb2F0NjQob2Zmc2V0ICsgMTUyLCBpc0xpdHRsZUVuZGlhbiksXG4gICAgZ3JpZE5vZGVDb3VudDogdmlldy5nZXRJbnQzMihvZmZzZXQgKyAxNjgsIGlzTGl0dGxlRW5kaWFuKVxuICB9O1xufVxuXG5mdW5jdGlvbiByZWFkR3JpZE5vZGVzKHZpZXcsIG9mZnNldCwgZ3JpZEhlYWRlciwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG5vZGVzT2Zmc2V0ID0gb2Zmc2V0ICsgMTc2O1xuICB2YXIgZ3JpZFJlY29yZExlbmd0aCA9IDE2O1xuICB2YXIgZ3JpZFNoaWZ0UmVjb3JkcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGdyaWRIZWFkZXIuZ3JpZE5vZGVDb3VudDsgaSsrKSB7XG4gICAgdmFyIHJlY29yZCA9IHtcbiAgICAgIGxhdGl0dWRlU2hpZnQ6IHZpZXcuZ2V0RmxvYXQzMihub2Rlc09mZnNldCArIGkgKiBncmlkUmVjb3JkTGVuZ3RoLCBpc0xpdHRsZUVuZGlhbiksXG4gICAgICBsb25naXR1ZGVTaGlmdDogdmlldy5nZXRGbG9hdDMyKG5vZGVzT2Zmc2V0ICsgaSAqIGdyaWRSZWNvcmRMZW5ndGggKyA0LCBpc0xpdHRsZUVuZGlhbiksXG4gICAgICBsYXRpdHVkZUFjY3VyYWN5OiB2aWV3LmdldEZsb2F0MzIobm9kZXNPZmZzZXQgKyBpICogZ3JpZFJlY29yZExlbmd0aCArIDgsIGlzTGl0dGxlRW5kaWFuKSxcbiAgICAgIGxvbmdpdHVkZUFjY3VyYWN5OiB2aWV3LmdldEZsb2F0MzIobm9kZXNPZmZzZXQgKyBpICogZ3JpZFJlY29yZExlbmd0aCArIDEyLCBpc0xpdHRsZUVuZGlhbiksXG4gICAgfTtcbiAgICBncmlkU2hpZnRSZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgfVxuICByZXR1cm4gZ3JpZFNoaWZ0UmVjb3Jkcztcbn1cbiIsImltcG9ydCBwYXJzZUNvZGUgZnJvbSAnLi9wYXJzZUNvZGUnO1xuaW1wb3J0IGV4dGVuZCBmcm9tICcuL2V4dGVuZCc7XG5pbXBvcnQgcHJvamVjdGlvbnMgZnJvbSAnLi9wcm9qZWN0aW9ucyc7XG5pbXBvcnQge3NwaGVyZSBhcyBkY19zcGhlcmUsIGVjY2VudHJpY2l0eSBhcyBkY19lY2NlbnRyaWNpdHl9IGZyb20gJy4vZGVyaXZlQ29uc3RhbnRzJztcbmltcG9ydCBEYXR1bSBmcm9tICcuL2NvbnN0YW50cy9EYXR1bSc7XG5pbXBvcnQgZGF0dW0gZnJvbSAnLi9kYXR1bSc7XG5pbXBvcnQgbWF0Y2ggZnJvbSAnLi9tYXRjaCc7XG5pbXBvcnQge2dldE5hZGdyaWRzfSBmcm9tIFwiLi9uYWRncmlkXCI7XG5cbmZ1bmN0aW9uIFByb2plY3Rpb24oc3JzQ29kZSxjYWxsYmFjaykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvamVjdGlvbikpIHtcbiAgICByZXR1cm4gbmV3IFByb2plY3Rpb24oc3JzQ29kZSk7XG4gIH1cbiAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbihlcnJvcil7XG4gICAgaWYoZXJyb3Ipe1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuICB2YXIganNvbiA9IHBhcnNlQ29kZShzcnNDb2RlKTtcbiAgaWYodHlwZW9mIGpzb24gIT09ICdvYmplY3QnKXtcbiAgICBjYWxsYmFjayhzcnNDb2RlKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG91clByb2ogPSBQcm9qZWN0aW9uLnByb2plY3Rpb25zLmdldChqc29uLnByb2pOYW1lKTtcbiAgaWYoIW91clByb2ope1xuICAgIGNhbGxiYWNrKHNyc0NvZGUpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoanNvbi5kYXR1bUNvZGUgJiYganNvbi5kYXR1bUNvZGUgIT09ICdub25lJykge1xuICAgIHZhciBkYXR1bURlZiA9IG1hdGNoKERhdHVtLCBqc29uLmRhdHVtQ29kZSk7XG4gICAgaWYgKGRhdHVtRGVmKSB7XG4gICAgICBqc29uLmRhdHVtX3BhcmFtcyA9IGpzb24uZGF0dW1fcGFyYW1zIHx8IChkYXR1bURlZi50b3dnczg0ID8gZGF0dW1EZWYudG93Z3M4NC5zcGxpdCgnLCcpIDogbnVsbCk7XG4gICAgICBqc29uLmVsbHBzID0gZGF0dW1EZWYuZWxsaXBzZTtcbiAgICAgIGpzb24uZGF0dW1OYW1lID0gZGF0dW1EZWYuZGF0dW1OYW1lID8gZGF0dW1EZWYuZGF0dW1OYW1lIDoganNvbi5kYXR1bUNvZGU7XG4gICAgfVxuICB9XG4gIGpzb24uazAgPSBqc29uLmswIHx8IDEuMDtcbiAganNvbi5heGlzID0ganNvbi5heGlzIHx8ICdlbnUnO1xuICBqc29uLmVsbHBzID0ganNvbi5lbGxwcyB8fCAnd2dzODQnO1xuICBqc29uLmxhdDEgPSBqc29uLmxhdDEgfHwganNvbi5sYXQwOyAvLyBMYW1iZXJ0X0NvbmZvcm1hbF9Db25pY18xU1AsIGZvciBleGFtcGxlLCBuZWVkcyB0aGlzXG5cbiAgdmFyIHNwaGVyZV8gPSBkY19zcGhlcmUoanNvbi5hLCBqc29uLmIsIGpzb24ucmYsIGpzb24uZWxscHMsIGpzb24uc3BoZXJlKTtcbiAgdmFyIGVjYyA9IGRjX2VjY2VudHJpY2l0eShzcGhlcmVfLmEsIHNwaGVyZV8uYiwgc3BoZXJlXy5yZiwganNvbi5SX0EpO1xuICB2YXIgbmFkZ3JpZHMgPSBnZXROYWRncmlkcyhqc29uLm5hZGdyaWRzKTtcbiAgdmFyIGRhdHVtT2JqID0ganNvbi5kYXR1bSB8fCBkYXR1bShqc29uLmRhdHVtQ29kZSwganNvbi5kYXR1bV9wYXJhbXMsIHNwaGVyZV8uYSwgc3BoZXJlXy5iLCBlY2MuZXMsIGVjYy5lcDIsXG4gICAgbmFkZ3JpZHMpO1xuXG4gIGV4dGVuZCh0aGlzLCBqc29uKTsgLy8gdHJhbnNmZXIgZXZlcnl0aGluZyBvdmVyIGZyb20gdGhlIHByb2plY3Rpb24gYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgd2UnbGwgbmVlZFxuICBleHRlbmQodGhpcywgb3VyUHJvaik7IC8vIHRyYW5zZmVyIGFsbCB0aGUgbWV0aG9kcyBmcm9tIHRoZSBwcm9qZWN0aW9uXG5cbiAgLy8gY29weSB0aGUgNCB0aGluZ3Mgb3ZlciB3ZSBjYWxjdWxhdGVkIGluIGRlcml2ZUNvbnN0YW50cy5zcGhlcmVcbiAgdGhpcy5hID0gc3BoZXJlXy5hO1xuICB0aGlzLmIgPSBzcGhlcmVfLmI7XG4gIHRoaXMucmYgPSBzcGhlcmVfLnJmO1xuICB0aGlzLnNwaGVyZSA9IHNwaGVyZV8uc3BoZXJlO1xuXG4gIC8vIGNvcHkgdGhlIDMgdGhpbmdzIHdlIGNhbGN1bGF0ZWQgaW4gZGVyaXZlQ29uc3RhbnRzLmVjY2VudHJpY2l0eVxuICB0aGlzLmVzID0gZWNjLmVzO1xuICB0aGlzLmUgPSBlY2MuZTtcbiAgdGhpcy5lcDIgPSBlY2MuZXAyO1xuXG4gIC8vIGFkZCBpbiB0aGUgZGF0dW0gb2JqZWN0XG4gIHRoaXMuZGF0dW0gPSBkYXR1bU9iajtcblxuICAvLyBpbml0IHRoZSBwcm9qZWN0aW9uXG4gIHRoaXMuaW5pdCgpO1xuXG4gIC8vIGxlZ2VjeSBjYWxsYmFjayBmcm9tIGJhY2sgaW4gdGhlIGRheSB3aGVuIGl0IHdlbnQgdG8gc3BhdGlhbHJlZmVyZW5jZS5vcmdcbiAgY2FsbGJhY2sobnVsbCwgdGhpcyk7XG5cbn1cblByb2plY3Rpb24ucHJvamVjdGlvbnMgPSBwcm9qZWN0aW9ucztcblByb2plY3Rpb24ucHJvamVjdGlvbnMuc3RhcnQoKTtcbmV4cG9ydCBkZWZhdWx0IFByb2plY3Rpb247XG4iLCIndXNlIHN0cmljdCc7XG5pbXBvcnQge1BKRF8zUEFSQU0sIFBKRF83UEFSQU0sIEhBTEZfUEl9IGZyb20gJy4vY29uc3RhbnRzL3ZhbHVlcyc7XG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURhdHVtcyhzb3VyY2UsIGRlc3QpIHtcbiAgaWYgKHNvdXJjZS5kYXR1bV90eXBlICE9PSBkZXN0LmRhdHVtX3R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIGZhbHNlLCBkYXR1bXMgYXJlIG5vdCBlcXVhbFxuICB9IGVsc2UgaWYgKHNvdXJjZS5hICE9PSBkZXN0LmEgfHwgTWF0aC5hYnMoc291cmNlLmVzIC0gZGVzdC5lcykgPiAwLjAwMDAwMDAwMDA1MCkge1xuICAgIC8vIHRoZSB0b2xlcmFuY2UgZm9yIGVzIGlzIHRvIGVuc3VyZSB0aGF0IEdSUzgwIGFuZCBXR1M4NFxuICAgIC8vIGFyZSBjb25zaWRlcmVkIGlkZW50aWNhbFxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChzb3VyY2UuZGF0dW1fdHlwZSA9PT0gUEpEXzNQQVJBTSkge1xuICAgIHJldHVybiAoc291cmNlLmRhdHVtX3BhcmFtc1swXSA9PT0gZGVzdC5kYXR1bV9wYXJhbXNbMF0gJiYgc291cmNlLmRhdHVtX3BhcmFtc1sxXSA9PT0gZGVzdC5kYXR1bV9wYXJhbXNbMV0gJiYgc291cmNlLmRhdHVtX3BhcmFtc1syXSA9PT0gZGVzdC5kYXR1bV9wYXJhbXNbMl0pO1xuICB9IGVsc2UgaWYgKHNvdXJjZS5kYXR1bV90eXBlID09PSBQSkRfN1BBUkFNKSB7XG4gICAgcmV0dXJuIChzb3VyY2UuZGF0dW1fcGFyYW1zWzBdID09PSBkZXN0LmRhdHVtX3BhcmFtc1swXSAmJiBzb3VyY2UuZGF0dW1fcGFyYW1zWzFdID09PSBkZXN0LmRhdHVtX3BhcmFtc1sxXSAmJiBzb3VyY2UuZGF0dW1fcGFyYW1zWzJdID09PSBkZXN0LmRhdHVtX3BhcmFtc1syXSAmJiBzb3VyY2UuZGF0dW1fcGFyYW1zWzNdID09PSBkZXN0LmRhdHVtX3BhcmFtc1szXSAmJiBzb3VyY2UuZGF0dW1fcGFyYW1zWzRdID09PSBkZXN0LmRhdHVtX3BhcmFtc1s0XSAmJiBzb3VyY2UuZGF0dW1fcGFyYW1zWzVdID09PSBkZXN0LmRhdHVtX3BhcmFtc1s1XSAmJiBzb3VyY2UuZGF0dW1fcGFyYW1zWzZdID09PSBkZXN0LmRhdHVtX3BhcmFtc1s2XSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7IC8vIGRhdHVtcyBhcmUgZXF1YWxcbiAgfVxufSAvLyBjc19jb21wYXJlX2RhdHVtcygpXG5cbi8qXG4gKiBUaGUgZnVuY3Rpb24gQ29udmVydF9HZW9kZXRpY19Ub19HZW9jZW50cmljIGNvbnZlcnRzIGdlb2RldGljIGNvb3JkaW5hdGVzXG4gKiAobGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIGhlaWdodCkgdG8gZ2VvY2VudHJpYyBjb29yZGluYXRlcyAoWCwgWSwgWiksXG4gKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgZWxsaXBzb2lkIHBhcmFtZXRlcnMuXG4gKlxuICogICAgTGF0aXR1ZGUgIDogR2VvZGV0aWMgbGF0aXR1ZGUgaW4gcmFkaWFucyAgICAgICAgICAgICAgICAgICAgIChpbnB1dClcbiAqICAgIExvbmdpdHVkZSA6IEdlb2RldGljIGxvbmdpdHVkZSBpbiByYWRpYW5zICAgICAgICAgICAgICAgICAgICAoaW5wdXQpXG4gKiAgICBIZWlnaHQgICAgOiBHZW9kZXRpYyBoZWlnaHQsIGluIG1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KVxuICogICAgWCAgICAgICAgIDogQ2FsY3VsYXRlZCBHZW9jZW50cmljIFggY29vcmRpbmF0ZSwgaW4gbWV0ZXJzICAgIChvdXRwdXQpXG4gKiAgICBZICAgICAgICAgOiBDYWxjdWxhdGVkIEdlb2NlbnRyaWMgWSBjb29yZGluYXRlLCBpbiBtZXRlcnMgICAgKG91dHB1dClcbiAqICAgIFogICAgICAgICA6IENhbGN1bGF0ZWQgR2VvY2VudHJpYyBaIGNvb3JkaW5hdGUsIGluIG1ldGVycyAgICAob3V0cHV0KVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlb2RldGljVG9HZW9jZW50cmljKHAsIGVzLCBhKSB7XG4gIHZhciBMb25naXR1ZGUgPSBwLng7XG4gIHZhciBMYXRpdHVkZSA9IHAueTtcbiAgdmFyIEhlaWdodCA9IHAueiA/IHAueiA6IDA7IC8vWiB2YWx1ZSBub3QgYWx3YXlzIHN1cHBsaWVkXG5cbiAgdmFyIFJuOyAvKiAgRWFydGggcmFkaXVzIGF0IGxvY2F0aW9uICAqL1xuICB2YXIgU2luX0xhdDsgLyogIE1hdGguc2luKExhdGl0dWRlKSAgKi9cbiAgdmFyIFNpbjJfTGF0OyAvKiAgU3F1YXJlIG9mIE1hdGguc2luKExhdGl0dWRlKSAgKi9cbiAgdmFyIENvc19MYXQ7IC8qICBNYXRoLmNvcyhMYXRpdHVkZSkgICovXG5cbiAgLypcbiAgICoqIERvbid0IGJsb3cgdXAgaWYgTGF0aXR1ZGUgaXMganVzdCBhIGxpdHRsZSBvdXQgb2YgdGhlIHZhbHVlXG4gICAqKiByYW5nZSBhcyBpdCBtYXkganVzdCBiZSBhIHJvdW5kaW5nIGlzc3VlLiAgQWxzbyByZW1vdmVkIGxvbmdpdHVkZVxuICAgKiogdGVzdCwgaXQgc2hvdWxkIGJlIHdyYXBwZWQgYnkgTWF0aC5jb3MoKSBhbmQgTWF0aC5zaW4oKS4gIE5GVyBmb3IgUFJPSi40LCBTZXAvMjAwMS5cbiAgICovXG4gIGlmIChMYXRpdHVkZSA8IC1IQUxGX1BJICYmIExhdGl0dWRlID4gLTEuMDAxICogSEFMRl9QSSkge1xuICAgIExhdGl0dWRlID0gLUhBTEZfUEk7XG4gIH0gZWxzZSBpZiAoTGF0aXR1ZGUgPiBIQUxGX1BJICYmIExhdGl0dWRlIDwgMS4wMDEgKiBIQUxGX1BJKSB7XG4gICAgTGF0aXR1ZGUgPSBIQUxGX1BJO1xuICB9IGVsc2UgaWYgKExhdGl0dWRlIDwgLUhBTEZfUEkpIHtcbiAgICAvKiBMYXRpdHVkZSBvdXQgb2YgcmFuZ2UgKi9cbiAgICAvLy4ucmVwb3J0RXJyb3IoJ2dlb2NlbnQ6bGF0IG91dCBvZiByYW5nZTonICsgTGF0aXR1ZGUpO1xuICAgIHJldHVybiB7IHg6IC1JbmZpbml0eSwgeTogLUluZmluaXR5LCB6OiBwLnogfTtcbiAgfSBlbHNlIGlmIChMYXRpdHVkZSA+IEhBTEZfUEkpIHtcbiAgICAvKiBMYXRpdHVkZSBvdXQgb2YgcmFuZ2UgKi9cbiAgICByZXR1cm4geyB4OiBJbmZpbml0eSwgeTogSW5maW5pdHksIHo6IHAueiB9O1xuICB9XG5cbiAgaWYgKExvbmdpdHVkZSA+IE1hdGguUEkpIHtcbiAgICBMb25naXR1ZGUgLT0gKDIgKiBNYXRoLlBJKTtcbiAgfVxuICBTaW5fTGF0ID0gTWF0aC5zaW4oTGF0aXR1ZGUpO1xuICBDb3NfTGF0ID0gTWF0aC5jb3MoTGF0aXR1ZGUpO1xuICBTaW4yX0xhdCA9IFNpbl9MYXQgKiBTaW5fTGF0O1xuICBSbiA9IGEgLyAoTWF0aC5zcXJ0KDEuMGUwIC0gZXMgKiBTaW4yX0xhdCkpO1xuICByZXR1cm4ge1xuICAgIHg6IChSbiArIEhlaWdodCkgKiBDb3NfTGF0ICogTWF0aC5jb3MoTG9uZ2l0dWRlKSxcbiAgICB5OiAoUm4gKyBIZWlnaHQpICogQ29zX0xhdCAqIE1hdGguc2luKExvbmdpdHVkZSksXG4gICAgejogKChSbiAqICgxIC0gZXMpKSArIEhlaWdodCkgKiBTaW5fTGF0XG4gIH07XG59IC8vIGNzX2dlb2RldGljX3RvX2dlb2NlbnRyaWMoKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VvY2VudHJpY1RvR2VvZGV0aWMocCwgZXMsIGEsIGIpIHtcbiAgLyogbG9jYWwgZGVmaW50aW9ucyBhbmQgdmFyaWFibGVzICovXG4gIC8qIGVuZC1jcml0ZXJpdW0gb2YgbG9vcCwgYWNjdXJhY3kgb2Ygc2luKExhdGl0dWRlKSAqL1xuICB2YXIgZ2VuYXUgPSAxZS0xMjtcbiAgdmFyIGdlbmF1MiA9IChnZW5hdSAqIGdlbmF1KTtcbiAgdmFyIG1heGl0ZXIgPSAzMDtcblxuICB2YXIgUDsgLyogZGlzdGFuY2UgYmV0d2VlbiBzZW1pLW1pbm9yIGF4aXMgYW5kIGxvY2F0aW9uICovXG4gIHZhciBSUjsgLyogZGlzdGFuY2UgYmV0d2VlbiBjZW50ZXIgYW5kIGxvY2F0aW9uICovXG4gIHZhciBDVDsgLyogc2luIG9mIGdlb2NlbnRyaWMgbGF0aXR1ZGUgKi9cbiAgdmFyIFNUOyAvKiBjb3Mgb2YgZ2VvY2VudHJpYyBsYXRpdHVkZSAqL1xuICB2YXIgUlg7XG4gIHZhciBSSztcbiAgdmFyIFJOOyAvKiBFYXJ0aCByYWRpdXMgYXQgbG9jYXRpb24gKi9cbiAgdmFyIENQSEkwOyAvKiBjb3Mgb2Ygc3RhcnQgb3Igb2xkIGdlb2RldGljIGxhdGl0dWRlIGluIGl0ZXJhdGlvbnMgKi9cbiAgdmFyIFNQSEkwOyAvKiBzaW4gb2Ygc3RhcnQgb3Igb2xkIGdlb2RldGljIGxhdGl0dWRlIGluIGl0ZXJhdGlvbnMgKi9cbiAgdmFyIENQSEk7IC8qIGNvcyBvZiBzZWFyY2hlZCBnZW9kZXRpYyBsYXRpdHVkZSAqL1xuICB2YXIgU1BISTsgLyogc2luIG9mIHNlYXJjaGVkIGdlb2RldGljIGxhdGl0dWRlICovXG4gIHZhciBTRFBISTsgLyogZW5kLWNyaXRlcml1bTogYWRkaXRpb24tdGhlb3JlbSBvZiBzaW4oTGF0aXR1ZGUoaXRlciktTGF0aXR1ZGUoaXRlci0xKSkgKi9cbiAgdmFyIGl0ZXI7IC8qICMgb2YgY29udGlub3VzIGl0ZXJhdGlvbiwgbWF4LiAzMCBpcyBhbHdheXMgZW5vdWdoIChzLmEuKSAqL1xuXG4gIHZhciBYID0gcC54O1xuICB2YXIgWSA9IHAueTtcbiAgdmFyIFogPSBwLnogPyBwLnogOiAwLjA7IC8vWiB2YWx1ZSBub3QgYWx3YXlzIHN1cHBsaWVkXG4gIHZhciBMb25naXR1ZGU7XG4gIHZhciBMYXRpdHVkZTtcbiAgdmFyIEhlaWdodDtcblxuICBQID0gTWF0aC5zcXJ0KFggKiBYICsgWSAqIFkpO1xuICBSUiA9IE1hdGguc3FydChYICogWCArIFkgKiBZICsgWiAqIFopO1xuXG4gIC8qICAgICAgc3BlY2lhbCBjYXNlcyBmb3IgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSAqL1xuICBpZiAoUCAvIGEgPCBnZW5hdSkge1xuXG4gICAgLyogIHNwZWNpYWwgY2FzZSwgaWYgUD0wLiAoWD0wLiwgWT0wLikgKi9cbiAgICBMb25naXR1ZGUgPSAwLjA7XG5cbiAgICAvKiAgaWYgKFgsWSxaKT0oMC4sMC4sMC4pIHRoZW4gSGVpZ2h0IGJlY29tZXMgc2VtaS1taW5vciBheGlzXG4gICAgICogIG9mIGVsbGlwc29pZCAoPWNlbnRlciBvZiBtYXNzKSwgTGF0aXR1ZGUgYmVjb21lcyBQSS8yICovXG4gICAgaWYgKFJSIC8gYSA8IGdlbmF1KSB7XG4gICAgICBMYXRpdHVkZSA9IEhBTEZfUEk7XG4gICAgICBIZWlnaHQgPSAtYjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHAueCxcbiAgICAgICAgeTogcC55LFxuICAgICAgICB6OiBwLnpcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8qICBlbGxpcHNvaWRhbCAoZ2VvZGV0aWMpIGxvbmdpdHVkZVxuICAgICAqICBpbnRlcnZhbDogLVBJIDwgTG9uZ2l0dWRlIDw9ICtQSSAqL1xuICAgIExvbmdpdHVkZSA9IE1hdGguYXRhbjIoWSwgWCk7XG4gIH1cblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBGb2xsb3dpbmcgaXRlcmF0aXZlIGFsZ29yaXRobSB3YXMgZGV2ZWxvcHBlZCBieVxuICAgKiBcIkluc3RpdHV0IGZvciBFcmRtZXNzdW5nXCIsIFVuaXZlcnNpdHkgb2YgSGFubm92ZXIsIEp1bHkgMTk4OC5cbiAgICogSW50ZXJuZXQ6IHd3dy5pZmUudW5pLWhhbm5vdmVyLmRlXG4gICAqIEl0ZXJhdGl2ZSBjb21wdXRhdGlvbiBvZiBDUEhJLFNQSEkgYW5kIEhlaWdodC5cbiAgICogSXRlcmF0aW9uIG9mIENQSEkgYW5kIFNQSEkgdG8gMTAqKi0xMiByYWRpYW4gcmVzcC5cbiAgICogMioxMCoqLTcgYXJjc2VjLlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgQ1QgPSBaIC8gUlI7XG4gIFNUID0gUCAvIFJSO1xuICBSWCA9IDEuMCAvIE1hdGguc3FydCgxLjAgLSBlcyAqICgyLjAgLSBlcykgKiBTVCAqIFNUKTtcbiAgQ1BISTAgPSBTVCAqICgxLjAgLSBlcykgKiBSWDtcbiAgU1BISTAgPSBDVCAqIFJYO1xuICBpdGVyID0gMDtcblxuICAvKiBsb29wIHRvIGZpbmQgc2luKExhdGl0dWRlKSByZXNwLiBMYXRpdHVkZVxuICAgKiB1bnRpbCB8c2luKExhdGl0dWRlKGl0ZXIpLUxhdGl0dWRlKGl0ZXItMSkpfCA8IGdlbmF1ICovXG4gIGRvIHtcbiAgICBpdGVyKys7XG4gICAgUk4gPSBhIC8gTWF0aC5zcXJ0KDEuMCAtIGVzICogU1BISTAgKiBTUEhJMCk7XG5cbiAgICAvKiAgZWxsaXBzb2lkYWwgKGdlb2RldGljKSBoZWlnaHQgKi9cbiAgICBIZWlnaHQgPSBQICogQ1BISTAgKyBaICogU1BISTAgLSBSTiAqICgxLjAgLSBlcyAqIFNQSEkwICogU1BISTApO1xuXG4gICAgUksgPSBlcyAqIFJOIC8gKFJOICsgSGVpZ2h0KTtcbiAgICBSWCA9IDEuMCAvIE1hdGguc3FydCgxLjAgLSBSSyAqICgyLjAgLSBSSykgKiBTVCAqIFNUKTtcbiAgICBDUEhJID0gU1QgKiAoMS4wIC0gUkspICogUlg7XG4gICAgU1BISSA9IENUICogUlg7XG4gICAgU0RQSEkgPSBTUEhJICogQ1BISTAgLSBDUEhJICogU1BISTA7XG4gICAgQ1BISTAgPSBDUEhJO1xuICAgIFNQSEkwID0gU1BISTtcbiAgfVxuICB3aGlsZSAoU0RQSEkgKiBTRFBISSA+IGdlbmF1MiAmJiBpdGVyIDwgbWF4aXRlcik7XG5cbiAgLyogICAgICBlbGxpcHNvaWRhbCAoZ2VvZGV0aWMpIGxhdGl0dWRlICovXG4gIExhdGl0dWRlID0gTWF0aC5hdGFuKFNQSEkgLyBNYXRoLmFicyhDUEhJKSk7XG4gIHJldHVybiB7XG4gICAgeDogTG9uZ2l0dWRlLFxuICAgIHk6IExhdGl0dWRlLFxuICAgIHo6IEhlaWdodFxuICB9O1xufSAvLyBjc19nZW9jZW50cmljX3RvX2dlb2RldGljKClcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vLyBwal9nZW9jZW50aWNfdG9fd2dzODQoIHAgKVxuLy8gIHAgPSBwb2ludCB0byB0cmFuc2Zvcm0gaW4gZ2VvY2VudHJpYyBjb29yZGluYXRlcyAoeCx5LHopXG5cblxuLyoqIHBvaW50IG9iamVjdCwgbm90aGluZyBmYW5jeSwganVzdCBhbGxvd3MgdmFsdWVzIHRvIGJlXG4gICAgcGFzc2VkIGJhY2sgYW5kIGZvcnRoIGJ5IHJlZmVyZW5jZSByYXRoZXIgdGhhbiBieSB2YWx1ZS5cbiAgICBPdGhlciBwb2ludCBjbGFzc2VzIG1heSBiZSB1c2VkIGFzIGxvbmcgYXMgdGhleSBoYXZlXG4gICAgeCBhbmQgeSBwcm9wZXJ0aWVzLCB3aGljaCB3aWxsIGdldCBtb2RpZmllZCBpbiB0aGUgdHJhbnNmb3JtIG1ldGhvZC5cbiovXG5leHBvcnQgZnVuY3Rpb24gZ2VvY2VudHJpY1RvV2dzODQocCwgZGF0dW1fdHlwZSwgZGF0dW1fcGFyYW1zKSB7XG5cbiAgaWYgKGRhdHVtX3R5cGUgPT09IFBKRF8zUEFSQU0pIHtcbiAgICAvLyBpZiggeFtpb10gPT09IEhVR0VfVkFMIClcbiAgICAvLyAgICBjb250aW51ZTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcC54ICsgZGF0dW1fcGFyYW1zWzBdLFxuICAgICAgeTogcC55ICsgZGF0dW1fcGFyYW1zWzFdLFxuICAgICAgejogcC56ICsgZGF0dW1fcGFyYW1zWzJdLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZGF0dW1fdHlwZSA9PT0gUEpEXzdQQVJBTSkge1xuICAgIHZhciBEeF9CRiA9IGRhdHVtX3BhcmFtc1swXTtcbiAgICB2YXIgRHlfQkYgPSBkYXR1bV9wYXJhbXNbMV07XG4gICAgdmFyIER6X0JGID0gZGF0dW1fcGFyYW1zWzJdO1xuICAgIHZhciBSeF9CRiA9IGRhdHVtX3BhcmFtc1szXTtcbiAgICB2YXIgUnlfQkYgPSBkYXR1bV9wYXJhbXNbNF07XG4gICAgdmFyIFJ6X0JGID0gZGF0dW1fcGFyYW1zWzVdO1xuICAgIHZhciBNX0JGID0gZGF0dW1fcGFyYW1zWzZdO1xuICAgIC8vIGlmKCB4W2lvXSA9PT0gSFVHRV9WQUwgKVxuICAgIC8vICAgIGNvbnRpbnVlO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBNX0JGICogKHAueCAtIFJ6X0JGICogcC55ICsgUnlfQkYgKiBwLnopICsgRHhfQkYsXG4gICAgICB5OiBNX0JGICogKFJ6X0JGICogcC54ICsgcC55IC0gUnhfQkYgKiBwLnopICsgRHlfQkYsXG4gICAgICB6OiBNX0JGICogKC1SeV9CRiAqIHAueCArIFJ4X0JGICogcC55ICsgcC56KSArIER6X0JGXG4gICAgfTtcbiAgfVxufSAvLyBjc19nZW9jZW50cmljX3RvX3dnczg0XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLy8gcGpfZ2VvY2VudGljX2Zyb21fd2dzODQoKVxuLy8gIGNvb3JkaW5hdGUgc3lzdGVtIGRlZmluaXRpb24sXG4vLyAgcG9pbnQgdG8gdHJhbnNmb3JtIGluIGdlb2NlbnRyaWMgY29vcmRpbmF0ZXMgKHgseSx6KVxuZXhwb3J0IGZ1bmN0aW9uIGdlb2NlbnRyaWNGcm9tV2dzODQocCwgZGF0dW1fdHlwZSwgZGF0dW1fcGFyYW1zKSB7XG5cbiAgaWYgKGRhdHVtX3R5cGUgPT09IFBKRF8zUEFSQU0pIHtcbiAgICAvL2lmKCB4W2lvXSA9PT0gSFVHRV9WQUwgKVxuICAgIC8vICAgIGNvbnRpbnVlO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwLnggLSBkYXR1bV9wYXJhbXNbMF0sXG4gICAgICB5OiBwLnkgLSBkYXR1bV9wYXJhbXNbMV0sXG4gICAgICB6OiBwLnogLSBkYXR1bV9wYXJhbXNbMl0sXG4gICAgfTtcblxuICB9IGVsc2UgaWYgKGRhdHVtX3R5cGUgPT09IFBKRF83UEFSQU0pIHtcbiAgICB2YXIgRHhfQkYgPSBkYXR1bV9wYXJhbXNbMF07XG4gICAgdmFyIER5X0JGID0gZGF0dW1fcGFyYW1zWzFdO1xuICAgIHZhciBEel9CRiA9IGRhdHVtX3BhcmFtc1syXTtcbiAgICB2YXIgUnhfQkYgPSBkYXR1bV9wYXJhbXNbM107XG4gICAgdmFyIFJ5X0JGID0gZGF0dW1fcGFyYW1zWzRdO1xuICAgIHZhciBSel9CRiA9IGRhdHVtX3BhcmFtc1s1XTtcbiAgICB2YXIgTV9CRiA9IGRhdHVtX3BhcmFtc1s2XTtcbiAgICB2YXIgeF90bXAgPSAocC54IC0gRHhfQkYpIC8gTV9CRjtcbiAgICB2YXIgeV90bXAgPSAocC55IC0gRHlfQkYpIC8gTV9CRjtcbiAgICB2YXIgel90bXAgPSAocC56IC0gRHpfQkYpIC8gTV9CRjtcbiAgICAvL2lmKCB4W2lvXSA9PT0gSFVHRV9WQUwgKVxuICAgIC8vICAgIGNvbnRpbnVlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHhfdG1wICsgUnpfQkYgKiB5X3RtcCAtIFJ5X0JGICogel90bXAsXG4gICAgICB5OiAtUnpfQkYgKiB4X3RtcCArIHlfdG1wICsgUnhfQkYgKiB6X3RtcCxcbiAgICAgIHo6IFJ5X0JGICogeF90bXAgLSBSeF9CRiAqIHlfdG1wICsgel90bXBcbiAgICB9O1xuICB9IC8vY3NfZ2VvY2VudHJpY19mcm9tX3dnczg0KClcbn1cbiIsImltcG9ydCB7XG4gIFBKRF8zUEFSQU0sXG4gIFBKRF83UEFSQU0sXG4gIFBKRF9HUklEU0hJRlQsXG4gIFBKRF9OT0RBVFVNLFxuICBSMkQsXG4gIFNSU19XR1M4NF9FU1FVQVJFRCxcbiAgU1JTX1dHUzg0X1NFTUlNQUpPUiwgU1JTX1dHUzg0X1NFTUlNSU5PUlxufSBmcm9tICcuL2NvbnN0YW50cy92YWx1ZXMnO1xuXG5pbXBvcnQge2dlb2RldGljVG9HZW9jZW50cmljLCBnZW9jZW50cmljVG9HZW9kZXRpYywgZ2VvY2VudHJpY1RvV2dzODQsIGdlb2NlbnRyaWNGcm9tV2dzODQsIGNvbXBhcmVEYXR1bXN9IGZyb20gJy4vZGF0dW1VdGlscyc7XG5pbXBvcnQgYWRqdXN0X2xvbiBmcm9tIFwiLi9jb21tb24vYWRqdXN0X2xvblwiO1xuZnVuY3Rpb24gY2hlY2tQYXJhbXModHlwZSkge1xuICByZXR1cm4gKHR5cGUgPT09IFBKRF8zUEFSQU0gfHwgdHlwZSA9PT0gUEpEXzdQQVJBTSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNvdXJjZSwgZGVzdCwgcG9pbnQpIHtcbiAgLy8gU2hvcnQgY3V0IGlmIHRoZSBkYXR1bXMgYXJlIGlkZW50aWNhbC5cbiAgaWYgKGNvbXBhcmVEYXR1bXMoc291cmNlLCBkZXN0KSkge1xuICAgIHJldHVybiBwb2ludDsgLy8gaW4gdGhpcyBjYXNlLCB6ZXJvIGlzIHN1Y2VzcyxcbiAgICAvLyB3aGVyZWFzIGNzX2NvbXBhcmVfZGF0dW1zIHJldHVybnMgMSB0byBpbmRpY2F0ZSBUUlVFXG4gICAgLy8gY29uZnVzaW5nLCBzaG91bGQgZml4IHRoaXNcbiAgfVxuXG4gIC8vIEV4cGxpY2l0bHkgc2tpcCBkYXR1bSB0cmFuc2Zvcm0gYnkgc2V0dGluZyAnZGF0dW09bm9uZScgYXMgcGFyYW1ldGVyIGZvciBlaXRoZXIgc291cmNlIG9yIGRlc3RcbiAgaWYgKHNvdXJjZS5kYXR1bV90eXBlID09PSBQSkRfTk9EQVRVTSB8fCBkZXN0LmRhdHVtX3R5cGUgPT09IFBKRF9OT0RBVFVNKSB7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9XG5cbiAgLy8gSWYgdGhpcyBkYXR1bSByZXF1aXJlcyBncmlkIHNoaWZ0cywgdGhlbiBhcHBseSBpdCB0byBnZW9kZXRpYyBjb29yZGluYXRlcy5cbiAgdmFyIHNvdXJjZV9hID0gc291cmNlLmE7XG4gIHZhciBzb3VyY2VfZXMgPSBzb3VyY2UuZXM7XG4gIGlmIChzb3VyY2UuZGF0dW1fdHlwZSA9PT0gUEpEX0dSSURTSElGVCkge1xuICAgIHZhciBncmlkU2hpZnRDb2RlID0gYXBwbHlHcmlkU2hpZnQoc291cmNlLCBmYWxzZSwgcG9pbnQpO1xuICAgIGlmIChncmlkU2hpZnRDb2RlICE9PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBzb3VyY2VfYSA9IFNSU19XR1M4NF9TRU1JTUFKT1I7XG4gICAgc291cmNlX2VzID0gU1JTX1dHUzg0X0VTUVVBUkVEO1xuICB9XG5cbiAgdmFyIGRlc3RfYSA9IGRlc3QuYTtcbiAgdmFyIGRlc3RfYiA9IGRlc3QuYjtcbiAgdmFyIGRlc3RfZXMgPSBkZXN0LmVzO1xuICBpZiAoZGVzdC5kYXR1bV90eXBlID09PSBQSkRfR1JJRFNISUZUKSB7XG4gICAgZGVzdF9hID0gU1JTX1dHUzg0X1NFTUlNQUpPUjtcbiAgICBkZXN0X2IgPSBTUlNfV0dTODRfU0VNSU1JTk9SO1xuICAgIGRlc3RfZXMgPSBTUlNfV0dTODRfRVNRVUFSRUQ7XG4gIH1cblxuICAvLyBEbyB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggZ2VvY2VudHJpYyBjb29yZGluYXRlcz9cbiAgaWYgKHNvdXJjZV9lcyA9PT0gZGVzdF9lcyAmJiBzb3VyY2VfYSA9PT0gZGVzdF9hICYmICFjaGVja1BhcmFtcyhzb3VyY2UuZGF0dW1fdHlwZSkgJiYgICFjaGVja1BhcmFtcyhkZXN0LmRhdHVtX3R5cGUpKSB7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9XG5cbiAgLy8gQ29udmVydCB0byBnZW9jZW50cmljIGNvb3JkaW5hdGVzLlxuICBwb2ludCA9IGdlb2RldGljVG9HZW9jZW50cmljKHBvaW50LCBzb3VyY2VfZXMsIHNvdXJjZV9hKTtcbiAgLy8gQ29udmVydCBiZXR3ZWVuIGRhdHVtc1xuICBpZiAoY2hlY2tQYXJhbXMoc291cmNlLmRhdHVtX3R5cGUpKSB7XG4gICAgcG9pbnQgPSBnZW9jZW50cmljVG9XZ3M4NChwb2ludCwgc291cmNlLmRhdHVtX3R5cGUsIHNvdXJjZS5kYXR1bV9wYXJhbXMpO1xuICB9XG4gIGlmIChjaGVja1BhcmFtcyhkZXN0LmRhdHVtX3R5cGUpKSB7XG4gICAgcG9pbnQgPSBnZW9jZW50cmljRnJvbVdnczg0KHBvaW50LCBkZXN0LmRhdHVtX3R5cGUsIGRlc3QuZGF0dW1fcGFyYW1zKTtcbiAgfVxuICBwb2ludCA9IGdlb2NlbnRyaWNUb0dlb2RldGljKHBvaW50LCBkZXN0X2VzLCBkZXN0X2EsIGRlc3RfYik7XG5cbiAgaWYgKGRlc3QuZGF0dW1fdHlwZSA9PT0gUEpEX0dSSURTSElGVCkge1xuICAgIHZhciBkZXN0R3JpZFNoaWZ0UmVzdWx0ID0gYXBwbHlHcmlkU2hpZnQoZGVzdCwgdHJ1ZSwgcG9pbnQpO1xuICAgIGlmIChkZXN0R3JpZFNoaWZ0UmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb2ludDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5R3JpZFNoaWZ0KHNvdXJjZSwgaW52ZXJzZSwgcG9pbnQpIHtcbiAgaWYgKHNvdXJjZS5ncmlkcyA9PT0gbnVsbCB8fCBzb3VyY2UuZ3JpZHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coJ0dyaWQgc2hpZnQgZ3JpZHMgbm90IGZvdW5kJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbnB1dCA9IHt4OiAtcG9pbnQueCwgeTogcG9pbnQueX07XG4gIHZhciBvdXRwdXQgPSB7eDogTnVtYmVyLk5hTiwgeTogTnVtYmVyLk5hTn07XG4gIHZhciBvbmx5TWFuZGF0b3J5R3JpZHMgPSBmYWxzZTtcbiAgdmFyIGF0dGVtcHRlZEdyaWRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmdyaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyaWQgPSBzb3VyY2UuZ3JpZHNbaV07XG4gICAgYXR0ZW1wdGVkR3JpZHMucHVzaChncmlkLm5hbWUpO1xuICAgIGlmIChncmlkLmlzTnVsbCkge1xuICAgICAgb3V0cHV0ID0gaW5wdXQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb25seU1hbmRhdG9yeUdyaWRzID0gZ3JpZC5tYW5kYXRvcnk7XG4gICAgaWYgKGdyaWQuZ3JpZCA9PT0gbnVsbCkge1xuICAgICAgaWYgKGdyaWQubWFuZGF0b3J5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiVW5hYmxlIHRvIGZpbmQgbWFuZGF0b3J5IGdyaWQgJ1wiICsgZ3JpZC5uYW1lICsgXCInXCIpO1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIHN1YmdyaWQgPSBncmlkLmdyaWQuc3ViZ3JpZHNbMF07XG4gICAgLy8gc2tpcCB0YWJsZXMgdGhhdCBkb24ndCBtYXRjaCBvdXIgcG9pbnQgYXQgYWxsXG4gICAgdmFyIGVwc2lsb24gPSAoTWF0aC5hYnMoc3ViZ3JpZC5kZWxbMV0pICsgTWF0aC5hYnMoc3ViZ3JpZC5kZWxbMF0pKSAvIDEwMDAwLjA7XG4gICAgdmFyIG1pblggPSBzdWJncmlkLmxsWzBdIC0gZXBzaWxvbjtcbiAgICB2YXIgbWluWSA9IHN1YmdyaWQubGxbMV0gLSBlcHNpbG9uO1xuICAgIHZhciBtYXhYID0gc3ViZ3JpZC5sbFswXSArIChzdWJncmlkLmxpbVswXSAtIDEpICogc3ViZ3JpZC5kZWxbMF0gKyBlcHNpbG9uO1xuICAgIHZhciBtYXhZID0gc3ViZ3JpZC5sbFsxXSArIChzdWJncmlkLmxpbVsxXSAtIDEpICogc3ViZ3JpZC5kZWxbMV0gKyBlcHNpbG9uO1xuICAgIGlmIChtaW5ZID4gaW5wdXQueSB8fCBtaW5YID4gaW5wdXQueCB8fCBtYXhZIDwgaW5wdXQueSB8fCBtYXhYIDwgaW5wdXQueCApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBvdXRwdXQgPSBhcHBseVN1YmdyaWRTaGlmdChpbnB1dCwgaW52ZXJzZSwgc3ViZ3JpZCk7XG4gICAgaWYgKCFpc05hTihvdXRwdXQueCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOYU4ob3V0cHV0LngpKSB7XG4gICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gZmluZCBhIGdyaWQgc2hpZnQgdGFibGUgZm9yIGxvY2F0aW9uICdcIitcbiAgICAgIC1pbnB1dC54ICogUjJEICsgXCIgXCIgKyBpbnB1dC55ICogUjJEICsgXCIgdHJpZWQ6ICdcIiArIGF0dGVtcHRlZEdyaWRzICsgXCInXCIpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBwb2ludC54ID0gLW91dHB1dC54O1xuICBwb2ludC55ID0gb3V0cHV0Lnk7XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBhcHBseVN1YmdyaWRTaGlmdChwaW4sIGludmVyc2UsIGN0KSB7XG4gIHZhciB2YWwgPSB7eDogTnVtYmVyLk5hTiwgeTogTnVtYmVyLk5hTn07XG4gIGlmIChpc05hTihwaW4ueCkpIHsgcmV0dXJuIHZhbDsgfVxuICB2YXIgdGIgPSB7eDogcGluLngsIHk6IHBpbi55fTtcbiAgdGIueCAtPSBjdC5sbFswXTtcbiAgdGIueSAtPSBjdC5sbFsxXTtcbiAgdGIueCA9IGFkanVzdF9sb24odGIueCAtIE1hdGguUEkpICsgTWF0aC5QSTtcbiAgdmFyIHQgPSBuYWRJbnRlcnBvbGF0ZSh0YiwgY3QpO1xuICBpZiAoaW52ZXJzZSkge1xuICAgIGlmIChpc05hTih0LngpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0LnggPSB0Yi54IC0gdC54O1xuICAgIHQueSA9IHRiLnkgLSB0Lnk7XG4gICAgdmFyIGkgPSA5LCB0b2wgPSAxZS0xMjtcbiAgICB2YXIgZGlmLCBkZWw7XG4gICAgZG8ge1xuICAgICAgZGVsID0gbmFkSW50ZXJwb2xhdGUodCwgY3QpO1xuICAgICAgaWYgKGlzTmFOKGRlbC54KSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkludmVyc2UgZ3JpZCBzaGlmdCBpdGVyYXRpb24gZmFpbGVkLCBwcmVzdW1hYmx5IGF0IGdyaWQgZWRnZS4gIFVzaW5nIGZpcnN0IGFwcHJveGltYXRpb24uXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRpZiA9IHt4OiB0Yi54IC0gKGRlbC54ICsgdC54KSwgeTogdGIueSAtIChkZWwueSArIHQueSl9O1xuICAgICAgdC54ICs9IGRpZi54O1xuICAgICAgdC55ICs9IGRpZi55O1xuICAgIH0gd2hpbGUgKGktLSAmJiBNYXRoLmFicyhkaWYueCkgPiB0b2wgJiYgTWF0aC5hYnMoZGlmLnkpID4gdG9sKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiSW52ZXJzZSBncmlkIHNoaWZ0IGl0ZXJhdG9yIGZhaWxlZCB0byBjb252ZXJnZS5cIik7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB2YWwueCA9IGFkanVzdF9sb24odC54ICsgY3QubGxbMF0pO1xuICAgIHZhbC55ID0gdC55ICsgY3QubGxbMV07XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpc05hTih0LngpKSB7XG4gICAgICB2YWwueCA9IHBpbi54ICsgdC54O1xuICAgICAgdmFsLnkgPSBwaW4ueSArIHQueTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gbmFkSW50ZXJwb2xhdGUocGluLCBjdCkge1xuICB2YXIgdCA9IHt4OiBwaW4ueCAvIGN0LmRlbFswXSwgeTogcGluLnkgLyBjdC5kZWxbMV19O1xuICB2YXIgaW5keCA9IHt4OiBNYXRoLmZsb29yKHQueCksIHk6IE1hdGguZmxvb3IodC55KX07XG4gIHZhciBmcmN0ID0ge3g6IHQueCAtIDEuMCAqIGluZHgueCwgeTogdC55IC0gMS4wICogaW5keC55fTtcbiAgdmFyIHZhbD0ge3g6IE51bWJlci5OYU4sIHk6IE51bWJlci5OYU59O1xuICB2YXIgaW54O1xuICBpZiAoaW5keC54IDwgMCB8fCBpbmR4LnggPj0gY3QubGltWzBdKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBpZiAoaW5keC55IDwgMCB8fCBpbmR4LnkgPj0gY3QubGltWzFdKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBpbnggPSAoaW5keC55ICogY3QubGltWzBdKSArIGluZHgueDtcbiAgdmFyIGYwMCA9IHt4OiBjdC5jdnNbaW54XVswXSwgeTogY3QuY3ZzW2lueF1bMV19O1xuICBpbngrKztcbiAgdmFyIGYxMD0ge3g6IGN0LmN2c1tpbnhdWzBdLCB5OiBjdC5jdnNbaW54XVsxXX07XG4gIGlueCArPSBjdC5saW1bMF07XG4gIHZhciBmMTEgPSB7eDogY3QuY3ZzW2lueF1bMF0sIHk6IGN0LmN2c1tpbnhdWzFdfTtcbiAgaW54LS07XG4gIHZhciBmMDEgPSB7eDogY3QuY3ZzW2lueF1bMF0sIHk6IGN0LmN2c1tpbnhdWzFdfTtcbiAgdmFyIG0xMSA9IGZyY3QueCAqIGZyY3QueSwgbTEwID0gZnJjdC54ICogKDEuMCAtIGZyY3QueSksXG4gICAgbTAwID0gKDEuMCAtIGZyY3QueCkgKiAoMS4wIC0gZnJjdC55KSwgbTAxID0gKDEuMCAtIGZyY3QueCkgKiBmcmN0Lnk7XG4gIHZhbC54ID0gKG0wMCAqIGYwMC54ICsgbTEwICogZjEwLnggKyBtMDEgKiBmMDEueCArIG0xMSAqIGYxMS54KTtcbiAgdmFsLnkgPSAobTAwICogZjAwLnkgKyBtMTAgKiBmMTAueSArIG0wMSAqIGYwMS55ICsgbTExICogZjExLnkpO1xuICByZXR1cm4gdmFsO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY3JzLCBkZW5vcm0sIHBvaW50KSB7XG4gIHZhciB4aW4gPSBwb2ludC54LFxuICAgIHlpbiA9IHBvaW50LnksXG4gICAgemluID0gcG9pbnQueiB8fCAwLjA7XG4gIHZhciB2LCB0LCBpO1xuICB2YXIgb3V0ID0ge307XG4gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICBpZiAoZGVub3JtICYmIGkgPT09IDIgJiYgcG9pbnQueiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHYgPSB4aW47XG4gICAgICBpZiAoXCJld1wiLmluZGV4T2YoY3JzLmF4aXNbaV0pICE9PSAtMSkge1xuICAgICAgICB0ID0gJ3gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdCA9ICd5JztcbiAgICAgIH1cblxuICAgIH1cbiAgICBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICB2ID0geWluO1xuICAgICAgaWYgKFwibnNcIi5pbmRleE9mKGNycy5heGlzW2ldKSAhPT0gLTEpIHtcbiAgICAgICAgdCA9ICd5JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHQgPSAneCc7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdiA9IHppbjtcbiAgICAgIHQgPSAneic7XG4gICAgfVxuICAgIHN3aXRjaCAoY3JzLmF4aXNbaV0pIHtcbiAgICBjYXNlICdlJzpcbiAgICAgIG91dFt0XSA9IHY7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd3JzpcbiAgICAgIG91dFt0XSA9IC12O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbic6XG4gICAgICBvdXRbdF0gPSB2O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncyc6XG4gICAgICBvdXRbdF0gPSAtdjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3UnOlxuICAgICAgaWYgKHBvaW50W3RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3V0LnogPSB2O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZCc6XG4gICAgICBpZiAocG9pbnRbdF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvdXQueiA9IC12O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vY29uc29sZS5sb2coXCJFUlJPUjogdW5rbm93IGF4aXMgKFwiK2Nycy5heGlzW2ldK1wiKSAtIGNoZWNrIGRlZmluaXRpb24gb2YgXCIrY3JzLnByb2pOYW1lKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFycmF5KXtcbiAgdmFyIG91dCA9IHtcbiAgICB4OiBhcnJheVswXSxcbiAgICB5OiBhcnJheVsxXVxuICB9O1xuICBpZiAoYXJyYXkubGVuZ3RoPjIpIHtcbiAgICBvdXQueiA9IGFycmF5WzJdO1xuICB9XG4gIGlmIChhcnJheS5sZW5ndGg+Mykge1xuICAgIG91dC5tID0gYXJyYXlbM107XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocG9pbnQpIHtcbiAgY2hlY2tDb29yZChwb2ludC54KTtcbiAgY2hlY2tDb29yZChwb2ludC55KTtcbn1cbmZ1bmN0aW9uIGNoZWNrQ29vcmQobnVtKSB7XG4gIGlmICh0eXBlb2YgTnVtYmVyLmlzRmluaXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShudW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Nvb3JkaW5hdGVzIG11c3QgYmUgZmluaXRlIG51bWJlcnMnKTtcbiAgfVxuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgfHwgbnVtICE9PSBudW0gfHwgIWlzRmluaXRlKG51bSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb29yZGluYXRlcyBtdXN0IGJlIGZpbml0ZSBudW1iZXJzJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7RDJSLCBSMkQsIFBKRF8zUEFSQU0sIFBKRF83UEFSQU0sIFBKRF9HUklEU0hJRlR9IGZyb20gJy4vY29uc3RhbnRzL3ZhbHVlcyc7XG5pbXBvcnQgZGF0dW1fdHJhbnNmb3JtIGZyb20gJy4vZGF0dW1fdHJhbnNmb3JtJztcbmltcG9ydCBhZGp1c3RfYXhpcyBmcm9tICcuL2FkanVzdF9heGlzJztcbmltcG9ydCBwcm9qIGZyb20gJy4vUHJvaic7XG5pbXBvcnQgdG9Qb2ludCBmcm9tICcuL2NvbW1vbi90b1BvaW50JztcbmltcG9ydCBjaGVja1Nhbml0eSBmcm9tICcuL2NoZWNrU2FuaXR5JztcblxuZnVuY3Rpb24gY2hlY2tOb3RXR1Moc291cmNlLCBkZXN0KSB7XG4gIHJldHVybiAoXG4gICAgKHNvdXJjZS5kYXR1bS5kYXR1bV90eXBlID09PSBQSkRfM1BBUkFNIHx8IHNvdXJjZS5kYXR1bS5kYXR1bV90eXBlID09PSBQSkRfN1BBUkFNIHx8IHNvdXJjZS5kYXR1bS5kYXR1bV90eXBlID09PSBQSkRfR1JJRFNISUZUKSAmJiBkZXN0LmRhdHVtQ29kZSAhPT0gJ1dHUzg0JykgfHxcbiAgICAoKGRlc3QuZGF0dW0uZGF0dW1fdHlwZSA9PT0gUEpEXzNQQVJBTSB8fCBkZXN0LmRhdHVtLmRhdHVtX3R5cGUgPT09IFBKRF83UEFSQU0gfHwgZGVzdC5kYXR1bS5kYXR1bV90eXBlID09PSBQSkRfR1JJRFNISUZUKSAmJiBzb3VyY2UuZGF0dW1Db2RlICE9PSAnV0dTODQnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKHNvdXJjZSwgZGVzdCwgcG9pbnQsIGVuZm9yY2VBeGlzKSB7XG4gIHZhciB3Z3M4NDtcbiAgaWYgKEFycmF5LmlzQXJyYXkocG9pbnQpKSB7XG4gICAgcG9pbnQgPSB0b1BvaW50KHBvaW50KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDbG9uZSB0aGUgcG9pbnQgb2JqZWN0IHNvIGlucHV0cyBkb24ndCBnZXQgbW9kaWZpZWRcbiAgICBwb2ludCA9IHtcbiAgICAgIHg6IHBvaW50LngsXG4gICAgICB5OiBwb2ludC55LFxuICAgICAgejogcG9pbnQueixcbiAgICAgIG06IHBvaW50Lm1cbiAgICB9O1xuICB9XG4gIHZhciBoYXNaID0gcG9pbnQueiAhPT0gdW5kZWZpbmVkO1xuICBjaGVja1Nhbml0eShwb2ludCk7XG4gIC8vIFdvcmthcm91bmQgZm9yIGRhdHVtIHNoaWZ0cyB0b3dnczg0LCBpZiBlaXRoZXIgc291cmNlIG9yIGRlc3RpbmF0aW9uIHByb2plY3Rpb24gaXMgbm90IHdnczg0XG4gIGlmIChzb3VyY2UuZGF0dW0gJiYgZGVzdC5kYXR1bSAmJiBjaGVja05vdFdHUyhzb3VyY2UsIGRlc3QpKSB7XG4gICAgd2dzODQgPSBuZXcgcHJvaignV0dTODQnKTtcbiAgICBwb2ludCA9IHRyYW5zZm9ybShzb3VyY2UsIHdnczg0LCBwb2ludCwgZW5mb3JjZUF4aXMpO1xuICAgIHNvdXJjZSA9IHdnczg0O1xuICB9XG4gIC8vIERHUiwgMjAxMC8xMS8xMlxuICBpZiAoZW5mb3JjZUF4aXMgJiYgc291cmNlLmF4aXMgIT09ICdlbnUnKSB7XG4gICAgcG9pbnQgPSBhZGp1c3RfYXhpcyhzb3VyY2UsIGZhbHNlLCBwb2ludCk7XG4gIH1cbiAgLy8gVHJhbnNmb3JtIHNvdXJjZSBwb2ludHMgdG8gbG9uZy9sYXQsIGlmIHRoZXkgYXJlbid0IGFscmVhZHkuXG4gIGlmIChzb3VyY2UucHJvak5hbWUgPT09ICdsb25nbGF0Jykge1xuICAgIHBvaW50ID0ge1xuICAgICAgeDogcG9pbnQueCAqIEQyUixcbiAgICAgIHk6IHBvaW50LnkgKiBEMlIsXG4gICAgICB6OiBwb2ludC56IHx8IDBcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGlmIChzb3VyY2UudG9fbWV0ZXIpIHtcbiAgICAgIHBvaW50ID0ge1xuICAgICAgICB4OiBwb2ludC54ICogc291cmNlLnRvX21ldGVyLFxuICAgICAgICB5OiBwb2ludC55ICogc291cmNlLnRvX21ldGVyLFxuICAgICAgICB6OiBwb2ludC56IHx8IDBcbiAgICAgIH07XG4gICAgfVxuICAgIHBvaW50ID0gc291cmNlLmludmVyc2UocG9pbnQpOyAvLyBDb252ZXJ0IENhcnRlc2lhbiB0byBsb25nbGF0XG4gICAgaWYgKCFwb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICAvLyBBZGp1c3QgZm9yIHRoZSBwcmltZSBtZXJpZGlhbiBpZiBuZWNlc3NhcnlcbiAgaWYgKHNvdXJjZS5mcm9tX2dyZWVud2ljaCkge1xuICAgIHBvaW50LnggKz0gc291cmNlLmZyb21fZ3JlZW53aWNoO1xuICB9XG5cbiAgLy8gQ29udmVydCBkYXR1bXMgaWYgbmVlZGVkLCBhbmQgaWYgcG9zc2libGUuXG4gIHBvaW50ID0gZGF0dW1fdHJhbnNmb3JtKHNvdXJjZS5kYXR1bSwgZGVzdC5kYXR1bSwgcG9pbnQpO1xuICBpZiAoIXBvaW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQWRqdXN0IGZvciB0aGUgcHJpbWUgbWVyaWRpYW4gaWYgbmVjZXNzYXJ5XG4gIGlmIChkZXN0LmZyb21fZ3JlZW53aWNoKSB7XG4gICAgcG9pbnQgPSB7XG4gICAgICB4OiBwb2ludC54IC0gZGVzdC5mcm9tX2dyZWVud2ljaCxcbiAgICAgIHk6IHBvaW50LnksXG4gICAgICB6OiBwb2ludC56IHx8IDBcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRlc3QucHJvak5hbWUgPT09ICdsb25nbGF0Jykge1xuICAgIC8vIGNvbnZlcnQgcmFkaWFucyB0byBkZWNpbWFsIGRlZ3JlZXNcbiAgICBwb2ludCA9IHtcbiAgICAgIHg6IHBvaW50LnggKiBSMkQsXG4gICAgICB5OiBwb2ludC55ICogUjJELFxuICAgICAgejogcG9pbnQueiB8fCAwXG4gICAgfTtcbiAgfSBlbHNlIHsgLy8gZWxzZSBwcm9qZWN0XG4gICAgcG9pbnQgPSBkZXN0LmZvcndhcmQocG9pbnQpO1xuICAgIGlmIChkZXN0LnRvX21ldGVyKSB7XG4gICAgICBwb2ludCA9IHtcbiAgICAgICAgeDogcG9pbnQueCAvIGRlc3QudG9fbWV0ZXIsXG4gICAgICAgIHk6IHBvaW50LnkgLyBkZXN0LnRvX21ldGVyLFxuICAgICAgICB6OiBwb2ludC56IHx8IDBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gREdSLCAyMDEwLzExLzEyXG4gIGlmIChlbmZvcmNlQXhpcyAmJiBkZXN0LmF4aXMgIT09ICdlbnUnKSB7XG4gICAgcmV0dXJuIGFkanVzdF9heGlzKGRlc3QsIHRydWUsIHBvaW50KTtcbiAgfVxuXG4gIGlmICghaGFzWikge1xuICAgIGRlbGV0ZSBwb2ludC56O1xuICB9XG4gIHJldHVybiBwb2ludDtcbn1cbiIsImltcG9ydCBwcm9qIGZyb20gJy4vUHJvaic7XG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJy4vdHJhbnNmb3JtJztcbnZhciB3Z3M4NCA9IHByb2ooJ1dHUzg0Jyk7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybWVyKGZyb20sIHRvLCBjb29yZHMsIGVuZm9yY2VBeGlzKSB7XG4gIHZhciB0cmFuc2Zvcm1lZEFycmF5LCBvdXQsIGtleXM7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvb3JkcykpIHtcbiAgICB0cmFuc2Zvcm1lZEFycmF5ID0gdHJhbnNmb3JtKGZyb20sIHRvLCBjb29yZHMsIGVuZm9yY2VBeGlzKSB8fCB7eDogTmFOLCB5OiBOYU59O1xuICAgIGlmIChjb29yZHMubGVuZ3RoID4gMikge1xuICAgICAgaWYgKCh0eXBlb2YgZnJvbS5uYW1lICE9PSAndW5kZWZpbmVkJyAmJiBmcm9tLm5hbWUgPT09ICdnZW9jZW50JykgfHwgKHR5cGVvZiB0by5uYW1lICE9PSAndW5kZWZpbmVkJyAmJiB0by5uYW1lID09PSAnZ2VvY2VudCcpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtZWRBcnJheS56ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJldHVybiBbdHJhbnNmb3JtZWRBcnJheS54LCB0cmFuc2Zvcm1lZEFycmF5LnksIHRyYW5zZm9ybWVkQXJyYXkuel0uY29uY2F0KGNvb3Jkcy5zcGxpY2UoMykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbdHJhbnNmb3JtZWRBcnJheS54LCB0cmFuc2Zvcm1lZEFycmF5LnksIGNvb3Jkc1syXV0uY29uY2F0KGNvb3Jkcy5zcGxpY2UoMykpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3RyYW5zZm9ybWVkQXJyYXkueCwgdHJhbnNmb3JtZWRBcnJheS55XS5jb25jYXQoY29vcmRzLnNwbGljZSgyKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbdHJhbnNmb3JtZWRBcnJheS54LCB0cmFuc2Zvcm1lZEFycmF5LnldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXQgPSB0cmFuc2Zvcm0oZnJvbSwgdG8sIGNvb3JkcywgZW5mb3JjZUF4aXMpO1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyhjb29yZHMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmICgodHlwZW9mIGZyb20ubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZnJvbS5uYW1lID09PSAnZ2VvY2VudCcpIHx8ICh0eXBlb2YgdG8ubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdG8ubmFtZSA9PT0gJ2dlb2NlbnQnKSkge1xuICAgICAgICBpZiAoa2V5ID09PSAneCcgfHwga2V5ID09PSAneScgfHwga2V5ID09PSAneicpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChrZXkgPT09ICd4JyB8fCBrZXkgPT09ICd5Jykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0W2tleV0gPSBjb29yZHNba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvaihpdGVtKSB7XG4gIGlmIChpdGVtIGluc3RhbmNlb2YgcHJvaikge1xuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIGlmIChpdGVtLm9Qcm9qKSB7XG4gICAgcmV0dXJuIGl0ZW0ub1Byb2o7XG4gIH1cbiAgcmV0dXJuIHByb2ooaXRlbSk7XG59XG5cbmZ1bmN0aW9uIHByb2o0KGZyb21Qcm9qLCB0b1Byb2osIGNvb3JkKSB7XG4gIGZyb21Qcm9qID0gY2hlY2tQcm9qKGZyb21Qcm9qKTtcbiAgdmFyIHNpbmdsZSA9IGZhbHNlO1xuICB2YXIgb2JqO1xuICBpZiAodHlwZW9mIHRvUHJvaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0b1Byb2ogPSBmcm9tUHJvajtcbiAgICBmcm9tUHJvaiA9IHdnczg0O1xuICAgIHNpbmdsZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRvUHJvai54ICE9PSAndW5kZWZpbmVkJyB8fCBBcnJheS5pc0FycmF5KHRvUHJvaikpIHtcbiAgICBjb29yZCA9IHRvUHJvajtcbiAgICB0b1Byb2ogPSBmcm9tUHJvajtcbiAgICBmcm9tUHJvaiA9IHdnczg0O1xuICAgIHNpbmdsZSA9IHRydWU7XG4gIH1cbiAgdG9Qcm9qID0gY2hlY2tQcm9qKHRvUHJvaik7XG4gIGlmIChjb29yZCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm1lcihmcm9tUHJvaiwgdG9Qcm9qLCBjb29yZCk7XG4gIH0gZWxzZSB7XG4gICAgb2JqID0ge1xuICAgICAgZm9yd2FyZDogZnVuY3Rpb24gKGNvb3JkcywgZW5mb3JjZUF4aXMpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyKGZyb21Qcm9qLCB0b1Byb2osIGNvb3JkcywgZW5mb3JjZUF4aXMpO1xuICAgICAgfSxcbiAgICAgIGludmVyc2U6IGZ1bmN0aW9uIChjb29yZHMsIGVuZm9yY2VBeGlzKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcih0b1Byb2osIGZyb21Qcm9qLCBjb29yZHMsIGVuZm9yY2VBeGlzKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChzaW5nbGUpIHtcbiAgICAgIG9iai5vUHJvaiA9IHRvUHJvajtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgcHJvajQ7IiwiXG5cblxuLyoqXG4gKiBVVE0gem9uZXMgYXJlIGdyb3VwZWQsIGFuZCBhc3NpZ25lZCB0byBvbmUgb2YgYSBncm91cCBvZiA2XG4gKiBzZXRzLlxuICpcbiAqIHtpbnR9IEBwcml2YXRlXG4gKi9cbnZhciBOVU1fMTAwS19TRVRTID0gNjtcblxuLyoqXG4gKiBUaGUgY29sdW1uIGxldHRlcnMgKGZvciBlYXN0aW5nKSBvZiB0aGUgbG93ZXIgbGVmdCB2YWx1ZSwgcGVyXG4gKiBzZXQuXG4gKlxuICoge3N0cmluZ30gQHByaXZhdGVcbiAqL1xudmFyIFNFVF9PUklHSU5fQ09MVU1OX0xFVFRFUlMgPSAnQUpTQUpTJztcblxuLyoqXG4gKiBUaGUgcm93IGxldHRlcnMgKGZvciBub3J0aGluZykgb2YgdGhlIGxvd2VyIGxlZnQgdmFsdWUsIHBlclxuICogc2V0LlxuICpcbiAqIHtzdHJpbmd9IEBwcml2YXRlXG4gKi9cbnZhciBTRVRfT1JJR0lOX1JPV19MRVRURVJTID0gJ0FGQUZBRic7XG5cbnZhciBBID0gNjU7IC8vIEFcbnZhciBJID0gNzM7IC8vIElcbnZhciBPID0gNzk7IC8vIE9cbnZhciBWID0gODY7IC8vIFZcbnZhciBaID0gOTA7IC8vIFpcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgdG9Qb2ludDogdG9Qb2ludFxufTtcbi8qKlxuICogQ29udmVyc2lvbiBvZiBsYXQvbG9uIHRvIE1HUlMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGxsIE9iamVjdCBsaXRlcmFsIHdpdGggbGF0IGFuZCBsb24gcHJvcGVydGllcyBvbiBhXG4gKiAgICAgV0dTODQgZWxsaXBzb2lkLlxuICogQHBhcmFtIHtpbnR9IGFjY3VyYWN5IEFjY3VyYWN5IGluIGRpZ2l0cyAoNSBmb3IgMSBtLCA0IGZvciAxMCBtLCAzIGZvclxuICogICAgICAxMDAgbSwgMiBmb3IgMTAwMCBtIG9yIDEgZm9yIDEwMDAwIG0pLiBPcHRpb25hbCwgZGVmYXVsdCBpcyA1LlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgTUdSUyBzdHJpbmcgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbiBhbmQgYWNjdXJhY3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKGxsLCBhY2N1cmFjeSkge1xuICBhY2N1cmFjeSA9IGFjY3VyYWN5IHx8IDU7IC8vIGRlZmF1bHQgYWNjdXJhY3kgMW1cbiAgcmV0dXJuIGVuY29kZShMTHRvVVRNKHtcbiAgICBsYXQ6IGxsWzFdLFxuICAgIGxvbjogbGxbMF1cbiAgfSksIGFjY3VyYWN5KTtcbn07XG5cbi8qKlxuICogQ29udmVyc2lvbiBvZiBNR1JTIHRvIGxhdC9sb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ncnMgTUdSUyBzdHJpbmcuXG4gKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgd2l0aCBsZWZ0IChsb25naXR1ZGUpLCBib3R0b20gKGxhdGl0dWRlKSwgcmlnaHRcbiAqICAgICAobG9uZ2l0dWRlKSBhbmQgdG9wIChsYXRpdHVkZSkgdmFsdWVzIGluIFdHUzg0LCByZXByZXNlbnRpbmcgdGhlXG4gKiAgICAgYm91bmRpbmcgYm94IGZvciB0aGUgcHJvdmlkZWQgTUdSUyByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG1ncnMpIHtcbiAgdmFyIGJib3ggPSBVVE10b0xMKGRlY29kZShtZ3JzLnRvVXBwZXJDYXNlKCkpKTtcbiAgaWYgKGJib3gubGF0ICYmIGJib3gubG9uKSB7XG4gICAgcmV0dXJuIFtiYm94LmxvbiwgYmJveC5sYXQsIGJib3gubG9uLCBiYm94LmxhdF07XG4gIH1cbiAgcmV0dXJuIFtiYm94LmxlZnQsIGJib3guYm90dG9tLCBiYm94LnJpZ2h0LCBiYm94LnRvcF07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdG9Qb2ludChtZ3JzKSB7XG4gIHZhciBiYm94ID0gVVRNdG9MTChkZWNvZGUobWdycy50b1VwcGVyQ2FzZSgpKSk7XG4gIGlmIChiYm94LmxhdCAmJiBiYm94Lmxvbikge1xuICAgIHJldHVybiBbYmJveC5sb24sIGJib3gubGF0XTtcbiAgfVxuICByZXR1cm4gWyhiYm94LmxlZnQgKyBiYm94LnJpZ2h0KSAvIDIsIChiYm94LnRvcCArIGJib3guYm90dG9tKSAvIDJdO1xufTtcbi8qKlxuICogQ29udmVyc2lvbiBmcm9tIGRlZ3JlZXMgdG8gcmFkaWFucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IGRlZyB0aGUgYW5nbGUgaW4gZGVncmVlcy5cbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGFuZ2xlIGluIHJhZGlhbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZ1RvUmFkKGRlZykge1xuICByZXR1cm4gKGRlZyAqIChNYXRoLlBJIC8gMTgwLjApKTtcbn1cblxuLyoqXG4gKiBDb252ZXJzaW9uIGZyb20gcmFkaWFucyB0byBkZWdyZWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIHRoZSBhbmdsZSBpbiByYWRpYW5zLlxuICogQHJldHVybiB7bnVtYmVyfSB0aGUgYW5nbGUgaW4gZGVncmVlcy5cbiAqL1xuZnVuY3Rpb24gcmFkVG9EZWcocmFkKSB7XG4gIHJldHVybiAoMTgwLjAgKiAocmFkIC8gTWF0aC5QSSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc2V0IG9mIExvbmdpdHVkZSBhbmQgTGF0aXR1ZGUgY28tb3JkaW5hdGVzIHRvIFVUTVxuICogdXNpbmcgdGhlIFdHUzg0IGVsbGlwc29pZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IGxsIE9iamVjdCBsaXRlcmFsIHdpdGggbGF0IGFuZCBsb24gcHJvcGVydGllc1xuICogICAgIHJlcHJlc2VudGluZyB0aGUgV0dTODQgY29vcmRpbmF0ZSB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcgdGhlIFVUTSB2YWx1ZSB3aXRoIGVhc3RpbmcsXG4gKiAgICAgbm9ydGhpbmcsIHpvbmVOdW1iZXIgYW5kIHpvbmVMZXR0ZXIgcHJvcGVydGllcywgYW5kIGFuIG9wdGlvbmFsXG4gKiAgICAgYWNjdXJhY3kgcHJvcGVydHkgaW4gZGlnaXRzLiBSZXR1cm5zIG51bGwgaWYgdGhlIGNvbnZlcnNpb24gZmFpbGVkLlxuICovXG5mdW5jdGlvbiBMTHRvVVRNKGxsKSB7XG4gIHZhciBMYXQgPSBsbC5sYXQ7XG4gIHZhciBMb25nID0gbGwubG9uO1xuICB2YXIgYSA9IDYzNzgxMzcuMDsgLy9lbGxpcC5yYWRpdXM7XG4gIHZhciBlY2NTcXVhcmVkID0gMC4wMDY2OTQzODsgLy9lbGxpcC5lY2NzcTtcbiAgdmFyIGswID0gMC45OTk2O1xuICB2YXIgTG9uZ09yaWdpbjtcbiAgdmFyIGVjY1ByaW1lU3F1YXJlZDtcbiAgdmFyIE4sIFQsIEMsIEEsIE07XG4gIHZhciBMYXRSYWQgPSBkZWdUb1JhZChMYXQpO1xuICB2YXIgTG9uZ1JhZCA9IGRlZ1RvUmFkKExvbmcpO1xuICB2YXIgTG9uZ09yaWdpblJhZDtcbiAgdmFyIFpvbmVOdW1iZXI7XG4gIC8vIChpbnQpXG4gIFpvbmVOdW1iZXIgPSBNYXRoLmZsb29yKChMb25nICsgMTgwKSAvIDYpICsgMTtcblxuICAvL01ha2Ugc3VyZSB0aGUgbG9uZ2l0dWRlIDE4MC4wMCBpcyBpbiBab25lIDYwXG4gIGlmIChMb25nID09PSAxODApIHtcbiAgICBab25lTnVtYmVyID0gNjA7XG4gIH1cblxuICAvLyBTcGVjaWFsIHpvbmUgZm9yIE5vcndheVxuICBpZiAoTGF0ID49IDU2LjAgJiYgTGF0IDwgNjQuMCAmJiBMb25nID49IDMuMCAmJiBMb25nIDwgMTIuMCkge1xuICAgIFpvbmVOdW1iZXIgPSAzMjtcbiAgfVxuXG4gIC8vIFNwZWNpYWwgem9uZXMgZm9yIFN2YWxiYXJkXG4gIGlmIChMYXQgPj0gNzIuMCAmJiBMYXQgPCA4NC4wKSB7XG4gICAgaWYgKExvbmcgPj0gMC4wICYmIExvbmcgPCA5LjApIHtcbiAgICAgIFpvbmVOdW1iZXIgPSAzMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoTG9uZyA+PSA5LjAgJiYgTG9uZyA8IDIxLjApIHtcbiAgICAgIFpvbmVOdW1iZXIgPSAzMztcbiAgICB9XG4gICAgZWxzZSBpZiAoTG9uZyA+PSAyMS4wICYmIExvbmcgPCAzMy4wKSB7XG4gICAgICBab25lTnVtYmVyID0gMzU7XG4gICAgfVxuICAgIGVsc2UgaWYgKExvbmcgPj0gMzMuMCAmJiBMb25nIDwgNDIuMCkge1xuICAgICAgWm9uZU51bWJlciA9IDM3O1xuICAgIH1cbiAgfVxuXG4gIExvbmdPcmlnaW4gPSAoWm9uZU51bWJlciAtIDEpICogNiAtIDE4MCArIDM7IC8vKzMgcHV0cyBvcmlnaW5cbiAgLy8gaW4gbWlkZGxlIG9mXG4gIC8vIHpvbmVcbiAgTG9uZ09yaWdpblJhZCA9IGRlZ1RvUmFkKExvbmdPcmlnaW4pO1xuXG4gIGVjY1ByaW1lU3F1YXJlZCA9IChlY2NTcXVhcmVkKSAvICgxIC0gZWNjU3F1YXJlZCk7XG5cbiAgTiA9IGEgLyBNYXRoLnNxcnQoMSAtIGVjY1NxdWFyZWQgKiBNYXRoLnNpbihMYXRSYWQpICogTWF0aC5zaW4oTGF0UmFkKSk7XG4gIFQgPSBNYXRoLnRhbihMYXRSYWQpICogTWF0aC50YW4oTGF0UmFkKTtcbiAgQyA9IGVjY1ByaW1lU3F1YXJlZCAqIE1hdGguY29zKExhdFJhZCkgKiBNYXRoLmNvcyhMYXRSYWQpO1xuICBBID0gTWF0aC5jb3MoTGF0UmFkKSAqIChMb25nUmFkIC0gTG9uZ09yaWdpblJhZCk7XG5cbiAgTSA9IGEgKiAoKDEgLSBlY2NTcXVhcmVkIC8gNCAtIDMgKiBlY2NTcXVhcmVkICogZWNjU3F1YXJlZCAvIDY0IC0gNSAqIGVjY1NxdWFyZWQgKiBlY2NTcXVhcmVkICogZWNjU3F1YXJlZCAvIDI1NikgKiBMYXRSYWQgLSAoMyAqIGVjY1NxdWFyZWQgLyA4ICsgMyAqIGVjY1NxdWFyZWQgKiBlY2NTcXVhcmVkIC8gMzIgKyA0NSAqIGVjY1NxdWFyZWQgKiBlY2NTcXVhcmVkICogZWNjU3F1YXJlZCAvIDEwMjQpICogTWF0aC5zaW4oMiAqIExhdFJhZCkgKyAoMTUgKiBlY2NTcXVhcmVkICogZWNjU3F1YXJlZCAvIDI1NiArIDQ1ICogZWNjU3F1YXJlZCAqIGVjY1NxdWFyZWQgKiBlY2NTcXVhcmVkIC8gMTAyNCkgKiBNYXRoLnNpbig0ICogTGF0UmFkKSAtICgzNSAqIGVjY1NxdWFyZWQgKiBlY2NTcXVhcmVkICogZWNjU3F1YXJlZCAvIDMwNzIpICogTWF0aC5zaW4oNiAqIExhdFJhZCkpO1xuXG4gIHZhciBVVE1FYXN0aW5nID0gKGswICogTiAqIChBICsgKDEgLSBUICsgQykgKiBBICogQSAqIEEgLyA2LjAgKyAoNSAtIDE4ICogVCArIFQgKiBUICsgNzIgKiBDIC0gNTggKiBlY2NQcmltZVNxdWFyZWQpICogQSAqIEEgKiBBICogQSAqIEEgLyAxMjAuMCkgKyA1MDAwMDAuMCk7XG5cbiAgdmFyIFVUTU5vcnRoaW5nID0gKGswICogKE0gKyBOICogTWF0aC50YW4oTGF0UmFkKSAqIChBICogQSAvIDIgKyAoNSAtIFQgKyA5ICogQyArIDQgKiBDICogQykgKiBBICogQSAqIEEgKiBBIC8gMjQuMCArICg2MSAtIDU4ICogVCArIFQgKiBUICsgNjAwICogQyAtIDMzMCAqIGVjY1ByaW1lU3F1YXJlZCkgKiBBICogQSAqIEEgKiBBICogQSAqIEEgLyA3MjAuMCkpKTtcbiAgaWYgKExhdCA8IDAuMCkge1xuICAgIFVUTU5vcnRoaW5nICs9IDEwMDAwMDAwLjA7IC8vMTAwMDAwMDAgbWV0ZXIgb2Zmc2V0IGZvclxuICAgIC8vIHNvdXRoZXJuIGhlbWlzcGhlcmVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbm9ydGhpbmc6IE1hdGgucm91bmQoVVRNTm9ydGhpbmcpLFxuICAgIGVhc3Rpbmc6IE1hdGgucm91bmQoVVRNRWFzdGluZyksXG4gICAgem9uZU51bWJlcjogWm9uZU51bWJlcixcbiAgICB6b25lTGV0dGVyOiBnZXRMZXR0ZXJEZXNpZ25hdG9yKExhdClcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBVVE0gY29vcmRzIHRvIGxhdC9sb25nLCB1c2luZyB0aGUgV0dTODQgZWxsaXBzb2lkLiBUaGlzIGlzIGEgY29udmVuaWVuY2VcbiAqIGNsYXNzIHdoZXJlIHRoZSBab25lIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBzaW5nbGUgc3RyaW5nIGVnLlwiNjBOXCIgd2hpY2hcbiAqIGlzIHRoZW4gYnJva2VuIGRvd24gaW50byB0aGUgWm9uZU51bWJlciBhbmQgWm9uZUxldHRlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtvYmplY3R9IHV0bSBBbiBvYmplY3QgbGl0ZXJhbCB3aXRoIG5vcnRoaW5nLCBlYXN0aW5nLCB6b25lTnVtYmVyXG4gKiAgICAgYW5kIHpvbmVMZXR0ZXIgcHJvcGVydGllcy4gSWYgYW4gb3B0aW9uYWwgYWNjdXJhY3kgcHJvcGVydHkgaXNcbiAqICAgICBwcm92aWRlZCAoaW4gbWV0ZXJzKSwgYSBib3VuZGluZyBib3ggd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mXG4gKiAgICAgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZS5cbiAqIEByZXR1cm4ge29iamVjdH0gQW4gb2JqZWN0IGxpdGVyYWwgY29udGFpbmluZyBlaXRoZXIgbGF0IGFuZCBsb24gdmFsdWVzXG4gKiAgICAgKGlmIG5vIGFjY3VyYWN5IHdhcyBwcm92aWRlZCksIG9yIHRvcCwgcmlnaHQsIGJvdHRvbSBhbmQgbGVmdCB2YWx1ZXNcbiAqICAgICBmb3IgdGhlIGJvdW5kaW5nIGJveCBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgYWNjdXJhY3kuXG4gKiAgICAgUmV0dXJucyBudWxsIGlmIHRoZSBjb252ZXJzaW9uIGZhaWxlZC5cbiAqL1xuZnVuY3Rpb24gVVRNdG9MTCh1dG0pIHtcblxuICB2YXIgVVRNTm9ydGhpbmcgPSB1dG0ubm9ydGhpbmc7XG4gIHZhciBVVE1FYXN0aW5nID0gdXRtLmVhc3Rpbmc7XG4gIHZhciB6b25lTGV0dGVyID0gdXRtLnpvbmVMZXR0ZXI7XG4gIHZhciB6b25lTnVtYmVyID0gdXRtLnpvbmVOdW1iZXI7XG4gIC8vIGNoZWNrIHRoZSBab25lTnVtbWJlciBpcyB2YWxpZFxuICBpZiAoem9uZU51bWJlciA8IDAgfHwgem9uZU51bWJlciA+IDYwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgazAgPSAwLjk5OTY7XG4gIHZhciBhID0gNjM3ODEzNy4wOyAvL2VsbGlwLnJhZGl1cztcbiAgdmFyIGVjY1NxdWFyZWQgPSAwLjAwNjY5NDM4OyAvL2VsbGlwLmVjY3NxO1xuICB2YXIgZWNjUHJpbWVTcXVhcmVkO1xuICB2YXIgZTEgPSAoMSAtIE1hdGguc3FydCgxIC0gZWNjU3F1YXJlZCkpIC8gKDEgKyBNYXRoLnNxcnQoMSAtIGVjY1NxdWFyZWQpKTtcbiAgdmFyIE4xLCBUMSwgQzEsIFIxLCBELCBNO1xuICB2YXIgTG9uZ09yaWdpbjtcbiAgdmFyIG11LCBwaGkxUmFkO1xuXG4gIC8vIHJlbW92ZSA1MDAsMDAwIG1ldGVyIG9mZnNldCBmb3IgbG9uZ2l0dWRlXG4gIHZhciB4ID0gVVRNRWFzdGluZyAtIDUwMDAwMC4wO1xuICB2YXIgeSA9IFVUTU5vcnRoaW5nO1xuXG4gIC8vIFdlIG11c3Qga25vdyBzb21laG93IGlmIHdlIGFyZSBpbiB0aGUgTm9ydGhlcm4gb3IgU291dGhlcm5cbiAgLy8gaGVtaXNwaGVyZSwgdGhpcyBpcyB0aGUgb25seSB0aW1lIHdlIHVzZSB0aGUgbGV0dGVyIFNvIGV2ZW5cbiAgLy8gaWYgdGhlIFpvbmUgbGV0dGVyIGlzbid0IGV4YWN0bHkgY29ycmVjdCBpdCBzaG91bGQgaW5kaWNhdGVcbiAgLy8gdGhlIGhlbWlzcGhlcmUgY29ycmVjdGx5XG4gIGlmICh6b25lTGV0dGVyIDwgJ04nKSB7XG4gICAgeSAtPSAxMDAwMDAwMC4wOyAvLyByZW1vdmUgMTAsMDAwLDAwMCBtZXRlciBvZmZzZXQgdXNlZFxuICAgIC8vIGZvciBzb3V0aGVybiBoZW1pc3BoZXJlXG4gIH1cblxuICAvLyBUaGVyZSBhcmUgNjAgem9uZXMgd2l0aCB6b25lIDEgYmVpbmcgYXQgV2VzdCAtMTgwIHRvIC0xNzRcbiAgTG9uZ09yaWdpbiA9ICh6b25lTnVtYmVyIC0gMSkgKiA2IC0gMTgwICsgMzsgLy8gKzMgcHV0cyBvcmlnaW5cbiAgLy8gaW4gbWlkZGxlIG9mXG4gIC8vIHpvbmVcblxuICBlY2NQcmltZVNxdWFyZWQgPSAoZWNjU3F1YXJlZCkgLyAoMSAtIGVjY1NxdWFyZWQpO1xuXG4gIE0gPSB5IC8gazA7XG4gIG11ID0gTSAvIChhICogKDEgLSBlY2NTcXVhcmVkIC8gNCAtIDMgKiBlY2NTcXVhcmVkICogZWNjU3F1YXJlZCAvIDY0IC0gNSAqIGVjY1NxdWFyZWQgKiBlY2NTcXVhcmVkICogZWNjU3F1YXJlZCAvIDI1NikpO1xuXG4gIHBoaTFSYWQgPSBtdSArICgzICogZTEgLyAyIC0gMjcgKiBlMSAqIGUxICogZTEgLyAzMikgKiBNYXRoLnNpbigyICogbXUpICsgKDIxICogZTEgKiBlMSAvIDE2IC0gNTUgKiBlMSAqIGUxICogZTEgKiBlMSAvIDMyKSAqIE1hdGguc2luKDQgKiBtdSkgKyAoMTUxICogZTEgKiBlMSAqIGUxIC8gOTYpICogTWF0aC5zaW4oNiAqIG11KTtcbiAgLy8gZG91YmxlIHBoaTEgPSBQcm9qTWF0aC5yYWRUb0RlZyhwaGkxUmFkKTtcblxuICBOMSA9IGEgLyBNYXRoLnNxcnQoMSAtIGVjY1NxdWFyZWQgKiBNYXRoLnNpbihwaGkxUmFkKSAqIE1hdGguc2luKHBoaTFSYWQpKTtcbiAgVDEgPSBNYXRoLnRhbihwaGkxUmFkKSAqIE1hdGgudGFuKHBoaTFSYWQpO1xuICBDMSA9IGVjY1ByaW1lU3F1YXJlZCAqIE1hdGguY29zKHBoaTFSYWQpICogTWF0aC5jb3MocGhpMVJhZCk7XG4gIFIxID0gYSAqICgxIC0gZWNjU3F1YXJlZCkgLyBNYXRoLnBvdygxIC0gZWNjU3F1YXJlZCAqIE1hdGguc2luKHBoaTFSYWQpICogTWF0aC5zaW4ocGhpMVJhZCksIDEuNSk7XG4gIEQgPSB4IC8gKE4xICogazApO1xuXG4gIHZhciBsYXQgPSBwaGkxUmFkIC0gKE4xICogTWF0aC50YW4ocGhpMVJhZCkgLyBSMSkgKiAoRCAqIEQgLyAyIC0gKDUgKyAzICogVDEgKyAxMCAqIEMxIC0gNCAqIEMxICogQzEgLSA5ICogZWNjUHJpbWVTcXVhcmVkKSAqIEQgKiBEICogRCAqIEQgLyAyNCArICg2MSArIDkwICogVDEgKyAyOTggKiBDMSArIDQ1ICogVDEgKiBUMSAtIDI1MiAqIGVjY1ByaW1lU3F1YXJlZCAtIDMgKiBDMSAqIEMxKSAqIEQgKiBEICogRCAqIEQgKiBEICogRCAvIDcyMCk7XG4gIGxhdCA9IHJhZFRvRGVnKGxhdCk7XG5cbiAgdmFyIGxvbiA9IChEIC0gKDEgKyAyICogVDEgKyBDMSkgKiBEICogRCAqIEQgLyA2ICsgKDUgLSAyICogQzEgKyAyOCAqIFQxIC0gMyAqIEMxICogQzEgKyA4ICogZWNjUHJpbWVTcXVhcmVkICsgMjQgKiBUMSAqIFQxKSAqIEQgKiBEICogRCAqIEQgKiBEIC8gMTIwKSAvIE1hdGguY29zKHBoaTFSYWQpO1xuICBsb24gPSBMb25nT3JpZ2luICsgcmFkVG9EZWcobG9uKTtcblxuICB2YXIgcmVzdWx0O1xuICBpZiAodXRtLmFjY3VyYWN5KSB7XG4gICAgdmFyIHRvcFJpZ2h0ID0gVVRNdG9MTCh7XG4gICAgICBub3J0aGluZzogdXRtLm5vcnRoaW5nICsgdXRtLmFjY3VyYWN5LFxuICAgICAgZWFzdGluZzogdXRtLmVhc3RpbmcgKyB1dG0uYWNjdXJhY3ksXG4gICAgICB6b25lTGV0dGVyOiB1dG0uem9uZUxldHRlcixcbiAgICAgIHpvbmVOdW1iZXI6IHV0bS56b25lTnVtYmVyXG4gICAgfSk7XG4gICAgcmVzdWx0ID0ge1xuICAgICAgdG9wOiB0b3BSaWdodC5sYXQsXG4gICAgICByaWdodDogdG9wUmlnaHQubG9uLFxuICAgICAgYm90dG9tOiBsYXQsXG4gICAgICBsZWZ0OiBsb25cbiAgICB9O1xuICB9XG4gIGVsc2Uge1xuICAgIHJlc3VsdCA9IHtcbiAgICAgIGxhdDogbGF0LFxuICAgICAgbG9uOiBsb25cbiAgICB9O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgTUdSUyBsZXR0ZXIgZGVzaWduYXRvciBmb3IgdGhlIGdpdmVuIGxhdGl0dWRlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IFRoZSBsYXRpdHVkZSBpbiBXR1M4NCB0byBnZXQgdGhlIGxldHRlciBkZXNpZ25hdG9yXG4gKiAgICAgZm9yLlxuICogQHJldHVybiB7Y2hhcn0gVGhlIGxldHRlciBkZXNpZ25hdG9yLlxuICovXG5mdW5jdGlvbiBnZXRMZXR0ZXJEZXNpZ25hdG9yKGxhdCkge1xuICAvL1RoaXMgaXMgaGVyZSBhcyBhbiBlcnJvciBmbGFnIHRvIHNob3cgdGhhdCB0aGUgTGF0aXR1ZGUgaXNcbiAgLy9vdXRzaWRlIE1HUlMgbGltaXRzXG4gIHZhciBMZXR0ZXJEZXNpZ25hdG9yID0gJ1onO1xuXG4gIGlmICgoODQgPj0gbGF0KSAmJiAobGF0ID49IDcyKSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnWCc7XG4gIH1cbiAgZWxzZSBpZiAoKDcyID4gbGF0KSAmJiAobGF0ID49IDY0KSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnVyc7XG4gIH1cbiAgZWxzZSBpZiAoKDY0ID4gbGF0KSAmJiAobGF0ID49IDU2KSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnVic7XG4gIH1cbiAgZWxzZSBpZiAoKDU2ID4gbGF0KSAmJiAobGF0ID49IDQ4KSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnVSc7XG4gIH1cbiAgZWxzZSBpZiAoKDQ4ID4gbGF0KSAmJiAobGF0ID49IDQwKSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnVCc7XG4gIH1cbiAgZWxzZSBpZiAoKDQwID4gbGF0KSAmJiAobGF0ID49IDMyKSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnUyc7XG4gIH1cbiAgZWxzZSBpZiAoKDMyID4gbGF0KSAmJiAobGF0ID49IDI0KSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnUic7XG4gIH1cbiAgZWxzZSBpZiAoKDI0ID4gbGF0KSAmJiAobGF0ID49IDE2KSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnUSc7XG4gIH1cbiAgZWxzZSBpZiAoKDE2ID4gbGF0KSAmJiAobGF0ID49IDgpKSB7XG4gICAgTGV0dGVyRGVzaWduYXRvciA9ICdQJztcbiAgfVxuICBlbHNlIGlmICgoOCA+IGxhdCkgJiYgKGxhdCA+PSAwKSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnTic7XG4gIH1cbiAgZWxzZSBpZiAoKDAgPiBsYXQpICYmIChsYXQgPj0gLTgpKSB7XG4gICAgTGV0dGVyRGVzaWduYXRvciA9ICdNJztcbiAgfVxuICBlbHNlIGlmICgoLTggPiBsYXQpICYmIChsYXQgPj0gLTE2KSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnTCc7XG4gIH1cbiAgZWxzZSBpZiAoKC0xNiA+IGxhdCkgJiYgKGxhdCA+PSAtMjQpKSB7XG4gICAgTGV0dGVyRGVzaWduYXRvciA9ICdLJztcbiAgfVxuICBlbHNlIGlmICgoLTI0ID4gbGF0KSAmJiAobGF0ID49IC0zMikpIHtcbiAgICBMZXR0ZXJEZXNpZ25hdG9yID0gJ0onO1xuICB9XG4gIGVsc2UgaWYgKCgtMzIgPiBsYXQpICYmIChsYXQgPj0gLTQwKSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnSCc7XG4gIH1cbiAgZWxzZSBpZiAoKC00MCA+IGxhdCkgJiYgKGxhdCA+PSAtNDgpKSB7XG4gICAgTGV0dGVyRGVzaWduYXRvciA9ICdHJztcbiAgfVxuICBlbHNlIGlmICgoLTQ4ID4gbGF0KSAmJiAobGF0ID49IC01NikpIHtcbiAgICBMZXR0ZXJEZXNpZ25hdG9yID0gJ0YnO1xuICB9XG4gIGVsc2UgaWYgKCgtNTYgPiBsYXQpICYmIChsYXQgPj0gLTY0KSkge1xuICAgIExldHRlckRlc2lnbmF0b3IgPSAnRSc7XG4gIH1cbiAgZWxzZSBpZiAoKC02NCA+IGxhdCkgJiYgKGxhdCA+PSAtNzIpKSB7XG4gICAgTGV0dGVyRGVzaWduYXRvciA9ICdEJztcbiAgfVxuICBlbHNlIGlmICgoLTcyID4gbGF0KSAmJiAobGF0ID49IC04MCkpIHtcbiAgICBMZXR0ZXJEZXNpZ25hdG9yID0gJ0MnO1xuICB9XG4gIHJldHVybiBMZXR0ZXJEZXNpZ25hdG9yO1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSBVVE0gbG9jYXRpb24gYXMgTUdSUyBzdHJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB1dG0gQW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBlYXN0aW5nLCBub3J0aGluZyxcbiAqICAgICB6b25lTGV0dGVyLCB6b25lTnVtYmVyXG4gKiBAcGFyYW0ge251bWJlcn0gYWNjdXJhY3kgQWNjdXJhY3kgaW4gZGlnaXRzICgxLTUpLlxuICogQHJldHVybiB7c3RyaW5nfSBNR1JTIHN0cmluZyBmb3IgdGhlIGdpdmVuIFVUTSBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHV0bSwgYWNjdXJhY3kpIHtcbiAgLy8gcHJlcGVuZCB3aXRoIGxlYWRpbmcgemVyb2VzXG4gIHZhciBzZWFzdGluZyA9IFwiMDAwMDBcIiArIHV0bS5lYXN0aW5nLFxuICAgIHNub3J0aGluZyA9IFwiMDAwMDBcIiArIHV0bS5ub3J0aGluZztcblxuICByZXR1cm4gdXRtLnpvbmVOdW1iZXIgKyB1dG0uem9uZUxldHRlciArIGdldDEwMGtJRCh1dG0uZWFzdGluZywgdXRtLm5vcnRoaW5nLCB1dG0uem9uZU51bWJlcikgKyBzZWFzdGluZy5zdWJzdHIoc2Vhc3RpbmcubGVuZ3RoIC0gNSwgYWNjdXJhY3kpICsgc25vcnRoaW5nLnN1YnN0cihzbm9ydGhpbmcubGVuZ3RoIC0gNSwgYWNjdXJhY3kpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdHdvIGxldHRlciAxMDBrIGRlc2lnbmF0b3IgZm9yIGEgZ2l2ZW4gVVRNIGVhc3RpbmcsXG4gKiBub3J0aGluZyBhbmQgem9uZSBudW1iZXIgdmFsdWUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlYXN0aW5nXG4gKiBAcGFyYW0ge251bWJlcn0gbm9ydGhpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSB6b25lTnVtYmVyXG4gKiBAcmV0dXJuIHRoZSB0d28gbGV0dGVyIDEwMGsgZGVzaWduYXRvciBmb3IgdGhlIGdpdmVuIFVUTSBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0MTAwa0lEKGVhc3RpbmcsIG5vcnRoaW5nLCB6b25lTnVtYmVyKSB7XG4gIHZhciBzZXRQYXJtID0gZ2V0MTAwa1NldEZvclpvbmUoem9uZU51bWJlcik7XG4gIHZhciBzZXRDb2x1bW4gPSBNYXRoLmZsb29yKGVhc3RpbmcgLyAxMDAwMDApO1xuICB2YXIgc2V0Um93ID0gTWF0aC5mbG9vcihub3J0aGluZyAvIDEwMDAwMCkgJSAyMDtcbiAgcmV0dXJuIGdldExldHRlcjEwMGtJRChzZXRDb2x1bW4sIHNldFJvdywgc2V0UGFybSk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBVVE0gem9uZSBudW1iZXIsIGZpZ3VyZSBvdXQgdGhlIE1HUlMgMTAwSyBzZXQgaXQgaXMgaW4uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpIEFuIFVUTSB6b25lIG51bWJlci5cbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIDEwMGsgc2V0IHRoZSBVVE0gem9uZSBpcyBpbi5cbiAqL1xuZnVuY3Rpb24gZ2V0MTAwa1NldEZvclpvbmUoaSkge1xuICB2YXIgc2V0UGFybSA9IGkgJSBOVU1fMTAwS19TRVRTO1xuICBpZiAoc2V0UGFybSA9PT0gMCkge1xuICAgIHNldFBhcm0gPSBOVU1fMTAwS19TRVRTO1xuICB9XG5cbiAgcmV0dXJuIHNldFBhcm07XG59XG5cbi8qKlxuICogR2V0IHRoZSB0d28tbGV0dGVyIE1HUlMgMTAwayBkZXNpZ25hdG9yIGdpdmVuIGluZm9ybWF0aW9uXG4gKiB0cmFuc2xhdGVkIGZyb20gdGhlIFVUTSBub3J0aGluZywgZWFzdGluZyBhbmQgem9uZSBudW1iZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW4gdGhlIGNvbHVtbiBpbmRleCBhcyBpdCByZWxhdGVzIHRvIHRoZSBNR1JTXG4gKiAgICAgICAgMTAwayBzZXQgc3ByZWFkc2hlZXQsIGNyZWF0ZWQgZnJvbSB0aGUgVVRNIGVhc3RpbmcuXG4gKiAgICAgICAgVmFsdWVzIGFyZSAxLTguXG4gKiBAcGFyYW0ge251bWJlcn0gcm93IHRoZSByb3cgaW5kZXggYXMgaXQgcmVsYXRlcyB0byB0aGUgTUdSUyAxMDBrIHNldFxuICogICAgICAgIHNwcmVhZHNoZWV0LCBjcmVhdGVkIGZyb20gdGhlIFVUTSBub3J0aGluZyB2YWx1ZS4gVmFsdWVzXG4gKiAgICAgICAgYXJlIGZyb20gMC0xOS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJtIHRoZSBzZXQgYmxvY2ssIGFzIGl0IHJlbGF0ZXMgdG8gdGhlIE1HUlMgMTAwayBzZXRcbiAqICAgICAgICBzcHJlYWRzaGVldCwgY3JlYXRlZCBmcm9tIHRoZSBVVE0gem9uZS4gVmFsdWVzIGFyZSBmcm9tXG4gKiAgICAgICAgMS02MC5cbiAqIEByZXR1cm4gdHdvIGxldHRlciBNR1JTIDEwMGsgY29kZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TGV0dGVyMTAwa0lEKGNvbHVtbiwgcm93LCBwYXJtKSB7XG4gIC8vIGNvbE9yaWdpbiBhbmQgcm93T3JpZ2luIGFyZSB0aGUgbGV0dGVycyBhdCB0aGUgb3JpZ2luIG9mIHRoZSBzZXRcbiAgdmFyIGluZGV4ID0gcGFybSAtIDE7XG4gIHZhciBjb2xPcmlnaW4gPSBTRVRfT1JJR0lOX0NPTFVNTl9MRVRURVJTLmNoYXJDb2RlQXQoaW5kZXgpO1xuICB2YXIgcm93T3JpZ2luID0gU0VUX09SSUdJTl9ST1dfTEVUVEVSUy5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAvLyBjb2xJbnQgYW5kIHJvd0ludCBhcmUgdGhlIGxldHRlcnMgdG8gYnVpbGQgdG8gcmV0dXJuXG4gIHZhciBjb2xJbnQgPSBjb2xPcmlnaW4gKyBjb2x1bW4gLSAxO1xuICB2YXIgcm93SW50ID0gcm93T3JpZ2luICsgcm93O1xuICB2YXIgcm9sbG92ZXIgPSBmYWxzZTtcblxuICBpZiAoY29sSW50ID4gWikge1xuICAgIGNvbEludCA9IGNvbEludCAtIFogKyBBIC0gMTtcbiAgICByb2xsb3ZlciA9IHRydWU7XG4gIH1cblxuICBpZiAoY29sSW50ID09PSBJIHx8IChjb2xPcmlnaW4gPCBJICYmIGNvbEludCA+IEkpIHx8ICgoY29sSW50ID4gSSB8fCBjb2xPcmlnaW4gPCBJKSAmJiByb2xsb3ZlcikpIHtcbiAgICBjb2xJbnQrKztcbiAgfVxuXG4gIGlmIChjb2xJbnQgPT09IE8gfHwgKGNvbE9yaWdpbiA8IE8gJiYgY29sSW50ID4gTykgfHwgKChjb2xJbnQgPiBPIHx8IGNvbE9yaWdpbiA8IE8pICYmIHJvbGxvdmVyKSkge1xuICAgIGNvbEludCsrO1xuXG4gICAgaWYgKGNvbEludCA9PT0gSSkge1xuICAgICAgY29sSW50Kys7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbEludCA+IFopIHtcbiAgICBjb2xJbnQgPSBjb2xJbnQgLSBaICsgQSAtIDE7XG4gIH1cblxuICBpZiAocm93SW50ID4gVikge1xuICAgIHJvd0ludCA9IHJvd0ludCAtIFYgKyBBIC0gMTtcbiAgICByb2xsb3ZlciA9IHRydWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgcm9sbG92ZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICgoKHJvd0ludCA9PT0gSSkgfHwgKChyb3dPcmlnaW4gPCBJKSAmJiAocm93SW50ID4gSSkpKSB8fCAoKChyb3dJbnQgPiBJKSB8fCAocm93T3JpZ2luIDwgSSkpICYmIHJvbGxvdmVyKSkge1xuICAgIHJvd0ludCsrO1xuICB9XG5cbiAgaWYgKCgocm93SW50ID09PSBPKSB8fCAoKHJvd09yaWdpbiA8IE8pICYmIChyb3dJbnQgPiBPKSkpIHx8ICgoKHJvd0ludCA+IE8pIHx8IChyb3dPcmlnaW4gPCBPKSkgJiYgcm9sbG92ZXIpKSB7XG4gICAgcm93SW50Kys7XG5cbiAgICBpZiAocm93SW50ID09PSBJKSB7XG4gICAgICByb3dJbnQrKztcbiAgICB9XG4gIH1cblxuICBpZiAocm93SW50ID4gVikge1xuICAgIHJvd0ludCA9IHJvd0ludCAtIFYgKyBBIC0gMTtcbiAgfVxuXG4gIHZhciB0d29MZXR0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvbEludCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHJvd0ludCk7XG4gIHJldHVybiB0d29MZXR0ZXI7XG59XG5cbi8qKlxuICogRGVjb2RlIHRoZSBVVE0gcGFyYW1ldGVycyBmcm9tIGEgTUdSUyBzdHJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZ3JzU3RyaW5nIGFuIFVQUEVSQ0FTRSBjb29yZGluYXRlIHN0cmluZyBpcyBleHBlY3RlZC5cbiAqIEByZXR1cm4ge29iamVjdH0gQW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBlYXN0aW5nLCBub3J0aGluZywgem9uZUxldHRlcixcbiAqICAgICB6b25lTnVtYmVyIGFuZCBhY2N1cmFjeSAoaW4gbWV0ZXJzKSBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBkZWNvZGUobWdyc1N0cmluZykge1xuXG4gIGlmIChtZ3JzU3RyaW5nICYmIG1ncnNTdHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgKFwiTUdSU1BvaW50IGNvdmVydGluZyBmcm9tIG5vdGhpbmdcIik7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gbWdyc1N0cmluZy5sZW5ndGg7XG5cbiAgdmFyIGh1bksgPSBudWxsO1xuICB2YXIgc2IgPSBcIlwiO1xuICB2YXIgdGVzdENoYXI7XG4gIHZhciBpID0gMDtcblxuICAvLyBnZXQgWm9uZSBudW1iZXJcbiAgd2hpbGUgKCEoL1tBLVpdLykudGVzdCh0ZXN0Q2hhciA9IG1ncnNTdHJpbmcuY2hhckF0KGkpKSkge1xuICAgIGlmIChpID49IDIpIHtcbiAgICAgIHRocm93IChcIk1HUlNQb2ludCBiYWQgY29udmVyc2lvbiBmcm9tOiBcIiArIG1ncnNTdHJpbmcpO1xuICAgIH1cbiAgICBzYiArPSB0ZXN0Q2hhcjtcbiAgICBpKys7XG4gIH1cblxuICB2YXIgem9uZU51bWJlciA9IHBhcnNlSW50KHNiLCAxMCk7XG5cbiAgaWYgKGkgPT09IDAgfHwgaSArIDMgPiBsZW5ndGgpIHtcbiAgICAvLyBBIGdvb2QgTUdSUyBzdHJpbmcgaGFzIHRvIGJlIDQtNSBkaWdpdHMgbG9uZyxcbiAgICAvLyAjI0FBQS8jQUFBIGF0IGxlYXN0LlxuICAgIHRocm93IChcIk1HUlNQb2ludCBiYWQgY29udmVyc2lvbiBmcm9tOiBcIiArIG1ncnNTdHJpbmcpO1xuICB9XG5cbiAgdmFyIHpvbmVMZXR0ZXIgPSBtZ3JzU3RyaW5nLmNoYXJBdChpKyspO1xuXG4gIC8vIFNob3VsZCB3ZSBjaGVjayB0aGUgem9uZSBsZXR0ZXIgaGVyZT8gV2h5IG5vdC5cbiAgaWYgKHpvbmVMZXR0ZXIgPD0gJ0EnIHx8IHpvbmVMZXR0ZXIgPT09ICdCJyB8fCB6b25lTGV0dGVyID09PSAnWScgfHwgem9uZUxldHRlciA+PSAnWicgfHwgem9uZUxldHRlciA9PT0gJ0knIHx8IHpvbmVMZXR0ZXIgPT09ICdPJykge1xuICAgIHRocm93IChcIk1HUlNQb2ludCB6b25lIGxldHRlciBcIiArIHpvbmVMZXR0ZXIgKyBcIiBub3QgaGFuZGxlZDogXCIgKyBtZ3JzU3RyaW5nKTtcbiAgfVxuXG4gIGh1bksgPSBtZ3JzU3RyaW5nLnN1YnN0cmluZyhpLCBpICs9IDIpO1xuXG4gIHZhciBzZXQgPSBnZXQxMDBrU2V0Rm9yWm9uZSh6b25lTnVtYmVyKTtcblxuICB2YXIgZWFzdDEwMGsgPSBnZXRFYXN0aW5nRnJvbUNoYXIoaHVuSy5jaGFyQXQoMCksIHNldCk7XG4gIHZhciBub3J0aDEwMGsgPSBnZXROb3J0aGluZ0Zyb21DaGFyKGh1bksuY2hhckF0KDEpLCBzZXQpO1xuXG4gIC8vIFdlIGhhdmUgYSBidWcgd2hlcmUgdGhlIG5vcnRoaW5nIG1heSBiZSAyMDAwMDAwIHRvbyBsb3cuXG4gIC8vIEhvd1xuICAvLyBkbyB3ZSBrbm93IHdoZW4gdG8gcm9sbCBvdmVyP1xuXG4gIHdoaWxlIChub3J0aDEwMGsgPCBnZXRNaW5Ob3J0aGluZyh6b25lTGV0dGVyKSkge1xuICAgIG5vcnRoMTAwayArPSAyMDAwMDAwO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIHRoZSBjaGFyIGluZGV4IGZvciBlYXN0aW5nL25vcnRoaW5nIHNlcGFyYXRvclxuICB2YXIgcmVtYWluZGVyID0gbGVuZ3RoIC0gaTtcblxuICBpZiAocmVtYWluZGVyICUgMiAhPT0gMCkge1xuICAgIHRocm93IChcIk1HUlNQb2ludCBoYXMgdG8gaGF2ZSBhbiBldmVuIG51bWJlciBcXG5vZiBkaWdpdHMgYWZ0ZXIgdGhlIHpvbmUgbGV0dGVyIGFuZCB0d28gMTAwa20gbGV0dGVycyAtIGZyb250IFxcbmhhbGYgZm9yIGVhc3RpbmcgbWV0ZXJzLCBzZWNvbmQgaGFsZiBmb3IgXFxubm9ydGhpbmcgbWV0ZXJzXCIgKyBtZ3JzU3RyaW5nKTtcbiAgfVxuXG4gIHZhciBzZXAgPSByZW1haW5kZXIgLyAyO1xuXG4gIHZhciBzZXBFYXN0aW5nID0gMC4wO1xuICB2YXIgc2VwTm9ydGhpbmcgPSAwLjA7XG4gIHZhciBhY2N1cmFjeUJvbnVzLCBzZXBFYXN0aW5nU3RyaW5nLCBzZXBOb3J0aGluZ1N0cmluZywgZWFzdGluZywgbm9ydGhpbmc7XG4gIGlmIChzZXAgPiAwKSB7XG4gICAgYWNjdXJhY3lCb251cyA9IDEwMDAwMC4wIC8gTWF0aC5wb3coMTAsIHNlcCk7XG4gICAgc2VwRWFzdGluZ1N0cmluZyA9IG1ncnNTdHJpbmcuc3Vic3RyaW5nKGksIGkgKyBzZXApO1xuICAgIHNlcEVhc3RpbmcgPSBwYXJzZUZsb2F0KHNlcEVhc3RpbmdTdHJpbmcpICogYWNjdXJhY3lCb251cztcbiAgICBzZXBOb3J0aGluZ1N0cmluZyA9IG1ncnNTdHJpbmcuc3Vic3RyaW5nKGkgKyBzZXApO1xuICAgIHNlcE5vcnRoaW5nID0gcGFyc2VGbG9hdChzZXBOb3J0aGluZ1N0cmluZykgKiBhY2N1cmFjeUJvbnVzO1xuICB9XG5cbiAgZWFzdGluZyA9IHNlcEVhc3RpbmcgKyBlYXN0MTAwaztcbiAgbm9ydGhpbmcgPSBzZXBOb3J0aGluZyArIG5vcnRoMTAwaztcblxuICByZXR1cm4ge1xuICAgIGVhc3Rpbmc6IGVhc3RpbmcsXG4gICAgbm9ydGhpbmc6IG5vcnRoaW5nLFxuICAgIHpvbmVMZXR0ZXI6IHpvbmVMZXR0ZXIsXG4gICAgem9uZU51bWJlcjogem9uZU51bWJlcixcbiAgICBhY2N1cmFjeTogYWNjdXJhY3lCb251c1xuICB9O1xufVxuXG4vKipcbiAqIEdpdmVuIHRoZSBmaXJzdCBsZXR0ZXIgZnJvbSBhIHR3by1sZXR0ZXIgTUdSUyAxMDBrIHpvbmUsIGFuZCBnaXZlbiB0aGVcbiAqIE1HUlMgdGFibGUgc2V0IGZvciB0aGUgem9uZSBudW1iZXIsIGZpZ3VyZSBvdXQgdGhlIGVhc3RpbmcgdmFsdWUgdGhhdFxuICogc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBvdGhlciwgc2Vjb25kYXJ5IGVhc3RpbmcgdmFsdWUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Y2hhcn0gZSBUaGUgZmlyc3QgbGV0dGVyIGZyb20gYSB0d28tbGV0dGVyIE1HUlMgMTAwwrRrIHpvbmUuXG4gKiBAcGFyYW0ge251bWJlcn0gc2V0IFRoZSBNR1JTIHRhYmxlIHNldCBmb3IgdGhlIHpvbmUgbnVtYmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgZWFzdGluZyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxldHRlciBhbmQgc2V0LlxuICovXG5mdW5jdGlvbiBnZXRFYXN0aW5nRnJvbUNoYXIoZSwgc2V0KSB7XG4gIC8vIGNvbE9yaWdpbiBpcyB0aGUgbGV0dGVyIGF0IHRoZSBvcmlnaW4gb2YgdGhlIHNldCBmb3IgdGhlXG4gIC8vIGNvbHVtblxuICB2YXIgY3VyQ29sID0gU0VUX09SSUdJTl9DT0xVTU5fTEVUVEVSUy5jaGFyQ29kZUF0KHNldCAtIDEpO1xuICB2YXIgZWFzdGluZ1ZhbHVlID0gMTAwMDAwLjA7XG4gIHZhciByZXdpbmRNYXJrZXIgPSBmYWxzZTtcblxuICB3aGlsZSAoY3VyQ29sICE9PSBlLmNoYXJDb2RlQXQoMCkpIHtcbiAgICBjdXJDb2wrKztcbiAgICBpZiAoY3VyQ29sID09PSBJKSB7XG4gICAgICBjdXJDb2wrKztcbiAgICB9XG4gICAgaWYgKGN1ckNvbCA9PT0gTykge1xuICAgICAgY3VyQ29sKys7XG4gICAgfVxuICAgIGlmIChjdXJDb2wgPiBaKSB7XG4gICAgICBpZiAocmV3aW5kTWFya2VyKSB7XG4gICAgICAgIHRocm93IChcIkJhZCBjaGFyYWN0ZXI6IFwiICsgZSk7XG4gICAgICB9XG4gICAgICBjdXJDb2wgPSBBO1xuICAgICAgcmV3aW5kTWFya2VyID0gdHJ1ZTtcbiAgICB9XG4gICAgZWFzdGluZ1ZhbHVlICs9IDEwMDAwMC4wO1xuICB9XG5cbiAgcmV0dXJuIGVhc3RpbmdWYWx1ZTtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgc2Vjb25kIGxldHRlciBmcm9tIGEgdHdvLWxldHRlciBNR1JTIDEwMGsgem9uZSwgYW5kIGdpdmVuIHRoZVxuICogTUdSUyB0YWJsZSBzZXQgZm9yIHRoZSB6b25lIG51bWJlciwgZmlndXJlIG91dCB0aGUgbm9ydGhpbmcgdmFsdWUgdGhhdFxuICogc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBvdGhlciwgc2Vjb25kYXJ5IG5vcnRoaW5nIHZhbHVlLiBZb3UgaGF2ZSB0b1xuICogcmVtZW1iZXIgdGhhdCBOb3J0aGluZ3MgYXJlIGRldGVybWluZWQgZnJvbSB0aGUgZXF1YXRvciwgYW5kIHRoZSB2ZXJ0aWNhbFxuICogY3ljbGUgb2YgbGV0dGVycyBtZWFuIGEgMjAwMDAwMCBhZGRpdGlvbmFsIG5vcnRoaW5nIG1ldGVycy4gVGhpcyBoYXBwZW5zXG4gKiBhcHByb3guIGV2ZXJ5IDE4IGRlZ3JlZXMgb2YgbGF0aXR1ZGUuIFRoaXMgbWV0aG9kIGRvZXMgKk5PVCogY291bnQgYW55XG4gKiBhZGRpdGlvbmFsIG5vcnRoaW5ncy4gWW91IGhhdmUgdG8gZmlndXJlIG91dCBob3cgbWFueSAyMDAwMDAwIG1ldGVycyBuZWVkXG4gKiB0byBiZSBhZGRlZCBmb3IgdGhlIHpvbmUgbGV0dGVyIG9mIHRoZSBNR1JTIGNvb3JkaW5hdGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Y2hhcn0gbiBTZWNvbmQgbGV0dGVyIG9mIHRoZSBNR1JTIDEwMGsgem9uZVxuICogQHBhcmFtIHtudW1iZXJ9IHNldCBUaGUgTUdSUyB0YWJsZSBzZXQgbnVtYmVyLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlXG4gKiAgICAgVVRNIHpvbmUgbnVtYmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbm9ydGhpbmcgdmFsdWUgZm9yIHRoZSBnaXZlbiBsZXR0ZXIgYW5kIHNldC5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9ydGhpbmdGcm9tQ2hhcihuLCBzZXQpIHtcblxuICBpZiAobiA+ICdWJykge1xuICAgIHRocm93IChcIk1HUlNQb2ludCBnaXZlbiBpbnZhbGlkIE5vcnRoaW5nIFwiICsgbik7XG4gIH1cblxuICAvLyByb3dPcmlnaW4gaXMgdGhlIGxldHRlciBhdCB0aGUgb3JpZ2luIG9mIHRoZSBzZXQgZm9yIHRoZVxuICAvLyBjb2x1bW5cbiAgdmFyIGN1clJvdyA9IFNFVF9PUklHSU5fUk9XX0xFVFRFUlMuY2hhckNvZGVBdChzZXQgLSAxKTtcbiAgdmFyIG5vcnRoaW5nVmFsdWUgPSAwLjA7XG4gIHZhciByZXdpbmRNYXJrZXIgPSBmYWxzZTtcblxuICB3aGlsZSAoY3VyUm93ICE9PSBuLmNoYXJDb2RlQXQoMCkpIHtcbiAgICBjdXJSb3crKztcbiAgICBpZiAoY3VyUm93ID09PSBJKSB7XG4gICAgICBjdXJSb3crKztcbiAgICB9XG4gICAgaWYgKGN1clJvdyA9PT0gTykge1xuICAgICAgY3VyUm93Kys7XG4gICAgfVxuICAgIC8vIGZpeGluZyBhIGJ1ZyBtYWtpbmcgd2hvbGUgYXBwbGljYXRpb24gaGFuZyBpbiB0aGlzIGxvb3BcbiAgICAvLyB3aGVuICduJyBpcyBhIHdyb25nIGNoYXJhY3RlclxuICAgIGlmIChjdXJSb3cgPiBWKSB7XG4gICAgICBpZiAocmV3aW5kTWFya2VyKSB7IC8vIG1ha2luZyBzdXJlIHRoYXQgdGhpcyBsb29wIGVuZHNcbiAgICAgICAgdGhyb3cgKFwiQmFkIGNoYXJhY3RlcjogXCIgKyBuKTtcbiAgICAgIH1cbiAgICAgIGN1clJvdyA9IEE7XG4gICAgICByZXdpbmRNYXJrZXIgPSB0cnVlO1xuICAgIH1cbiAgICBub3J0aGluZ1ZhbHVlICs9IDEwMDAwMC4wO1xuICB9XG5cbiAgcmV0dXJuIG5vcnRoaW5nVmFsdWU7XG59XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9uIGdldE1pbk5vcnRoaW5nIHJldHVybnMgdGhlIG1pbmltdW0gbm9ydGhpbmcgdmFsdWUgb2YgYSBNR1JTXG4gKiB6b25lLlxuICpcbiAqIFBvcnRlZCBmcm9tIEdlb3RyYW5zJyBjIExhdHRpdHVkZV9CYW5kX1ZhbHVlIHN0cnVjdHVyZSB0YWJsZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtjaGFyfSB6b25lTGV0dGVyIFRoZSBNR1JTIHpvbmUgdG8gZ2V0IHRoZSBtaW4gbm9ydGhpbmcgZm9yLlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRNaW5Ob3J0aGluZyh6b25lTGV0dGVyKSB7XG4gIHZhciBub3J0aGluZztcbiAgc3dpdGNoICh6b25lTGV0dGVyKSB7XG4gIGNhc2UgJ0MnOlxuICAgIG5vcnRoaW5nID0gMTEwMDAwMC4wO1xuICAgIGJyZWFrO1xuICBjYXNlICdEJzpcbiAgICBub3J0aGluZyA9IDIwMDAwMDAuMDtcbiAgICBicmVhaztcbiAgY2FzZSAnRSc6XG4gICAgbm9ydGhpbmcgPSAyODAwMDAwLjA7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ0YnOlxuICAgIG5vcnRoaW5nID0gMzcwMDAwMC4wO1xuICAgIGJyZWFrO1xuICBjYXNlICdHJzpcbiAgICBub3J0aGluZyA9IDQ2MDAwMDAuMDtcbiAgICBicmVhaztcbiAgY2FzZSAnSCc6XG4gICAgbm9ydGhpbmcgPSA1NTAwMDAwLjA7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ0onOlxuICAgIG5vcnRoaW5nID0gNjQwMDAwMC4wO1xuICAgIGJyZWFrO1xuICBjYXNlICdLJzpcbiAgICBub3J0aGluZyA9IDczMDAwMDAuMDtcbiAgICBicmVhaztcbiAgY2FzZSAnTCc6XG4gICAgbm9ydGhpbmcgPSA4MjAwMDAwLjA7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ00nOlxuICAgIG5vcnRoaW5nID0gOTEwMDAwMC4wO1xuICAgIGJyZWFrO1xuICBjYXNlICdOJzpcbiAgICBub3J0aGluZyA9IDAuMDtcbiAgICBicmVhaztcbiAgY2FzZSAnUCc6XG4gICAgbm9ydGhpbmcgPSA4MDAwMDAuMDtcbiAgICBicmVhaztcbiAgY2FzZSAnUSc6XG4gICAgbm9ydGhpbmcgPSAxNzAwMDAwLjA7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ1InOlxuICAgIG5vcnRoaW5nID0gMjYwMDAwMC4wO1xuICAgIGJyZWFrO1xuICBjYXNlICdTJzpcbiAgICBub3J0aGluZyA9IDM1MDAwMDAuMDtcbiAgICBicmVhaztcbiAgY2FzZSAnVCc6XG4gICAgbm9ydGhpbmcgPSA0NDAwMDAwLjA7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ1UnOlxuICAgIG5vcnRoaW5nID0gNTMwMDAwMC4wO1xuICAgIGJyZWFrO1xuICBjYXNlICdWJzpcbiAgICBub3J0aGluZyA9IDYyMDAwMDAuMDtcbiAgICBicmVhaztcbiAgY2FzZSAnVyc6XG4gICAgbm9ydGhpbmcgPSA3MDAwMDAwLjA7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ1gnOlxuICAgIG5vcnRoaW5nID0gNzkwMDAwMC4wO1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIG5vcnRoaW5nID0gLTEuMDtcbiAgfVxuICBpZiAobm9ydGhpbmcgPj0gMC4wKSB7XG4gICAgcmV0dXJuIG5vcnRoaW5nO1xuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IChcIkludmFsaWQgem9uZSBsZXR0ZXI6IFwiICsgem9uZUxldHRlcik7XG4gIH1cblxufVxuIiwiaW1wb3J0IHt0b1BvaW50LCBmb3J3YXJkfSBmcm9tICdtZ3JzJztcblxuZnVuY3Rpb24gUG9pbnQoeCwgeSwgeikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUG9pbnQpKSB7XG4gICAgcmV0dXJuIG5ldyBQb2ludCh4LCB5LCB6KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHRoaXMueCA9IHhbMF07XG4gICAgdGhpcy55ID0geFsxXTtcbiAgICB0aGlzLnogPSB4WzJdIHx8IDAuMDtcbiAgfSBlbHNlIGlmKHR5cGVvZiB4ID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMueCA9IHgueDtcbiAgICB0aGlzLnkgPSB4Lnk7XG4gICAgdGhpcy56ID0geC56IHx8IDAuMDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIGNvb3JkcyA9IHguc3BsaXQoJywnKTtcbiAgICB0aGlzLnggPSBwYXJzZUZsb2F0KGNvb3Jkc1swXSwgMTApO1xuICAgIHRoaXMueSA9IHBhcnNlRmxvYXQoY29vcmRzWzFdLCAxMCk7XG4gICAgdGhpcy56ID0gcGFyc2VGbG9hdChjb29yZHNbMl0sIDEwKSB8fCAwLjA7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMueiA9IHogfHwgMC4wO1xuICB9XG4gIGNvbnNvbGUud2FybigncHJvajQuUG9pbnQgd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMywgdXNlIHByb2o0LnRvUG9pbnQnKTtcbn1cblxuUG9pbnQuZnJvbU1HUlMgPSBmdW5jdGlvbihtZ3JzU3RyKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodG9Qb2ludChtZ3JzU3RyKSk7XG59O1xuUG9pbnQucHJvdG90eXBlLnRvTUdSUyA9IGZ1bmN0aW9uKGFjY3VyYWN5KSB7XG4gIHJldHVybiBmb3J3YXJkKFt0aGlzLngsIHRoaXMueV0sIGFjY3VyYWN5KTtcbn07XG5leHBvcnQgZGVmYXVsdCBQb2ludDtcbiIsInZhciBDMDAgPSAxO1xudmFyIEMwMiA9IDAuMjU7XG52YXIgQzA0ID0gMC4wNDY4NzU7XG52YXIgQzA2ID0gMC4wMTk1MzEyNTtcbnZhciBDMDggPSAwLjAxMDY4MTE1MjM0Mzc1O1xudmFyIEMyMiA9IDAuNzU7XG52YXIgQzQ0ID0gMC40Njg3NTtcbnZhciBDNDYgPSAwLjAxMzAyMDgzMzMzMzMzMzMzMzMzO1xudmFyIEM0OCA9IDAuMDA3MTIwNzY4MjI5MTY2NjY2NjY7XG52YXIgQzY2ID0gMC4zNjQ1ODMzMzMzMzMzMzMzMzMzMztcbnZhciBDNjggPSAwLjAwNTY5NjYxNDU4MzMzMzMzMzMzO1xudmFyIEM4OCA9IDAuMzA3NjE3MTg3NTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXMpIHtcbiAgdmFyIGVuID0gW107XG4gIGVuWzBdID0gQzAwIC0gZXMgKiAoQzAyICsgZXMgKiAoQzA0ICsgZXMgKiAoQzA2ICsgZXMgKiBDMDgpKSk7XG4gIGVuWzFdID0gZXMgKiAoQzIyIC0gZXMgKiAoQzA0ICsgZXMgKiAoQzA2ICsgZXMgKiBDMDgpKSk7XG4gIHZhciB0ID0gZXMgKiBlcztcbiAgZW5bMl0gPSB0ICogKEM0NCAtIGVzICogKEM0NiArIGVzICogQzQ4KSk7XG4gIHQgKj0gZXM7XG4gIGVuWzNdID0gdCAqIChDNjYgLSBlcyAqIEM2OCk7XG4gIGVuWzRdID0gdCAqIGVzICogQzg4O1xuICByZXR1cm4gZW47XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGhpLCBzcGhpLCBjcGhpLCBlbikge1xuICBjcGhpICo9IHNwaGk7XG4gIHNwaGkgKj0gc3BoaTtcbiAgcmV0dXJuIChlblswXSAqIHBoaSAtIGNwaGkgKiAoZW5bMV0gKyBzcGhpICogKGVuWzJdICsgc3BoaSAqIChlblszXSArIHNwaGkgKiBlbls0XSkpKSk7XG59IiwiaW1wb3J0IHBqX21sZm4gZnJvbSBcIi4vcGpfbWxmblwiO1xuaW1wb3J0IHtFUFNMTn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbnZhciBNQVhfSVRFUiA9IDIwO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhcmcsIGVzLCBlbikge1xuICB2YXIgayA9IDEgLyAoMSAtIGVzKTtcbiAgdmFyIHBoaSA9IGFyZztcbiAgZm9yICh2YXIgaSA9IE1BWF9JVEVSOyBpOyAtLWkpIHsgLyogcmFyZWx5IGdvZXMgb3ZlciAyIGl0ZXJhdGlvbnMgKi9cbiAgICB2YXIgcyA9IE1hdGguc2luKHBoaSk7XG4gICAgdmFyIHQgPSAxIC0gZXMgKiBzICogcztcbiAgICAvL3QgPSB0aGlzLnBqX21sZm4ocGhpLCBzLCBNYXRoLmNvcyhwaGkpLCBlbikgLSBhcmc7XG4gICAgLy9waGkgLT0gdCAqICh0ICogTWF0aC5zcXJ0KHQpKSAqIGs7XG4gICAgdCA9IChwal9tbGZuKHBoaSwgcywgTWF0aC5jb3MocGhpKSwgZW4pIC0gYXJnKSAqICh0ICogTWF0aC5zcXJ0KHQpKSAqIGs7XG4gICAgcGhpIC09IHQ7XG4gICAgaWYgKE1hdGguYWJzKHQpIDwgRVBTTE4pIHtcbiAgICAgIHJldHVybiBwaGk7XG4gICAgfVxuICB9XG4gIC8vLi5yZXBvcnRFcnJvcihcImNhc3M6cGpfaW52X21sZm46IENvbnZlcmdlbmNlIGVycm9yXCIpO1xuICByZXR1cm4gcGhpO1xufVxuIiwiLy8gSGVhdmlseSBiYXNlZCBvbiB0aGlzIHRtZXJjIHByb2plY3Rpb24gaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmxvY2gvbWFwc2hhcGVyLXByb2ovYmxvYi9tYXN0ZXIvc3JjL3Byb2plY3Rpb25zL3RtZXJjLmpzXG5cbmltcG9ydCBwal9lbmZuIGZyb20gJy4uL2NvbW1vbi9wal9lbmZuJztcbmltcG9ydCBwal9tbGZuIGZyb20gJy4uL2NvbW1vbi9wal9tbGZuJztcbmltcG9ydCBwal9pbnZfbWxmbiBmcm9tICcuLi9jb21tb24vcGpfaW52X21sZm4nO1xuaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuXG5pbXBvcnQge0VQU0xOLCBIQUxGX1BJfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcbmltcG9ydCBzaWduIGZyb20gJy4uL2NvbW1vbi9zaWduJztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gIHRoaXMueDAgPSB0aGlzLngwICE9PSB1bmRlZmluZWQgPyB0aGlzLngwIDogMDtcbiAgdGhpcy55MCA9IHRoaXMueTAgIT09IHVuZGVmaW5lZCA/IHRoaXMueTAgOiAwO1xuICB0aGlzLmxvbmcwID0gdGhpcy5sb25nMCAhPT0gdW5kZWZpbmVkID8gdGhpcy5sb25nMCA6IDA7XG4gIHRoaXMubGF0MCA9IHRoaXMubGF0MCAhPT0gdW5kZWZpbmVkID8gdGhpcy5sYXQwIDogMDtcblxuICBpZiAodGhpcy5lcykge1xuICAgIHRoaXMuZW4gPSBwal9lbmZuKHRoaXMuZXMpO1xuICAgIHRoaXMubWwwID0gcGpfbWxmbih0aGlzLmxhdDAsIE1hdGguc2luKHRoaXMubGF0MCksIE1hdGguY29zKHRoaXMubGF0MCksIHRoaXMuZW4pO1xuICB9XG59XG5cbi8qKlxuICAgIFRyYW5zdmVyc2UgTWVyY2F0b3IgRm9yd2FyZCAgLSBsb25nL2xhdCB0byB4L3lcbiAgICBsb25nL2xhdCBpbiByYWRpYW5zXG4gICovXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZChwKSB7XG4gIHZhciBsb24gPSBwLng7XG4gIHZhciBsYXQgPSBwLnk7XG5cbiAgdmFyIGRlbHRhX2xvbiA9IGFkanVzdF9sb24obG9uIC0gdGhpcy5sb25nMCk7XG4gIHZhciBjb247XG4gIHZhciB4LCB5O1xuICB2YXIgc2luX3BoaSA9IE1hdGguc2luKGxhdCk7XG4gIHZhciBjb3NfcGhpID0gTWF0aC5jb3MobGF0KTtcblxuICBpZiAoIXRoaXMuZXMpIHtcbiAgICB2YXIgYiA9IGNvc19waGkgKiBNYXRoLnNpbihkZWx0YV9sb24pO1xuXG4gICAgaWYgKChNYXRoLmFicyhNYXRoLmFicyhiKSAtIDEpKSA8IEVQU0xOKSB7XG4gICAgICByZXR1cm4gKDkzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB4ID0gMC41ICogdGhpcy5hICogdGhpcy5rMCAqIE1hdGgubG9nKCgxICsgYikgLyAoMSAtIGIpKSArIHRoaXMueDA7XG4gICAgICB5ID0gY29zX3BoaSAqIE1hdGguY29zKGRlbHRhX2xvbikgLyBNYXRoLnNxcnQoMSAtIE1hdGgucG93KGIsIDIpKTtcbiAgICAgIGIgPSBNYXRoLmFicyh5KTtcblxuICAgICAgaWYgKGIgPj0gMSkge1xuICAgICAgICBpZiAoKGIgLSAxKSA+IEVQU0xOKSB7XG4gICAgICAgICAgcmV0dXJuICg5Myk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgeSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB5ID0gTWF0aC5hY29zKHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAobGF0IDwgMCkge1xuICAgICAgICB5ID0gLXk7XG4gICAgICB9XG5cbiAgICAgIHkgPSB0aGlzLmEgKiB0aGlzLmswICogKHkgLSB0aGlzLmxhdDApICsgdGhpcy55MDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgdmFyIGFsID0gY29zX3BoaSAqIGRlbHRhX2xvbjtcbiAgICB2YXIgYWxzID0gTWF0aC5wb3coYWwsIDIpO1xuICAgIHZhciBjID0gdGhpcy5lcDIgKiBNYXRoLnBvdyhjb3NfcGhpLCAyKTtcbiAgICB2YXIgY3MgPSBNYXRoLnBvdyhjLCAyKTtcbiAgICB2YXIgdHEgPSBNYXRoLmFicyhjb3NfcGhpKSA+IEVQU0xOID8gTWF0aC50YW4obGF0KSA6IDA7XG4gICAgdmFyIHQgPSBNYXRoLnBvdyh0cSwgMik7XG4gICAgdmFyIHRzID0gTWF0aC5wb3codCwgMik7XG4gICAgY29uID0gMSAtIHRoaXMuZXMgKiBNYXRoLnBvdyhzaW5fcGhpLCAyKTtcbiAgICBhbCA9IGFsIC8gTWF0aC5zcXJ0KGNvbik7XG4gICAgdmFyIG1sID0gcGpfbWxmbihsYXQsIHNpbl9waGksIGNvc19waGksIHRoaXMuZW4pO1xuXG4gICAgeCA9IHRoaXMuYSAqICh0aGlzLmswICogYWwgKiAoMSArXG4gICAgICBhbHMgLyA2ICogKDEgLSB0ICsgYyArXG4gICAgICBhbHMgLyAyMCAqICg1IC0gMTggKiB0ICsgdHMgKyAxNCAqIGMgLSA1OCAqIHQgKiBjICtcbiAgICAgIGFscyAvIDQyICogKDYxICsgMTc5ICogdHMgLSB0cyAqIHQgLSA0NzkgKiB0KSkpKSkgK1xuICAgICAgdGhpcy54MDtcblxuICAgIHkgPSB0aGlzLmEgKiAodGhpcy5rMCAqIChtbCAtIHRoaXMubWwwICtcbiAgICAgIHNpbl9waGkgKiBkZWx0YV9sb24gKiBhbCAvIDIgKiAoMSArXG4gICAgICBhbHMgLyAxMiAqICg1IC0gdCArIDkgKiBjICsgNCAqIGNzICtcbiAgICAgIGFscyAvIDMwICogKDYxICsgdHMgLSA1OCAqIHQgKyAyNzAgKiBjIC0gMzMwICogdCAqIGMgK1xuICAgICAgYWxzIC8gNTYgKiAoMTM4NSArIDU0MyAqIHRzIC0gdHMgKiB0IC0gMzExMSAqIHQpKSkpKSkgK1xuICAgICAgdGhpcy55MDtcbiAgfVxuXG4gIHAueCA9IHg7XG4gIHAueSA9IHk7XG5cbiAgcmV0dXJuIHA7XG59XG5cbi8qKlxuICAgIFRyYW5zdmVyc2UgTWVyY2F0b3IgSW52ZXJzZSAgLSAgeC95IHRvIGxvbmcvbGF0XG4gICovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHZhciBjb24sIHBoaTtcbiAgdmFyIGxhdCwgbG9uO1xuICB2YXIgeCA9IChwLnggLSB0aGlzLngwKSAqICgxIC8gdGhpcy5hKTtcbiAgdmFyIHkgPSAocC55IC0gdGhpcy55MCkgKiAoMSAvIHRoaXMuYSk7XG5cbiAgaWYgKCF0aGlzLmVzKSB7XG4gICAgdmFyIGYgPSBNYXRoLmV4cCh4IC8gdGhpcy5rMCk7XG4gICAgdmFyIGcgPSAwLjUgKiAoZiAtIDEgLyBmKTtcbiAgICB2YXIgdGVtcCA9IHRoaXMubGF0MCArIHkgLyB0aGlzLmswO1xuICAgIHZhciBoID0gTWF0aC5jb3ModGVtcCk7XG4gICAgY29uID0gTWF0aC5zcXJ0KCgxIC0gTWF0aC5wb3coaCwgMikpIC8gKDEgKyBNYXRoLnBvdyhnLCAyKSkpO1xuICAgIGxhdCA9IE1hdGguYXNpbihjb24pO1xuXG4gICAgaWYgKHkgPCAwKSB7XG4gICAgICBsYXQgPSAtbGF0O1xuICAgIH1cblxuICAgIGlmICgoZyA9PT0gMCkgJiYgKGggPT09IDApKSB7XG4gICAgICBsb24gPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxvbiA9IGFkanVzdF9sb24oTWF0aC5hdGFuMihnLCBoKSArIHRoaXMubG9uZzApO1xuICAgIH1cbiAgfVxuICBlbHNlIHsgLy8gZWxsaXBzb2lkYWwgZm9ybVxuICAgIGNvbiA9IHRoaXMubWwwICsgeSAvIHRoaXMuazA7XG4gICAgcGhpID0gcGpfaW52X21sZm4oY29uLCB0aGlzLmVzLCB0aGlzLmVuKTtcblxuICAgIGlmIChNYXRoLmFicyhwaGkpIDwgSEFMRl9QSSkge1xuICAgICAgdmFyIHNpbl9waGkgPSBNYXRoLnNpbihwaGkpO1xuICAgICAgdmFyIGNvc19waGkgPSBNYXRoLmNvcyhwaGkpO1xuICAgICAgdmFyIHRhbl9waGkgPSBNYXRoLmFicyhjb3NfcGhpKSA+IEVQU0xOID8gTWF0aC50YW4ocGhpKSA6IDA7XG4gICAgICB2YXIgYyA9IHRoaXMuZXAyICogTWF0aC5wb3coY29zX3BoaSwgMik7XG4gICAgICB2YXIgY3MgPSBNYXRoLnBvdyhjLCAyKTtcbiAgICAgIHZhciB0ID0gTWF0aC5wb3codGFuX3BoaSwgMik7XG4gICAgICB2YXIgdHMgPSBNYXRoLnBvdyh0LCAyKTtcbiAgICAgIGNvbiA9IDEgLSB0aGlzLmVzICogTWF0aC5wb3coc2luX3BoaSwgMik7XG4gICAgICB2YXIgZCA9IHggKiBNYXRoLnNxcnQoY29uKSAvIHRoaXMuazA7XG4gICAgICB2YXIgZHMgPSBNYXRoLnBvdyhkLCAyKTtcbiAgICAgIGNvbiA9IGNvbiAqIHRhbl9waGk7XG5cbiAgICAgIGxhdCA9IHBoaSAtIChjb24gKiBkcyAvICgxIC0gdGhpcy5lcykpICogMC41ICogKDEgLVxuICAgICAgICBkcyAvIDEyICogKDUgKyAzICogdCAtIDkgKiBjICogdCArIGMgLSA0ICogY3MgLVxuICAgICAgICBkcyAvIDMwICogKDYxICsgOTAgKiB0IC0gMjUyICogYyAqIHQgKyA0NSAqIHRzICsgNDYgKiBjIC1cbiAgICAgICAgZHMgLyA1NiAqICgxMzg1ICsgMzYzMyAqIHQgKyA0MDk1ICogdHMgKyAxNTc0ICogdHMgKiB0KSkpKTtcblxuICAgICAgbG9uID0gYWRqdXN0X2xvbih0aGlzLmxvbmcwICsgKGQgKiAoMSAtXG4gICAgICAgIGRzIC8gNiAqICgxICsgMiAqIHQgKyBjIC1cbiAgICAgICAgZHMgLyAyMCAqICg1ICsgMjggKiB0ICsgMjQgKiB0cyArIDggKiBjICogdCArIDYgKiBjIC1cbiAgICAgICAgZHMgLyA0MiAqICg2MSArIDY2MiAqIHQgKyAxMzIwICogdHMgKyA3MjAgKiB0cyAqIHQpKSkpIC8gY29zX3BoaSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxhdCA9IEhBTEZfUEkgKiBzaWduKHkpO1xuICAgICAgbG9uID0gMDtcbiAgICB9XG4gIH1cblxuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcblxuICByZXR1cm4gcDtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIkZhc3RfVHJhbnN2ZXJzZV9NZXJjYXRvclwiLCBcIkZhc3QgVHJhbnN2ZXJzZSBNZXJjYXRvclwiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICB2YXIgciA9IE1hdGguZXhwKHgpO1xuICByID0gKHIgLSAxIC8gcikgLyAyO1xuICByZXR1cm4gcjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5KSB7XG4gIHggPSBNYXRoLmFicyh4KTtcbiAgeSA9IE1hdGguYWJzKHkpO1xuICB2YXIgYSA9IE1hdGgubWF4KHgsIHkpO1xuICB2YXIgYiA9IE1hdGgubWluKHgsIHkpIC8gKGEgPyBhIDogMSk7XG5cbiAgcmV0dXJuIGEgKiBNYXRoLnNxcnQoMSArIE1hdGgucG93KGIsIDIpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgdmFyIHkgPSAxICsgeDtcbiAgdmFyIHogPSB5IC0gMTtcblxuICByZXR1cm4geiA9PT0gMCA/IHggOiB4ICogTWF0aC5sb2coeSkgLyB6O1xufVxuIiwiaW1wb3J0IGh5cG90IGZyb20gJy4vaHlwb3QnO1xuaW1wb3J0IGxvZzFweSBmcm9tICcuL2xvZzFweSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgdmFyIHkgPSBNYXRoLmFicyh4KTtcbiAgeSA9IGxvZzFweSh5ICogKDEgKyB5IC8gKGh5cG90KDEsIHkpICsgMSkpKTtcblxuICByZXR1cm4geCA8IDAgPyAteSA6IHk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwcCwgQikge1xuICB2YXIgY29zXzJCID0gMiAqIE1hdGguY29zKDIgKiBCKTtcbiAgdmFyIGkgPSBwcC5sZW5ndGggLSAxO1xuICB2YXIgaDEgPSBwcFtpXTtcbiAgdmFyIGgyID0gMDtcbiAgdmFyIGg7XG5cbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgaCA9IC1oMiArIGNvc18yQiAqIGgxICsgcHBbaV07XG4gICAgaDIgPSBoMTtcbiAgICBoMSA9IGg7XG4gIH1cblxuICByZXR1cm4gKEIgKyBoICogTWF0aC5zaW4oMiAqIEIpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBwLCBhcmdfcikge1xuICB2YXIgciA9IDIgKiBNYXRoLmNvcyhhcmdfcik7XG4gIHZhciBpID0gcHAubGVuZ3RoIC0gMTtcbiAgdmFyIGhyMSA9IHBwW2ldO1xuICB2YXIgaHIyID0gMDtcbiAgdmFyIGhyO1xuXG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIGhyID0gLWhyMiArIHIgKiBocjEgKyBwcFtpXTtcbiAgICBocjIgPSBocjE7XG4gICAgaHIxID0gaHI7XG4gIH1cblxuICByZXR1cm4gTWF0aC5zaW4oYXJnX3IpICogaHI7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHZhciByID0gTWF0aC5leHAoeCk7XG4gIHIgPSAociArIDEgLyByKSAvIDI7XG4gIHJldHVybiByO1xufSIsImltcG9ydCBzaW5oIGZyb20gJy4vc2luaCc7XG5pbXBvcnQgY29zaCBmcm9tICcuL2Nvc2gnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwcCwgYXJnX3IsIGFyZ19pKSB7XG4gIHZhciBzaW5fYXJnX3IgPSBNYXRoLnNpbihhcmdfcik7XG4gIHZhciBjb3NfYXJnX3IgPSBNYXRoLmNvcyhhcmdfcik7XG4gIHZhciBzaW5oX2FyZ19pID0gc2luaChhcmdfaSk7XG4gIHZhciBjb3NoX2FyZ19pID0gY29zaChhcmdfaSk7XG4gIHZhciByID0gMiAqIGNvc19hcmdfciAqIGNvc2hfYXJnX2k7XG4gIHZhciBpID0gLTIgKiBzaW5fYXJnX3IgKiBzaW5oX2FyZ19pO1xuICB2YXIgaiA9IHBwLmxlbmd0aCAtIDE7XG4gIHZhciBociA9IHBwW2pdO1xuICB2YXIgaGkxID0gMDtcbiAgdmFyIGhyMSA9IDA7XG4gIHZhciBoaSA9IDA7XG4gIHZhciBocjI7XG4gIHZhciBoaTI7XG5cbiAgd2hpbGUgKC0taiA+PSAwKSB7XG4gICAgaHIyID0gaHIxO1xuICAgIGhpMiA9IGhpMTtcbiAgICBocjEgPSBocjtcbiAgICBoaTEgPSBoaTtcbiAgICBociA9IC1ocjIgKyByICogaHIxIC0gaSAqIGhpMSArIHBwW2pdO1xuICAgIGhpID0gLWhpMiArIGkgKiBocjEgKyByICogaGkxO1xuICB9XG5cbiAgciA9IHNpbl9hcmdfciAqIGNvc2hfYXJnX2k7XG4gIGkgPSBjb3NfYXJnX3IgKiBzaW5oX2FyZ19pO1xuXG4gIHJldHVybiBbciAqIGhyIC0gaSAqIGhpLCByICogaGkgKyBpICogaHJdO1xufVxuIiwiLy8gSGVhdmlseSBiYXNlZCBvbiB0aGlzIGV0bWVyYyBwcm9qZWN0aW9uIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWJsb2NoL21hcHNoYXBlci1wcm9qL2Jsb2IvbWFzdGVyL3NyYy9wcm9qZWN0aW9ucy9ldG1lcmMuanNcblxuaW1wb3J0IHRtZXJjIGZyb20gJy4uL3Byb2plY3Rpb25zL3RtZXJjJztcbmltcG9ydCBzaW5oIGZyb20gJy4uL2NvbW1vbi9zaW5oJztcbmltcG9ydCBoeXBvdCBmcm9tICcuLi9jb21tb24vaHlwb3QnO1xuaW1wb3J0IGFzaW5oeSBmcm9tICcuLi9jb21tb24vYXNpbmh5JztcbmltcG9ydCBnYXRnIGZyb20gJy4uL2NvbW1vbi9nYXRnJztcbmltcG9ydCBjbGVucyBmcm9tICcuLi9jb21tb24vY2xlbnMnO1xuaW1wb3J0IGNsZW5zX2NtcGx4IGZyb20gJy4uL2NvbW1vbi9jbGVuc19jbXBseCc7XG5pbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICBpZiAoIXRoaXMuYXBwcm94ICYmIChpc05hTih0aGlzLmVzKSB8fCB0aGlzLmVzIDw9IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgZWxsaXB0aWNhbCB1c2FnZS4gVHJ5IHVzaW5nIHRoZSArYXBwcm94IG9wdGlvbiBpbiB0aGUgcHJvaiBzdHJpbmcsIG9yIFBST0pFQ1RJT05bXCJGYXN0X1RyYW5zdmVyc2VfTWVyY2F0b3JcIl0gaW4gdGhlIFdLVC4nKTtcbiAgfVxuICBpZiAodGhpcy5hcHByb3gpIHtcbiAgICAvLyBXaGVuICcrYXBwcm94JyBpcyBzZXQsIHVzZSB0bWVyYyBpbnN0ZWFkXG4gICAgdG1lcmMuaW5pdC5hcHBseSh0aGlzKTtcbiAgICB0aGlzLmZvcndhcmQgPSB0bWVyYy5mb3J3YXJkO1xuICAgIHRoaXMuaW52ZXJzZSA9IHRtZXJjLmludmVyc2U7XG4gIH1cblxuICB0aGlzLngwID0gdGhpcy54MCAhPT0gdW5kZWZpbmVkID8gdGhpcy54MCA6IDA7XG4gIHRoaXMueTAgPSB0aGlzLnkwICE9PSB1bmRlZmluZWQgPyB0aGlzLnkwIDogMDtcbiAgdGhpcy5sb25nMCA9IHRoaXMubG9uZzAgIT09IHVuZGVmaW5lZCA/IHRoaXMubG9uZzAgOiAwO1xuICB0aGlzLmxhdDAgPSB0aGlzLmxhdDAgIT09IHVuZGVmaW5lZCA/IHRoaXMubGF0MCA6IDA7XG5cbiAgdGhpcy5jZ2IgPSBbXTtcbiAgdGhpcy5jYmcgPSBbXTtcbiAgdGhpcy51dGcgPSBbXTtcbiAgdGhpcy5ndHUgPSBbXTtcblxuICB2YXIgZiA9IHRoaXMuZXMgLyAoMSArIE1hdGguc3FydCgxIC0gdGhpcy5lcykpO1xuICB2YXIgbiA9IGYgLyAoMiAtIGYpO1xuICB2YXIgbnAgPSBuO1xuXG4gIHRoaXMuY2diWzBdID0gbiAqICgyICsgbiAqICgtMiAvIDMgKyBuICogKC0yICsgbiAqICgxMTYgLyA0NSArIG4gKiAoMjYgLyA0NSArIG4gKiAoLTI4NTQgLyA2NzUgKSkpKSkpO1xuICB0aGlzLmNiZ1swXSA9IG4gKiAoLTIgKyBuICogKCAyIC8gMyArIG4gKiAoIDQgLyAzICsgbiAqICgtODIgLyA0NSArIG4gKiAoMzIgLyA0NSArIG4gKiAoNDY0MiAvIDQ3MjUpKSkpKSk7XG5cbiAgbnAgPSBucCAqIG47XG4gIHRoaXMuY2diWzFdID0gbnAgKiAoNyAvIDMgKyBuICogKC04IC8gNSArIG4gKiAoLTIyNyAvIDQ1ICsgbiAqICgyNzA0IC8gMzE1ICsgbiAqICgyMzIzIC8gOTQ1KSkpKSk7XG4gIHRoaXMuY2JnWzFdID0gbnAgKiAoNSAvIDMgKyBuICogKC0xNiAvIDE1ICsgbiAqICggLTEzIC8gOSArIG4gKiAoOTA0IC8gMzE1ICsgbiAqICgtMTUyMiAvIDk0NSkpKSkpO1xuXG4gIG5wID0gbnAgKiBuO1xuICB0aGlzLmNnYlsyXSA9IG5wICogKDU2IC8gMTUgKyBuICogKC0xMzYgLyAzNSArIG4gKiAoLTEyNjIgLyAxMDUgKyBuICogKDczODE0IC8gMjgzNSkpKSk7XG4gIHRoaXMuY2JnWzJdID0gbnAgKiAoLTI2IC8gMTUgKyBuICogKDM0IC8gMjEgKyBuICogKDggLyA1ICsgbiAqICgtMTI2ODYgLyAyODM1KSkpKTtcblxuICBucCA9IG5wICogbjtcbiAgdGhpcy5jZ2JbM10gPSBucCAqICg0Mjc5IC8gNjMwICsgbiAqICgtMzMyIC8gMzUgKyBuICogKC0zOTk1NzIgLyAxNDE3NSkpKTtcbiAgdGhpcy5jYmdbM10gPSBucCAqICgxMjM3IC8gNjMwICsgbiAqICgtMTIgLyA1ICsgbiAqICggLTI0ODMyIC8gMTQxNzUpKSk7XG5cbiAgbnAgPSBucCAqIG47XG4gIHRoaXMuY2diWzRdID0gbnAgKiAoNDE3NCAvIDMxNSArIG4gKiAoLTE0NDgzOCAvIDYyMzcpKTtcbiAgdGhpcy5jYmdbNF0gPSBucCAqICgtNzM0IC8gMzE1ICsgbiAqICgxMDk1OTggLyAzMTE4NSkpO1xuXG4gIG5wID0gbnAgKiBuO1xuICB0aGlzLmNnYls1XSA9IG5wICogKDYwMTY3NiAvIDIyMjc1KTtcbiAgdGhpcy5jYmdbNV0gPSBucCAqICg0NDQzMzcgLyAxNTU5MjUpO1xuXG4gIG5wID0gTWF0aC5wb3cobiwgMik7XG4gIHRoaXMuUW4gPSB0aGlzLmswIC8gKDEgKyBuKSAqICgxICsgbnAgKiAoMSAvIDQgKyBucCAqICgxIC8gNjQgKyBucCAvIDI1NikpKTtcblxuICB0aGlzLnV0Z1swXSA9IG4gKiAoLTAuNSArIG4gKiAoIDIgLyAzICsgbiAqICgtMzcgLyA5NiArIG4gKiAoIDEgLyAzNjAgKyBuICogKDgxIC8gNTEyICsgbiAqICgtOTYxOTkgLyA2MDQ4MDApKSkpKSk7XG4gIHRoaXMuZ3R1WzBdID0gbiAqICgwLjUgKyBuICogKC0yIC8gMyArIG4gKiAoNSAvIDE2ICsgbiAqICg0MSAvIDE4MCArIG4gKiAoLTEyNyAvIDI4OCArIG4gKiAoNzg5MSAvIDM3ODAwKSkpKSkpO1xuXG4gIHRoaXMudXRnWzFdID0gbnAgKiAoLTEgLyA0OCArIG4gKiAoLTEgLyAxNSArIG4gKiAoNDM3IC8gMTQ0MCArIG4gKiAoLTQ2IC8gMTA1ICsgbiAqICgxMTE4NzExIC8gMzg3MDcyMCkpKSkpO1xuICB0aGlzLmd0dVsxXSA9IG5wICogKDEzIC8gNDggKyBuICogKC0zIC8gNSArIG4gKiAoNTU3IC8gMTQ0MCArIG4gKiAoMjgxIC8gNjMwICsgbiAqICgtMTk4MzQzMyAvIDE5MzUzNjApKSkpKTtcblxuICBucCA9IG5wICogbjtcbiAgdGhpcy51dGdbMl0gPSBucCAqICgtMTcgLyA0ODAgKyBuICogKDM3IC8gODQwICsgbiAqICgyMDkgLyA0NDgwICsgbiAqICgtNTU2OSAvIDkwNzIwICkpKSk7XG4gIHRoaXMuZ3R1WzJdID0gbnAgKiAoNjEgLyAyNDAgKyBuICogKC0xMDMgLyAxNDAgKyBuICogKDE1MDYxIC8gMjY4ODAgKyBuICogKDE2NzYwMyAvIDE4MTQ0MCkpKSk7XG5cbiAgbnAgPSBucCAqIG47XG4gIHRoaXMudXRnWzNdID0gbnAgKiAoLTQzOTcgLyAxNjEyODAgKyBuICogKDExIC8gNTA0ICsgbiAqICg4MzAyNTEgLyA3MjU3NjAwKSkpO1xuICB0aGlzLmd0dVszXSA9IG5wICogKDQ5NTYxIC8gMTYxMjgwICsgbiAqICgtMTc5IC8gMTY4ICsgbiAqICg2NjAxNjYxIC8gNzI1NzYwMCkpKTtcblxuICBucCA9IG5wICogbjtcbiAgdGhpcy51dGdbNF0gPSBucCAqICgtNDU4MyAvIDE2MTI4MCArIG4gKiAoMTA4ODQ3IC8gMzk5MTY4MCkpO1xuICB0aGlzLmd0dVs0XSA9IG5wICogKDM0NzI5IC8gODA2NDAgKyBuICogKC0zNDE4ODg5IC8gMTk5NTg0MCkpO1xuXG4gIG5wID0gbnAgKiBuO1xuICB0aGlzLnV0Z1s1XSA9IG5wICogKC0yMDY0ODY5MyAvIDYzODY2ODgwMCk7XG4gIHRoaXMuZ3R1WzVdID0gbnAgKiAoMjEyMzc4OTQxIC8gMzE5MzM0NDAwKTtcblxuICB2YXIgWiA9IGdhdGcodGhpcy5jYmcsIHRoaXMubGF0MCk7XG4gIHRoaXMuWmIgPSAtdGhpcy5RbiAqIChaICsgY2xlbnModGhpcy5ndHUsIDIgKiBaKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIENlID0gYWRqdXN0X2xvbihwLnggLSB0aGlzLmxvbmcwKTtcbiAgdmFyIENuID0gcC55O1xuXG4gIENuID0gZ2F0Zyh0aGlzLmNiZywgQ24pO1xuICB2YXIgc2luX0NuID0gTWF0aC5zaW4oQ24pO1xuICB2YXIgY29zX0NuID0gTWF0aC5jb3MoQ24pO1xuICB2YXIgc2luX0NlID0gTWF0aC5zaW4oQ2UpO1xuICB2YXIgY29zX0NlID0gTWF0aC5jb3MoQ2UpO1xuXG4gIENuID0gTWF0aC5hdGFuMihzaW5fQ24sIGNvc19DZSAqIGNvc19Dbik7XG4gIENlID0gTWF0aC5hdGFuMihzaW5fQ2UgKiBjb3NfQ24sIGh5cG90KHNpbl9DbiwgY29zX0NuICogY29zX0NlKSk7XG4gIENlID0gYXNpbmh5KE1hdGgudGFuKENlKSk7XG5cbiAgdmFyIHRtcCA9IGNsZW5zX2NtcGx4KHRoaXMuZ3R1LCAyICogQ24sIDIgKiBDZSk7XG5cbiAgQ24gPSBDbiArIHRtcFswXTtcbiAgQ2UgPSBDZSArIHRtcFsxXTtcblxuICB2YXIgeDtcbiAgdmFyIHk7XG5cbiAgaWYgKE1hdGguYWJzKENlKSA8PSAyLjYyMzM5NTE2Mjc3OCkge1xuICAgIHggPSB0aGlzLmEgKiAodGhpcy5RbiAqIENlKSArIHRoaXMueDA7XG4gICAgeSA9IHRoaXMuYSAqICh0aGlzLlFuICogQ24gKyB0aGlzLlpiKSArIHRoaXMueTA7XG4gIH1cbiAgZWxzZSB7XG4gICAgeCA9IEluZmluaXR5O1xuICAgIHkgPSBJbmZpbml0eTtcbiAgfVxuXG4gIHAueCA9IHg7XG4gIHAueSA9IHk7XG5cbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgdmFyIENlID0gKHAueCAtIHRoaXMueDApICogKDEgLyB0aGlzLmEpO1xuICB2YXIgQ24gPSAocC55IC0gdGhpcy55MCkgKiAoMSAvIHRoaXMuYSk7XG5cbiAgQ24gPSAoQ24gLSB0aGlzLlpiKSAvIHRoaXMuUW47XG4gIENlID0gQ2UgLyB0aGlzLlFuO1xuXG4gIHZhciBsb247XG4gIHZhciBsYXQ7XG5cbiAgaWYgKE1hdGguYWJzKENlKSA8PSAyLjYyMzM5NTE2Mjc3OCkge1xuICAgIHZhciB0bXAgPSBjbGVuc19jbXBseCh0aGlzLnV0ZywgMiAqIENuLCAyICogQ2UpO1xuXG4gICAgQ24gPSBDbiArIHRtcFswXTtcbiAgICBDZSA9IENlICsgdG1wWzFdO1xuICAgIENlID0gTWF0aC5hdGFuKHNpbmgoQ2UpKTtcblxuICAgIHZhciBzaW5fQ24gPSBNYXRoLnNpbihDbik7XG4gICAgdmFyIGNvc19DbiA9IE1hdGguY29zKENuKTtcbiAgICB2YXIgc2luX0NlID0gTWF0aC5zaW4oQ2UpO1xuICAgIHZhciBjb3NfQ2UgPSBNYXRoLmNvcyhDZSk7XG5cbiAgICBDbiA9IE1hdGguYXRhbjIoc2luX0NuICogY29zX0NlLCBoeXBvdChzaW5fQ2UsIGNvc19DZSAqIGNvc19DbikpO1xuICAgIENlID0gTWF0aC5hdGFuMihzaW5fQ2UsIGNvc19DZSAqIGNvc19Dbik7XG5cbiAgICBsb24gPSBhZGp1c3RfbG9uKENlICsgdGhpcy5sb25nMCk7XG4gICAgbGF0ID0gZ2F0Zyh0aGlzLmNnYiwgQ24pO1xuICB9XG4gIGVsc2Uge1xuICAgIGxvbiA9IEluZmluaXR5O1xuICAgIGxhdCA9IEluZmluaXR5O1xuICB9XG5cbiAgcC54ID0gbG9uO1xuICBwLnkgPSBsYXQ7XG5cbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJFeHRlbmRlZF9UcmFuc3ZlcnNlX01lcmNhdG9yXCIsIFwiRXh0ZW5kZWQgVHJhbnN2ZXJzZSBNZXJjYXRvclwiLCBcImV0bWVyY1wiLCBcIlRyYW5zdmVyc2VfTWVyY2F0b3JcIiwgXCJUcmFuc3ZlcnNlIE1lcmNhdG9yXCIsIFwidG1lcmNcIl07XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGluaXQsXG4gIGZvcndhcmQ6IGZvcndhcmQsXG4gIGludmVyc2U6IGludmVyc2UsXG4gIG5hbWVzOiBuYW1lc1xufTtcbiIsImltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4vYWRqdXN0X2xvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHpvbmUsIGxvbikge1xuICBpZiAoem9uZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgem9uZSA9IE1hdGguZmxvb3IoKGFkanVzdF9sb24obG9uKSArIE1hdGguUEkpICogMzAgLyBNYXRoLlBJKSArIDE7XG5cbiAgICBpZiAoem9uZSA8IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoem9uZSA+IDYwKSB7XG4gICAgICByZXR1cm4gNjA7XG4gICAgfVxuICB9XG4gIHJldHVybiB6b25lO1xufVxuIiwiaW1wb3J0IGFkanVzdF96b25lIGZyb20gJy4uL2NvbW1vbi9hZGp1c3Rfem9uZSc7XG5pbXBvcnQgZXRtZXJjIGZyb20gJy4vZXRtZXJjJztcbmV4cG9ydCB2YXIgZGVwZW5kc09uID0gJ2V0bWVyYyc7XG5pbXBvcnQge0QyUn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gIHZhciB6b25lID0gYWRqdXN0X3pvbmUodGhpcy56b25lLCB0aGlzLmxvbmcwKTtcbiAgaWYgKHpvbmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biB1dG0gem9uZScpO1xuICB9XG4gIHRoaXMubGF0MCA9IDA7XG4gIHRoaXMubG9uZzAgPSAgKCg2ICogTWF0aC5hYnMoem9uZSkpIC0gMTgzKSAqIEQyUjtcbiAgdGhpcy54MCA9IDUwMDAwMDtcbiAgdGhpcy55MCA9IHRoaXMudXRtU291dGggPyAxMDAwMDAwMCA6IDA7XG4gIHRoaXMuazAgPSAwLjk5OTY7XG5cbiAgZXRtZXJjLmluaXQuYXBwbHkodGhpcyk7XG4gIHRoaXMuZm9yd2FyZCA9IGV0bWVyYy5mb3J3YXJkO1xuICB0aGlzLmludmVyc2UgPSBldG1lcmMuaW52ZXJzZTtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIlVuaXZlcnNhbCBUcmFuc3ZlcnNlIE1lcmNhdG9yIFN5c3RlbVwiLCBcInV0bVwiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgbmFtZXM6IG5hbWVzLFxuICBkZXBlbmRzT246IGRlcGVuZHNPblxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVzaW5wLCBleHApIHtcbiAgcmV0dXJuIChNYXRoLnBvdygoMSAtIGVzaW5wKSAvICgxICsgZXNpbnApLCBleHApKTtcbn0iLCJpbXBvcnQgc3JhdCBmcm9tICcuLi9jb21tb24vc3JhdCc7XG52YXIgTUFYX0lURVIgPSAyMDtcbmltcG9ydCB7SEFMRl9QSSwgRk9SVFBJfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gIHZhciBzcGhpID0gTWF0aC5zaW4odGhpcy5sYXQwKTtcbiAgdmFyIGNwaGkgPSBNYXRoLmNvcyh0aGlzLmxhdDApO1xuICBjcGhpICo9IGNwaGk7XG4gIHRoaXMucmMgPSBNYXRoLnNxcnQoMSAtIHRoaXMuZXMpIC8gKDEgLSB0aGlzLmVzICogc3BoaSAqIHNwaGkpO1xuICB0aGlzLkMgPSBNYXRoLnNxcnQoMSArIHRoaXMuZXMgKiBjcGhpICogY3BoaSAvICgxIC0gdGhpcy5lcykpO1xuICB0aGlzLnBoaWMwID0gTWF0aC5hc2luKHNwaGkgLyB0aGlzLkMpO1xuICB0aGlzLnJhdGV4cCA9IDAuNSAqIHRoaXMuQyAqIHRoaXMuZTtcbiAgdGhpcy5LID0gTWF0aC50YW4oMC41ICogdGhpcy5waGljMCArIEZPUlRQSSkgLyAoTWF0aC5wb3coTWF0aC50YW4oMC41ICogdGhpcy5sYXQwICsgRk9SVFBJKSwgdGhpcy5DKSAqIHNyYXQodGhpcy5lICogc3BoaSwgdGhpcy5yYXRleHApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmQocCkge1xuICB2YXIgbG9uID0gcC54O1xuICB2YXIgbGF0ID0gcC55O1xuXG4gIHAueSA9IDIgKiBNYXRoLmF0YW4odGhpcy5LICogTWF0aC5wb3coTWF0aC50YW4oMC41ICogbGF0ICsgRk9SVFBJKSwgdGhpcy5DKSAqIHNyYXQodGhpcy5lICogTWF0aC5zaW4obGF0KSwgdGhpcy5yYXRleHApKSAtIEhBTEZfUEk7XG4gIHAueCA9IHRoaXMuQyAqIGxvbjtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgdmFyIERFTF9UT0wgPSAxZS0xNDtcbiAgdmFyIGxvbiA9IHAueCAvIHRoaXMuQztcbiAgdmFyIGxhdCA9IHAueTtcbiAgdmFyIG51bSA9IE1hdGgucG93KE1hdGgudGFuKDAuNSAqIGxhdCArIEZPUlRQSSkgLyB0aGlzLkssIDEgLyB0aGlzLkMpO1xuICBmb3IgKHZhciBpID0gTUFYX0lURVI7IGkgPiAwOyAtLWkpIHtcbiAgICBsYXQgPSAyICogTWF0aC5hdGFuKG51bSAqIHNyYXQodGhpcy5lICogTWF0aC5zaW4ocC55KSwgLSAwLjUgKiB0aGlzLmUpKSAtIEhBTEZfUEk7XG4gICAgaWYgKE1hdGguYWJzKGxhdCAtIHAueSkgPCBERUxfVE9MKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcC55ID0gbGF0O1xuICB9XG4gIC8qIGNvbnZlcmdlbmNlIGZhaWxlZCAqL1xuICBpZiAoIWkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJnYXVzc1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IGdhdXNzIGZyb20gJy4vZ2F1c3MnO1xuaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHtcbiAgZ2F1c3MuaW5pdC5hcHBseSh0aGlzKTtcbiAgaWYgKCF0aGlzLnJjKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc2luYzAgPSBNYXRoLnNpbih0aGlzLnBoaWMwKTtcbiAgdGhpcy5jb3NjMCA9IE1hdGguY29zKHRoaXMucGhpYzApO1xuICB0aGlzLlIyID0gMiAqIHRoaXMucmM7XG4gIGlmICghdGhpcy50aXRsZSkge1xuICAgIHRoaXMudGl0bGUgPSBcIk9ibGlxdWUgU3RlcmVvZ3JhcGhpYyBBbHRlcm5hdGl2ZVwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIHNpbmMsIGNvc2MsIGNvc2wsIGs7XG4gIHAueCA9IGFkanVzdF9sb24ocC54IC0gdGhpcy5sb25nMCk7XG4gIGdhdXNzLmZvcndhcmQuYXBwbHkodGhpcywgW3BdKTtcbiAgc2luYyA9IE1hdGguc2luKHAueSk7XG4gIGNvc2MgPSBNYXRoLmNvcyhwLnkpO1xuICBjb3NsID0gTWF0aC5jb3MocC54KTtcbiAgayA9IHRoaXMuazAgKiB0aGlzLlIyIC8gKDEgKyB0aGlzLnNpbmMwICogc2luYyArIHRoaXMuY29zYzAgKiBjb3NjICogY29zbCk7XG4gIHAueCA9IGsgKiBjb3NjICogTWF0aC5zaW4ocC54KTtcbiAgcC55ID0gayAqICh0aGlzLmNvc2MwICogc2luYyAtIHRoaXMuc2luYzAgKiBjb3NjICogY29zbCk7XG4gIHAueCA9IHRoaXMuYSAqIHAueCArIHRoaXMueDA7XG4gIHAueSA9IHRoaXMuYSAqIHAueSArIHRoaXMueTA7XG4gIHJldHVybiBwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHZhciBzaW5jLCBjb3NjLCBsb24sIGxhdCwgcmhvO1xuICBwLnggPSAocC54IC0gdGhpcy54MCkgLyB0aGlzLmE7XG4gIHAueSA9IChwLnkgLSB0aGlzLnkwKSAvIHRoaXMuYTtcblxuICBwLnggLz0gdGhpcy5rMDtcbiAgcC55IC89IHRoaXMuazA7XG4gIGlmICgocmhvID0gTWF0aC5zcXJ0KHAueCAqIHAueCArIHAueSAqIHAueSkpKSB7XG4gICAgdmFyIGMgPSAyICogTWF0aC5hdGFuMihyaG8sIHRoaXMuUjIpO1xuICAgIHNpbmMgPSBNYXRoLnNpbihjKTtcbiAgICBjb3NjID0gTWF0aC5jb3MoYyk7XG4gICAgbGF0ID0gTWF0aC5hc2luKGNvc2MgKiB0aGlzLnNpbmMwICsgcC55ICogc2luYyAqIHRoaXMuY29zYzAgLyByaG8pO1xuICAgIGxvbiA9IE1hdGguYXRhbjIocC54ICogc2luYywgcmhvICogdGhpcy5jb3NjMCAqIGNvc2MgLSBwLnkgKiB0aGlzLnNpbmMwICogc2luYyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgbGF0ID0gdGhpcy5waGljMDtcbiAgICBsb24gPSAwO1xuICB9XG5cbiAgcC54ID0gbG9uO1xuICBwLnkgPSBsYXQ7XG4gIGdhdXNzLmludmVyc2UuYXBwbHkodGhpcywgW3BdKTtcbiAgcC54ID0gYWRqdXN0X2xvbihwLnggKyB0aGlzLmxvbmcwKTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJTdGVyZW9ncmFwaGljX05vcnRoX1BvbGVcIiwgXCJPYmxpcXVlX1N0ZXJlb2dyYXBoaWNcIiwgXCJQb2xhcl9TdGVyZW9ncmFwaGljXCIsIFwic3RlcmVhXCIsXCJPYmxpcXVlIFN0ZXJlb2dyYXBoaWMgQWx0ZXJuYXRpdmVcIixcIkRvdWJsZV9TdGVyZW9ncmFwaGljXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJpbXBvcnQge0VQU0xOLCBIQUxGX1BJfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcblxuaW1wb3J0IHNpZ24gZnJvbSAnLi4vY29tbW9uL3NpZ24nO1xuaW1wb3J0IG1zZm56IGZyb20gJy4uL2NvbW1vbi9tc2Zueic7XG5pbXBvcnQgdHNmbnogZnJvbSAnLi4vY29tbW9uL3RzZm56JztcbmltcG9ydCBwaGkyeiBmcm9tICcuLi9jb21tb24vcGhpMnonO1xuaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Nmbl8ocGhpdCwgc2lucGhpLCBlY2Nlbikge1xuICBzaW5waGkgKj0gZWNjZW47XG4gIHJldHVybiAoTWF0aC50YW4oMC41ICogKEhBTEZfUEkgKyBwaGl0KSkgKiBNYXRoLnBvdygoMSAtIHNpbnBoaSkgLyAoMSArIHNpbnBoaSksIDAuNSAqIGVjY2VuKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICB0aGlzLmNvc2xhdDAgPSBNYXRoLmNvcyh0aGlzLmxhdDApO1xuICB0aGlzLnNpbmxhdDAgPSBNYXRoLnNpbih0aGlzLmxhdDApO1xuICBpZiAodGhpcy5zcGhlcmUpIHtcbiAgICBpZiAodGhpcy5rMCA9PT0gMSAmJiAhaXNOYU4odGhpcy5sYXRfdHMpICYmIE1hdGguYWJzKHRoaXMuY29zbGF0MCkgPD0gRVBTTE4pIHtcbiAgICAgIHRoaXMuazAgPSAwLjUgKiAoMSArIHNpZ24odGhpcy5sYXQwKSAqIE1hdGguc2luKHRoaXMubGF0X3RzKSk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGlmIChNYXRoLmFicyh0aGlzLmNvc2xhdDApIDw9IEVQU0xOKSB7XG4gICAgICBpZiAodGhpcy5sYXQwID4gMCkge1xuICAgICAgICAvL05vcnRoIHBvbGVcbiAgICAgICAgLy90cmFjZSgnc3RlcmU6bm9ydGggcG9sZScpO1xuICAgICAgICB0aGlzLmNvbiA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy9Tb3V0aCBwb2xlXG4gICAgICAgIC8vdHJhY2UoJ3N0ZXJlOnNvdXRoIHBvbGUnKTtcbiAgICAgICAgdGhpcy5jb24gPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb25zID0gTWF0aC5zcXJ0KE1hdGgucG93KDEgKyB0aGlzLmUsIDEgKyB0aGlzLmUpICogTWF0aC5wb3coMSAtIHRoaXMuZSwgMSAtIHRoaXMuZSkpO1xuICAgIGlmICh0aGlzLmswID09PSAxICYmICFpc05hTih0aGlzLmxhdF90cykgJiYgTWF0aC5hYnModGhpcy5jb3NsYXQwKSA8PSBFUFNMTikge1xuICAgICAgdGhpcy5rMCA9IDAuNSAqIHRoaXMuY29ucyAqIG1zZm56KHRoaXMuZSwgTWF0aC5zaW4odGhpcy5sYXRfdHMpLCBNYXRoLmNvcyh0aGlzLmxhdF90cykpIC8gdHNmbnoodGhpcy5lLCB0aGlzLmNvbiAqIHRoaXMubGF0X3RzLCB0aGlzLmNvbiAqIE1hdGguc2luKHRoaXMubGF0X3RzKSk7XG4gICAgfVxuICAgIHRoaXMubXMxID0gbXNmbnoodGhpcy5lLCB0aGlzLnNpbmxhdDAsIHRoaXMuY29zbGF0MCk7XG4gICAgdGhpcy5YMCA9IDIgKiBNYXRoLmF0YW4odGhpcy5zc2ZuXyh0aGlzLmxhdDAsIHRoaXMuc2lubGF0MCwgdGhpcy5lKSkgLSBIQUxGX1BJO1xuICAgIHRoaXMuY29zWDAgPSBNYXRoLmNvcyh0aGlzLlgwKTtcbiAgICB0aGlzLnNpblgwID0gTWF0aC5zaW4odGhpcy5YMCk7XG4gIH1cbn1cblxuLy8gU3RlcmVvZ3JhcGhpYyBmb3J3YXJkIGVxdWF0aW9ucy0tbWFwcGluZyBsYXQsbG9uZyB0byB4LHlcbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIGxvbiA9IHAueDtcbiAgdmFyIGxhdCA9IHAueTtcbiAgdmFyIHNpbmxhdCA9IE1hdGguc2luKGxhdCk7XG4gIHZhciBjb3NsYXQgPSBNYXRoLmNvcyhsYXQpO1xuICB2YXIgQSwgWCwgc2luWCwgY29zWCwgdHMsIHJoO1xuICB2YXIgZGxvbiA9IGFkanVzdF9sb24obG9uIC0gdGhpcy5sb25nMCk7XG5cbiAgaWYgKE1hdGguYWJzKE1hdGguYWJzKGxvbiAtIHRoaXMubG9uZzApIC0gTWF0aC5QSSkgPD0gRVBTTE4gJiYgTWF0aC5hYnMobGF0ICsgdGhpcy5sYXQwKSA8PSBFUFNMTikge1xuICAgIC8vY2FzZSBvZiB0aGUgb3JpZ2luZSBwb2ludFxuICAgIC8vdHJhY2UoJ3N0ZXJlOnRoaXMgaXMgdGhlIG9yaWdpbiBwb2ludCcpO1xuICAgIHAueCA9IE5hTjtcbiAgICBwLnkgPSBOYU47XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgaWYgKHRoaXMuc3BoZXJlKSB7XG4gICAgLy90cmFjZSgnc3RlcmU6c3BoZXJlIGNhc2UnKTtcbiAgICBBID0gMiAqIHRoaXMuazAgLyAoMSArIHRoaXMuc2lubGF0MCAqIHNpbmxhdCArIHRoaXMuY29zbGF0MCAqIGNvc2xhdCAqIE1hdGguY29zKGRsb24pKTtcbiAgICBwLnggPSB0aGlzLmEgKiBBICogY29zbGF0ICogTWF0aC5zaW4oZGxvbikgKyB0aGlzLngwO1xuICAgIHAueSA9IHRoaXMuYSAqIEEgKiAodGhpcy5jb3NsYXQwICogc2lubGF0IC0gdGhpcy5zaW5sYXQwICogY29zbGF0ICogTWF0aC5jb3MoZGxvbikpICsgdGhpcy55MDtcbiAgICByZXR1cm4gcDtcbiAgfVxuICBlbHNlIHtcbiAgICBYID0gMiAqIE1hdGguYXRhbih0aGlzLnNzZm5fKGxhdCwgc2lubGF0LCB0aGlzLmUpKSAtIEhBTEZfUEk7XG4gICAgY29zWCA9IE1hdGguY29zKFgpO1xuICAgIHNpblggPSBNYXRoLnNpbihYKTtcbiAgICBpZiAoTWF0aC5hYnModGhpcy5jb3NsYXQwKSA8PSBFUFNMTikge1xuICAgICAgdHMgPSB0c2Zueih0aGlzLmUsIGxhdCAqIHRoaXMuY29uLCB0aGlzLmNvbiAqIHNpbmxhdCk7XG4gICAgICByaCA9IDIgKiB0aGlzLmEgKiB0aGlzLmswICogdHMgLyB0aGlzLmNvbnM7XG4gICAgICBwLnggPSB0aGlzLngwICsgcmggKiBNYXRoLnNpbihsb24gLSB0aGlzLmxvbmcwKTtcbiAgICAgIHAueSA9IHRoaXMueTAgLSB0aGlzLmNvbiAqIHJoICogTWF0aC5jb3MobG9uIC0gdGhpcy5sb25nMCk7XG4gICAgICAvL3RyYWNlKHAudG9TdHJpbmcoKSk7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5zaW5sYXQwKSA8IEVQU0xOKSB7XG4gICAgICAvL0VxXG4gICAgICAvL3RyYWNlKCdzdGVyZTplcXVhdGV1cicpO1xuICAgICAgQSA9IDIgKiB0aGlzLmEgKiB0aGlzLmswIC8gKDEgKyBjb3NYICogTWF0aC5jb3MoZGxvbikpO1xuICAgICAgcC55ID0gQSAqIHNpblg7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy9vdGhlciBjYXNlXG4gICAgICAvL3RyYWNlKCdzdGVyZTpub3JtYWwgY2FzZScpO1xuICAgICAgQSA9IDIgKiB0aGlzLmEgKiB0aGlzLmswICogdGhpcy5tczEgLyAodGhpcy5jb3NYMCAqICgxICsgdGhpcy5zaW5YMCAqIHNpblggKyB0aGlzLmNvc1gwICogY29zWCAqIE1hdGguY29zKGRsb24pKSk7XG4gICAgICBwLnkgPSBBICogKHRoaXMuY29zWDAgKiBzaW5YIC0gdGhpcy5zaW5YMCAqIGNvc1ggKiBNYXRoLmNvcyhkbG9uKSkgKyB0aGlzLnkwO1xuICAgIH1cbiAgICBwLnggPSBBICogY29zWCAqIE1hdGguc2luKGRsb24pICsgdGhpcy54MDtcbiAgfVxuICAvL3RyYWNlKHAudG9TdHJpbmcoKSk7XG4gIHJldHVybiBwO1xufVxuXG4vLyogU3RlcmVvZ3JhcGhpYyBpbnZlcnNlIGVxdWF0aW9ucy0tbWFwcGluZyB4LHkgdG8gbGF0L2xvbmdcbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgcC54IC09IHRoaXMueDA7XG4gIHAueSAtPSB0aGlzLnkwO1xuICB2YXIgbG9uLCBsYXQsIHRzLCBjZSwgQ2hpO1xuICB2YXIgcmggPSBNYXRoLnNxcnQocC54ICogcC54ICsgcC55ICogcC55KTtcbiAgaWYgKHRoaXMuc3BoZXJlKSB7XG4gICAgdmFyIGMgPSAyICogTWF0aC5hdGFuKHJoIC8gKDIgKiB0aGlzLmEgKiB0aGlzLmswKSk7XG4gICAgbG9uID0gdGhpcy5sb25nMDtcbiAgICBsYXQgPSB0aGlzLmxhdDA7XG4gICAgaWYgKHJoIDw9IEVQU0xOKSB7XG4gICAgICBwLnggPSBsb247XG4gICAgICBwLnkgPSBsYXQ7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgbGF0ID0gTWF0aC5hc2luKE1hdGguY29zKGMpICogdGhpcy5zaW5sYXQwICsgcC55ICogTWF0aC5zaW4oYykgKiB0aGlzLmNvc2xhdDAgLyByaCk7XG4gICAgaWYgKE1hdGguYWJzKHRoaXMuY29zbGF0MCkgPCBFUFNMTikge1xuICAgICAgaWYgKHRoaXMubGF0MCA+IDApIHtcbiAgICAgICAgbG9uID0gYWRqdXN0X2xvbih0aGlzLmxvbmcwICsgTWF0aC5hdGFuMihwLngsIC0gMSAqIHAueSkpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIE1hdGguYXRhbjIocC54LCBwLnkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBNYXRoLmF0YW4yKHAueCAqIE1hdGguc2luKGMpLCByaCAqIHRoaXMuY29zbGF0MCAqIE1hdGguY29zKGMpIC0gcC55ICogdGhpcy5zaW5sYXQwICogTWF0aC5zaW4oYykpKTtcbiAgICB9XG4gICAgcC54ID0gbG9uO1xuICAgIHAueSA9IGxhdDtcbiAgICByZXR1cm4gcDtcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoTWF0aC5hYnModGhpcy5jb3NsYXQwKSA8PSBFUFNMTikge1xuICAgICAgaWYgKHJoIDw9IEVQU0xOKSB7XG4gICAgICAgIGxhdCA9IHRoaXMubGF0MDtcbiAgICAgICAgbG9uID0gdGhpcy5sb25nMDtcbiAgICAgICAgcC54ID0gbG9uO1xuICAgICAgICBwLnkgPSBsYXQ7XG4gICAgICAgIC8vdHJhY2UocC50b1N0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9XG4gICAgICBwLnggKj0gdGhpcy5jb247XG4gICAgICBwLnkgKj0gdGhpcy5jb247XG4gICAgICB0cyA9IHJoICogdGhpcy5jb25zIC8gKDIgKiB0aGlzLmEgKiB0aGlzLmswKTtcbiAgICAgIGxhdCA9IHRoaXMuY29uICogcGhpMnoodGhpcy5lLCB0cyk7XG4gICAgICBsb24gPSB0aGlzLmNvbiAqIGFkanVzdF9sb24odGhpcy5jb24gKiB0aGlzLmxvbmcwICsgTWF0aC5hdGFuMihwLngsIC0gMSAqIHAueSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNlID0gMiAqIE1hdGguYXRhbihyaCAqIHRoaXMuY29zWDAgLyAoMiAqIHRoaXMuYSAqIHRoaXMuazAgKiB0aGlzLm1zMSkpO1xuICAgICAgbG9uID0gdGhpcy5sb25nMDtcbiAgICAgIGlmIChyaCA8PSBFUFNMTikge1xuICAgICAgICBDaGkgPSB0aGlzLlgwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIENoaSA9IE1hdGguYXNpbihNYXRoLmNvcyhjZSkgKiB0aGlzLnNpblgwICsgcC55ICogTWF0aC5zaW4oY2UpICogdGhpcy5jb3NYMCAvIHJoKTtcbiAgICAgICAgbG9uID0gYWRqdXN0X2xvbih0aGlzLmxvbmcwICsgTWF0aC5hdGFuMihwLnggKiBNYXRoLnNpbihjZSksIHJoICogdGhpcy5jb3NYMCAqIE1hdGguY29zKGNlKSAtIHAueSAqIHRoaXMuc2luWDAgKiBNYXRoLnNpbihjZSkpKTtcbiAgICAgIH1cbiAgICAgIGxhdCA9IC0xICogcGhpMnoodGhpcy5lLCBNYXRoLnRhbigwLjUgKiAoSEFMRl9QSSArIENoaSkpKTtcbiAgICB9XG4gIH1cbiAgcC54ID0gbG9uO1xuICBwLnkgPSBsYXQ7XG5cbiAgLy90cmFjZShwLnRvU3RyaW5nKCkpO1xuICByZXR1cm4gcDtcblxufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wic3RlcmVcIiwgXCJTdGVyZW9ncmFwaGljX1NvdXRoX1BvbGVcIiwgXCJQb2xhciBTdGVyZW9ncmFwaGljICh2YXJpYW50IEIpXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXMsXG4gIHNzZm5fOiBzc2ZuX1xufTtcbiIsIi8qXG4gIHJlZmVyZW5jZXM6XG4gICAgRm9ybXVsZXMgZXQgY29uc3RhbnRlcyBwb3VyIGxlIENhbGN1bCBwb3VyIGxhXG4gICAgcHJvamVjdGlvbiBjeWxpbmRyaXF1ZSBjb25mb3JtZSDDoCBheGUgb2JsaXF1ZSBldCBwb3VyIGxhIHRyYW5zZm9ybWF0aW9uIGVudHJlXG4gICAgZGVzIHN5c3TDqG1lcyBkZSByw6lmw6lyZW5jZS5cbiAgICBodHRwOi8vd3d3LnN3aXNzdG9wby5hZG1pbi5jaC9pbnRlcm5ldC9zd2lzc3RvcG8vZnIvaG9tZS90b3BpY3Mvc3VydmV5L3N5cy9yZWZzeXMvc3dpdHplcmxhbmQucGFyc3lzcmVsYXRlZDEuMzEyMTYuZG93bmxvYWRMaXN0Ljc3MDA0LkRvd25sb2FkRmlsZS50bXAvc3dpc3Nwcm9qZWN0aW9uZnIucGRmXG4gICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICB2YXIgcGh5MCA9IHRoaXMubGF0MDtcbiAgdGhpcy5sYW1iZGEwID0gdGhpcy5sb25nMDtcbiAgdmFyIHNpblBoeTAgPSBNYXRoLnNpbihwaHkwKTtcbiAgdmFyIHNlbWlNYWpvckF4aXMgPSB0aGlzLmE7XG4gIHZhciBpbnZGID0gdGhpcy5yZjtcbiAgdmFyIGZsYXR0ZW5pbmcgPSAxIC8gaW52RjtcbiAgdmFyIGUyID0gMiAqIGZsYXR0ZW5pbmcgLSBNYXRoLnBvdyhmbGF0dGVuaW5nLCAyKTtcbiAgdmFyIGUgPSB0aGlzLmUgPSBNYXRoLnNxcnQoZTIpO1xuICB0aGlzLlIgPSB0aGlzLmswICogc2VtaU1ham9yQXhpcyAqIE1hdGguc3FydCgxIC0gZTIpIC8gKDEgLSBlMiAqIE1hdGgucG93KHNpblBoeTAsIDIpKTtcbiAgdGhpcy5hbHBoYSA9IE1hdGguc3FydCgxICsgZTIgLyAoMSAtIGUyKSAqIE1hdGgucG93KE1hdGguY29zKHBoeTApLCA0KSk7XG4gIHRoaXMuYjAgPSBNYXRoLmFzaW4oc2luUGh5MCAvIHRoaXMuYWxwaGEpO1xuICB2YXIgazEgPSBNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIHRoaXMuYjAgLyAyKSk7XG4gIHZhciBrMiA9IE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgcGh5MCAvIDIpKTtcbiAgdmFyIGszID0gTWF0aC5sb2coKDEgKyBlICogc2luUGh5MCkgLyAoMSAtIGUgKiBzaW5QaHkwKSk7XG4gIHRoaXMuSyA9IGsxIC0gdGhpcy5hbHBoYSAqIGsyICsgdGhpcy5hbHBoYSAqIGUgLyAyICogazM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIFNhMSA9IE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0IC0gcC55IC8gMikpO1xuICB2YXIgU2EyID0gdGhpcy5lIC8gMiAqIE1hdGgubG9nKCgxICsgdGhpcy5lICogTWF0aC5zaW4ocC55KSkgLyAoMSAtIHRoaXMuZSAqIE1hdGguc2luKHAueSkpKTtcbiAgdmFyIFMgPSAtdGhpcy5hbHBoYSAqIChTYTEgKyBTYTIpICsgdGhpcy5LO1xuXG4gIC8vIHNwaGVyaWMgbGF0aXR1ZGVcbiAgdmFyIGIgPSAyICogKE1hdGguYXRhbihNYXRoLmV4cChTKSkgLSBNYXRoLlBJIC8gNCk7XG5cbiAgLy8gc3BoZXJpYyBsb25naXR1ZGVcbiAgdmFyIEkgPSB0aGlzLmFscGhhICogKHAueCAtIHRoaXMubGFtYmRhMCk7XG5cbiAgLy8gcHNvZXVkbyBlcXVhdG9yaWFsIHJvdGF0aW9uXG4gIHZhciByb3RJID0gTWF0aC5hdGFuKE1hdGguc2luKEkpIC8gKE1hdGguc2luKHRoaXMuYjApICogTWF0aC50YW4oYikgKyBNYXRoLmNvcyh0aGlzLmIwKSAqIE1hdGguY29zKEkpKSk7XG5cbiAgdmFyIHJvdEIgPSBNYXRoLmFzaW4oTWF0aC5jb3ModGhpcy5iMCkgKiBNYXRoLnNpbihiKSAtIE1hdGguc2luKHRoaXMuYjApICogTWF0aC5jb3MoYikgKiBNYXRoLmNvcyhJKSk7XG5cbiAgcC55ID0gdGhpcy5SIC8gMiAqIE1hdGgubG9nKCgxICsgTWF0aC5zaW4ocm90QikpIC8gKDEgLSBNYXRoLnNpbihyb3RCKSkpICsgdGhpcy55MDtcbiAgcC54ID0gdGhpcy5SICogcm90SSArIHRoaXMueDA7XG4gIHJldHVybiBwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHZhciBZID0gcC54IC0gdGhpcy54MDtcbiAgdmFyIFggPSBwLnkgLSB0aGlzLnkwO1xuXG4gIHZhciByb3RJID0gWSAvIHRoaXMuUjtcbiAgdmFyIHJvdEIgPSAyICogKE1hdGguYXRhbihNYXRoLmV4cChYIC8gdGhpcy5SKSkgLSBNYXRoLlBJIC8gNCk7XG5cbiAgdmFyIGIgPSBNYXRoLmFzaW4oTWF0aC5jb3ModGhpcy5iMCkgKiBNYXRoLnNpbihyb3RCKSArIE1hdGguc2luKHRoaXMuYjApICogTWF0aC5jb3Mocm90QikgKiBNYXRoLmNvcyhyb3RJKSk7XG4gIHZhciBJID0gTWF0aC5hdGFuKE1hdGguc2luKHJvdEkpIC8gKE1hdGguY29zKHRoaXMuYjApICogTWF0aC5jb3Mocm90SSkgLSBNYXRoLnNpbih0aGlzLmIwKSAqIE1hdGgudGFuKHJvdEIpKSk7XG5cbiAgdmFyIGxhbWJkYSA9IHRoaXMubGFtYmRhMCArIEkgLyB0aGlzLmFscGhhO1xuXG4gIHZhciBTID0gMDtcbiAgdmFyIHBoeSA9IGI7XG4gIHZhciBwcmV2UGh5ID0gLTEwMDA7XG4gIHZhciBpdGVyYXRpb24gPSAwO1xuICB3aGlsZSAoTWF0aC5hYnMocGh5IC0gcHJldlBoeSkgPiAwLjAwMDAwMDEpIHtcbiAgICBpZiAoKytpdGVyYXRpb24gPiAyMCkge1xuICAgICAgLy8uLi5yZXBvcnRFcnJvcihcIm9tZXJjRndkSW5maW5pdHlcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vUyA9IE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgcGh5IC8gMikpO1xuICAgIFMgPSAxIC8gdGhpcy5hbHBoYSAqIChNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIGIgLyAyKSkgLSB0aGlzLkspICsgdGhpcy5lICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBNYXRoLmFzaW4odGhpcy5lICogTWF0aC5zaW4ocGh5KSkgLyAyKSk7XG4gICAgcHJldlBoeSA9IHBoeTtcbiAgICBwaHkgPSAyICogTWF0aC5hdGFuKE1hdGguZXhwKFMpKSAtIE1hdGguUEkgLyAyO1xuICB9XG5cbiAgcC54ID0gbGFtYmRhO1xuICBwLnkgPSBwaHk7XG4gIHJldHVybiBwO1xufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wic29tZXJjXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJpbXBvcnQgdHNmbnogZnJvbSAnLi4vY29tbW9uL3RzZm56JztcbmltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbG9uJztcbmltcG9ydCBwaGkyeiBmcm9tICcuLi9jb21tb24vcGhpMnonO1xuaW1wb3J0IHsgRDJSLCBFUFNMTiwgSEFMRl9QSSwgVFdPX1BJLCBGT1JUUEkgfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcblxudmFyIFRPTCA9IDFlLTc7XG5cbmZ1bmN0aW9uIGlzVHlwZUEoUCkge1xuICB2YXIgdHlwZUFQcm9qZWN0aW9ucyA9IFsnSG90aW5lX09ibGlxdWVfTWVyY2F0b3InLCdIb3RpbmVfT2JsaXF1ZV9NZXJjYXRvcl9BemltdXRoX05hdHVyYWxfT3JpZ2luJ107XG4gIHZhciBwcm9qZWN0aW9uTmFtZSA9IHR5cGVvZiBQLlBST0pFQ1RJT04gPT09IFwib2JqZWN0XCIgPyBPYmplY3Qua2V5cyhQLlBST0pFQ1RJT04pWzBdIDogUC5QUk9KRUNUSU9OO1xuICBcbiAgcmV0dXJuICdub191b2ZmJyBpbiBQIHx8ICdub19vZmYnIGluIFAgfHwgdHlwZUFQcm9qZWN0aW9ucy5pbmRleE9mKHByb2plY3Rpb25OYW1lKSAhPT0gLTE7XG59XG5cblxuLyogSW5pdGlhbGl6ZSB0aGUgT2JsaXF1ZSBNZXJjYXRvciAgcHJvamVjdGlvblxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHsgIFxuICB2YXIgY29uLCBjb20sIGNvc3BoMCwgRCwgRiwgSCwgTCwgc2lucGgwLCBwLCBKLCBnYW1tYSA9IDAsXG4gICAgZ2FtbWEwLCBsYW1jID0gMCwgbGFtMSA9IDAsIGxhbTIgPSAwLCBwaGkxID0gMCwgcGhpMiA9IDAsIGFscGhhX2MgPSAwLCBBQjtcbiAgXG4gIC8vIG9ubHkgVHlwZSBBIHVzZXMgdGhlIG5vX29mZiBvciBub191b2ZmIHByb3BlcnR5XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9PU0dlby9wcm9qLjQvaXNzdWVzLzEwNFxuICB0aGlzLm5vX29mZiA9IGlzVHlwZUEodGhpcyk7XG4gIHRoaXMubm9fcm90ID0gJ25vX3JvdCcgaW4gdGhpcztcbiAgXG4gIHZhciBhbHAgPSBmYWxzZTtcbiAgaWYgKFwiYWxwaGFcIiBpbiB0aGlzKSB7XG4gICAgYWxwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBnYW0gPSBmYWxzZTtcbiAgaWYgKFwicmVjdGlmaWVkX2dyaWRfYW5nbGVcIiBpbiB0aGlzKSB7XG4gICAgZ2FtID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhbHApIHtcbiAgICBhbHBoYV9jID0gdGhpcy5hbHBoYTtcbiAgfVxuICBcbiAgaWYgKGdhbSkge1xuICAgIGdhbW1hID0gKHRoaXMucmVjdGlmaWVkX2dyaWRfYW5nbGUgKiBEMlIpO1xuICB9XG4gIFxuICBpZiAoYWxwIHx8IGdhbSkge1xuICAgIGxhbWMgPSB0aGlzLmxvbmdjO1xuICB9IGVsc2Uge1xuICAgIGxhbTEgPSB0aGlzLmxvbmcxO1xuICAgIHBoaTEgPSB0aGlzLmxhdDE7XG4gICAgbGFtMiA9IHRoaXMubG9uZzI7XG4gICAgcGhpMiA9IHRoaXMubGF0MjtcbiAgICBcbiAgICBpZiAoTWF0aC5hYnMocGhpMSAtIHBoaTIpIDw9IFRPTCB8fCAoY29uID0gTWF0aC5hYnMocGhpMSkpIDw9IFRPTCB8fFxuICAgICAgICBNYXRoLmFicyhjb24gLSBIQUxGX1BJKSA8PSBUT0wgfHwgTWF0aC5hYnMoTWF0aC5hYnModGhpcy5sYXQwKSAtIEhBTEZfUEkpIDw9IFRPTCB8fFxuICAgICAgICBNYXRoLmFicyhNYXRoLmFicyhwaGkyKSAtIEhBTEZfUEkpIDw9IFRPTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9XG4gIFxuICB2YXIgb25lX2VzID0gMS4wIC0gdGhpcy5lcztcbiAgY29tID0gTWF0aC5zcXJ0KG9uZV9lcyk7XG4gIFxuICBpZiAoTWF0aC5hYnModGhpcy5sYXQwKSA+IEVQU0xOKSB7XG4gICAgc2lucGgwID0gTWF0aC5zaW4odGhpcy5sYXQwKTtcbiAgICBjb3NwaDAgPSBNYXRoLmNvcyh0aGlzLmxhdDApO1xuICAgIGNvbiA9IDEgLSB0aGlzLmVzICogc2lucGgwICogc2lucGgwO1xuICAgIHRoaXMuQiA9IGNvc3BoMCAqIGNvc3BoMDtcbiAgICB0aGlzLkIgPSBNYXRoLnNxcnQoMSArIHRoaXMuZXMgKiB0aGlzLkIgKiB0aGlzLkIgLyBvbmVfZXMpO1xuICAgIHRoaXMuQSA9IHRoaXMuQiAqIHRoaXMuazAgKiBjb20gLyBjb247XG4gICAgRCA9IHRoaXMuQiAqIGNvbSAvIChjb3NwaDAgKiBNYXRoLnNxcnQoY29uKSk7XG4gICAgRiA9IEQgKiBEIC0xO1xuICAgIFxuICAgIGlmIChGIDw9IDApIHtcbiAgICAgIEYgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBGID0gTWF0aC5zcXJ0KEYpO1xuICAgICAgaWYgKHRoaXMubGF0MCA8IDApIHtcbiAgICAgICAgRiA9IC1GO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLkUgPSBGICs9IEQ7XG4gICAgdGhpcy5FICo9IE1hdGgucG93KHRzZm56KHRoaXMuZSwgdGhpcy5sYXQwLCBzaW5waDApLCB0aGlzLkIpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuQiA9IDEgLyBjb207XG4gICAgdGhpcy5BID0gdGhpcy5rMDtcbiAgICB0aGlzLkUgPSBEID0gRiA9IDE7XG4gIH1cbiAgXG4gIGlmIChhbHAgfHwgZ2FtKSB7XG4gICAgaWYgKGFscCkge1xuICAgICAgZ2FtbWEwID0gTWF0aC5hc2luKE1hdGguc2luKGFscGhhX2MpIC8gRCk7XG4gICAgICBpZiAoIWdhbSkge1xuICAgICAgICBnYW1tYSA9IGFscGhhX2M7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGdhbW1hMCA9IGdhbW1hO1xuICAgICAgYWxwaGFfYyA9IE1hdGguYXNpbihEICogTWF0aC5zaW4oZ2FtbWEwKSk7XG4gICAgfVxuICAgIHRoaXMubGFtMCA9IGxhbWMgLSBNYXRoLmFzaW4oMC41ICogKEYgLSAxIC8gRikgKiBNYXRoLnRhbihnYW1tYTApKSAvIHRoaXMuQjtcbiAgfSBlbHNlIHtcbiAgICBIID0gTWF0aC5wb3codHNmbnoodGhpcy5lLCBwaGkxLCBNYXRoLnNpbihwaGkxKSksIHRoaXMuQik7XG4gICAgTCA9IE1hdGgucG93KHRzZm56KHRoaXMuZSwgcGhpMiwgTWF0aC5zaW4ocGhpMikpLCB0aGlzLkIpO1xuICAgIEYgPSB0aGlzLkUgLyBIO1xuICAgIHAgPSAoTCAtIEgpIC8gKEwgKyBIKTtcbiAgICBKID0gdGhpcy5FICogdGhpcy5FO1xuICAgIEogPSAoSiAtIEwgKiBIKSAvIChKICsgTCAqIEgpO1xuICAgIGNvbiA9IGxhbTEgLSBsYW0yO1xuICAgIFxuICAgIGlmIChjb24gPCAtTWF0aC5waSkge1xuICAgICAgbGFtMiAtPVRXT19QSTtcbiAgICB9IGVsc2UgaWYgKGNvbiA+IE1hdGgucGkpIHtcbiAgICAgIGxhbTIgKz0gVFdPX1BJO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmxhbTAgPSBhZGp1c3RfbG9uKDAuNSAqIChsYW0xICsgbGFtMikgLSBNYXRoLmF0YW4oSiAqIE1hdGgudGFuKDAuNSAqIHRoaXMuQiAqIChsYW0xIC0gbGFtMikpIC8gcCkgLyB0aGlzLkIpO1xuICAgIGdhbW1hMCA9IE1hdGguYXRhbigyICogTWF0aC5zaW4odGhpcy5CICogYWRqdXN0X2xvbihsYW0xIC0gdGhpcy5sYW0wKSkgLyAoRiAtIDEgLyBGKSk7XG4gICAgZ2FtbWEgPSBhbHBoYV9jID0gTWF0aC5hc2luKEQgKiBNYXRoLnNpbihnYW1tYTApKTtcbiAgfVxuICBcbiAgdGhpcy5zaW5nYW0gPSBNYXRoLnNpbihnYW1tYTApO1xuICB0aGlzLmNvc2dhbSA9IE1hdGguY29zKGdhbW1hMCk7XG4gIHRoaXMuc2lucm90ID0gTWF0aC5zaW4oZ2FtbWEpO1xuICB0aGlzLmNvc3JvdCA9IE1hdGguY29zKGdhbW1hKTtcbiAgXG4gIHRoaXMuckIgPSAxIC8gdGhpcy5CO1xuICB0aGlzLkFyQiA9IHRoaXMuQSAqIHRoaXMuckI7XG4gIHRoaXMuQnJBID0gMSAvIHRoaXMuQXJCO1xuICBBQiA9IHRoaXMuQSAqIHRoaXMuQjtcbiAgXG4gIGlmICh0aGlzLm5vX29mZikge1xuICAgIHRoaXMudV8wID0gMDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnVfMCA9IE1hdGguYWJzKHRoaXMuQXJCICogTWF0aC5hdGFuKE1hdGguc3FydChEICogRCAtIDEpIC8gTWF0aC5jb3MoYWxwaGFfYykpKTtcbiAgICBcbiAgICBpZiAodGhpcy5sYXQwIDwgMCkge1xuICAgICAgdGhpcy51XzAgPSAtIHRoaXMudV8wO1xuICAgIH0gIFxuICB9XG4gICAgXG4gIEYgPSAwLjUgKiBnYW1tYTA7XG4gIHRoaXMudl9wb2xlX24gPSB0aGlzLkFyQiAqIE1hdGgubG9nKE1hdGgudGFuKEZPUlRQSSAtIEYpKTtcbiAgdGhpcy52X3BvbGVfcyA9IHRoaXMuQXJCICogTWF0aC5sb2coTWF0aC50YW4oRk9SVFBJICsgRikpO1xufVxuXG5cbi8qIE9ibGlxdWUgTWVyY2F0b3IgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZChwKSB7XG4gIHZhciBjb29yZHMgPSB7fTtcbiAgdmFyIFMsIFQsIFUsIFYsIFcsIHRlbXAsIHUsIHY7XG4gIHAueCA9IHAueCAtIHRoaXMubGFtMDtcbiAgXG4gIGlmIChNYXRoLmFicyhNYXRoLmFicyhwLnkpIC0gSEFMRl9QSSkgPiBFUFNMTikge1xuICAgIFcgPSB0aGlzLkUgLyBNYXRoLnBvdyh0c2Zueih0aGlzLmUsIHAueSwgTWF0aC5zaW4ocC55KSksIHRoaXMuQik7XG4gICAgXG4gICAgdGVtcCA9IDEgLyBXO1xuICAgIFMgPSAwLjUgKiAoVyAtIHRlbXApO1xuICAgIFQgPSAwLjUgKiAoVyArIHRlbXApO1xuICAgIFYgPSBNYXRoLnNpbih0aGlzLkIgKiBwLngpO1xuICAgIFUgPSAoUyAqIHRoaXMuc2luZ2FtIC0gViAqIHRoaXMuY29zZ2FtKSAvIFQ7XG4gICAgICAgIFxuICAgIGlmIChNYXRoLmFicyhNYXRoLmFicyhVKSAtIDEuMCkgPCBFUFNMTikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICAgIFxuICAgIHYgPSAwLjUgKiB0aGlzLkFyQiAqIE1hdGgubG9nKCgxIC0gVSkvKDEgKyBVKSk7XG4gICAgdGVtcCA9IE1hdGguY29zKHRoaXMuQiAqIHAueCk7XG4gICAgXG4gICAgaWYgKE1hdGguYWJzKHRlbXApIDwgVE9MKSB7XG4gICAgICB1ID0gdGhpcy5BICogcC54O1xuICAgIH0gZWxzZSB7XG4gICAgICB1ID0gdGhpcy5BckIgKiBNYXRoLmF0YW4yKChTICogdGhpcy5jb3NnYW0gKyBWICogdGhpcy5zaW5nYW0pLCB0ZW1wKTtcbiAgICB9ICAgIFxuICB9IGVsc2Uge1xuICAgIHYgPSBwLnkgPiAwID8gdGhpcy52X3BvbGVfbiA6IHRoaXMudl9wb2xlX3M7XG4gICAgdSA9IHRoaXMuQXJCICogcC55O1xuICB9XG4gICAgIFxuICBpZiAodGhpcy5ub19yb3QpIHtcbiAgICBjb29yZHMueCA9IHU7XG4gICAgY29vcmRzLnkgPSB2O1xuICB9IGVsc2Uge1xuICAgIHUgLT0gdGhpcy51XzA7XG4gICAgY29vcmRzLnggPSB2ICogdGhpcy5jb3Nyb3QgKyB1ICogdGhpcy5zaW5yb3Q7XG4gICAgY29vcmRzLnkgPSB1ICogdGhpcy5jb3Nyb3QgLSB2ICogdGhpcy5zaW5yb3Q7XG4gIH1cbiAgXG4gIGNvb3Jkcy54ID0gKHRoaXMuYSAqIGNvb3Jkcy54ICsgdGhpcy54MCk7XG4gIGNvb3Jkcy55ID0gKHRoaXMuYSAqIGNvb3Jkcy55ICsgdGhpcy55MCk7XG4gIFxuICByZXR1cm4gY29vcmRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHZhciB1LCB2LCBRcCwgU3AsIFRwLCBWcCwgVXA7XG4gIHZhciBjb29yZHMgPSB7fTtcbiAgXG4gIHAueCA9IChwLnggLSB0aGlzLngwKSAqICgxLjAgLyB0aGlzLmEpO1xuICBwLnkgPSAocC55IC0gdGhpcy55MCkgKiAoMS4wIC8gdGhpcy5hKTtcblxuICBpZiAodGhpcy5ub19yb3QpIHtcbiAgICB2ID0gcC55O1xuICAgIHUgPSBwLng7XG4gIH0gZWxzZSB7XG4gICAgdiA9IHAueCAqIHRoaXMuY29zcm90IC0gcC55ICogdGhpcy5zaW5yb3Q7XG4gICAgdSA9IHAueSAqIHRoaXMuY29zcm90ICsgcC54ICogdGhpcy5zaW5yb3QgKyB0aGlzLnVfMDtcbiAgfVxuICBcbiAgUXAgPSBNYXRoLmV4cCgtdGhpcy5CckEgKiB2KTtcbiAgU3AgPSAwLjUgKiAoUXAgLSAxIC8gUXApO1xuICBUcCA9IDAuNSAqIChRcCArIDEgLyBRcCk7XG4gIFZwID0gTWF0aC5zaW4odGhpcy5CckEgKiB1KTtcbiAgVXAgPSAoVnAgKiB0aGlzLmNvc2dhbSArIFNwICogdGhpcy5zaW5nYW0pIC8gVHA7XG4gIFxuICBpZiAoTWF0aC5hYnMoTWF0aC5hYnMoVXApIC0gMSkgPCBFUFNMTikge1xuICAgIGNvb3Jkcy54ID0gMDtcbiAgICBjb29yZHMueSA9IFVwIDwgMCA/IC1IQUxGX1BJIDogSEFMRl9QSTtcbiAgfSBlbHNlIHtcbiAgICBjb29yZHMueSA9IHRoaXMuRSAvIE1hdGguc3FydCgoMSArIFVwKSAvICgxIC0gVXApKTtcbiAgICBjb29yZHMueSA9IHBoaTJ6KHRoaXMuZSwgTWF0aC5wb3coY29vcmRzLnksIDEgLyB0aGlzLkIpKTtcbiAgICBcbiAgICBpZiAoY29vcmRzLnkgPT09IEluZmluaXR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gICAgICAgIFxuICAgIGNvb3Jkcy54ID0gLXRoaXMuckIgKiBNYXRoLmF0YW4yKChTcCAqIHRoaXMuY29zZ2FtIC0gVnAgKiB0aGlzLnNpbmdhbSksIE1hdGguY29zKHRoaXMuQnJBICogdSkpO1xuICB9XG4gIFxuICBjb29yZHMueCArPSB0aGlzLmxhbTA7XG4gIFxuICByZXR1cm4gY29vcmRzO1xufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wiSG90aW5lX09ibGlxdWVfTWVyY2F0b3JcIiwgXCJIb3RpbmUgT2JsaXF1ZSBNZXJjYXRvclwiLCBcIkhvdGluZV9PYmxpcXVlX01lcmNhdG9yX0F6aW11dGhfTmF0dXJhbF9PcmlnaW5cIiwgXCJIb3RpbmVfT2JsaXF1ZV9NZXJjYXRvcl9Ud29fUG9pbnRfTmF0dXJhbF9PcmlnaW5cIiwgXCJIb3RpbmVfT2JsaXF1ZV9NZXJjYXRvcl9BemltdXRoX0NlbnRlclwiLCBcIk9ibGlxdWVfTWVyY2F0b3JcIiwgXCJvbWVyY1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IG1zZm56IGZyb20gJy4uL2NvbW1vbi9tc2Zueic7XG5pbXBvcnQgdHNmbnogZnJvbSAnLi4vY29tbW9uL3RzZm56JztcbmltcG9ydCBzaWduIGZyb20gJy4uL2NvbW1vbi9zaWduJztcbmltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbG9uJztcbmltcG9ydCBwaGkyeiBmcm9tICcuLi9jb21tb24vcGhpMnonO1xuaW1wb3J0IHtIQUxGX1BJLCBFUFNMTn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHtcbiAgXG4gIC8vZG91YmxlIGxhdDA7ICAgICAgICAgICAgICAgICAgICAvKiB0aGUgcmVmZXJlbmNlIGxhdGl0dWRlICAgICAgICAgICAgICAgKi9cbiAgLy9kb3VibGUgbG9uZzA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSByZWZlcmVuY2UgbG9uZ2l0dWRlICAgICAgICAgICAgICAqL1xuICAvL2RvdWJsZSBsYXQxOyAgICAgICAgICAgICAgICAgICAgLyogZmlyc3Qgc3RhbmRhcmQgcGFyYWxsZWwgICAgICAgICAgICAgICovXG4gIC8vZG91YmxlIGxhdDI7ICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgc3RhbmRhcmQgcGFyYWxsZWwgICAgICAgICAgICAgKi9cbiAgLy9kb3VibGUgcl9tYWo7ICAgICAgICAgICAgICAgICAgIC8qIG1ham9yIGF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL2RvdWJsZSByX21pbjsgICAgICAgICAgICAgICAgICAgLyogbWlub3IgYXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vZG91YmxlIGZhbHNlX2Vhc3Q7ICAgICAgICAgICAgICAvKiB4IG9mZnNldCBpbiBtZXRlcnMgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9kb3VibGUgZmFsc2Vfbm9ydGg7ICAgICAgICAgICAgIC8qIHkgb2Zmc2V0IGluIG1ldGVycyAgICAgICAgICAgICAgICAgICAqL1xuICBcbiAgLy90aGUgYWJvdmUgdmFsdWUgY2FuIGJlIHNldCB3aXRoIHByb2o0LmRlZnNcbiAgLy9leGFtcGxlOiBwcm9qNC5kZWZzKFwiRVBTRzoyMTU0XCIsXCIrcHJvaj1sY2MgK2xhdF8xPTQ5ICtsYXRfMj00NCArbGF0XzA9NDYuNSArbG9uXzA9MyAreF8wPTcwMDAwMCAreV8wPTY2MDAwMDAgK2VsbHBzPUdSUzgwICt0b3dnczg0PTAsMCwwLDAsMCwwLDAgK3VuaXRzPW0gK25vX2RlZnNcIik7XG5cbiAgaWYgKCF0aGlzLmxhdDIpIHtcbiAgICB0aGlzLmxhdDIgPSB0aGlzLmxhdDE7XG4gIH0gLy9pZiBsYXQyIGlzIG5vdCBkZWZpbmVkXG4gIGlmICghdGhpcy5rMCkge1xuICAgIHRoaXMuazAgPSAxO1xuICB9XG4gIHRoaXMueDAgPSB0aGlzLngwIHx8IDA7XG4gIHRoaXMueTAgPSB0aGlzLnkwIHx8IDA7XG4gIC8vIFN0YW5kYXJkIFBhcmFsbGVscyBjYW5ub3QgYmUgZXF1YWwgYW5kIG9uIG9wcG9zaXRlIHNpZGVzIG9mIHRoZSBlcXVhdG9yXG4gIGlmIChNYXRoLmFicyh0aGlzLmxhdDEgKyB0aGlzLmxhdDIpIDwgRVBTTE4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGVtcCA9IHRoaXMuYiAvIHRoaXMuYTtcbiAgdGhpcy5lID0gTWF0aC5zcXJ0KDEgLSB0ZW1wICogdGVtcCk7XG5cbiAgdmFyIHNpbjEgPSBNYXRoLnNpbih0aGlzLmxhdDEpO1xuICB2YXIgY29zMSA9IE1hdGguY29zKHRoaXMubGF0MSk7XG4gIHZhciBtczEgPSBtc2Zueih0aGlzLmUsIHNpbjEsIGNvczEpO1xuICB2YXIgdHMxID0gdHNmbnoodGhpcy5lLCB0aGlzLmxhdDEsIHNpbjEpO1xuXG4gIHZhciBzaW4yID0gTWF0aC5zaW4odGhpcy5sYXQyKTtcbiAgdmFyIGNvczIgPSBNYXRoLmNvcyh0aGlzLmxhdDIpO1xuICB2YXIgbXMyID0gbXNmbnoodGhpcy5lLCBzaW4yLCBjb3MyKTtcbiAgdmFyIHRzMiA9IHRzZm56KHRoaXMuZSwgdGhpcy5sYXQyLCBzaW4yKTtcblxuICB2YXIgdHMwID0gdHNmbnoodGhpcy5lLCB0aGlzLmxhdDAsIE1hdGguc2luKHRoaXMubGF0MCkpO1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxhdDEgLSB0aGlzLmxhdDIpID4gRVBTTE4pIHtcbiAgICB0aGlzLm5zID0gTWF0aC5sb2cobXMxIC8gbXMyKSAvIE1hdGgubG9nKHRzMSAvIHRzMik7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5ucyA9IHNpbjE7XG4gIH1cbiAgaWYgKGlzTmFOKHRoaXMubnMpKSB7XG4gICAgdGhpcy5ucyA9IHNpbjE7XG4gIH1cbiAgdGhpcy5mMCA9IG1zMSAvICh0aGlzLm5zICogTWF0aC5wb3codHMxLCB0aGlzLm5zKSk7XG4gIHRoaXMucmggPSB0aGlzLmEgKiB0aGlzLmYwICogTWF0aC5wb3codHMwLCB0aGlzLm5zKTtcbiAgaWYgKCF0aGlzLnRpdGxlKSB7XG4gICAgdGhpcy50aXRsZSA9IFwiTGFtYmVydCBDb25mb3JtYWwgQ29uaWNcIjtcbiAgfVxufVxuXG4vLyBMYW1iZXJ0IENvbmZvcm1hbCBjb25pYyBmb3J3YXJkIGVxdWF0aW9ucy0tbWFwcGluZyBsYXQsbG9uZyB0byB4LHlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZChwKSB7XG5cbiAgdmFyIGxvbiA9IHAueDtcbiAgdmFyIGxhdCA9IHAueTtcblxuICAvLyBzaW5ndWxhciBjYXNlcyA6XG4gIGlmIChNYXRoLmFicygyICogTWF0aC5hYnMobGF0KSAtIE1hdGguUEkpIDw9IEVQU0xOKSB7XG4gICAgbGF0ID0gc2lnbihsYXQpICogKEhBTEZfUEkgLSAyICogRVBTTE4pO1xuICB9XG5cbiAgdmFyIGNvbiA9IE1hdGguYWJzKE1hdGguYWJzKGxhdCkgLSBIQUxGX1BJKTtcbiAgdmFyIHRzLCByaDE7XG4gIGlmIChjb24gPiBFUFNMTikge1xuICAgIHRzID0gdHNmbnoodGhpcy5lLCBsYXQsIE1hdGguc2luKGxhdCkpO1xuICAgIHJoMSA9IHRoaXMuYSAqIHRoaXMuZjAgKiBNYXRoLnBvdyh0cywgdGhpcy5ucyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgY29uID0gbGF0ICogdGhpcy5ucztcbiAgICBpZiAoY29uIDw9IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByaDEgPSAwO1xuICB9XG4gIHZhciB0aGV0YSA9IHRoaXMubnMgKiBhZGp1c3RfbG9uKGxvbiAtIHRoaXMubG9uZzApO1xuICBwLnggPSB0aGlzLmswICogKHJoMSAqIE1hdGguc2luKHRoZXRhKSkgKyB0aGlzLngwO1xuICBwLnkgPSB0aGlzLmswICogKHRoaXMucmggLSByaDEgKiBNYXRoLmNvcyh0aGV0YSkpICsgdGhpcy55MDtcblxuICByZXR1cm4gcDtcbn1cblxuLy8gTGFtYmVydCBDb25mb3JtYWwgQ29uaWMgaW52ZXJzZSBlcXVhdGlvbnMtLW1hcHBpbmcgeCx5IHRvIGxhdC9sb25nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuXG4gIHZhciByaDEsIGNvbiwgdHM7XG4gIHZhciBsYXQsIGxvbjtcbiAgdmFyIHggPSAocC54IC0gdGhpcy54MCkgLyB0aGlzLmswO1xuICB2YXIgeSA9ICh0aGlzLnJoIC0gKHAueSAtIHRoaXMueTApIC8gdGhpcy5rMCk7XG4gIGlmICh0aGlzLm5zID4gMCkge1xuICAgIHJoMSA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICBjb24gPSAxO1xuICB9XG4gIGVsc2Uge1xuICAgIHJoMSA9IC1NYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgY29uID0gLTE7XG4gIH1cbiAgdmFyIHRoZXRhID0gMDtcbiAgaWYgKHJoMSAhPT0gMCkge1xuICAgIHRoZXRhID0gTWF0aC5hdGFuMigoY29uICogeCksIChjb24gKiB5KSk7XG4gIH1cbiAgaWYgKChyaDEgIT09IDApIHx8ICh0aGlzLm5zID4gMCkpIHtcbiAgICBjb24gPSAxIC8gdGhpcy5ucztcbiAgICB0cyA9IE1hdGgucG93KChyaDEgLyAodGhpcy5hICogdGhpcy5mMCkpLCBjb24pO1xuICAgIGxhdCA9IHBoaTJ6KHRoaXMuZSwgdHMpO1xuICAgIGlmIChsYXQgPT09IC05OTk5KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgbGF0ID0gLUhBTEZfUEk7XG4gIH1cbiAgbG9uID0gYWRqdXN0X2xvbih0aGV0YSAvIHRoaXMubnMgKyB0aGlzLmxvbmcwKTtcblxuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXG4gIFwiTGFtYmVydCBUYW5nZW50aWFsIENvbmZvcm1hbCBDb25pYyBQcm9qZWN0aW9uXCIsXG4gIFwiTGFtYmVydF9Db25mb3JtYWxfQ29uaWNcIixcbiAgXCJMYW1iZXJ0X0NvbmZvcm1hbF9Db25pY18xU1BcIixcbiAgXCJMYW1iZXJ0X0NvbmZvcm1hbF9Db25pY18yU1BcIixcbiAgXCJsY2NcIixcbiAgXCJMYW1iZXJ0IENvbmljIENvbmZvcm1hbCAoMVNQKVwiLFxuICBcIkxhbWJlcnQgQ29uaWMgQ29uZm9ybWFsICgyU1ApXCJcbl07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHtcbiAgdGhpcy5hID0gNjM3NzM5Ny4xNTU7XG4gIHRoaXMuZXMgPSAwLjAwNjY3NDM3MjIzMDYxNDtcbiAgdGhpcy5lID0gTWF0aC5zcXJ0KHRoaXMuZXMpO1xuICBpZiAoIXRoaXMubGF0MCkge1xuICAgIHRoaXMubGF0MCA9IDAuODYzOTM3OTc5NzM3MTkzO1xuICB9XG4gIGlmICghdGhpcy5sb25nMCkge1xuICAgIHRoaXMubG9uZzAgPSAwLjc0MTc2NDkzMjA5NzU5MDEgLSAwLjMwODM0MTUwMTE4NTY2NTtcbiAgfVxuICAvKiBpZiBzY2FsZSBub3Qgc2V0IGRlZmF1bHQgdG8gMC45OTk5ICovXG4gIGlmICghdGhpcy5rMCkge1xuICAgIHRoaXMuazAgPSAwLjk5OTk7XG4gIH1cbiAgdGhpcy5zNDUgPSAwLjc4NTM5ODE2MzM5NzQ0ODsgLyogNDUgKi9cbiAgdGhpcy5zOTAgPSAyICogdGhpcy5zNDU7XG4gIHRoaXMuZmkwID0gdGhpcy5sYXQwO1xuICB0aGlzLmUyID0gdGhpcy5lcztcbiAgdGhpcy5lID0gTWF0aC5zcXJ0KHRoaXMuZTIpO1xuICB0aGlzLmFsZmEgPSBNYXRoLnNxcnQoMSArICh0aGlzLmUyICogTWF0aC5wb3coTWF0aC5jb3ModGhpcy5maTApLCA0KSkgLyAoMSAtIHRoaXMuZTIpKTtcbiAgdGhpcy51cSA9IDEuMDQyMTY4NTYzODA0NzQ7XG4gIHRoaXMudTAgPSBNYXRoLmFzaW4oTWF0aC5zaW4odGhpcy5maTApIC8gdGhpcy5hbGZhKTtcbiAgdGhpcy5nID0gTWF0aC5wb3coKDEgKyB0aGlzLmUgKiBNYXRoLnNpbih0aGlzLmZpMCkpIC8gKDEgLSB0aGlzLmUgKiBNYXRoLnNpbih0aGlzLmZpMCkpLCB0aGlzLmFsZmEgKiB0aGlzLmUgLyAyKTtcbiAgdGhpcy5rID0gTWF0aC50YW4odGhpcy51MCAvIDIgKyB0aGlzLnM0NSkgLyBNYXRoLnBvdyhNYXRoLnRhbih0aGlzLmZpMCAvIDIgKyB0aGlzLnM0NSksIHRoaXMuYWxmYSkgKiB0aGlzLmc7XG4gIHRoaXMuazEgPSB0aGlzLmswO1xuICB0aGlzLm4wID0gdGhpcy5hICogTWF0aC5zcXJ0KDEgLSB0aGlzLmUyKSAvICgxIC0gdGhpcy5lMiAqIE1hdGgucG93KE1hdGguc2luKHRoaXMuZmkwKSwgMikpO1xuICB0aGlzLnMwID0gMS4zNzAwODM0NjI4MTU1NTtcbiAgdGhpcy5uID0gTWF0aC5zaW4odGhpcy5zMCk7XG4gIHRoaXMucm8wID0gdGhpcy5rMSAqIHRoaXMubjAgLyBNYXRoLnRhbih0aGlzLnMwKTtcbiAgdGhpcy5hZCA9IHRoaXMuczkwIC0gdGhpcy51cTtcbn1cblxuLyogZWxsaXBzb2lkICovXG4vKiBjYWxjdWxhdGUgeHkgZnJvbSBsYXQvbG9uICovXG4vKiBDb25zdGFudHMsIGlkZW50aWNhbCB0byBpbnZlcnNlIHRyYW5zZm9ybSBmdW5jdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmQocCkge1xuICB2YXIgZ2ZpLCB1LCBkZWx0YXYsIHMsIGQsIGVwcywgcm87XG4gIHZhciBsb24gPSBwLng7XG4gIHZhciBsYXQgPSBwLnk7XG4gIHZhciBkZWx0YV9sb24gPSBhZGp1c3RfbG9uKGxvbiAtIHRoaXMubG9uZzApO1xuICAvKiBUcmFuc2Zvcm1hdGlvbiAqL1xuICBnZmkgPSBNYXRoLnBvdygoKDEgKyB0aGlzLmUgKiBNYXRoLnNpbihsYXQpKSAvICgxIC0gdGhpcy5lICogTWF0aC5zaW4obGF0KSkpLCAodGhpcy5hbGZhICogdGhpcy5lIC8gMikpO1xuICB1ID0gMiAqIChNYXRoLmF0YW4odGhpcy5rICogTWF0aC5wb3coTWF0aC50YW4obGF0IC8gMiArIHRoaXMuczQ1KSwgdGhpcy5hbGZhKSAvIGdmaSkgLSB0aGlzLnM0NSk7XG4gIGRlbHRhdiA9IC1kZWx0YV9sb24gKiB0aGlzLmFsZmE7XG4gIHMgPSBNYXRoLmFzaW4oTWF0aC5jb3ModGhpcy5hZCkgKiBNYXRoLnNpbih1KSArIE1hdGguc2luKHRoaXMuYWQpICogTWF0aC5jb3ModSkgKiBNYXRoLmNvcyhkZWx0YXYpKTtcbiAgZCA9IE1hdGguYXNpbihNYXRoLmNvcyh1KSAqIE1hdGguc2luKGRlbHRhdikgLyBNYXRoLmNvcyhzKSk7XG4gIGVwcyA9IHRoaXMubiAqIGQ7XG4gIHJvID0gdGhpcy5ybzAgKiBNYXRoLnBvdyhNYXRoLnRhbih0aGlzLnMwIC8gMiArIHRoaXMuczQ1KSwgdGhpcy5uKSAvIE1hdGgucG93KE1hdGgudGFuKHMgLyAyICsgdGhpcy5zNDUpLCB0aGlzLm4pO1xuICBwLnkgPSBybyAqIE1hdGguY29zKGVwcykgLyAxO1xuICBwLnggPSBybyAqIE1hdGguc2luKGVwcykgLyAxO1xuXG4gIGlmICghdGhpcy5jemVjaCkge1xuICAgIHAueSAqPSAtMTtcbiAgICBwLnggKj0gLTE7XG4gIH1cbiAgcmV0dXJuIChwKTtcbn1cblxuLyogY2FsY3VsYXRlIGxhdC9sb24gZnJvbSB4eSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICB2YXIgdSwgZGVsdGF2LCBzLCBkLCBlcHMsIHJvLCBmaTE7XG4gIHZhciBvaztcblxuICAvKiBUcmFuc2Zvcm1hdGlvbiAqL1xuICAvKiByZXZlcnQgeSwgeCovXG4gIHZhciB0bXAgPSBwLng7XG4gIHAueCA9IHAueTtcbiAgcC55ID0gdG1wO1xuICBpZiAoIXRoaXMuY3plY2gpIHtcbiAgICBwLnkgKj0gLTE7XG4gICAgcC54ICo9IC0xO1xuICB9XG4gIHJvID0gTWF0aC5zcXJ0KHAueCAqIHAueCArIHAueSAqIHAueSk7XG4gIGVwcyA9IE1hdGguYXRhbjIocC55LCBwLngpO1xuICBkID0gZXBzIC8gTWF0aC5zaW4odGhpcy5zMCk7XG4gIHMgPSAyICogKE1hdGguYXRhbihNYXRoLnBvdyh0aGlzLnJvMCAvIHJvLCAxIC8gdGhpcy5uKSAqIE1hdGgudGFuKHRoaXMuczAgLyAyICsgdGhpcy5zNDUpKSAtIHRoaXMuczQ1KTtcbiAgdSA9IE1hdGguYXNpbihNYXRoLmNvcyh0aGlzLmFkKSAqIE1hdGguc2luKHMpIC0gTWF0aC5zaW4odGhpcy5hZCkgKiBNYXRoLmNvcyhzKSAqIE1hdGguY29zKGQpKTtcbiAgZGVsdGF2ID0gTWF0aC5hc2luKE1hdGguY29zKHMpICogTWF0aC5zaW4oZCkgLyBNYXRoLmNvcyh1KSk7XG4gIHAueCA9IHRoaXMubG9uZzAgLSBkZWx0YXYgLyB0aGlzLmFsZmE7XG4gIGZpMSA9IHU7XG4gIG9rID0gMDtcbiAgdmFyIGl0ZXIgPSAwO1xuICBkbyB7XG4gICAgcC55ID0gMiAqIChNYXRoLmF0YW4oTWF0aC5wb3codGhpcy5rLCAtIDEgLyB0aGlzLmFsZmEpICogTWF0aC5wb3coTWF0aC50YW4odSAvIDIgKyB0aGlzLnM0NSksIDEgLyB0aGlzLmFsZmEpICogTWF0aC5wb3coKDEgKyB0aGlzLmUgKiBNYXRoLnNpbihmaTEpKSAvICgxIC0gdGhpcy5lICogTWF0aC5zaW4oZmkxKSksIHRoaXMuZSAvIDIpKSAtIHRoaXMuczQ1KTtcbiAgICBpZiAoTWF0aC5hYnMoZmkxIC0gcC55KSA8IDAuMDAwMDAwMDAwMSkge1xuICAgICAgb2sgPSAxO1xuICAgIH1cbiAgICBmaTEgPSBwLnk7XG4gICAgaXRlciArPSAxO1xuICB9IHdoaWxlIChvayA9PT0gMCAmJiBpdGVyIDwgMTUpO1xuICBpZiAoaXRlciA+PSAxNSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIChwKTtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIktyb3Zha1wiLCBcImtyb3Zha1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZTAsIGUxLCBlMiwgZTMsIHBoaSkge1xuICByZXR1cm4gKGUwICogcGhpIC0gZTEgKiBNYXRoLnNpbigyICogcGhpKSArIGUyICogTWF0aC5zaW4oNCAqIHBoaSkgLSBlMyAqIE1hdGguc2luKDYgKiBwaGkpKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiAoMSAtIDAuMjUgKiB4ICogKDEgKyB4IC8gMTYgKiAoMyArIDEuMjUgKiB4KSkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuICgwLjM3NSAqIHggKiAoMSArIDAuMjUgKiB4ICogKDEgKyAwLjQ2ODc1ICogeCkpKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiAoMC4wNTg1OTM3NSAqIHggKiB4ICogKDEgKyAwLjc1ICogeCkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuICh4ICogeCAqIHggKiAoMzUgLyAzMDcyKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgZSwgc2lucGhpKSB7XG4gIHZhciB0ZW1wID0gZSAqIHNpbnBoaTtcbiAgcmV0dXJuIGEgLyBNYXRoLnNxcnQoMSAtIHRlbXAgKiB0ZW1wKTtcbn0iLCJpbXBvcnQge0hBTEZfUEl9IGZyb20gJy4uL2NvbnN0YW50cy92YWx1ZXMnO1xuaW1wb3J0IHNpZ24gZnJvbSAnLi9zaWduJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gKE1hdGguYWJzKHgpIDwgSEFMRl9QSSkgPyB4IDogKHggLSAoc2lnbih4KSAqIE1hdGguUEkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1sLCBlMCwgZTEsIGUyLCBlMykge1xuICB2YXIgcGhpO1xuICB2YXIgZHBoaTtcblxuICBwaGkgPSBtbCAvIGUwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDE1OyBpKyspIHtcbiAgICBkcGhpID0gKG1sIC0gKGUwICogcGhpIC0gZTEgKiBNYXRoLnNpbigyICogcGhpKSArIGUyICogTWF0aC5zaW4oNCAqIHBoaSkgLSBlMyAqIE1hdGguc2luKDYgKiBwaGkpKSkgLyAoZTAgLSAyICogZTEgKiBNYXRoLmNvcygyICogcGhpKSArIDQgKiBlMiAqIE1hdGguY29zKDQgKiBwaGkpIC0gNiAqIGUzICogTWF0aC5jb3MoNiAqIHBoaSkpO1xuICAgIHBoaSArPSBkcGhpO1xuICAgIGlmIChNYXRoLmFicyhkcGhpKSA8PSAwLjAwMDAwMDAwMDEpIHtcbiAgICAgIHJldHVybiBwaGk7XG4gICAgfVxuICB9XG5cbiAgLy8uLnJlcG9ydEVycm9yKFwiSU1MRk4tQ09OVjpMYXRpdHVkZSBmYWlsZWQgdG8gY29udmVyZ2UgYWZ0ZXIgMTUgaXRlcmF0aW9uc1wiKTtcbiAgcmV0dXJuIE5hTjtcbn0iLCJpbXBvcnQgbWxmbiBmcm9tICcuLi9jb21tb24vbWxmbic7XG5pbXBvcnQgZTBmbiBmcm9tICcuLi9jb21tb24vZTBmbic7XG5pbXBvcnQgZTFmbiBmcm9tICcuLi9jb21tb24vZTFmbic7XG5pbXBvcnQgZTJmbiBmcm9tICcuLi9jb21tb24vZTJmbic7XG5pbXBvcnQgZTNmbiBmcm9tICcuLi9jb21tb24vZTNmbic7XG5pbXBvcnQgZ04gZnJvbSAnLi4vY29tbW9uL2dOJztcbmltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbG9uJztcbmltcG9ydCBhZGp1c3RfbGF0IGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbGF0JztcbmltcG9ydCBpbWxmbiBmcm9tICcuLi9jb21tb24vaW1sZm4nO1xuaW1wb3J0IHtIQUxGX1BJLCBFUFNMTn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICBpZiAoIXRoaXMuc3BoZXJlKSB7XG4gICAgdGhpcy5lMCA9IGUwZm4odGhpcy5lcyk7XG4gICAgdGhpcy5lMSA9IGUxZm4odGhpcy5lcyk7XG4gICAgdGhpcy5lMiA9IGUyZm4odGhpcy5lcyk7XG4gICAgdGhpcy5lMyA9IGUzZm4odGhpcy5lcyk7XG4gICAgdGhpcy5tbDAgPSB0aGlzLmEgKiBtbGZuKHRoaXMuZTAsIHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMsIHRoaXMubGF0MCk7XG4gIH1cbn1cblxuLyogQ2Fzc2luaSBmb3J3YXJkIGVxdWF0aW9ucy0tbWFwcGluZyBsYXQsbG9uZyB0byB4LHlcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmQocCkge1xuXG4gIC8qIEZvcndhcmQgZXF1YXRpb25zXG4gICAgICAtLS0tLS0tLS0tLS0tLS0tLSovXG4gIHZhciB4LCB5O1xuICB2YXIgbGFtID0gcC54O1xuICB2YXIgcGhpID0gcC55O1xuICBsYW0gPSBhZGp1c3RfbG9uKGxhbSAtIHRoaXMubG9uZzApO1xuXG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIHggPSB0aGlzLmEgKiBNYXRoLmFzaW4oTWF0aC5jb3MocGhpKSAqIE1hdGguc2luKGxhbSkpO1xuICAgIHkgPSB0aGlzLmEgKiAoTWF0aC5hdGFuMihNYXRoLnRhbihwaGkpLCBNYXRoLmNvcyhsYW0pKSAtIHRoaXMubGF0MCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy9lbGxpcHNvaWRcbiAgICB2YXIgc2lucGhpID0gTWF0aC5zaW4ocGhpKTtcbiAgICB2YXIgY29zcGhpID0gTWF0aC5jb3MocGhpKTtcbiAgICB2YXIgbmwgPSBnTih0aGlzLmEsIHRoaXMuZSwgc2lucGhpKTtcbiAgICB2YXIgdGwgPSBNYXRoLnRhbihwaGkpICogTWF0aC50YW4ocGhpKTtcbiAgICB2YXIgYWwgPSBsYW0gKiBNYXRoLmNvcyhwaGkpO1xuICAgIHZhciBhc3EgPSBhbCAqIGFsO1xuICAgIHZhciBjbCA9IHRoaXMuZXMgKiBjb3NwaGkgKiBjb3NwaGkgLyAoMSAtIHRoaXMuZXMpO1xuICAgIHZhciBtbCA9IHRoaXMuYSAqIG1sZm4odGhpcy5lMCwgdGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMywgcGhpKTtcblxuICAgIHggPSBubCAqIGFsICogKDEgLSBhc3EgKiB0bCAqICgxIC8gNiAtICg4IC0gdGwgKyA4ICogY2wpICogYXNxIC8gMTIwKSk7XG4gICAgeSA9IG1sIC0gdGhpcy5tbDAgKyBubCAqIHNpbnBoaSAvIGNvc3BoaSAqIGFzcSAqICgwLjUgKyAoNSAtIHRsICsgNiAqIGNsKSAqIGFzcSAvIDI0KTtcblxuXG4gIH1cblxuICBwLnggPSB4ICsgdGhpcy54MDtcbiAgcC55ID0geSArIHRoaXMueTA7XG4gIHJldHVybiBwO1xufVxuXG4vKiBJbnZlcnNlIGVxdWF0aW9uc1xuICAtLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHAueCAtPSB0aGlzLngwO1xuICBwLnkgLT0gdGhpcy55MDtcbiAgdmFyIHggPSBwLnggLyB0aGlzLmE7XG4gIHZhciB5ID0gcC55IC8gdGhpcy5hO1xuICB2YXIgcGhpLCBsYW07XG5cbiAgaWYgKHRoaXMuc3BoZXJlKSB7XG4gICAgdmFyIGRkID0geSArIHRoaXMubGF0MDtcbiAgICBwaGkgPSBNYXRoLmFzaW4oTWF0aC5zaW4oZGQpICogTWF0aC5jb3MoeCkpO1xuICAgIGxhbSA9IE1hdGguYXRhbjIoTWF0aC50YW4oeCksIE1hdGguY29zKGRkKSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgLyogZWxsaXBzb2lkICovXG4gICAgdmFyIG1sMSA9IHRoaXMubWwwIC8gdGhpcy5hICsgeTtcbiAgICB2YXIgcGhpMSA9IGltbGZuKG1sMSwgdGhpcy5lMCwgdGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMyk7XG4gICAgaWYgKE1hdGguYWJzKE1hdGguYWJzKHBoaTEpIC0gSEFMRl9QSSkgPD0gRVBTTE4pIHtcbiAgICAgIHAueCA9IHRoaXMubG9uZzA7XG4gICAgICBwLnkgPSBIQUxGX1BJO1xuICAgICAgaWYgKHkgPCAwKSB7XG4gICAgICAgIHAueSAqPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICB2YXIgbmwxID0gZ04odGhpcy5hLCB0aGlzLmUsIE1hdGguc2luKHBoaTEpKTtcblxuICAgIHZhciBybDEgPSBubDEgKiBubDEgKiBubDEgLyB0aGlzLmEgLyB0aGlzLmEgKiAoMSAtIHRoaXMuZXMpO1xuICAgIHZhciB0bDEgPSBNYXRoLnBvdyhNYXRoLnRhbihwaGkxKSwgMik7XG4gICAgdmFyIGRsID0geCAqIHRoaXMuYSAvIG5sMTtcbiAgICB2YXIgZHNxID0gZGwgKiBkbDtcbiAgICBwaGkgPSBwaGkxIC0gbmwxICogTWF0aC50YW4ocGhpMSkgLyBybDEgKiBkbCAqIGRsICogKDAuNSAtICgxICsgMyAqIHRsMSkgKiBkbCAqIGRsIC8gMjQpO1xuICAgIGxhbSA9IGRsICogKDEgLSBkc3EgKiAodGwxIC8gMyArICgxICsgMyAqIHRsMSkgKiB0bDEgKiBkc3EgLyAxNSkpIC8gTWF0aC5jb3MocGhpMSk7XG5cbiAgfVxuXG4gIHAueCA9IGFkanVzdF9sb24obGFtICsgdGhpcy5sb25nMCk7XG4gIHAueSA9IGFkanVzdF9sYXQocGhpKTtcbiAgcmV0dXJuIHA7XG5cbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIkNhc3NpbmlcIiwgXCJDYXNzaW5pX1NvbGRuZXJcIiwgXCJjYXNzXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihlY2NlbnQsIHNpbnBoaSkge1xuICB2YXIgY29uO1xuICBpZiAoZWNjZW50ID4gMS4wZS03KSB7XG4gICAgY29uID0gZWNjZW50ICogc2lucGhpO1xuICAgIHJldHVybiAoKDEgLSBlY2NlbnQgKiBlY2NlbnQpICogKHNpbnBoaSAvICgxIC0gY29uICogY29uKSAtICgwLjUgLyBlY2NlbnQpICogTWF0aC5sb2coKDEgLSBjb24pIC8gKDEgKyBjb24pKSkpO1xuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiAoMiAqIHNpbnBoaSk7XG4gIH1cbn0iLCJcbmltcG9ydCB7SEFMRl9QSSwgRVBTTE4sIEZPUlRQSX0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmltcG9ydCBxc2ZueiBmcm9tICcuLi9jb21tb24vcXNmbnonO1xuaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuXG4vKlxuICByZWZlcmVuY2VcbiAgICBcIk5ldyBFcXVhbC1BcmVhIE1hcCBQcm9qZWN0aW9ucyBmb3IgTm9uY2lyY3VsYXIgUmVnaW9uc1wiLCBKb2huIFAuIFNueWRlcixcbiAgICBUaGUgQW1lcmljYW4gQ2FydG9ncmFwaGVyLCBWb2wgMTUsIE5vLiA0LCBPY3RvYmVyIDE5ODgsIHBwLiAzNDEtMzU1LlxuICAqL1xuXG5leHBvcnQgdmFyIFNfUE9MRSA9IDE7XG5cbmV4cG9ydCB2YXIgTl9QT0xFID0gMjtcbmV4cG9ydCB2YXIgRVFVSVQgPSAzO1xuZXhwb3J0IHZhciBPQkxJUSA9IDQ7XG5cbi8qIEluaXRpYWxpemUgdGhlIExhbWJlcnQgQXppbXV0aGFsIEVxdWFsIEFyZWEgcHJvamVjdGlvblxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gIHZhciB0ID0gTWF0aC5hYnModGhpcy5sYXQwKTtcbiAgaWYgKE1hdGguYWJzKHQgLSBIQUxGX1BJKSA8IEVQU0xOKSB7XG4gICAgdGhpcy5tb2RlID0gdGhpcy5sYXQwIDwgMCA/IHRoaXMuU19QT0xFIDogdGhpcy5OX1BPTEU7XG4gIH1cbiAgZWxzZSBpZiAoTWF0aC5hYnModCkgPCBFUFNMTikge1xuICAgIHRoaXMubW9kZSA9IHRoaXMuRVFVSVQ7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5tb2RlID0gdGhpcy5PQkxJUTtcbiAgfVxuICBpZiAodGhpcy5lcyA+IDApIHtcbiAgICB2YXIgc2lucGhpO1xuXG4gICAgdGhpcy5xcCA9IHFzZm56KHRoaXMuZSwgMSk7XG4gICAgdGhpcy5tbWYgPSAwLjUgLyAoMSAtIHRoaXMuZXMpO1xuICAgIHRoaXMuYXBhID0gYXV0aHNldCh0aGlzLmVzKTtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgdGhpcy5OX1BPTEU6XG4gICAgICB0aGlzLmRkID0gMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdGhpcy5TX1BPTEU6XG4gICAgICB0aGlzLmRkID0gMTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdGhpcy5FUVVJVDpcbiAgICAgIHRoaXMucnEgPSBNYXRoLnNxcnQoMC41ICogdGhpcy5xcCk7XG4gICAgICB0aGlzLmRkID0gMSAvIHRoaXMucnE7XG4gICAgICB0aGlzLnhtZiA9IDE7XG4gICAgICB0aGlzLnltZiA9IDAuNSAqIHRoaXMucXA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIHRoaXMuT0JMSVE6XG4gICAgICB0aGlzLnJxID0gTWF0aC5zcXJ0KDAuNSAqIHRoaXMucXApO1xuICAgICAgc2lucGhpID0gTWF0aC5zaW4odGhpcy5sYXQwKTtcbiAgICAgIHRoaXMuc2luYjEgPSBxc2Zueih0aGlzLmUsIHNpbnBoaSkgLyB0aGlzLnFwO1xuICAgICAgdGhpcy5jb3NiMSA9IE1hdGguc3FydCgxIC0gdGhpcy5zaW5iMSAqIHRoaXMuc2luYjEpO1xuICAgICAgdGhpcy5kZCA9IE1hdGguY29zKHRoaXMubGF0MCkgLyAoTWF0aC5zcXJ0KDEgLSB0aGlzLmVzICogc2lucGhpICogc2lucGhpKSAqIHRoaXMucnEgKiB0aGlzLmNvc2IxKTtcbiAgICAgIHRoaXMueW1mID0gKHRoaXMueG1mID0gdGhpcy5ycSkgLyB0aGlzLmRkO1xuICAgICAgdGhpcy54bWYgKj0gdGhpcy5kZDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSB0aGlzLk9CTElRKSB7XG4gICAgICB0aGlzLnNpbnBoMCA9IE1hdGguc2luKHRoaXMubGF0MCk7XG4gICAgICB0aGlzLmNvc3BoMCA9IE1hdGguY29zKHRoaXMubGF0MCk7XG4gICAgfVxuICB9XG59XG5cbi8qIExhbWJlcnQgQXppbXV0aGFsIEVxdWFsIEFyZWEgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcblxuICAvKiBGb3J3YXJkIGVxdWF0aW9uc1xuICAgICAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuICB2YXIgeCwgeSwgY29zbGFtLCBzaW5sYW0sIHNpbnBoaSwgcSwgc2luYiwgY29zYiwgYiwgY29zcGhpO1xuICB2YXIgbGFtID0gcC54O1xuICB2YXIgcGhpID0gcC55O1xuXG4gIGxhbSA9IGFkanVzdF9sb24obGFtIC0gdGhpcy5sb25nMCk7XG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIHNpbnBoaSA9IE1hdGguc2luKHBoaSk7XG4gICAgY29zcGhpID0gTWF0aC5jb3MocGhpKTtcbiAgICBjb3NsYW0gPSBNYXRoLmNvcyhsYW0pO1xuICAgIGlmICh0aGlzLm1vZGUgPT09IHRoaXMuT0JMSVEgfHwgdGhpcy5tb2RlID09PSB0aGlzLkVRVUlUKSB7XG4gICAgICB5ID0gKHRoaXMubW9kZSA9PT0gdGhpcy5FUVVJVCkgPyAxICsgY29zcGhpICogY29zbGFtIDogMSArIHRoaXMuc2lucGgwICogc2lucGhpICsgdGhpcy5jb3NwaDAgKiBjb3NwaGkgKiBjb3NsYW07XG4gICAgICBpZiAoeSA8PSBFUFNMTikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHkgPSBNYXRoLnNxcnQoMiAvIHkpO1xuICAgICAgeCA9IHkgKiBjb3NwaGkgKiBNYXRoLnNpbihsYW0pO1xuICAgICAgeSAqPSAodGhpcy5tb2RlID09PSB0aGlzLkVRVUlUKSA/IHNpbnBoaSA6IHRoaXMuY29zcGgwICogc2lucGhpIC0gdGhpcy5zaW5waDAgKiBjb3NwaGkgKiBjb3NsYW07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gdGhpcy5OX1BPTEUgfHwgdGhpcy5tb2RlID09PSB0aGlzLlNfUE9MRSkge1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gdGhpcy5OX1BPTEUpIHtcbiAgICAgICAgY29zbGFtID0gLWNvc2xhbTtcbiAgICAgIH1cbiAgICAgIGlmIChNYXRoLmFicyhwaGkgKyB0aGlzLmxhdDApIDwgRVBTTE4pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB5ID0gRk9SVFBJIC0gcGhpICogMC41O1xuICAgICAgeSA9IDIgKiAoKHRoaXMubW9kZSA9PT0gdGhpcy5TX1BPTEUpID8gTWF0aC5jb3MoeSkgOiBNYXRoLnNpbih5KSk7XG4gICAgICB4ID0geSAqIE1hdGguc2luKGxhbSk7XG4gICAgICB5ICo9IGNvc2xhbTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgc2luYiA9IDA7XG4gICAgY29zYiA9IDA7XG4gICAgYiA9IDA7XG4gICAgY29zbGFtID0gTWF0aC5jb3MobGFtKTtcbiAgICBzaW5sYW0gPSBNYXRoLnNpbihsYW0pO1xuICAgIHNpbnBoaSA9IE1hdGguc2luKHBoaSk7XG4gICAgcSA9IHFzZm56KHRoaXMuZSwgc2lucGhpKTtcbiAgICBpZiAodGhpcy5tb2RlID09PSB0aGlzLk9CTElRIHx8IHRoaXMubW9kZSA9PT0gdGhpcy5FUVVJVCkge1xuICAgICAgc2luYiA9IHEgLyB0aGlzLnFwO1xuICAgICAgY29zYiA9IE1hdGguc3FydCgxIC0gc2luYiAqIHNpbmIpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgdGhpcy5PQkxJUTpcbiAgICAgIGIgPSAxICsgdGhpcy5zaW5iMSAqIHNpbmIgKyB0aGlzLmNvc2IxICogY29zYiAqIGNvc2xhbTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdGhpcy5FUVVJVDpcbiAgICAgIGIgPSAxICsgY29zYiAqIGNvc2xhbTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdGhpcy5OX1BPTEU6XG4gICAgICBiID0gSEFMRl9QSSArIHBoaTtcbiAgICAgIHEgPSB0aGlzLnFwIC0gcTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdGhpcy5TX1BPTEU6XG4gICAgICBiID0gcGhpIC0gSEFMRl9QSTtcbiAgICAgIHEgPSB0aGlzLnFwICsgcTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoTWF0aC5hYnMoYikgPCBFUFNMTikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgY2FzZSB0aGlzLk9CTElROlxuICAgIGNhc2UgdGhpcy5FUVVJVDpcbiAgICAgIGIgPSBNYXRoLnNxcnQoMiAvIGIpO1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gdGhpcy5PQkxJUSkge1xuICAgICAgICB5ID0gdGhpcy55bWYgKiBiICogKHRoaXMuY29zYjEgKiBzaW5iIC0gdGhpcy5zaW5iMSAqIGNvc2IgKiBjb3NsYW0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHkgPSAoYiA9IE1hdGguc3FydCgyIC8gKDEgKyBjb3NiICogY29zbGFtKSkpICogc2luYiAqIHRoaXMueW1mO1xuICAgICAgfVxuICAgICAgeCA9IHRoaXMueG1mICogYiAqIGNvc2IgKiBzaW5sYW07XG4gICAgICBicmVhaztcbiAgICBjYXNlIHRoaXMuTl9QT0xFOlxuICAgIGNhc2UgdGhpcy5TX1BPTEU6XG4gICAgICBpZiAocSA+PSAwKSB7XG4gICAgICAgIHggPSAoYiA9IE1hdGguc3FydChxKSkgKiBzaW5sYW07XG4gICAgICAgIHkgPSBjb3NsYW0gKiAoKHRoaXMubW9kZSA9PT0gdGhpcy5TX1BPTEUpID8gYiA6IC1iKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB4ID0geSA9IDA7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwLnggPSB0aGlzLmEgKiB4ICsgdGhpcy54MDtcbiAgcC55ID0gdGhpcy5hICogeSArIHRoaXMueTA7XG4gIHJldHVybiBwO1xufVxuXG4vKiBJbnZlcnNlIGVxdWF0aW9uc1xuICAtLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHAueCAtPSB0aGlzLngwO1xuICBwLnkgLT0gdGhpcy55MDtcbiAgdmFyIHggPSBwLnggLyB0aGlzLmE7XG4gIHZhciB5ID0gcC55IC8gdGhpcy5hO1xuICB2YXIgbGFtLCBwaGksIGNDZSwgc0NlLCBxLCByaG8sIGFiO1xuICBpZiAodGhpcy5zcGhlcmUpIHtcbiAgICB2YXIgY29zeiA9IDAsXG4gICAgICByaCwgc2lueiA9IDA7XG5cbiAgICByaCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICBwaGkgPSByaCAqIDAuNTtcbiAgICBpZiAocGhpID4gMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBoaSA9IDIgKiBNYXRoLmFzaW4ocGhpKTtcbiAgICBpZiAodGhpcy5tb2RlID09PSB0aGlzLk9CTElRIHx8IHRoaXMubW9kZSA9PT0gdGhpcy5FUVVJVCkge1xuICAgICAgc2lueiA9IE1hdGguc2luKHBoaSk7XG4gICAgICBjb3N6ID0gTWF0aC5jb3MocGhpKTtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICBjYXNlIHRoaXMuRVFVSVQ6XG4gICAgICBwaGkgPSAoTWF0aC5hYnMocmgpIDw9IEVQU0xOKSA/IDAgOiBNYXRoLmFzaW4oeSAqIHNpbnogLyByaCk7XG4gICAgICB4ICo9IHNpbno7XG4gICAgICB5ID0gY29zeiAqIHJoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSB0aGlzLk9CTElROlxuICAgICAgcGhpID0gKE1hdGguYWJzKHJoKSA8PSBFUFNMTikgPyB0aGlzLmxhdDAgOiBNYXRoLmFzaW4oY29zeiAqIHRoaXMuc2lucGgwICsgeSAqIHNpbnogKiB0aGlzLmNvc3BoMCAvIHJoKTtcbiAgICAgIHggKj0gc2lueiAqIHRoaXMuY29zcGgwO1xuICAgICAgeSA9IChjb3N6IC0gTWF0aC5zaW4ocGhpKSAqIHRoaXMuc2lucGgwKSAqIHJoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSB0aGlzLk5fUE9MRTpcbiAgICAgIHkgPSAteTtcbiAgICAgIHBoaSA9IEhBTEZfUEkgLSBwaGk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIHRoaXMuU19QT0xFOlxuICAgICAgcGhpIC09IEhBTEZfUEk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbGFtID0gKHkgPT09IDAgJiYgKHRoaXMubW9kZSA9PT0gdGhpcy5FUVVJVCB8fCB0aGlzLm1vZGUgPT09IHRoaXMuT0JMSVEpKSA/IDAgOiBNYXRoLmF0YW4yKHgsIHkpO1xuICB9XG4gIGVsc2Uge1xuICAgIGFiID0gMDtcbiAgICBpZiAodGhpcy5tb2RlID09PSB0aGlzLk9CTElRIHx8IHRoaXMubW9kZSA9PT0gdGhpcy5FUVVJVCkge1xuICAgICAgeCAvPSB0aGlzLmRkO1xuICAgICAgeSAqPSB0aGlzLmRkO1xuICAgICAgcmhvID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgICAgaWYgKHJobyA8IEVQU0xOKSB7XG4gICAgICAgIHAueCA9IHRoaXMubG9uZzA7XG4gICAgICAgIHAueSA9IHRoaXMubGF0MDtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9XG4gICAgICBzQ2UgPSAyICogTWF0aC5hc2luKDAuNSAqIHJobyAvIHRoaXMucnEpO1xuICAgICAgY0NlID0gTWF0aC5jb3Moc0NlKTtcbiAgICAgIHggKj0gKHNDZSA9IE1hdGguc2luKHNDZSkpO1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gdGhpcy5PQkxJUSkge1xuICAgICAgICBhYiA9IGNDZSAqIHRoaXMuc2luYjEgKyB5ICogc0NlICogdGhpcy5jb3NiMSAvIHJobztcbiAgICAgICAgcSA9IHRoaXMucXAgKiBhYjtcbiAgICAgICAgeSA9IHJobyAqIHRoaXMuY29zYjEgKiBjQ2UgLSB5ICogdGhpcy5zaW5iMSAqIHNDZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBhYiA9IHkgKiBzQ2UgLyByaG87XG4gICAgICAgIHEgPSB0aGlzLnFwICogYWI7XG4gICAgICAgIHkgPSByaG8gKiBjQ2U7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gdGhpcy5OX1BPTEUgfHwgdGhpcy5tb2RlID09PSB0aGlzLlNfUE9MRSkge1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gdGhpcy5OX1BPTEUpIHtcbiAgICAgICAgeSA9IC15O1xuICAgICAgfVxuICAgICAgcSA9ICh4ICogeCArIHkgKiB5KTtcbiAgICAgIGlmICghcSkge1xuICAgICAgICBwLnggPSB0aGlzLmxvbmcwO1xuICAgICAgICBwLnkgPSB0aGlzLmxhdDA7XG4gICAgICAgIHJldHVybiBwO1xuICAgICAgfVxuICAgICAgYWIgPSAxIC0gcSAvIHRoaXMucXA7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSB0aGlzLlNfUE9MRSkge1xuICAgICAgICBhYiA9IC1hYjtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFtID0gTWF0aC5hdGFuMih4LCB5KTtcbiAgICBwaGkgPSBhdXRobGF0KE1hdGguYXNpbihhYiksIHRoaXMuYXBhKTtcbiAgfVxuXG4gIHAueCA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIGxhbSk7XG4gIHAueSA9IHBoaTtcbiAgcmV0dXJuIHA7XG59XG5cbi8qIGRldGVybWluZSBsYXRpdHVkZSBmcm9tIGF1dGhhbGljIGxhdGl0dWRlICovXG52YXIgUDAwID0gMC4zMzMzMzMzMzMzMzMzMzMzMzMzMztcblxudmFyIFAwMSA9IDAuMTcyMjIyMjIyMjIyMjIyMjIyMjI7XG52YXIgUDAyID0gMC4xMDI1NzkzNjUwNzkzNjUwNzkzNjtcbnZhciBQMTAgPSAwLjA2Mzg4ODg4ODg4ODg4ODg4ODg4O1xudmFyIFAxMSA9IDAuMDY2NDAyMTE2NDAyMTE2NDAyMTE7XG52YXIgUDIwID0gMC4wMTY0MTUwMTI5NDIxOTE1NDQ0MztcblxuZnVuY3Rpb24gYXV0aHNldChlcykge1xuICB2YXIgdDtcbiAgdmFyIEFQQSA9IFtdO1xuICBBUEFbMF0gPSBlcyAqIFAwMDtcbiAgdCA9IGVzICogZXM7XG4gIEFQQVswXSArPSB0ICogUDAxO1xuICBBUEFbMV0gPSB0ICogUDEwO1xuICB0ICo9IGVzO1xuICBBUEFbMF0gKz0gdCAqIFAwMjtcbiAgQVBBWzFdICs9IHQgKiBQMTE7XG4gIEFQQVsyXSA9IHQgKiBQMjA7XG4gIHJldHVybiBBUEE7XG59XG5cbmZ1bmN0aW9uIGF1dGhsYXQoYmV0YSwgQVBBKSB7XG4gIHZhciB0ID0gYmV0YSArIGJldGE7XG4gIHJldHVybiAoYmV0YSArIEFQQVswXSAqIE1hdGguc2luKHQpICsgQVBBWzFdICogTWF0aC5zaW4odCArIHQpICsgQVBBWzJdICogTWF0aC5zaW4odCArIHQgKyB0KSk7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJMYW1iZXJ0IEF6aW11dGhhbCBFcXVhbCBBcmVhXCIsIFwiTGFtYmVydF9BemltdXRoYWxfRXF1YWxfQXJlYVwiLCBcImxhZWFcIl07XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGluaXQsXG4gIGZvcndhcmQ6IGZvcndhcmQsXG4gIGludmVyc2U6IGludmVyc2UsXG4gIG5hbWVzOiBuYW1lcyxcbiAgU19QT0xFOiBTX1BPTEUsXG4gIE5fUE9MRTogTl9QT0xFLFxuICBFUVVJVDogRVFVSVQsXG4gIE9CTElROiBPQkxJUVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgaWYgKE1hdGguYWJzKHgpID4gMSkge1xuICAgIHggPSAoeCA+IDEpID8gMSA6IC0xO1xuICB9XG4gIHJldHVybiBNYXRoLmFzaW4oeCk7XG59IiwiaW1wb3J0IG1zZm56IGZyb20gJy4uL2NvbW1vbi9tc2Zueic7XG5pbXBvcnQgcXNmbnogZnJvbSAnLi4vY29tbW9uL3FzZm56JztcbmltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbG9uJztcbmltcG9ydCBhc2lueiBmcm9tICcuLi9jb21tb24vYXNpbnonO1xuaW1wb3J0IHtFUFNMTn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxhdDEgKyB0aGlzLmxhdDIpIDwgRVBTTE4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy50ZW1wID0gdGhpcy5iIC8gdGhpcy5hO1xuICB0aGlzLmVzID0gMSAtIE1hdGgucG93KHRoaXMudGVtcCwgMik7XG4gIHRoaXMuZTMgPSBNYXRoLnNxcnQodGhpcy5lcyk7XG5cbiAgdGhpcy5zaW5fcG8gPSBNYXRoLnNpbih0aGlzLmxhdDEpO1xuICB0aGlzLmNvc19wbyA9IE1hdGguY29zKHRoaXMubGF0MSk7XG4gIHRoaXMudDEgPSB0aGlzLnNpbl9wbztcbiAgdGhpcy5jb24gPSB0aGlzLnNpbl9wbztcbiAgdGhpcy5tczEgPSBtc2Zueih0aGlzLmUzLCB0aGlzLnNpbl9wbywgdGhpcy5jb3NfcG8pO1xuICB0aGlzLnFzMSA9IHFzZm56KHRoaXMuZTMsIHRoaXMuc2luX3BvKTtcblxuICB0aGlzLnNpbl9wbyA9IE1hdGguc2luKHRoaXMubGF0Mik7XG4gIHRoaXMuY29zX3BvID0gTWF0aC5jb3ModGhpcy5sYXQyKTtcbiAgdGhpcy50MiA9IHRoaXMuc2luX3BvO1xuICB0aGlzLm1zMiA9IG1zZm56KHRoaXMuZTMsIHRoaXMuc2luX3BvLCB0aGlzLmNvc19wbyk7XG4gIHRoaXMucXMyID0gcXNmbnoodGhpcy5lMywgdGhpcy5zaW5fcG8pO1xuXG4gIHRoaXMuc2luX3BvID0gTWF0aC5zaW4odGhpcy5sYXQwKTtcbiAgdGhpcy5jb3NfcG8gPSBNYXRoLmNvcyh0aGlzLmxhdDApO1xuICB0aGlzLnQzID0gdGhpcy5zaW5fcG87XG4gIHRoaXMucXMwID0gcXNmbnoodGhpcy5lMywgdGhpcy5zaW5fcG8pO1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxhdDEgLSB0aGlzLmxhdDIpID4gRVBTTE4pIHtcbiAgICB0aGlzLm5zMCA9ICh0aGlzLm1zMSAqIHRoaXMubXMxIC0gdGhpcy5tczIgKiB0aGlzLm1zMikgLyAodGhpcy5xczIgLSB0aGlzLnFzMSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5uczAgPSB0aGlzLmNvbjtcbiAgfVxuICB0aGlzLmMgPSB0aGlzLm1zMSAqIHRoaXMubXMxICsgdGhpcy5uczAgKiB0aGlzLnFzMTtcbiAgdGhpcy5yaCA9IHRoaXMuYSAqIE1hdGguc3FydCh0aGlzLmMgLSB0aGlzLm5zMCAqIHRoaXMucXMwKSAvIHRoaXMubnMwO1xufVxuXG4vKiBBbGJlcnMgQ29uaWNhbCBFcXVhbCBBcmVhIGZvcndhcmQgZXF1YXRpb25zLS1tYXBwaW5nIGxhdCxsb25nIHRvIHgseVxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcblxuICB2YXIgbG9uID0gcC54O1xuICB2YXIgbGF0ID0gcC55O1xuXG4gIHRoaXMuc2luX3BoaSA9IE1hdGguc2luKGxhdCk7XG4gIHRoaXMuY29zX3BoaSA9IE1hdGguY29zKGxhdCk7XG5cbiAgdmFyIHFzID0gcXNmbnoodGhpcy5lMywgdGhpcy5zaW5fcGhpKTtcbiAgdmFyIHJoMSA9IHRoaXMuYSAqIE1hdGguc3FydCh0aGlzLmMgLSB0aGlzLm5zMCAqIHFzKSAvIHRoaXMubnMwO1xuICB2YXIgdGhldGEgPSB0aGlzLm5zMCAqIGFkanVzdF9sb24obG9uIC0gdGhpcy5sb25nMCk7XG4gIHZhciB4ID0gcmgxICogTWF0aC5zaW4odGhldGEpICsgdGhpcy54MDtcbiAgdmFyIHkgPSB0aGlzLnJoIC0gcmgxICogTWF0aC5jb3ModGhldGEpICsgdGhpcy55MDtcblxuICBwLnggPSB4O1xuICBwLnkgPSB5O1xuICByZXR1cm4gcDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICB2YXIgcmgxLCBxcywgY29uLCB0aGV0YSwgbG9uLCBsYXQ7XG5cbiAgcC54IC09IHRoaXMueDA7XG4gIHAueSA9IHRoaXMucmggLSBwLnkgKyB0aGlzLnkwO1xuICBpZiAodGhpcy5uczAgPj0gMCkge1xuICAgIHJoMSA9IE1hdGguc3FydChwLnggKiBwLnggKyBwLnkgKiBwLnkpO1xuICAgIGNvbiA9IDE7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmgxID0gLU1hdGguc3FydChwLnggKiBwLnggKyBwLnkgKiBwLnkpO1xuICAgIGNvbiA9IC0xO1xuICB9XG4gIHRoZXRhID0gMDtcbiAgaWYgKHJoMSAhPT0gMCkge1xuICAgIHRoZXRhID0gTWF0aC5hdGFuMihjb24gKiBwLngsIGNvbiAqIHAueSk7XG4gIH1cbiAgY29uID0gcmgxICogdGhpcy5uczAgLyB0aGlzLmE7XG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIGxhdCA9IE1hdGguYXNpbigodGhpcy5jIC0gY29uICogY29uKSAvICgyICogdGhpcy5uczApKTtcbiAgfVxuICBlbHNlIHtcbiAgICBxcyA9ICh0aGlzLmMgLSBjb24gKiBjb24pIC8gdGhpcy5uczA7XG4gICAgbGF0ID0gdGhpcy5waGkxeih0aGlzLmUzLCBxcyk7XG4gIH1cblxuICBsb24gPSBhZGp1c3RfbG9uKHRoZXRhIC8gdGhpcy5uczAgKyB0aGlzLmxvbmcwKTtcbiAgcC54ID0gbG9uO1xuICBwLnkgPSBsYXQ7XG4gIHJldHVybiBwO1xufVxuXG4vKiBGdW5jdGlvbiB0byBjb21wdXRlIHBoaTEsIHRoZSBsYXRpdHVkZSBmb3IgdGhlIGludmVyc2Ugb2YgdGhlXG4gICBBbGJlcnMgQ29uaWNhbCBFcXVhbC1BcmVhIHByb2plY3Rpb24uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBwaGkxeihlY2NlbnQsIHFzKSB7XG4gIHZhciBzaW5waGksIGNvc3BoaSwgY29uLCBjb20sIGRwaGk7XG4gIHZhciBwaGkgPSBhc2lueigwLjUgKiBxcyk7XG4gIGlmIChlY2NlbnQgPCBFUFNMTikge1xuICAgIHJldHVybiBwaGk7XG4gIH1cblxuICB2YXIgZWNjbnRzID0gZWNjZW50ICogZWNjZW50O1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSAyNTsgaSsrKSB7XG4gICAgc2lucGhpID0gTWF0aC5zaW4ocGhpKTtcbiAgICBjb3NwaGkgPSBNYXRoLmNvcyhwaGkpO1xuICAgIGNvbiA9IGVjY2VudCAqIHNpbnBoaTtcbiAgICBjb20gPSAxIC0gY29uICogY29uO1xuICAgIGRwaGkgPSAwLjUgKiBjb20gKiBjb20gLyBjb3NwaGkgKiAocXMgLyAoMSAtIGVjY250cykgLSBzaW5waGkgLyBjb20gKyAwLjUgLyBlY2NlbnQgKiBNYXRoLmxvZygoMSAtIGNvbikgLyAoMSArIGNvbikpKTtcbiAgICBwaGkgPSBwaGkgKyBkcGhpO1xuICAgIGlmIChNYXRoLmFicyhkcGhpKSA8PSAxZS03KSB7XG4gICAgICByZXR1cm4gcGhpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIkFsYmVyc19Db25pY19FcXVhbF9BcmVhXCIsIFwiQWxiZXJzXCIsIFwiYWVhXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXMsXG4gIHBoaTF6OiBwaGkxelxufTtcbiIsImltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbG9uJztcbmltcG9ydCBhc2lueiBmcm9tICcuLi9jb21tb24vYXNpbnonO1xuaW1wb3J0IHtFUFNMTn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbi8qXG4gIHJlZmVyZW5jZTpcbiAgICBXb2xmcmFtIE1hdGh3b3JsZCBcIkdub21vbmljIFByb2plY3Rpb25cIlxuICAgIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vR25vbW9uaWNQcm9qZWN0aW9uLmh0bWxcbiAgICBBY2Nlc3NlZDogMTJ0aCBOb3ZlbWJlciAyMDA5XG4gICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHtcblxuICAvKiBQbGFjZSBwYXJhbWV0ZXJzIGluIHN0YXRpYyBzdG9yYWdlIGZvciBjb21tb24gdXNlXG4gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgdGhpcy5zaW5fcDE0ID0gTWF0aC5zaW4odGhpcy5sYXQwKTtcbiAgdGhpcy5jb3NfcDE0ID0gTWF0aC5jb3ModGhpcy5sYXQwKTtcbiAgLy8gQXBwcm94aW1hdGlvbiBmb3IgcHJvamVjdGluZyBwb2ludHMgdG8gdGhlIGhvcml6b24gKGluZmluaXR5KVxuICB0aGlzLmluZmluaXR5X2Rpc3QgPSAxMDAwICogdGhpcy5hO1xuICB0aGlzLnJjID0gMTtcbn1cblxuLyogR25vbW9uaWMgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIHNpbnBoaSwgY29zcGhpOyAvKiBzaW4gYW5kIGNvcyB2YWx1ZSAgICAgICAgKi9cbiAgdmFyIGRsb247IC8qIGRlbHRhIGxvbmdpdHVkZSB2YWx1ZSAgICAgICovXG4gIHZhciBjb3Nsb247IC8qIGNvcyBvZiBsb25naXR1ZGUgICAgICAgICovXG4gIHZhciBrc3A7IC8qIHNjYWxlIGZhY3RvciAgICAgICAgICAqL1xuICB2YXIgZztcbiAgdmFyIHgsIHk7XG4gIHZhciBsb24gPSBwLng7XG4gIHZhciBsYXQgPSBwLnk7XG4gIC8qIEZvcndhcmQgZXF1YXRpb25zXG4gICAgICAtLS0tLS0tLS0tLS0tLS0tLSovXG4gIGRsb24gPSBhZGp1c3RfbG9uKGxvbiAtIHRoaXMubG9uZzApO1xuXG4gIHNpbnBoaSA9IE1hdGguc2luKGxhdCk7XG4gIGNvc3BoaSA9IE1hdGguY29zKGxhdCk7XG5cbiAgY29zbG9uID0gTWF0aC5jb3MoZGxvbik7XG4gIGcgPSB0aGlzLnNpbl9wMTQgKiBzaW5waGkgKyB0aGlzLmNvc19wMTQgKiBjb3NwaGkgKiBjb3Nsb247XG4gIGtzcCA9IDE7XG4gIGlmICgoZyA+IDApIHx8IChNYXRoLmFicyhnKSA8PSBFUFNMTikpIHtcbiAgICB4ID0gdGhpcy54MCArIHRoaXMuYSAqIGtzcCAqIGNvc3BoaSAqIE1hdGguc2luKGRsb24pIC8gZztcbiAgICB5ID0gdGhpcy55MCArIHRoaXMuYSAqIGtzcCAqICh0aGlzLmNvc19wMTQgKiBzaW5waGkgLSB0aGlzLnNpbl9wMTQgKiBjb3NwaGkgKiBjb3Nsb24pIC8gZztcbiAgfVxuICBlbHNlIHtcblxuICAgIC8vIFBvaW50IGlzIGluIHRoZSBvcHBvc2luZyBoZW1pc3BoZXJlIGFuZCBpcyB1bnByb2plY3RhYmxlXG4gICAgLy8gV2Ugc3RpbGwgbmVlZCB0byByZXR1cm4gYSByZWFzb25hYmxlIHBvaW50LCBzbyB3ZSBwcm9qZWN0XG4gICAgLy8gdG8gaW5maW5pdHksIG9uIGEgYmVhcmluZ1xuICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlIG5vcnRoZXJuIGhlbWlzcGhlcmUgZXF1aXZhbGVudFxuICAgIC8vIFRoaXMgaXMgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gZm9yIHNob3J0IHNoYXBlcyBhbmQgbGluZXMgdGhhdFxuICAgIC8vIHN0cmFkZGxlIHRoZSBob3Jpem9uLlxuXG4gICAgeCA9IHRoaXMueDAgKyB0aGlzLmluZmluaXR5X2Rpc3QgKiBjb3NwaGkgKiBNYXRoLnNpbihkbG9uKTtcbiAgICB5ID0gdGhpcy55MCArIHRoaXMuaW5maW5pdHlfZGlzdCAqICh0aGlzLmNvc19wMTQgKiBzaW5waGkgLSB0aGlzLnNpbl9wMTQgKiBjb3NwaGkgKiBjb3Nsb24pO1xuXG4gIH1cbiAgcC54ID0geDtcbiAgcC55ID0geTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgdmFyIHJoOyAvKiBSaG8gKi9cbiAgdmFyIHNpbmMsIGNvc2M7XG4gIHZhciBjO1xuICB2YXIgbG9uLCBsYXQ7XG5cbiAgLyogSW52ZXJzZSBlcXVhdGlvbnNcbiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgcC54ID0gKHAueCAtIHRoaXMueDApIC8gdGhpcy5hO1xuICBwLnkgPSAocC55IC0gdGhpcy55MCkgLyB0aGlzLmE7XG5cbiAgcC54IC89IHRoaXMuazA7XG4gIHAueSAvPSB0aGlzLmswO1xuXG4gIGlmICgocmggPSBNYXRoLnNxcnQocC54ICogcC54ICsgcC55ICogcC55KSkpIHtcbiAgICBjID0gTWF0aC5hdGFuMihyaCwgdGhpcy5yYyk7XG4gICAgc2luYyA9IE1hdGguc2luKGMpO1xuICAgIGNvc2MgPSBNYXRoLmNvcyhjKTtcblxuICAgIGxhdCA9IGFzaW56KGNvc2MgKiB0aGlzLnNpbl9wMTQgKyAocC55ICogc2luYyAqIHRoaXMuY29zX3AxNCkgLyByaCk7XG4gICAgbG9uID0gTWF0aC5hdGFuMihwLnggKiBzaW5jLCByaCAqIHRoaXMuY29zX3AxNCAqIGNvc2MgLSBwLnkgKiB0aGlzLnNpbl9wMTQgKiBzaW5jKTtcbiAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBsb24pO1xuICB9XG4gIGVsc2Uge1xuICAgIGxhdCA9IHRoaXMucGhpYzA7XG4gICAgbG9uID0gMDtcbiAgfVxuXG4gIHAueCA9IGxvbjtcbiAgcC55ID0gbGF0O1xuICByZXR1cm4gcDtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcImdub21cIl07XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGluaXQsXG4gIGZvcndhcmQ6IGZvcndhcmQsXG4gIGludmVyc2U6IGludmVyc2UsXG4gIG5hbWVzOiBuYW1lc1xufTtcbiIsImltcG9ydCB7SEFMRl9QSX0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVjY2VudCwgcSkge1xuICB2YXIgdGVtcCA9IDEgLSAoMSAtIGVjY2VudCAqIGVjY2VudCkgLyAoMiAqIGVjY2VudCkgKiBNYXRoLmxvZygoMSAtIGVjY2VudCkgLyAoMSArIGVjY2VudCkpO1xuICBpZiAoTWF0aC5hYnMoTWF0aC5hYnMocSkgLSB0ZW1wKSA8IDEuMEUtNikge1xuICAgIGlmIChxIDwgMCkge1xuICAgICAgcmV0dXJuICgtMSAqIEhBTEZfUEkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBIQUxGX1BJO1xuICAgIH1cbiAgfVxuICAvL3ZhciBwaGkgPSAwLjUqIHEvKDEtZWNjZW50KmVjY2VudCk7XG4gIHZhciBwaGkgPSBNYXRoLmFzaW4oMC41ICogcSk7XG4gIHZhciBkcGhpO1xuICB2YXIgc2luX3BoaTtcbiAgdmFyIGNvc19waGk7XG4gIHZhciBjb247XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzA7IGkrKykge1xuICAgIHNpbl9waGkgPSBNYXRoLnNpbihwaGkpO1xuICAgIGNvc19waGkgPSBNYXRoLmNvcyhwaGkpO1xuICAgIGNvbiA9IGVjY2VudCAqIHNpbl9waGk7XG4gICAgZHBoaSA9IE1hdGgucG93KDEgLSBjb24gKiBjb24sIDIpIC8gKDIgKiBjb3NfcGhpKSAqIChxIC8gKDEgLSBlY2NlbnQgKiBlY2NlbnQpIC0gc2luX3BoaSAvICgxIC0gY29uICogY29uKSArIDAuNSAvIGVjY2VudCAqIE1hdGgubG9nKCgxIC0gY29uKSAvICgxICsgY29uKSkpO1xuICAgIHBoaSArPSBkcGhpO1xuICAgIGlmIChNYXRoLmFicyhkcGhpKSA8PSAwLjAwMDAwMDAwMDEpIHtcbiAgICAgIHJldHVybiBwaGk7XG4gICAgfVxuICB9XG5cbiAgLy9jb25zb2xlLmxvZyhcIklRU0ZOLUNPTlY6TGF0aXR1ZGUgZmFpbGVkIHRvIGNvbnZlcmdlIGFmdGVyIDMwIGl0ZXJhdGlvbnNcIik7XG4gIHJldHVybiBOYU47XG59XG4iLCJpbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5pbXBvcnQgcXNmbnogZnJvbSAnLi4vY29tbW9uL3FzZm56JztcbmltcG9ydCBtc2ZueiBmcm9tICcuLi9jb21tb24vbXNmbnonO1xuaW1wb3J0IGlxc2ZueiBmcm9tICcuLi9jb21tb24vaXFzZm56JztcblxuLypcbiAgcmVmZXJlbmNlOlxuICAgIFwiQ2FydG9ncmFwaGljIFByb2plY3Rpb24gUHJvY2VkdXJlcyBmb3IgdGhlIFVOSVggRW52aXJvbm1lbnQtXG4gICAgQSBVc2VyJ3MgTWFudWFsXCIgYnkgR2VyYWxkIEkuIEV2ZW5kZW4sXG4gICAgVVNHUyBPcGVuIEZpbGUgUmVwb3J0IDkwLTI4NGFuZCBSZWxlYXNlIDQgSW50ZXJpbSBSZXBvcnRzICgyMDAzKVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAvL25vLW9wXG4gIGlmICghdGhpcy5zcGhlcmUpIHtcbiAgICB0aGlzLmswID0gbXNmbnoodGhpcy5lLCBNYXRoLnNpbih0aGlzLmxhdF90cyksIE1hdGguY29zKHRoaXMubGF0X3RzKSk7XG4gIH1cbn1cblxuLyogQ3lsaW5kcmljYWwgRXF1YWwgQXJlYSBmb3J3YXJkIGVxdWF0aW9ucy0tbWFwcGluZyBsYXQsbG9uZyB0byB4LHlcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmQocCkge1xuICB2YXIgbG9uID0gcC54O1xuICB2YXIgbGF0ID0gcC55O1xuICB2YXIgeCwgeTtcbiAgLyogRm9yd2FyZCBlcXVhdGlvbnNcbiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgdmFyIGRsb24gPSBhZGp1c3RfbG9uKGxvbiAtIHRoaXMubG9uZzApO1xuICBpZiAodGhpcy5zcGhlcmUpIHtcbiAgICB4ID0gdGhpcy54MCArIHRoaXMuYSAqIGRsb24gKiBNYXRoLmNvcyh0aGlzLmxhdF90cyk7XG4gICAgeSA9IHRoaXMueTAgKyB0aGlzLmEgKiBNYXRoLnNpbihsYXQpIC8gTWF0aC5jb3ModGhpcy5sYXRfdHMpO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBxcyA9IHFzZm56KHRoaXMuZSwgTWF0aC5zaW4obGF0KSk7XG4gICAgeCA9IHRoaXMueDAgKyB0aGlzLmEgKiB0aGlzLmswICogZGxvbjtcbiAgICB5ID0gdGhpcy55MCArIHRoaXMuYSAqIHFzICogMC41IC8gdGhpcy5rMDtcbiAgfVxuXG4gIHAueCA9IHg7XG4gIHAueSA9IHk7XG4gIHJldHVybiBwO1xufVxuXG4vKiBDeWxpbmRyaWNhbCBFcXVhbCBBcmVhIGludmVyc2UgZXF1YXRpb25zLS1tYXBwaW5nIHgseSB0byBsYXQvbG9uZ1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHAueCAtPSB0aGlzLngwO1xuICBwLnkgLT0gdGhpcy55MDtcbiAgdmFyIGxvbiwgbGF0O1xuXG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIChwLnggLyB0aGlzLmEpIC8gTWF0aC5jb3ModGhpcy5sYXRfdHMpKTtcbiAgICBsYXQgPSBNYXRoLmFzaW4oKHAueSAvIHRoaXMuYSkgKiBNYXRoLmNvcyh0aGlzLmxhdF90cykpO1xuICB9XG4gIGVsc2Uge1xuICAgIGxhdCA9IGlxc2Zueih0aGlzLmUsIDIgKiBwLnkgKiB0aGlzLmswIC8gdGhpcy5hKTtcbiAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBwLnggLyAodGhpcy5hICogdGhpcy5rMCkpO1xuICB9XG5cbiAgcC54ID0gbG9uO1xuICBwLnkgPSBsYXQ7XG4gIHJldHVybiBwO1xufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wiY2VhXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJpbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5pbXBvcnQgYWRqdXN0X2xhdCBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xhdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuXG4gIHRoaXMueDAgPSB0aGlzLngwIHx8IDA7XG4gIHRoaXMueTAgPSB0aGlzLnkwIHx8IDA7XG4gIHRoaXMubGF0MCA9IHRoaXMubGF0MCB8fCAwO1xuICB0aGlzLmxvbmcwID0gdGhpcy5sb25nMCB8fCAwO1xuICB0aGlzLmxhdF90cyA9IHRoaXMubGF0X3RzIHx8IDA7XG4gIHRoaXMudGl0bGUgPSB0aGlzLnRpdGxlIHx8IFwiRXF1aWRpc3RhbnQgQ3lsaW5kcmljYWwgKFBsYXRlIENhcnJlKVwiO1xuXG4gIHRoaXMucmMgPSBNYXRoLmNvcyh0aGlzLmxhdF90cyk7XG59XG5cbi8vIGZvcndhcmQgZXF1YXRpb25zLS1tYXBwaW5nIGxhdCxsb25nIHRvIHgseVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcblxuICB2YXIgbG9uID0gcC54O1xuICB2YXIgbGF0ID0gcC55O1xuXG4gIHZhciBkbG9uID0gYWRqdXN0X2xvbihsb24gLSB0aGlzLmxvbmcwKTtcbiAgdmFyIGRsYXQgPSBhZGp1c3RfbGF0KGxhdCAtIHRoaXMubGF0MCk7XG4gIHAueCA9IHRoaXMueDAgKyAodGhpcy5hICogZGxvbiAqIHRoaXMucmMpO1xuICBwLnkgPSB0aGlzLnkwICsgKHRoaXMuYSAqIGRsYXQpO1xuICByZXR1cm4gcDtcbn1cblxuLy8gaW52ZXJzZSBlcXVhdGlvbnMtLW1hcHBpbmcgeCx5IHRvIGxhdC9sb25nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuXG4gIHZhciB4ID0gcC54O1xuICB2YXIgeSA9IHAueTtcblxuICBwLnggPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyAoKHggLSB0aGlzLngwKSAvICh0aGlzLmEgKiB0aGlzLnJjKSkpO1xuICBwLnkgPSBhZGp1c3RfbGF0KHRoaXMubGF0MCArICgoeSAtIHRoaXMueTApIC8gKHRoaXMuYSkpKTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJFcXVpcmVjdGFuZ3VsYXJcIiwgXCJFcXVpZGlzdGFudF9DeWxpbmRyaWNhbFwiLCBcImVxY1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IGUwZm4gZnJvbSAnLi4vY29tbW9uL2UwZm4nO1xuaW1wb3J0IGUxZm4gZnJvbSAnLi4vY29tbW9uL2UxZm4nO1xuaW1wb3J0IGUyZm4gZnJvbSAnLi4vY29tbW9uL2UyZm4nO1xuaW1wb3J0IGUzZm4gZnJvbSAnLi4vY29tbW9uL2UzZm4nO1xuaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuaW1wb3J0IGFkanVzdF9sYXQgZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sYXQnO1xuaW1wb3J0IG1sZm4gZnJvbSAnLi4vY29tbW9uL21sZm4nO1xuaW1wb3J0IHtFUFNMTn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmltcG9ydCBnTiBmcm9tICcuLi9jb21tb24vZ04nO1xudmFyIE1BWF9JVEVSID0gMjA7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAvKiBQbGFjZSBwYXJhbWV0ZXJzIGluIHN0YXRpYyBzdG9yYWdlIGZvciBjb21tb24gdXNlXG4gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgdGhpcy50ZW1wID0gdGhpcy5iIC8gdGhpcy5hO1xuICB0aGlzLmVzID0gMSAtIE1hdGgucG93KHRoaXMudGVtcCwgMik7IC8vIGRldmFpdCBldHJlIGRhbnMgdG1lcmMuanMgbWFpcyBuIHkgZXN0IHBhcyBkb25jIGplIGNvbW1lbnRlIHNpbm9uIHJldG91ciBkZSB2YWxldXJzIG51bGxlc1xuICB0aGlzLmUgPSBNYXRoLnNxcnQodGhpcy5lcyk7XG4gIHRoaXMuZTAgPSBlMGZuKHRoaXMuZXMpO1xuICB0aGlzLmUxID0gZTFmbih0aGlzLmVzKTtcbiAgdGhpcy5lMiA9IGUyZm4odGhpcy5lcyk7XG4gIHRoaXMuZTMgPSBlM2ZuKHRoaXMuZXMpO1xuICB0aGlzLm1sMCA9IHRoaXMuYSAqIG1sZm4odGhpcy5lMCwgdGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMywgdGhpcy5sYXQwKTsgLy9zaSBxdWUgZGVzIHplcm9zIGxlIGNhbGN1bCBuZSBzZSBmYWl0IHBhc1xufVxuXG4vKiBQb2x5Y29uaWMgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIGxvbiA9IHAueDtcbiAgdmFyIGxhdCA9IHAueTtcbiAgdmFyIHgsIHksIGVsO1xuICB2YXIgZGxvbiA9IGFkanVzdF9sb24obG9uIC0gdGhpcy5sb25nMCk7XG4gIGVsID0gZGxvbiAqIE1hdGguc2luKGxhdCk7XG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIGlmIChNYXRoLmFicyhsYXQpIDw9IEVQU0xOKSB7XG4gICAgICB4ID0gdGhpcy5hICogZGxvbjtcbiAgICAgIHkgPSAtMSAqIHRoaXMuYSAqIHRoaXMubGF0MDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB4ID0gdGhpcy5hICogTWF0aC5zaW4oZWwpIC8gTWF0aC50YW4obGF0KTtcbiAgICAgIHkgPSB0aGlzLmEgKiAoYWRqdXN0X2xhdChsYXQgLSB0aGlzLmxhdDApICsgKDEgLSBNYXRoLmNvcyhlbCkpIC8gTWF0aC50YW4obGF0KSk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGlmIChNYXRoLmFicyhsYXQpIDw9IEVQU0xOKSB7XG4gICAgICB4ID0gdGhpcy5hICogZGxvbjtcbiAgICAgIHkgPSAtMSAqIHRoaXMubWwwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBubCA9IGdOKHRoaXMuYSwgdGhpcy5lLCBNYXRoLnNpbihsYXQpKSAvIE1hdGgudGFuKGxhdCk7XG4gICAgICB4ID0gbmwgKiBNYXRoLnNpbihlbCk7XG4gICAgICB5ID0gdGhpcy5hICogbWxmbih0aGlzLmUwLCB0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzLCBsYXQpIC0gdGhpcy5tbDAgKyBubCAqICgxIC0gTWF0aC5jb3MoZWwpKTtcbiAgICB9XG5cbiAgfVxuICBwLnggPSB4ICsgdGhpcy54MDtcbiAgcC55ID0geSArIHRoaXMueTA7XG4gIHJldHVybiBwO1xufVxuXG4vKiBJbnZlcnNlIGVxdWF0aW9uc1xuICAtLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHZhciBsb24sIGxhdCwgeCwgeSwgaTtcbiAgdmFyIGFsLCBibDtcbiAgdmFyIHBoaSwgZHBoaTtcbiAgeCA9IHAueCAtIHRoaXMueDA7XG4gIHkgPSBwLnkgLSB0aGlzLnkwO1xuXG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIGlmIChNYXRoLmFicyh5ICsgdGhpcy5hICogdGhpcy5sYXQwKSA8PSBFUFNMTikge1xuICAgICAgbG9uID0gYWRqdXN0X2xvbih4IC8gdGhpcy5hICsgdGhpcy5sb25nMCk7XG4gICAgICBsYXQgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGFsID0gdGhpcy5sYXQwICsgeSAvIHRoaXMuYTtcbiAgICAgIGJsID0geCAqIHggLyB0aGlzLmEgLyB0aGlzLmEgKyBhbCAqIGFsO1xuICAgICAgcGhpID0gYWw7XG4gICAgICB2YXIgdGFucGhpO1xuICAgICAgZm9yIChpID0gTUFYX0lURVI7IGk7IC0taSkge1xuICAgICAgICB0YW5waGkgPSBNYXRoLnRhbihwaGkpO1xuICAgICAgICBkcGhpID0gLTEgKiAoYWwgKiAocGhpICogdGFucGhpICsgMSkgLSBwaGkgLSAwLjUgKiAocGhpICogcGhpICsgYmwpICogdGFucGhpKSAvICgocGhpIC0gYWwpIC8gdGFucGhpIC0gMSk7XG4gICAgICAgIHBoaSArPSBkcGhpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZHBoaSkgPD0gRVBTTE4pIHtcbiAgICAgICAgICBsYXQgPSBwaGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIChNYXRoLmFzaW4oeCAqIE1hdGgudGFuKHBoaSkgLyB0aGlzLmEpKSAvIE1hdGguc2luKGxhdCkpO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoTWF0aC5hYnMoeSArIHRoaXMubWwwKSA8PSBFUFNMTikge1xuICAgICAgbGF0ID0gMDtcbiAgICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIHggLyB0aGlzLmEpO1xuICAgIH1cbiAgICBlbHNlIHtcblxuICAgICAgYWwgPSAodGhpcy5tbDAgKyB5KSAvIHRoaXMuYTtcbiAgICAgIGJsID0geCAqIHggLyB0aGlzLmEgLyB0aGlzLmEgKyBhbCAqIGFsO1xuICAgICAgcGhpID0gYWw7XG4gICAgICB2YXIgY2wsIG1sbiwgbWxucCwgbWE7XG4gICAgICB2YXIgY29uO1xuICAgICAgZm9yIChpID0gTUFYX0lURVI7IGk7IC0taSkge1xuICAgICAgICBjb24gPSB0aGlzLmUgKiBNYXRoLnNpbihwaGkpO1xuICAgICAgICBjbCA9IE1hdGguc3FydCgxIC0gY29uICogY29uKSAqIE1hdGgudGFuKHBoaSk7XG4gICAgICAgIG1sbiA9IHRoaXMuYSAqIG1sZm4odGhpcy5lMCwgdGhpcy5lMSwgdGhpcy5lMiwgdGhpcy5lMywgcGhpKTtcbiAgICAgICAgbWxucCA9IHRoaXMuZTAgLSAyICogdGhpcy5lMSAqIE1hdGguY29zKDIgKiBwaGkpICsgNCAqIHRoaXMuZTIgKiBNYXRoLmNvcyg0ICogcGhpKSAtIDYgKiB0aGlzLmUzICogTWF0aC5jb3MoNiAqIHBoaSk7XG4gICAgICAgIG1hID0gbWxuIC8gdGhpcy5hO1xuICAgICAgICBkcGhpID0gKGFsICogKGNsICogbWEgKyAxKSAtIG1hIC0gMC41ICogY2wgKiAobWEgKiBtYSArIGJsKSkgLyAodGhpcy5lcyAqIE1hdGguc2luKDIgKiBwaGkpICogKG1hICogbWEgKyBibCAtIDIgKiBhbCAqIG1hKSAvICg0ICogY2wpICsgKGFsIC0gbWEpICogKGNsICogbWxucCAtIDIgLyBNYXRoLnNpbigyICogcGhpKSkgLSBtbG5wKTtcbiAgICAgICAgcGhpIC09IGRwaGk7XG4gICAgICAgIGlmIChNYXRoLmFicyhkcGhpKSA8PSBFUFNMTikge1xuICAgICAgICAgIGxhdCA9IHBoaTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2xhdD1waGk0eih0aGlzLmUsdGhpcy5lMCx0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyxhbCxibCwwLDApO1xuICAgICAgY2wgPSBNYXRoLnNxcnQoMSAtIHRoaXMuZXMgKiBNYXRoLnBvdyhNYXRoLnNpbihsYXQpLCAyKSkgKiBNYXRoLnRhbihsYXQpO1xuICAgICAgbG9uID0gYWRqdXN0X2xvbih0aGlzLmxvbmcwICsgTWF0aC5hc2luKHggKiBjbCAvIHRoaXMuYSkgLyBNYXRoLnNpbihsYXQpKTtcbiAgICB9XG4gIH1cblxuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJQb2x5Y29uaWNcIiwgXCJwb2x5XCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJpbXBvcnQge1NFQ19UT19SQUR9IGZyb20gJy4uL2NvbnN0YW50cy92YWx1ZXMnO1xuXG4vKlxuICByZWZlcmVuY2VcbiAgICBEZXBhcnRtZW50IG9mIExhbmQgYW5kIFN1cnZleSBUZWNobmljYWwgQ2lyY3VsYXIgMTk3My8zMlxuICAgICAgaHR0cDovL3d3dy5saW56LmdvdnQubnovZG9jcy9taXNjZWxsYW5lb3VzL256LW1hcC1kZWZpbml0aW9uLnBkZlxuICAgIE9TRyBUZWNobmljYWwgUmVwb3J0IDQuMVxuICAgICAgaHR0cDovL3d3dy5saW56LmdvdnQubnovZG9jcy9taXNjZWxsYW5lb3VzL256bWcucGRmXG4gICovXG5cbi8qKlxuICogaXRlcmF0aW9uczogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcmVmaW5lIGludmVyc2UgdHJhbnNmb3JtLlxuICogICAgIDAgLT4ga20gYWNjdXJhY3lcbiAqICAgICAxIC0+IG0gYWNjdXJhY3kgLS0gc3VpdGFibGUgZm9yIG1vc3QgbWFwcGluZyBhcHBsaWNhdGlvbnNcbiAqICAgICAyIC0+IG1tIGFjY3VyYWN5XG4gKi9cbmV4cG9ydCB2YXIgaXRlcmF0aW9ucyA9IDE7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICB0aGlzLkEgPSBbXTtcbiAgdGhpcy5BWzFdID0gMC42Mzk5MTc1MDczO1xuICB0aGlzLkFbMl0gPSAtMC4xMzU4Nzk3NjEzO1xuICB0aGlzLkFbM10gPSAwLjA2MzI5NDQwOTtcbiAgdGhpcy5BWzRdID0gLTAuMDI1MjY4NTM7XG4gIHRoaXMuQVs1XSA9IDAuMDExNzg3OTtcbiAgdGhpcy5BWzZdID0gLTAuMDA1NTE2MTtcbiAgdGhpcy5BWzddID0gMC4wMDI2OTA2O1xuICB0aGlzLkFbOF0gPSAtMC4wMDEzMzM7XG4gIHRoaXMuQVs5XSA9IDAuMDAwNjc7XG4gIHRoaXMuQVsxMF0gPSAtMC4wMDAzNDtcblxuICB0aGlzLkJfcmUgPSBbXTtcbiAgdGhpcy5CX2ltID0gW107XG4gIHRoaXMuQl9yZVsxXSA9IDAuNzU1Nzg1MzIyODtcbiAgdGhpcy5CX2ltWzFdID0gMDtcbiAgdGhpcy5CX3JlWzJdID0gMC4yNDkyMDQ2NDY7XG4gIHRoaXMuQl9pbVsyXSA9IDAuMDAzMzcxNTA3O1xuICB0aGlzLkJfcmVbM10gPSAtMC4wMDE1NDE3Mzk7XG4gIHRoaXMuQl9pbVszXSA9IDAuMDQxMDU4NTYwO1xuICB0aGlzLkJfcmVbNF0gPSAtMC4xMDE2MjkwNztcbiAgdGhpcy5CX2ltWzRdID0gMC4wMTcyNzYwOTtcbiAgdGhpcy5CX3JlWzVdID0gLTAuMjY2MjM0ODk7XG4gIHRoaXMuQl9pbVs1XSA9IC0wLjM2MjQ5MjE4O1xuICB0aGlzLkJfcmVbNl0gPSAtMC42ODcwOTgzO1xuICB0aGlzLkJfaW1bNl0gPSAtMS4xNjUxOTY3O1xuXG4gIHRoaXMuQ19yZSA9IFtdO1xuICB0aGlzLkNfaW0gPSBbXTtcbiAgdGhpcy5DX3JlWzFdID0gMS4zMjMxMjcwNDM5O1xuICB0aGlzLkNfaW1bMV0gPSAwO1xuICB0aGlzLkNfcmVbMl0gPSAtMC41NzcyNDU3ODk7XG4gIHRoaXMuQ19pbVsyXSA9IC0wLjAwNzgwOTU5ODtcbiAgdGhpcy5DX3JlWzNdID0gMC41MDgzMDc1MTM7XG4gIHRoaXMuQ19pbVszXSA9IC0wLjExMjIwODk1MjtcbiAgdGhpcy5DX3JlWzRdID0gLTAuMTUwOTQ3NjI7XG4gIHRoaXMuQ19pbVs0XSA9IDAuMTgyMDA2MDI7XG4gIHRoaXMuQ19yZVs1XSA9IDEuMDE0MTgxNzk7XG4gIHRoaXMuQ19pbVs1XSA9IDEuNjQ0OTc2OTY7XG4gIHRoaXMuQ19yZVs2XSA9IDEuOTY2MDU0OTtcbiAgdGhpcy5DX2ltWzZdID0gMi41MTI3NjQ1O1xuXG4gIHRoaXMuRCA9IFtdO1xuICB0aGlzLkRbMV0gPSAxLjU2MjcwMTQyNDM7XG4gIHRoaXMuRFsyXSA9IDAuNTE4NTQwNjM5ODtcbiAgdGhpcy5EWzNdID0gLTAuMDMzMzMwOTg7XG4gIHRoaXMuRFs0XSA9IC0wLjEwNTI5MDY7XG4gIHRoaXMuRFs1XSA9IC0wLjAzNjg1OTQ7XG4gIHRoaXMuRFs2XSA9IDAuMDA3MzE3O1xuICB0aGlzLkRbN10gPSAwLjAxMjIwO1xuICB0aGlzLkRbOF0gPSAwLjAwMzk0O1xuICB0aGlzLkRbOV0gPSAtMC4wMDEzO1xufVxuXG4vKipcbiAgICBOZXcgWmVhbGFuZCBNYXAgR3JpZCBGb3J3YXJkICAtIGxvbmcvbGF0IHRvIHgveVxuICAgIGxvbmcvbGF0IGluIHJhZGlhbnNcbiAgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIG47XG4gIHZhciBsb24gPSBwLng7XG4gIHZhciBsYXQgPSBwLnk7XG5cbiAgdmFyIGRlbHRhX2xhdCA9IGxhdCAtIHRoaXMubGF0MDtcbiAgdmFyIGRlbHRhX2xvbiA9IGxvbiAtIHRoaXMubG9uZzA7XG5cbiAgLy8gMS4gQ2FsY3VsYXRlIGRfcGhpIGFuZCBkX3BzaSAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkX2xhbWJkYVxuICAvLyBGb3IgdGhpcyBhbGdvcml0aG0sIGRlbHRhX2xhdGl0dWRlIGlzIGluIHNlY29uZHMgb2YgYXJjIHggMTAtNSwgc28gd2UgbmVlZCB0byBzY2FsZSB0byB0aG9zZSB1bml0cy4gTG9uZ2l0dWRlIGlzIHJhZGlhbnMuXG4gIHZhciBkX3BoaSA9IGRlbHRhX2xhdCAvIFNFQ19UT19SQUQgKiAxRS01O1xuICB2YXIgZF9sYW1iZGEgPSBkZWx0YV9sb247XG4gIHZhciBkX3BoaV9uID0gMTsgLy8gZF9waGleMFxuXG4gIHZhciBkX3BzaSA9IDA7XG4gIGZvciAobiA9IDE7IG4gPD0gMTA7IG4rKykge1xuICAgIGRfcGhpX24gPSBkX3BoaV9uICogZF9waGk7XG4gICAgZF9wc2kgPSBkX3BzaSArIHRoaXMuQVtuXSAqIGRfcGhpX247XG4gIH1cblxuICAvLyAyLiBDYWxjdWxhdGUgdGhldGFcbiAgdmFyIHRoX3JlID0gZF9wc2k7XG4gIHZhciB0aF9pbSA9IGRfbGFtYmRhO1xuXG4gIC8vIDMuIENhbGN1bGF0ZSB6XG4gIHZhciB0aF9uX3JlID0gMTtcbiAgdmFyIHRoX25faW0gPSAwOyAvLyB0aGV0YV4wXG4gIHZhciB0aF9uX3JlMTtcbiAgdmFyIHRoX25faW0xO1xuXG4gIHZhciB6X3JlID0gMDtcbiAgdmFyIHpfaW0gPSAwO1xuICBmb3IgKG4gPSAxOyBuIDw9IDY7IG4rKykge1xuICAgIHRoX25fcmUxID0gdGhfbl9yZSAqIHRoX3JlIC0gdGhfbl9pbSAqIHRoX2ltO1xuICAgIHRoX25faW0xID0gdGhfbl9pbSAqIHRoX3JlICsgdGhfbl9yZSAqIHRoX2ltO1xuICAgIHRoX25fcmUgPSB0aF9uX3JlMTtcbiAgICB0aF9uX2ltID0gdGhfbl9pbTE7XG4gICAgel9yZSA9IHpfcmUgKyB0aGlzLkJfcmVbbl0gKiB0aF9uX3JlIC0gdGhpcy5CX2ltW25dICogdGhfbl9pbTtcbiAgICB6X2ltID0gel9pbSArIHRoaXMuQl9pbVtuXSAqIHRoX25fcmUgKyB0aGlzLkJfcmVbbl0gKiB0aF9uX2ltO1xuICB9XG5cbiAgLy8gNC4gQ2FsY3VsYXRlIGVhc3RpbmcgYW5kIG5vcnRoaW5nXG4gIHAueCA9ICh6X2ltICogdGhpcy5hKSArIHRoaXMueDA7XG4gIHAueSA9ICh6X3JlICogdGhpcy5hKSArIHRoaXMueTA7XG5cbiAgcmV0dXJuIHA7XG59XG5cbi8qKlxuICAgIE5ldyBaZWFsYW5kIE1hcCBHcmlkIEludmVyc2UgIC0gIHgveSB0byBsb25nL2xhdFxuICAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICB2YXIgbjtcbiAgdmFyIHggPSBwLng7XG4gIHZhciB5ID0gcC55O1xuXG4gIHZhciBkZWx0YV94ID0geCAtIHRoaXMueDA7XG4gIHZhciBkZWx0YV95ID0geSAtIHRoaXMueTA7XG5cbiAgLy8gMS4gQ2FsY3VsYXRlIHpcbiAgdmFyIHpfcmUgPSBkZWx0YV95IC8gdGhpcy5hO1xuICB2YXIgel9pbSA9IGRlbHRhX3ggLyB0aGlzLmE7XG5cbiAgLy8gMmEuIENhbGN1bGF0ZSB0aGV0YSAtIGZpcnN0IGFwcHJveGltYXRpb24gZ2l2ZXMga20gYWNjdXJhY3lcbiAgdmFyIHpfbl9yZSA9IDE7XG4gIHZhciB6X25faW0gPSAwOyAvLyB6XjBcbiAgdmFyIHpfbl9yZTE7XG4gIHZhciB6X25faW0xO1xuXG4gIHZhciB0aF9yZSA9IDA7XG4gIHZhciB0aF9pbSA9IDA7XG4gIGZvciAobiA9IDE7IG4gPD0gNjsgbisrKSB7XG4gICAgel9uX3JlMSA9IHpfbl9yZSAqIHpfcmUgLSB6X25faW0gKiB6X2ltO1xuICAgIHpfbl9pbTEgPSB6X25faW0gKiB6X3JlICsgel9uX3JlICogel9pbTtcbiAgICB6X25fcmUgPSB6X25fcmUxO1xuICAgIHpfbl9pbSA9IHpfbl9pbTE7XG4gICAgdGhfcmUgPSB0aF9yZSArIHRoaXMuQ19yZVtuXSAqIHpfbl9yZSAtIHRoaXMuQ19pbVtuXSAqIHpfbl9pbTtcbiAgICB0aF9pbSA9IHRoX2ltICsgdGhpcy5DX2ltW25dICogel9uX3JlICsgdGhpcy5DX3JlW25dICogel9uX2ltO1xuICB9XG5cbiAgLy8gMmIuIEl0ZXJhdGUgdG8gcmVmaW5lIHRoZSBhY2N1cmFjeSBvZiB0aGUgY2FsY3VsYXRpb25cbiAgLy8gICAgICAgIDAgaXRlcmF0aW9ucyBnaXZlcyBrbSBhY2N1cmFjeVxuICAvLyAgICAgICAgMSBpdGVyYXRpb24gZ2l2ZXMgbSBhY2N1cmFjeSAtLSBnb29kIGVub3VnaCBmb3IgbW9zdCBtYXBwaW5nIGFwcGxpY2F0aW9uc1xuICAvLyAgICAgICAgMiBpdGVyYXRpb25zIGJpdmVzIG1tIGFjY3VyYWN5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVyYXRpb25zOyBpKyspIHtcbiAgICB2YXIgdGhfbl9yZSA9IHRoX3JlO1xuICAgIHZhciB0aF9uX2ltID0gdGhfaW07XG4gICAgdmFyIHRoX25fcmUxO1xuICAgIHZhciB0aF9uX2ltMTtcblxuICAgIHZhciBudW1fcmUgPSB6X3JlO1xuICAgIHZhciBudW1faW0gPSB6X2ltO1xuICAgIGZvciAobiA9IDI7IG4gPD0gNjsgbisrKSB7XG4gICAgICB0aF9uX3JlMSA9IHRoX25fcmUgKiB0aF9yZSAtIHRoX25faW0gKiB0aF9pbTtcbiAgICAgIHRoX25faW0xID0gdGhfbl9pbSAqIHRoX3JlICsgdGhfbl9yZSAqIHRoX2ltO1xuICAgICAgdGhfbl9yZSA9IHRoX25fcmUxO1xuICAgICAgdGhfbl9pbSA9IHRoX25faW0xO1xuICAgICAgbnVtX3JlID0gbnVtX3JlICsgKG4gLSAxKSAqICh0aGlzLkJfcmVbbl0gKiB0aF9uX3JlIC0gdGhpcy5CX2ltW25dICogdGhfbl9pbSk7XG4gICAgICBudW1faW0gPSBudW1faW0gKyAobiAtIDEpICogKHRoaXMuQl9pbVtuXSAqIHRoX25fcmUgKyB0aGlzLkJfcmVbbl0gKiB0aF9uX2ltKTtcbiAgICB9XG5cbiAgICB0aF9uX3JlID0gMTtcbiAgICB0aF9uX2ltID0gMDtcbiAgICB2YXIgZGVuX3JlID0gdGhpcy5CX3JlWzFdO1xuICAgIHZhciBkZW5faW0gPSB0aGlzLkJfaW1bMV07XG4gICAgZm9yIChuID0gMjsgbiA8PSA2OyBuKyspIHtcbiAgICAgIHRoX25fcmUxID0gdGhfbl9yZSAqIHRoX3JlIC0gdGhfbl9pbSAqIHRoX2ltO1xuICAgICAgdGhfbl9pbTEgPSB0aF9uX2ltICogdGhfcmUgKyB0aF9uX3JlICogdGhfaW07XG4gICAgICB0aF9uX3JlID0gdGhfbl9yZTE7XG4gICAgICB0aF9uX2ltID0gdGhfbl9pbTE7XG4gICAgICBkZW5fcmUgPSBkZW5fcmUgKyBuICogKHRoaXMuQl9yZVtuXSAqIHRoX25fcmUgLSB0aGlzLkJfaW1bbl0gKiB0aF9uX2ltKTtcbiAgICAgIGRlbl9pbSA9IGRlbl9pbSArIG4gKiAodGhpcy5CX2ltW25dICogdGhfbl9yZSArIHRoaXMuQl9yZVtuXSAqIHRoX25faW0pO1xuICAgIH1cblxuICAgIC8vIENvbXBsZXggZGl2aXNpb25cbiAgICB2YXIgZGVuMiA9IGRlbl9yZSAqIGRlbl9yZSArIGRlbl9pbSAqIGRlbl9pbTtcbiAgICB0aF9yZSA9IChudW1fcmUgKiBkZW5fcmUgKyBudW1faW0gKiBkZW5faW0pIC8gZGVuMjtcbiAgICB0aF9pbSA9IChudW1faW0gKiBkZW5fcmUgLSBudW1fcmUgKiBkZW5faW0pIC8gZGVuMjtcbiAgfVxuXG4gIC8vIDMuIENhbGN1bGF0ZSBkX3BoaSAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRfbGFtYmRhXG4gIHZhciBkX3BzaSA9IHRoX3JlO1xuICB2YXIgZF9sYW1iZGEgPSB0aF9pbTtcbiAgdmFyIGRfcHNpX24gPSAxOyAvLyBkX3BzaV4wXG5cbiAgdmFyIGRfcGhpID0gMDtcbiAgZm9yIChuID0gMTsgbiA8PSA5OyBuKyspIHtcbiAgICBkX3BzaV9uID0gZF9wc2lfbiAqIGRfcHNpO1xuICAgIGRfcGhpID0gZF9waGkgKyB0aGlzLkRbbl0gKiBkX3BzaV9uO1xuICB9XG5cbiAgLy8gNC4gQ2FsY3VsYXRlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGVcbiAgLy8gZF9waGkgaXMgY2FsY3VhdGVkIGluIHNlY29uZCBvZiBhcmMgKiAxMF4tNSwgc28gd2UgbmVlZCB0byBzY2FsZSBiYWNrIHRvIHJhZGlhbnMuIGRfbGFtYmRhIGlzIGluIHJhZGlhbnMuXG4gIHZhciBsYXQgPSB0aGlzLmxhdDAgKyAoZF9waGkgKiBTRUNfVE9fUkFEICogMUU1KTtcbiAgdmFyIGxvbiA9IHRoaXMubG9uZzAgKyBkX2xhbWJkYTtcblxuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcblxuICByZXR1cm4gcDtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIk5ld19aZWFsYW5kX01hcF9HcmlkXCIsIFwibnptZ1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IGFkanVzdF9sb24gZnJvbSAnLi4vY29tbW9uL2FkanVzdF9sb24nO1xuXG4vKlxuICByZWZlcmVuY2VcbiAgICBcIk5ldyBFcXVhbC1BcmVhIE1hcCBQcm9qZWN0aW9ucyBmb3IgTm9uY2lyY3VsYXIgUmVnaW9uc1wiLCBKb2huIFAuIFNueWRlcixcbiAgICBUaGUgQW1lcmljYW4gQ2FydG9ncmFwaGVyLCBWb2wgMTUsIE5vLiA0LCBPY3RvYmVyIDE5ODgsIHBwLiAzNDEtMzU1LlxuICAqL1xuXG5cbi8qIEluaXRpYWxpemUgdGhlIE1pbGxlciBDeWxpbmRyaWNhbCBwcm9qZWN0aW9uXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gIC8vbm8tb3Bcbn1cblxuLyogTWlsbGVyIEN5bGluZHJpY2FsIGZvcndhcmQgZXF1YXRpb25zLS1tYXBwaW5nIGxhdCxsb25nIHRvIHgseVxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZChwKSB7XG4gIHZhciBsb24gPSBwLng7XG4gIHZhciBsYXQgPSBwLnk7XG4gIC8qIEZvcndhcmQgZXF1YXRpb25zXG4gICAgICAtLS0tLS0tLS0tLS0tLS0tLSovXG4gIHZhciBkbG9uID0gYWRqdXN0X2xvbihsb24gLSB0aGlzLmxvbmcwKTtcbiAgdmFyIHggPSB0aGlzLngwICsgdGhpcy5hICogZGxvbjtcbiAgdmFyIHkgPSB0aGlzLnkwICsgdGhpcy5hICogTWF0aC5sb2coTWF0aC50YW4oKE1hdGguUEkgLyA0KSArIChsYXQgLyAyLjUpKSkgKiAxLjI1O1xuXG4gIHAueCA9IHg7XG4gIHAueSA9IHk7XG4gIHJldHVybiBwO1xufVxuXG4vKiBNaWxsZXIgQ3lsaW5kcmljYWwgaW52ZXJzZSBlcXVhdGlvbnMtLW1hcHBpbmcgeCx5IHRvIGxhdC9sb25nXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgcC54IC09IHRoaXMueDA7XG4gIHAueSAtPSB0aGlzLnkwO1xuXG4gIHZhciBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBwLnggLyB0aGlzLmEpO1xuICB2YXIgbGF0ID0gMi41ICogKE1hdGguYXRhbihNYXRoLmV4cCgwLjggKiBwLnkgLyB0aGlzLmEpKSAtIE1hdGguUEkgLyA0KTtcblxuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJNaWxsZXJfQ3lsaW5kcmljYWxcIiwgXCJtaWxsXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJpbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5pbXBvcnQgYWRqdXN0X2xhdCBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xhdCc7XG5pbXBvcnQgcGpfZW5mbiBmcm9tICcuLi9jb21tb24vcGpfZW5mbic7XG52YXIgTUFYX0lURVIgPSAyMDtcbmltcG9ydCBwal9tbGZuIGZyb20gJy4uL2NvbW1vbi9wal9tbGZuJztcbmltcG9ydCBwal9pbnZfbWxmbiBmcm9tICcuLi9jb21tb24vcGpfaW52X21sZm4nO1xuaW1wb3J0IHtFUFNMTiwgSEFMRl9QSX0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmltcG9ydCBhc2lueiBmcm9tICcuLi9jb21tb24vYXNpbnonO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAvKiBQbGFjZSBwYXJhbWV0ZXJzIGluIHN0YXRpYyBzdG9yYWdlIGZvciBjb21tb24gdXNlXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblxuICBpZiAoIXRoaXMuc3BoZXJlKSB7XG4gICAgdGhpcy5lbiA9IHBqX2VuZm4odGhpcy5lcyk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5uID0gMTtcbiAgICB0aGlzLm0gPSAwO1xuICAgIHRoaXMuZXMgPSAwO1xuICAgIHRoaXMuQ195ID0gTWF0aC5zcXJ0KCh0aGlzLm0gKyAxKSAvIHRoaXMubik7XG4gICAgdGhpcy5DX3ggPSB0aGlzLkNfeSAvICh0aGlzLm0gKyAxKTtcbiAgfVxuXG59XG5cbi8qIFNpbnVzb2lkYWwgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIHgsIHk7XG4gIHZhciBsb24gPSBwLng7XG4gIHZhciBsYXQgPSBwLnk7XG4gIC8qIEZvcndhcmQgZXF1YXRpb25zXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuICBsb24gPSBhZGp1c3RfbG9uKGxvbiAtIHRoaXMubG9uZzApO1xuXG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIGlmICghdGhpcy5tKSB7XG4gICAgICBsYXQgPSB0aGlzLm4gIT09IDEgPyBNYXRoLmFzaW4odGhpcy5uICogTWF0aC5zaW4obGF0KSkgOiBsYXQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIGsgPSB0aGlzLm4gKiBNYXRoLnNpbihsYXQpO1xuICAgICAgZm9yICh2YXIgaSA9IE1BWF9JVEVSOyBpOyAtLWkpIHtcbiAgICAgICAgdmFyIFYgPSAodGhpcy5tICogbGF0ICsgTWF0aC5zaW4obGF0KSAtIGspIC8gKHRoaXMubSArIE1hdGguY29zKGxhdCkpO1xuICAgICAgICBsYXQgLT0gVjtcbiAgICAgICAgaWYgKE1hdGguYWJzKFYpIDwgRVBTTE4pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB4ID0gdGhpcy5hICogdGhpcy5DX3ggKiBsb24gKiAodGhpcy5tICsgTWF0aC5jb3MobGF0KSk7XG4gICAgeSA9IHRoaXMuYSAqIHRoaXMuQ195ICogbGF0O1xuXG4gIH1cbiAgZWxzZSB7XG5cbiAgICB2YXIgcyA9IE1hdGguc2luKGxhdCk7XG4gICAgdmFyIGMgPSBNYXRoLmNvcyhsYXQpO1xuICAgIHkgPSB0aGlzLmEgKiBwal9tbGZuKGxhdCwgcywgYywgdGhpcy5lbik7XG4gICAgeCA9IHRoaXMuYSAqIGxvbiAqIGMgLyBNYXRoLnNxcnQoMSAtIHRoaXMuZXMgKiBzICogcyk7XG4gIH1cblxuICBwLnggPSB4O1xuICBwLnkgPSB5O1xuICByZXR1cm4gcDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICB2YXIgbGF0LCB0ZW1wLCBsb24sIHM7XG5cbiAgcC54IC09IHRoaXMueDA7XG4gIGxvbiA9IHAueCAvIHRoaXMuYTtcbiAgcC55IC09IHRoaXMueTA7XG4gIGxhdCA9IHAueSAvIHRoaXMuYTtcblxuICBpZiAodGhpcy5zcGhlcmUpIHtcbiAgICBsYXQgLz0gdGhpcy5DX3k7XG4gICAgbG9uID0gbG9uIC8gKHRoaXMuQ194ICogKHRoaXMubSArIE1hdGguY29zKGxhdCkpKTtcbiAgICBpZiAodGhpcy5tKSB7XG4gICAgICBsYXQgPSBhc2lueigodGhpcy5tICogbGF0ICsgTWF0aC5zaW4obGF0KSkgLyB0aGlzLm4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLm4gIT09IDEpIHtcbiAgICAgIGxhdCA9IGFzaW56KE1hdGguc2luKGxhdCkgLyB0aGlzLm4pO1xuICAgIH1cbiAgICBsb24gPSBhZGp1c3RfbG9uKGxvbiArIHRoaXMubG9uZzApO1xuICAgIGxhdCA9IGFkanVzdF9sYXQobGF0KTtcbiAgfVxuICBlbHNlIHtcbiAgICBsYXQgPSBwal9pbnZfbWxmbihwLnkgLyB0aGlzLmEsIHRoaXMuZXMsIHRoaXMuZW4pO1xuICAgIHMgPSBNYXRoLmFicyhsYXQpO1xuICAgIGlmIChzIDwgSEFMRl9QSSkge1xuICAgICAgcyA9IE1hdGguc2luKGxhdCk7XG4gICAgICB0ZW1wID0gdGhpcy5sb25nMCArIHAueCAqIE1hdGguc3FydCgxIC0gdGhpcy5lcyAqIHMgKiBzKSAvICh0aGlzLmEgKiBNYXRoLmNvcyhsYXQpKTtcbiAgICAgIC8vdGVtcCA9IHRoaXMubG9uZzAgKyBwLnggLyAodGhpcy5hICogTWF0aC5jb3MobGF0KSk7XG4gICAgICBsb24gPSBhZGp1c3RfbG9uKHRlbXApO1xuICAgIH1cbiAgICBlbHNlIGlmICgocyAtIEVQU0xOKSA8IEhBTEZfUEkpIHtcbiAgICAgIGxvbiA9IHRoaXMubG9uZzA7XG4gICAgfVxuICB9XG4gIHAueCA9IGxvbjtcbiAgcC55ID0gbGF0O1xuICByZXR1cm4gcDtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIlNpbnVzb2lkYWxcIiwgXCJzaW51XCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJpbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHt9XG5pbXBvcnQge0VQU0xOfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcbi8qIE1vbGx3ZWlkZSBmb3J3YXJkIGVxdWF0aW9ucy0tbWFwcGluZyBsYXQsbG9uZyB0byB4LHlcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcblxuICAvKiBGb3J3YXJkIGVxdWF0aW9uc1xuICAgICAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuICB2YXIgbG9uID0gcC54O1xuICB2YXIgbGF0ID0gcC55O1xuXG4gIHZhciBkZWx0YV9sb24gPSBhZGp1c3RfbG9uKGxvbiAtIHRoaXMubG9uZzApO1xuICB2YXIgdGhldGEgPSBsYXQ7XG4gIHZhciBjb24gPSBNYXRoLlBJICogTWF0aC5zaW4obGF0KTtcblxuICAvKiBJdGVyYXRlIHVzaW5nIHRoZSBOZXd0b24tUmFwaHNvbiBtZXRob2QgdG8gZmluZCB0aGV0YVxuICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBkZWx0YV90aGV0YSA9IC0odGhldGEgKyBNYXRoLnNpbih0aGV0YSkgLSBjb24pIC8gKDEgKyBNYXRoLmNvcyh0aGV0YSkpO1xuICAgIHRoZXRhICs9IGRlbHRhX3RoZXRhO1xuICAgIGlmIChNYXRoLmFicyhkZWx0YV90aGV0YSkgPCBFUFNMTikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoZXRhIC89IDI7XG5cbiAgLyogSWYgdGhlIGxhdGl0dWRlIGlzIDkwIGRlZywgZm9yY2UgdGhlIHggY29vcmRpbmF0ZSB0byBiZSBcIjAgKyBmYWxzZSBlYXN0aW5nXCJcbiAgICAgICB0aGlzIGlzIGRvbmUgaGVyZSBiZWNhdXNlIG9mIHByZWNpc2lvbiBwcm9ibGVtcyB3aXRoIFwiY29zKHRoZXRhKVwiXG4gICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuICBpZiAoTWF0aC5QSSAvIDIgLSBNYXRoLmFicyhsYXQpIDwgRVBTTE4pIHtcbiAgICBkZWx0YV9sb24gPSAwO1xuICB9XG4gIHZhciB4ID0gMC45MDAzMTYzMTYxNTggKiB0aGlzLmEgKiBkZWx0YV9sb24gKiBNYXRoLmNvcyh0aGV0YSkgKyB0aGlzLngwO1xuICB2YXIgeSA9IDEuNDE0MjEzNTYyMzczMSAqIHRoaXMuYSAqIE1hdGguc2luKHRoZXRhKSArIHRoaXMueTA7XG5cbiAgcC54ID0geDtcbiAgcC55ID0geTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgdmFyIHRoZXRhO1xuICB2YXIgYXJnO1xuXG4gIC8qIEludmVyc2UgZXF1YXRpb25zXG4gICAgICAtLS0tLS0tLS0tLS0tLS0tLSovXG4gIHAueCAtPSB0aGlzLngwO1xuICBwLnkgLT0gdGhpcy55MDtcbiAgYXJnID0gcC55IC8gKDEuNDE0MjEzNTYyMzczMSAqIHRoaXMuYSk7XG5cbiAgLyogQmVjYXVzZSBvZiBkaXZpc2lvbiBieSB6ZXJvIHByb2JsZW1zLCAnYXJnJyBjYW4gbm90IGJlIDEuICBUaGVyZWZvcmVcbiAgICAgICBhIG51bWJlciB2ZXJ5IGNsb3NlIHRvIG9uZSBpcyB1c2VkIGluc3RlYWQuXG4gICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gIGlmIChNYXRoLmFicyhhcmcpID4gMC45OTk5OTk5OTk5OTkpIHtcbiAgICBhcmcgPSAwLjk5OTk5OTk5OTk5OTtcbiAgfVxuICB0aGV0YSA9IE1hdGguYXNpbihhcmcpO1xuICB2YXIgbG9uID0gYWRqdXN0X2xvbih0aGlzLmxvbmcwICsgKHAueCAvICgwLjkwMDMxNjMxNjE1OCAqIHRoaXMuYSAqIE1hdGguY29zKHRoZXRhKSkpKTtcbiAgaWYgKGxvbiA8ICgtTWF0aC5QSSkpIHtcbiAgICBsb24gPSAtTWF0aC5QSTtcbiAgfVxuICBpZiAobG9uID4gTWF0aC5QSSkge1xuICAgIGxvbiA9IE1hdGguUEk7XG4gIH1cbiAgYXJnID0gKDIgKiB0aGV0YSArIE1hdGguc2luKDIgKiB0aGV0YSkpIC8gTWF0aC5QSTtcbiAgaWYgKE1hdGguYWJzKGFyZykgPiAxKSB7XG4gICAgYXJnID0gMTtcbiAgfVxuICB2YXIgbGF0ID0gTWF0aC5hc2luKGFyZyk7XG5cbiAgcC54ID0gbG9uO1xuICBwLnkgPSBsYXQ7XG4gIHJldHVybiBwO1xufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wiTW9sbHdlaWRlXCIsIFwibW9sbFwiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IGUwZm4gZnJvbSAnLi4vY29tbW9uL2UwZm4nO1xuaW1wb3J0IGUxZm4gZnJvbSAnLi4vY29tbW9uL2UxZm4nO1xuaW1wb3J0IGUyZm4gZnJvbSAnLi4vY29tbW9uL2UyZm4nO1xuaW1wb3J0IGUzZm4gZnJvbSAnLi4vY29tbW9uL2UzZm4nO1xuaW1wb3J0IG1zZm56IGZyb20gJy4uL2NvbW1vbi9tc2Zueic7XG5pbXBvcnQgbWxmbiBmcm9tICcuLi9jb21tb24vbWxmbic7XG5pbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5pbXBvcnQgYWRqdXN0X2xhdCBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xhdCc7XG5pbXBvcnQgaW1sZm4gZnJvbSAnLi4vY29tbW9uL2ltbGZuJztcbmltcG9ydCB7RVBTTE59IGZyb20gJy4uL2NvbnN0YW50cy92YWx1ZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHtcblxuICAvKiBQbGFjZSBwYXJhbWV0ZXJzIGluIHN0YXRpYyBzdG9yYWdlIGZvciBjb21tb24gdXNlXG4gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgLy8gU3RhbmRhcmQgUGFyYWxsZWxzIGNhbm5vdCBiZSBlcXVhbCBhbmQgb24gb3Bwb3NpdGUgc2lkZXMgb2YgdGhlIGVxdWF0b3JcbiAgaWYgKE1hdGguYWJzKHRoaXMubGF0MSArIHRoaXMubGF0MikgPCBFUFNMTikge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxhdDIgPSB0aGlzLmxhdDIgfHwgdGhpcy5sYXQxO1xuICB0aGlzLnRlbXAgPSB0aGlzLmIgLyB0aGlzLmE7XG4gIHRoaXMuZXMgPSAxIC0gTWF0aC5wb3codGhpcy50ZW1wLCAyKTtcbiAgdGhpcy5lID0gTWF0aC5zcXJ0KHRoaXMuZXMpO1xuICB0aGlzLmUwID0gZTBmbih0aGlzLmVzKTtcbiAgdGhpcy5lMSA9IGUxZm4odGhpcy5lcyk7XG4gIHRoaXMuZTIgPSBlMmZuKHRoaXMuZXMpO1xuICB0aGlzLmUzID0gZTNmbih0aGlzLmVzKTtcblxuICB0aGlzLnNpbnBoaSA9IE1hdGguc2luKHRoaXMubGF0MSk7XG4gIHRoaXMuY29zcGhpID0gTWF0aC5jb3ModGhpcy5sYXQxKTtcblxuICB0aGlzLm1zMSA9IG1zZm56KHRoaXMuZSwgdGhpcy5zaW5waGksIHRoaXMuY29zcGhpKTtcbiAgdGhpcy5tbDEgPSBtbGZuKHRoaXMuZTAsIHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMsIHRoaXMubGF0MSk7XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMubGF0MSAtIHRoaXMubGF0MikgPCBFUFNMTikge1xuICAgIHRoaXMubnMgPSB0aGlzLnNpbnBoaTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLnNpbnBoaSA9IE1hdGguc2luKHRoaXMubGF0Mik7XG4gICAgdGhpcy5jb3NwaGkgPSBNYXRoLmNvcyh0aGlzLmxhdDIpO1xuICAgIHRoaXMubXMyID0gbXNmbnoodGhpcy5lLCB0aGlzLnNpbnBoaSwgdGhpcy5jb3NwaGkpO1xuICAgIHRoaXMubWwyID0gbWxmbih0aGlzLmUwLCB0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzLCB0aGlzLmxhdDIpO1xuICAgIHRoaXMubnMgPSAodGhpcy5tczEgLSB0aGlzLm1zMikgLyAodGhpcy5tbDIgLSB0aGlzLm1sMSk7XG4gIH1cbiAgdGhpcy5nID0gdGhpcy5tbDEgKyB0aGlzLm1zMSAvIHRoaXMubnM7XG4gIHRoaXMubWwwID0gbWxmbih0aGlzLmUwLCB0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzLCB0aGlzLmxhdDApO1xuICB0aGlzLnJoID0gdGhpcy5hICogKHRoaXMuZyAtIHRoaXMubWwwKTtcbn1cblxuLyogRXF1aWRpc3RhbnQgQ29uaWMgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIGxvbiA9IHAueDtcbiAgdmFyIGxhdCA9IHAueTtcbiAgdmFyIHJoMTtcblxuICAvKiBGb3J3YXJkIGVxdWF0aW9uc1xuICAgICAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuICBpZiAodGhpcy5zcGhlcmUpIHtcbiAgICByaDEgPSB0aGlzLmEgKiAodGhpcy5nIC0gbGF0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB2YXIgbWwgPSBtbGZuKHRoaXMuZTAsIHRoaXMuZTEsIHRoaXMuZTIsIHRoaXMuZTMsIGxhdCk7XG4gICAgcmgxID0gdGhpcy5hICogKHRoaXMuZyAtIG1sKTtcbiAgfVxuICB2YXIgdGhldGEgPSB0aGlzLm5zICogYWRqdXN0X2xvbihsb24gLSB0aGlzLmxvbmcwKTtcbiAgdmFyIHggPSB0aGlzLngwICsgcmgxICogTWF0aC5zaW4odGhldGEpO1xuICB2YXIgeSA9IHRoaXMueTAgKyB0aGlzLnJoIC0gcmgxICogTWF0aC5jb3ModGhldGEpO1xuICBwLnggPSB4O1xuICBwLnkgPSB5O1xuICByZXR1cm4gcDtcbn1cblxuLyogSW52ZXJzZSBlcXVhdGlvbnNcbiAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICBwLnggLT0gdGhpcy54MDtcbiAgcC55ID0gdGhpcy5yaCAtIHAueSArIHRoaXMueTA7XG4gIHZhciBjb24sIHJoMSwgbGF0LCBsb247XG4gIGlmICh0aGlzLm5zID49IDApIHtcbiAgICByaDEgPSBNYXRoLnNxcnQocC54ICogcC54ICsgcC55ICogcC55KTtcbiAgICBjb24gPSAxO1xuICB9XG4gIGVsc2Uge1xuICAgIHJoMSA9IC1NYXRoLnNxcnQocC54ICogcC54ICsgcC55ICogcC55KTtcbiAgICBjb24gPSAtMTtcbiAgfVxuICB2YXIgdGhldGEgPSAwO1xuICBpZiAocmgxICE9PSAwKSB7XG4gICAgdGhldGEgPSBNYXRoLmF0YW4yKGNvbiAqIHAueCwgY29uICogcC55KTtcbiAgfVxuXG4gIGlmICh0aGlzLnNwaGVyZSkge1xuICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIHRoZXRhIC8gdGhpcy5ucyk7XG4gICAgbGF0ID0gYWRqdXN0X2xhdCh0aGlzLmcgLSByaDEgLyB0aGlzLmEpO1xuICAgIHAueCA9IGxvbjtcbiAgICBwLnkgPSBsYXQ7XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgZWxzZSB7XG4gICAgdmFyIG1sID0gdGhpcy5nIC0gcmgxIC8gdGhpcy5hO1xuICAgIGxhdCA9IGltbGZuKG1sLCB0aGlzLmUwLCB0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzKTtcbiAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyB0aGV0YSAvIHRoaXMubnMpO1xuICAgIHAueCA9IGxvbjtcbiAgICBwLnkgPSBsYXQ7XG4gICAgcmV0dXJuIHA7XG4gIH1cblxufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wiRXF1aWRpc3RhbnRfQ29uaWNcIiwgXCJlcWRjXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBpbml0LFxuICBmb3J3YXJkOiBmb3J3YXJkLFxuICBpbnZlcnNlOiBpbnZlcnNlLFxuICBuYW1lczogbmFtZXNcbn07XG4iLCJpbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5cbmltcG9ydCB7SEFMRl9QSSwgRVBTTE59IGZyb20gJy4uL2NvbnN0YW50cy92YWx1ZXMnO1xuXG5pbXBvcnQgYXNpbnogZnJvbSAnLi4vY29tbW9uL2FzaW56JztcblxuLyogSW5pdGlhbGl6ZSB0aGUgVmFuIERlciBHcmludGVuIHByb2plY3Rpb25cbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHtcbiAgLy90aGlzLlIgPSA2MzcwOTk3OyAvL1JhZGl1cyBvZiBlYXJ0aFxuICB0aGlzLlIgPSB0aGlzLmE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcblxuICB2YXIgbG9uID0gcC54O1xuICB2YXIgbGF0ID0gcC55O1xuXG4gIC8qIEZvcndhcmQgZXF1YXRpb25zXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuICB2YXIgZGxvbiA9IGFkanVzdF9sb24obG9uIC0gdGhpcy5sb25nMCk7XG4gIHZhciB4LCB5O1xuXG4gIGlmIChNYXRoLmFicyhsYXQpIDw9IEVQU0xOKSB7XG4gICAgeCA9IHRoaXMueDAgKyB0aGlzLlIgKiBkbG9uO1xuICAgIHkgPSB0aGlzLnkwO1xuICB9XG4gIHZhciB0aGV0YSA9IGFzaW56KDIgKiBNYXRoLmFicyhsYXQgLyBNYXRoLlBJKSk7XG4gIGlmICgoTWF0aC5hYnMoZGxvbikgPD0gRVBTTE4pIHx8IChNYXRoLmFicyhNYXRoLmFicyhsYXQpIC0gSEFMRl9QSSkgPD0gRVBTTE4pKSB7XG4gICAgeCA9IHRoaXMueDA7XG4gICAgaWYgKGxhdCA+PSAwKSB7XG4gICAgICB5ID0gdGhpcy55MCArIE1hdGguUEkgKiB0aGlzLlIgKiBNYXRoLnRhbigwLjUgKiB0aGV0YSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgeSA9IHRoaXMueTAgKyBNYXRoLlBJICogdGhpcy5SICogLU1hdGgudGFuKDAuNSAqIHRoZXRhKTtcbiAgICB9XG4gICAgLy8gIHJldHVybihPSyk7XG4gIH1cbiAgdmFyIGFsID0gMC41ICogTWF0aC5hYnMoKE1hdGguUEkgLyBkbG9uKSAtIChkbG9uIC8gTWF0aC5QSSkpO1xuICB2YXIgYXNxID0gYWwgKiBhbDtcbiAgdmFyIHNpbnRoID0gTWF0aC5zaW4odGhldGEpO1xuICB2YXIgY29zdGggPSBNYXRoLmNvcyh0aGV0YSk7XG5cbiAgdmFyIGcgPSBjb3N0aCAvIChzaW50aCArIGNvc3RoIC0gMSk7XG4gIHZhciBnc3EgPSBnICogZztcbiAgdmFyIG0gPSBnICogKDIgLyBzaW50aCAtIDEpO1xuICB2YXIgbXNxID0gbSAqIG07XG4gIHZhciBjb24gPSBNYXRoLlBJICogdGhpcy5SICogKGFsICogKGcgLSBtc3EpICsgTWF0aC5zcXJ0KGFzcSAqIChnIC0gbXNxKSAqIChnIC0gbXNxKSAtIChtc3EgKyBhc3EpICogKGdzcSAtIG1zcSkpKSAvIChtc3EgKyBhc3EpO1xuICBpZiAoZGxvbiA8IDApIHtcbiAgICBjb24gPSAtY29uO1xuICB9XG4gIHggPSB0aGlzLngwICsgY29uO1xuICAvL2NvbiA9IE1hdGguYWJzKGNvbiAvIChNYXRoLlBJICogdGhpcy5SKSk7XG4gIHZhciBxID0gYXNxICsgZztcbiAgY29uID0gTWF0aC5QSSAqIHRoaXMuUiAqIChtICogcSAtIGFsICogTWF0aC5zcXJ0KChtc3EgKyBhc3EpICogKGFzcSArIDEpIC0gcSAqIHEpKSAvIChtc3EgKyBhc3EpO1xuICBpZiAobGF0ID49IDApIHtcbiAgICAvL3kgPSB0aGlzLnkwICsgTWF0aC5QSSAqIHRoaXMuUiAqIE1hdGguc3FydCgxIC0gY29uICogY29uIC0gMiAqIGFsICogY29uKTtcbiAgICB5ID0gdGhpcy55MCArIGNvbjtcbiAgfVxuICBlbHNlIHtcbiAgICAvL3kgPSB0aGlzLnkwIC0gTWF0aC5QSSAqIHRoaXMuUiAqIE1hdGguc3FydCgxIC0gY29uICogY29uIC0gMiAqIGFsICogY29uKTtcbiAgICB5ID0gdGhpcy55MCAtIGNvbjtcbiAgfVxuICBwLnggPSB4O1xuICBwLnkgPSB5O1xuICByZXR1cm4gcDtcbn1cblxuLyogVmFuIERlciBHcmludGVuIGludmVyc2UgZXF1YXRpb25zLS1tYXBwaW5nIHgseSB0byBsYXQvbG9uZ1xuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICB2YXIgbG9uLCBsYXQ7XG4gIHZhciB4eCwgeXksIHh5cywgYzEsIGMyLCBjMztcbiAgdmFyIGExO1xuICB2YXIgbTE7XG4gIHZhciBjb247XG4gIHZhciB0aDE7XG4gIHZhciBkO1xuXG4gIC8qIGludmVyc2UgZXF1YXRpb25zXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuICBwLnggLT0gdGhpcy54MDtcbiAgcC55IC09IHRoaXMueTA7XG4gIGNvbiA9IE1hdGguUEkgKiB0aGlzLlI7XG4gIHh4ID0gcC54IC8gY29uO1xuICB5eSA9IHAueSAvIGNvbjtcbiAgeHlzID0geHggKiB4eCArIHl5ICogeXk7XG4gIGMxID0gLU1hdGguYWJzKHl5KSAqICgxICsgeHlzKTtcbiAgYzIgPSBjMSAtIDIgKiB5eSAqIHl5ICsgeHggKiB4eDtcbiAgYzMgPSAtMiAqIGMxICsgMSArIDIgKiB5eSAqIHl5ICsgeHlzICogeHlzO1xuICBkID0geXkgKiB5eSAvIGMzICsgKDIgKiBjMiAqIGMyICogYzIgLyBjMyAvIGMzIC8gYzMgLSA5ICogYzEgKiBjMiAvIGMzIC8gYzMpIC8gMjc7XG4gIGExID0gKGMxIC0gYzIgKiBjMiAvIDMgLyBjMykgLyBjMztcbiAgbTEgPSAyICogTWF0aC5zcXJ0KC1hMSAvIDMpO1xuICBjb24gPSAoKDMgKiBkKSAvIGExKSAvIG0xO1xuICBpZiAoTWF0aC5hYnMoY29uKSA+IDEpIHtcbiAgICBpZiAoY29uID49IDApIHtcbiAgICAgIGNvbiA9IDE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uID0gLTE7XG4gICAgfVxuICB9XG4gIHRoMSA9IE1hdGguYWNvcyhjb24pIC8gMztcbiAgaWYgKHAueSA+PSAwKSB7XG4gICAgbGF0ID0gKC1tMSAqIE1hdGguY29zKHRoMSArIE1hdGguUEkgLyAzKSAtIGMyIC8gMyAvIGMzKSAqIE1hdGguUEk7XG4gIH1cbiAgZWxzZSB7XG4gICAgbGF0ID0gLSgtbTEgKiBNYXRoLmNvcyh0aDEgKyBNYXRoLlBJIC8gMykgLSBjMiAvIDMgLyBjMykgKiBNYXRoLlBJO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHh4KSA8IEVQU0xOKSB7XG4gICAgbG9uID0gdGhpcy5sb25nMDtcbiAgfVxuICBlbHNlIHtcbiAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBNYXRoLlBJICogKHh5cyAtIDEgKyBNYXRoLnNxcnQoMSArIDIgKiAoeHggKiB4eCAtIHl5ICogeXkpICsgeHlzICogeHlzKSkgLyAyIC8geHgpO1xuICB9XG5cbiAgcC54ID0gbG9uO1xuICBwLnkgPSBsYXQ7XG4gIHJldHVybiBwO1xufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wiVmFuX2Rlcl9HcmludGVuX0lcIiwgXCJWYW5EZXJHcmludGVuXCIsIFwidmFuZGdcIl07XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGluaXQsXG4gIGZvcndhcmQ6IGZvcndhcmQsXG4gIGludmVyc2U6IGludmVyc2UsXG4gIG5hbWVzOiBuYW1lc1xufTtcbiIsImltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbG9uJztcbmltcG9ydCB7SEFMRl9QSSwgRVBTTE59IGZyb20gJy4uL2NvbnN0YW50cy92YWx1ZXMnO1xuXG5pbXBvcnQgbWxmbiBmcm9tICcuLi9jb21tb24vbWxmbic7XG5pbXBvcnQgZTBmbiBmcm9tICcuLi9jb21tb24vZTBmbic7XG5pbXBvcnQgZTFmbiBmcm9tICcuLi9jb21tb24vZTFmbic7XG5pbXBvcnQgZTJmbiBmcm9tICcuLi9jb21tb24vZTJmbic7XG5pbXBvcnQgZTNmbiBmcm9tICcuLi9jb21tb24vZTNmbic7XG5pbXBvcnQgZ04gZnJvbSAnLi4vY29tbW9uL2dOJztcbmltcG9ydCBhc2lueiBmcm9tICcuLi9jb21tb24vYXNpbnonO1xuaW1wb3J0IGltbGZuIGZyb20gJy4uL2NvbW1vbi9pbWxmbic7XG5cblxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCgpIHtcbiAgdGhpcy5zaW5fcDEyID0gTWF0aC5zaW4odGhpcy5sYXQwKTtcbiAgdGhpcy5jb3NfcDEyID0gTWF0aC5jb3ModGhpcy5sYXQwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmQocCkge1xuICB2YXIgbG9uID0gcC54O1xuICB2YXIgbGF0ID0gcC55O1xuICB2YXIgc2lucGhpID0gTWF0aC5zaW4ocC55KTtcbiAgdmFyIGNvc3BoaSA9IE1hdGguY29zKHAueSk7XG4gIHZhciBkbG9uID0gYWRqdXN0X2xvbihsb24gLSB0aGlzLmxvbmcwKTtcbiAgdmFyIGUwLCBlMSwgZTIsIGUzLCBNbHAsIE1sLCB0YW5waGksIE5sMSwgTmwsIHBzaSwgQXosIEcsIEgsIEdILCBIcywgYywga3AsIGNvc19jLCBzLCBzMiwgczMsIHM0LCBzNTtcbiAgaWYgKHRoaXMuc3BoZXJlKSB7XG4gICAgaWYgKE1hdGguYWJzKHRoaXMuc2luX3AxMiAtIDEpIDw9IEVQU0xOKSB7XG4gICAgICAvL05vcnRoIFBvbGUgY2FzZVxuICAgICAgcC54ID0gdGhpcy54MCArIHRoaXMuYSAqIChIQUxGX1BJIC0gbGF0KSAqIE1hdGguc2luKGRsb24pO1xuICAgICAgcC55ID0gdGhpcy55MCAtIHRoaXMuYSAqIChIQUxGX1BJIC0gbGF0KSAqIE1hdGguY29zKGRsb24pO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIGVsc2UgaWYgKE1hdGguYWJzKHRoaXMuc2luX3AxMiArIDEpIDw9IEVQU0xOKSB7XG4gICAgICAvL1NvdXRoIFBvbGUgY2FzZVxuICAgICAgcC54ID0gdGhpcy54MCArIHRoaXMuYSAqIChIQUxGX1BJICsgbGF0KSAqIE1hdGguc2luKGRsb24pO1xuICAgICAgcC55ID0gdGhpcy55MCArIHRoaXMuYSAqIChIQUxGX1BJICsgbGF0KSAqIE1hdGguY29zKGRsb24pO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy9kZWZhdWx0IGNhc2VcbiAgICAgIGNvc19jID0gdGhpcy5zaW5fcDEyICogc2lucGhpICsgdGhpcy5jb3NfcDEyICogY29zcGhpICogTWF0aC5jb3MoZGxvbik7XG4gICAgICBjID0gTWF0aC5hY29zKGNvc19jKTtcbiAgICAgIGtwID0gYyA/IGMgLyBNYXRoLnNpbihjKSA6IDE7XG4gICAgICBwLnggPSB0aGlzLngwICsgdGhpcy5hICoga3AgKiBjb3NwaGkgKiBNYXRoLnNpbihkbG9uKTtcbiAgICAgIHAueSA9IHRoaXMueTAgKyB0aGlzLmEgKiBrcCAqICh0aGlzLmNvc19wMTIgKiBzaW5waGkgLSB0aGlzLnNpbl9wMTIgKiBjb3NwaGkgKiBNYXRoLmNvcyhkbG9uKSk7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgZTAgPSBlMGZuKHRoaXMuZXMpO1xuICAgIGUxID0gZTFmbih0aGlzLmVzKTtcbiAgICBlMiA9IGUyZm4odGhpcy5lcyk7XG4gICAgZTMgPSBlM2ZuKHRoaXMuZXMpO1xuICAgIGlmIChNYXRoLmFicyh0aGlzLnNpbl9wMTIgLSAxKSA8PSBFUFNMTikge1xuICAgICAgLy9Ob3J0aCBQb2xlIGNhc2VcbiAgICAgIE1scCA9IHRoaXMuYSAqIG1sZm4oZTAsIGUxLCBlMiwgZTMsIEhBTEZfUEkpO1xuICAgICAgTWwgPSB0aGlzLmEgKiBtbGZuKGUwLCBlMSwgZTIsIGUzLCBsYXQpO1xuICAgICAgcC54ID0gdGhpcy54MCArIChNbHAgLSBNbCkgKiBNYXRoLnNpbihkbG9uKTtcbiAgICAgIHAueSA9IHRoaXMueTAgLSAoTWxwIC0gTWwpICogTWF0aC5jb3MoZGxvbik7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5zaW5fcDEyICsgMSkgPD0gRVBTTE4pIHtcbiAgICAgIC8vU291dGggUG9sZSBjYXNlXG4gICAgICBNbHAgPSB0aGlzLmEgKiBtbGZuKGUwLCBlMSwgZTIsIGUzLCBIQUxGX1BJKTtcbiAgICAgIE1sID0gdGhpcy5hICogbWxmbihlMCwgZTEsIGUyLCBlMywgbGF0KTtcbiAgICAgIHAueCA9IHRoaXMueDAgKyAoTWxwICsgTWwpICogTWF0aC5zaW4oZGxvbik7XG4gICAgICBwLnkgPSB0aGlzLnkwICsgKE1scCArIE1sKSAqIE1hdGguY29zKGRsb24pO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy9EZWZhdWx0IGNhc2VcbiAgICAgIHRhbnBoaSA9IHNpbnBoaSAvIGNvc3BoaTtcbiAgICAgIE5sMSA9IGdOKHRoaXMuYSwgdGhpcy5lLCB0aGlzLnNpbl9wMTIpO1xuICAgICAgTmwgPSBnTih0aGlzLmEsIHRoaXMuZSwgc2lucGhpKTtcbiAgICAgIHBzaSA9IE1hdGguYXRhbigoMSAtIHRoaXMuZXMpICogdGFucGhpICsgdGhpcy5lcyAqIE5sMSAqIHRoaXMuc2luX3AxMiAvIChObCAqIGNvc3BoaSkpO1xuICAgICAgQXogPSBNYXRoLmF0YW4yKE1hdGguc2luKGRsb24pLCB0aGlzLmNvc19wMTIgKiBNYXRoLnRhbihwc2kpIC0gdGhpcy5zaW5fcDEyICogTWF0aC5jb3MoZGxvbikpO1xuICAgICAgaWYgKEF6ID09PSAwKSB7XG4gICAgICAgIHMgPSBNYXRoLmFzaW4odGhpcy5jb3NfcDEyICogTWF0aC5zaW4ocHNpKSAtIHRoaXMuc2luX3AxMiAqIE1hdGguY29zKHBzaSkpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoTWF0aC5hYnMoQXopIC0gTWF0aC5QSSkgPD0gRVBTTE4pIHtcbiAgICAgICAgcyA9IC1NYXRoLmFzaW4odGhpcy5jb3NfcDEyICogTWF0aC5zaW4ocHNpKSAtIHRoaXMuc2luX3AxMiAqIE1hdGguY29zKHBzaSkpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHMgPSBNYXRoLmFzaW4oTWF0aC5zaW4oZGxvbikgKiBNYXRoLmNvcyhwc2kpIC8gTWF0aC5zaW4oQXopKTtcbiAgICAgIH1cbiAgICAgIEcgPSB0aGlzLmUgKiB0aGlzLnNpbl9wMTIgLyBNYXRoLnNxcnQoMSAtIHRoaXMuZXMpO1xuICAgICAgSCA9IHRoaXMuZSAqIHRoaXMuY29zX3AxMiAqIE1hdGguY29zKEF6KSAvIE1hdGguc3FydCgxIC0gdGhpcy5lcyk7XG4gICAgICBHSCA9IEcgKiBIO1xuICAgICAgSHMgPSBIICogSDtcbiAgICAgIHMyID0gcyAqIHM7XG4gICAgICBzMyA9IHMyICogcztcbiAgICAgIHM0ID0gczMgKiBzO1xuICAgICAgczUgPSBzNCAqIHM7XG4gICAgICBjID0gTmwxICogcyAqICgxIC0gczIgKiBIcyAqICgxIC0gSHMpIC8gNiArIHMzIC8gOCAqIEdIICogKDEgLSAyICogSHMpICsgczQgLyAxMjAgKiAoSHMgKiAoNCAtIDcgKiBIcykgLSAzICogRyAqIEcgKiAoMSAtIDcgKiBIcykpIC0gczUgLyA0OCAqIEdIKTtcbiAgICAgIHAueCA9IHRoaXMueDAgKyBjICogTWF0aC5zaW4oQXopO1xuICAgICAgcC55ID0gdGhpcy55MCArIGMgKiBNYXRoLmNvcyhBeik7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH1cblxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgcC54IC09IHRoaXMueDA7XG4gIHAueSAtPSB0aGlzLnkwO1xuICB2YXIgcmgsIHosIHNpbnosIGNvc3osIGxvbiwgbGF0LCBjb24sIGUwLCBlMSwgZTIsIGUzLCBNbHAsIE0sIE4xLCBwc2ksIEF6LCBjb3NBeiwgdG1wLCBBLCBCLCBELCBFZSwgRiwgc2lucHNpO1xuICBpZiAodGhpcy5zcGhlcmUpIHtcbiAgICByaCA9IE1hdGguc3FydChwLnggKiBwLnggKyBwLnkgKiBwLnkpO1xuICAgIGlmIChyaCA+ICgyICogSEFMRl9QSSAqIHRoaXMuYSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgeiA9IHJoIC8gdGhpcy5hO1xuXG4gICAgc2lueiA9IE1hdGguc2luKHopO1xuICAgIGNvc3ogPSBNYXRoLmNvcyh6KTtcblxuICAgIGxvbiA9IHRoaXMubG9uZzA7XG4gICAgaWYgKE1hdGguYWJzKHJoKSA8PSBFUFNMTikge1xuICAgICAgbGF0ID0gdGhpcy5sYXQwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxhdCA9IGFzaW56KGNvc3ogKiB0aGlzLnNpbl9wMTIgKyAocC55ICogc2lueiAqIHRoaXMuY29zX3AxMikgLyByaCk7XG4gICAgICBjb24gPSBNYXRoLmFicyh0aGlzLmxhdDApIC0gSEFMRl9QSTtcbiAgICAgIGlmIChNYXRoLmFicyhjb24pIDw9IEVQU0xOKSB7XG4gICAgICAgIGlmICh0aGlzLmxhdDAgPj0gMCkge1xuICAgICAgICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIE1hdGguYXRhbjIocC54LCAtIHAueSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCAtIE1hdGguYXRhbjIoLXAueCwgcC55KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvKmNvbiA9IGNvc3ogLSB0aGlzLnNpbl9wMTIgKiBNYXRoLnNpbihsYXQpO1xuICAgICAgICBpZiAoKE1hdGguYWJzKGNvbikgPCBFUFNMTikgJiYgKE1hdGguYWJzKHAueCkgPCBFUFNMTikpIHtcbiAgICAgICAgICAvL25vLW9wLCBqdXN0IGtlZXAgdGhlIGxvbiB2YWx1ZSBhcyBpc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0ZW1wID0gTWF0aC5hdGFuMigocC54ICogc2lueiAqIHRoaXMuY29zX3AxMiksIChjb24gKiByaCkpO1xuICAgICAgICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIE1hdGguYXRhbjIoKHAueCAqIHNpbnogKiB0aGlzLmNvc19wMTIpLCAoY29uICogcmgpKSk7XG4gICAgICAgIH0qL1xuICAgICAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBNYXRoLmF0YW4yKHAueCAqIHNpbnosIHJoICogdGhpcy5jb3NfcDEyICogY29zeiAtIHAueSAqIHRoaXMuc2luX3AxMiAqIHNpbnopKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwLnggPSBsb247XG4gICAgcC55ID0gbGF0O1xuICAgIHJldHVybiBwO1xuICB9XG4gIGVsc2Uge1xuICAgIGUwID0gZTBmbih0aGlzLmVzKTtcbiAgICBlMSA9IGUxZm4odGhpcy5lcyk7XG4gICAgZTIgPSBlMmZuKHRoaXMuZXMpO1xuICAgIGUzID0gZTNmbih0aGlzLmVzKTtcbiAgICBpZiAoTWF0aC5hYnModGhpcy5zaW5fcDEyIC0gMSkgPD0gRVBTTE4pIHtcbiAgICAgIC8vTm9ydGggcG9sZSBjYXNlXG4gICAgICBNbHAgPSB0aGlzLmEgKiBtbGZuKGUwLCBlMSwgZTIsIGUzLCBIQUxGX1BJKTtcbiAgICAgIHJoID0gTWF0aC5zcXJ0KHAueCAqIHAueCArIHAueSAqIHAueSk7XG4gICAgICBNID0gTWxwIC0gcmg7XG4gICAgICBsYXQgPSBpbWxmbihNIC8gdGhpcy5hLCBlMCwgZTEsIGUyLCBlMyk7XG4gICAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBNYXRoLmF0YW4yKHAueCwgLSAxICogcC55KSk7XG4gICAgICBwLnggPSBsb247XG4gICAgICBwLnkgPSBsYXQ7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5zaW5fcDEyICsgMSkgPD0gRVBTTE4pIHtcbiAgICAgIC8vU291dGggcG9sZSBjYXNlXG4gICAgICBNbHAgPSB0aGlzLmEgKiBtbGZuKGUwLCBlMSwgZTIsIGUzLCBIQUxGX1BJKTtcbiAgICAgIHJoID0gTWF0aC5zcXJ0KHAueCAqIHAueCArIHAueSAqIHAueSk7XG4gICAgICBNID0gcmggLSBNbHA7XG5cbiAgICAgIGxhdCA9IGltbGZuKE0gLyB0aGlzLmEsIGUwLCBlMSwgZTIsIGUzKTtcbiAgICAgIGxvbiA9IGFkanVzdF9sb24odGhpcy5sb25nMCArIE1hdGguYXRhbjIocC54LCBwLnkpKTtcbiAgICAgIHAueCA9IGxvbjtcbiAgICAgIHAueSA9IGxhdDtcbiAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vZGVmYXVsdCBjYXNlXG4gICAgICByaCA9IE1hdGguc3FydChwLnggKiBwLnggKyBwLnkgKiBwLnkpO1xuICAgICAgQXogPSBNYXRoLmF0YW4yKHAueCwgcC55KTtcbiAgICAgIE4xID0gZ04odGhpcy5hLCB0aGlzLmUsIHRoaXMuc2luX3AxMik7XG4gICAgICBjb3NBeiA9IE1hdGguY29zKEF6KTtcbiAgICAgIHRtcCA9IHRoaXMuZSAqIHRoaXMuY29zX3AxMiAqIGNvc0F6O1xuICAgICAgQSA9IC10bXAgKiB0bXAgLyAoMSAtIHRoaXMuZXMpO1xuICAgICAgQiA9IDMgKiB0aGlzLmVzICogKDEgLSBBKSAqIHRoaXMuc2luX3AxMiAqIHRoaXMuY29zX3AxMiAqIGNvc0F6IC8gKDEgLSB0aGlzLmVzKTtcbiAgICAgIEQgPSByaCAvIE4xO1xuICAgICAgRWUgPSBEIC0gQSAqICgxICsgQSkgKiBNYXRoLnBvdyhELCAzKSAvIDYgLSBCICogKDEgKyAzICogQSkgKiBNYXRoLnBvdyhELCA0KSAvIDI0O1xuICAgICAgRiA9IDEgLSBBICogRWUgKiBFZSAvIDIgLSBEICogRWUgKiBFZSAqIEVlIC8gNjtcbiAgICAgIHBzaSA9IE1hdGguYXNpbih0aGlzLnNpbl9wMTIgKiBNYXRoLmNvcyhFZSkgKyB0aGlzLmNvc19wMTIgKiBNYXRoLnNpbihFZSkgKiBjb3NBeik7XG4gICAgICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBNYXRoLmFzaW4oTWF0aC5zaW4oQXopICogTWF0aC5zaW4oRWUpIC8gTWF0aC5jb3MocHNpKSkpO1xuICAgICAgc2lucHNpID0gTWF0aC5zaW4ocHNpKTtcbiAgICAgIGxhdCA9IE1hdGguYXRhbjIoKHNpbnBzaSAtIHRoaXMuZXMgKiBGICogdGhpcy5zaW5fcDEyKSAqIE1hdGgudGFuKHBzaSksIHNpbnBzaSAqICgxIC0gdGhpcy5lcykpO1xuICAgICAgcC54ID0gbG9uO1xuICAgICAgcC55ID0gbGF0O1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9XG5cbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIkF6aW11dGhhbF9FcXVpZGlzdGFudFwiLCBcImFlcWRcIl07XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGluaXQsXG4gIGZvcndhcmQ6IGZvcndhcmQsXG4gIGludmVyc2U6IGludmVyc2UsXG4gIG5hbWVzOiBuYW1lc1xufTtcbiIsImltcG9ydCBhZGp1c3RfbG9uIGZyb20gJy4uL2NvbW1vbi9hZGp1c3RfbG9uJztcbmltcG9ydCBhc2lueiBmcm9tICcuLi9jb21tb24vYXNpbnonO1xuaW1wb3J0IHtFUFNMTiwgSEFMRl9QSX0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAvL2RvdWJsZSB0ZW1wOyAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAgICAqL1xuXG4gIC8qIFBsYWNlIHBhcmFtZXRlcnMgaW4gc3RhdGljIHN0b3JhZ2UgZm9yIGNvbW1vbiB1c2VcbiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuICB0aGlzLnNpbl9wMTQgPSBNYXRoLnNpbih0aGlzLmxhdDApO1xuICB0aGlzLmNvc19wMTQgPSBNYXRoLmNvcyh0aGlzLmxhdDApO1xufVxuXG4vKiBPcnRob2dyYXBoaWMgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgdmFyIHNpbnBoaSwgY29zcGhpOyAvKiBzaW4gYW5kIGNvcyB2YWx1ZSAgICAgICAgKi9cbiAgdmFyIGRsb247IC8qIGRlbHRhIGxvbmdpdHVkZSB2YWx1ZSAgICAgICovXG4gIHZhciBjb3Nsb247IC8qIGNvcyBvZiBsb25naXR1ZGUgICAgICAgICovXG4gIHZhciBrc3A7IC8qIHNjYWxlIGZhY3RvciAgICAgICAgICAqL1xuICB2YXIgZywgeCwgeTtcbiAgdmFyIGxvbiA9IHAueDtcbiAgdmFyIGxhdCA9IHAueTtcbiAgLyogRm9yd2FyZCBlcXVhdGlvbnNcbiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgZGxvbiA9IGFkanVzdF9sb24obG9uIC0gdGhpcy5sb25nMCk7XG5cbiAgc2lucGhpID0gTWF0aC5zaW4obGF0KTtcbiAgY29zcGhpID0gTWF0aC5jb3MobGF0KTtcblxuICBjb3Nsb24gPSBNYXRoLmNvcyhkbG9uKTtcbiAgZyA9IHRoaXMuc2luX3AxNCAqIHNpbnBoaSArIHRoaXMuY29zX3AxNCAqIGNvc3BoaSAqIGNvc2xvbjtcbiAga3NwID0gMTtcbiAgaWYgKChnID4gMCkgfHwgKE1hdGguYWJzKGcpIDw9IEVQU0xOKSkge1xuICAgIHggPSB0aGlzLmEgKiBrc3AgKiBjb3NwaGkgKiBNYXRoLnNpbihkbG9uKTtcbiAgICB5ID0gdGhpcy55MCArIHRoaXMuYSAqIGtzcCAqICh0aGlzLmNvc19wMTQgKiBzaW5waGkgLSB0aGlzLnNpbl9wMTQgKiBjb3NwaGkgKiBjb3Nsb24pO1xuICB9XG4gIHAueCA9IHg7XG4gIHAueSA9IHk7XG4gIHJldHVybiBwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShwKSB7XG4gIHZhciByaDsgLyogaGVpZ2h0IGFib3ZlIGVsbGlwc29pZCAgICAgICovXG4gIHZhciB6OyAvKiBhbmdsZSAgICAgICAgICAqL1xuICB2YXIgc2lueiwgY29zejsgLyogc2luIG9mIHogYW5kIGNvcyBvZiB6ICAgICAgKi9cbiAgdmFyIGNvbjtcbiAgdmFyIGxvbiwgbGF0O1xuICAvKiBJbnZlcnNlIGVxdWF0aW9uc1xuICAgICAgLS0tLS0tLS0tLS0tLS0tLS0qL1xuICBwLnggLT0gdGhpcy54MDtcbiAgcC55IC09IHRoaXMueTA7XG4gIHJoID0gTWF0aC5zcXJ0KHAueCAqIHAueCArIHAueSAqIHAueSk7XG4gIHogPSBhc2lueihyaCAvIHRoaXMuYSk7XG5cbiAgc2lueiA9IE1hdGguc2luKHopO1xuICBjb3N6ID0gTWF0aC5jb3Moeik7XG5cbiAgbG9uID0gdGhpcy5sb25nMDtcbiAgaWYgKE1hdGguYWJzKHJoKSA8PSBFUFNMTikge1xuICAgIGxhdCA9IHRoaXMubGF0MDtcbiAgICBwLnggPSBsb247XG4gICAgcC55ID0gbGF0O1xuICAgIHJldHVybiBwO1xuICB9XG4gIGxhdCA9IGFzaW56KGNvc3ogKiB0aGlzLnNpbl9wMTQgKyAocC55ICogc2lueiAqIHRoaXMuY29zX3AxNCkgLyByaCk7XG4gIGNvbiA9IE1hdGguYWJzKHRoaXMubGF0MCkgLSBIQUxGX1BJO1xuICBpZiAoTWF0aC5hYnMoY29uKSA8PSBFUFNMTikge1xuICAgIGlmICh0aGlzLmxhdDAgPj0gMCkge1xuICAgICAgbG9uID0gYWRqdXN0X2xvbih0aGlzLmxvbmcwICsgTWF0aC5hdGFuMihwLngsIC0gcC55KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbG9uID0gYWRqdXN0X2xvbih0aGlzLmxvbmcwIC0gTWF0aC5hdGFuMigtcC54LCBwLnkpKTtcbiAgICB9XG4gICAgcC54ID0gbG9uO1xuICAgIHAueSA9IGxhdDtcbiAgICByZXR1cm4gcDtcbiAgfVxuICBsb24gPSBhZGp1c3RfbG9uKHRoaXMubG9uZzAgKyBNYXRoLmF0YW4yKChwLnggKiBzaW56KSwgcmggKiB0aGlzLmNvc19wMTQgKiBjb3N6IC0gcC55ICogdGhpcy5zaW5fcDE0ICogc2lueikpO1xuICBwLnggPSBsb247XG4gIHAueSA9IGxhdDtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJvcnRob1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiLy8gUVNDIHByb2plY3Rpb24gcmV3cml0dGVuIGZyb20gdGhlIG9yaWdpbmFsIFBST0o0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vT1NHZW8vcHJvai40L2Jsb2IvbWFzdGVyL3NyYy9QSl9xc2MuY1xuXG5pbXBvcnQge0VQU0xOLCBUV09fUEksIFNQSSwgSEFMRl9QSSwgRk9SVFBJfSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWVzJztcblxuLyogY29uc3RhbnRzICovXG52YXIgRkFDRV9FTlVNID0ge1xuICAgIEZST05UOiAxLFxuICAgIFJJR0hUOiAyLFxuICAgIEJBQ0s6IDMsXG4gICAgTEVGVDogNCxcbiAgICBUT1A6IDUsXG4gICAgQk9UVE9NOiA2XG59O1xuXG52YXIgQVJFQV9FTlVNID0ge1xuICAgIEFSRUFfMDogMSxcbiAgICBBUkVBXzE6IDIsXG4gICAgQVJFQV8yOiAzLFxuICAgIEFSRUFfMzogNFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG5cbiAgdGhpcy54MCA9IHRoaXMueDAgfHwgMDtcbiAgdGhpcy55MCA9IHRoaXMueTAgfHwgMDtcbiAgdGhpcy5sYXQwID0gdGhpcy5sYXQwIHx8IDA7XG4gIHRoaXMubG9uZzAgPSB0aGlzLmxvbmcwIHx8IDA7XG4gIHRoaXMubGF0X3RzID0gdGhpcy5sYXRfdHMgfHwgMDtcbiAgdGhpcy50aXRsZSA9IHRoaXMudGl0bGUgfHwgXCJRdWFkcmlsYXRlcmFsaXplZCBTcGhlcmljYWwgQ3ViZVwiO1xuXG4gIC8qIERldGVybWluZSB0aGUgY3ViZSBmYWNlIGZyb20gdGhlIGNlbnRlciBvZiBwcm9qZWN0aW9uLiAqL1xuICBpZiAodGhpcy5sYXQwID49IEhBTEZfUEkgLSBGT1JUUEkgLyAyLjApIHtcbiAgICB0aGlzLmZhY2UgPSBGQUNFX0VOVU0uVE9QO1xuICB9IGVsc2UgaWYgKHRoaXMubGF0MCA8PSAtKEhBTEZfUEkgLSBGT1JUUEkgLyAyLjApKSB7XG4gICAgdGhpcy5mYWNlID0gRkFDRV9FTlVNLkJPVFRPTTtcbiAgfSBlbHNlIGlmIChNYXRoLmFicyh0aGlzLmxvbmcwKSA8PSBGT1JUUEkpIHtcbiAgICB0aGlzLmZhY2UgPSBGQUNFX0VOVU0uRlJPTlQ7XG4gIH0gZWxzZSBpZiAoTWF0aC5hYnModGhpcy5sb25nMCkgPD0gSEFMRl9QSSArIEZPUlRQSSkge1xuICAgIHRoaXMuZmFjZSA9IHRoaXMubG9uZzAgPiAwLjAgPyBGQUNFX0VOVU0uUklHSFQgOiBGQUNFX0VOVU0uTEVGVDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmZhY2UgPSBGQUNFX0VOVU0uQkFDSztcbiAgfVxuXG4gIC8qIEZpbGwgaW4gdXNlZnVsIHZhbHVlcyBmb3IgdGhlIGVsbGlwc29pZCA8LT4gc3BoZXJlIHNoaWZ0XG4gICAqIGRlc2NyaWJlZCBpbiBbTEsxMl0uICovXG4gIGlmICh0aGlzLmVzICE9PSAwKSB7XG4gICAgdGhpcy5vbmVfbWludXNfZiA9IDEgLSAodGhpcy5hIC0gdGhpcy5iKSAvIHRoaXMuYTtcbiAgICB0aGlzLm9uZV9taW51c19mX3NxdWFyZWQgPSB0aGlzLm9uZV9taW51c19mICogdGhpcy5vbmVfbWludXNfZjtcbiAgfVxufVxuXG4vLyBRU0MgZm9yd2FyZCBlcXVhdGlvbnMtLW1hcHBpbmcgbGF0LGxvbmcgdG8geCx5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmQocCkge1xuICB2YXIgeHkgPSB7eDogMCwgeTogMH07XG4gIHZhciBsYXQsIGxvbjtcbiAgdmFyIHRoZXRhLCBwaGk7XG4gIHZhciB0LCBtdTtcbiAgLyogbnU7ICovXG4gIHZhciBhcmVhID0ge3ZhbHVlOiAwfTtcblxuICAvLyBtb3ZlIGxvbiBhY2NvcmRpbmcgdG8gcHJvamVjdGlvbidzIGxvblxuICBwLnggLT0gdGhpcy5sb25nMDtcblxuICAvKiBDb252ZXJ0IHRoZSBnZW9kZXRpYyBsYXRpdHVkZSB0byBhIGdlb2NlbnRyaWMgbGF0aXR1ZGUuXG4gICAqIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHNoaWZ0IGZyb20gdGhlIGVsbGlwc29pZCB0byB0aGUgc3BoZXJlXG4gICAqIGRlc2NyaWJlZCBpbiBbTEsxMl0uICovXG4gIGlmICh0aGlzLmVzICE9PSAwKSB7Ly9pZiAoUC0+ZXMgIT0gMCkge1xuICAgIGxhdCA9IE1hdGguYXRhbih0aGlzLm9uZV9taW51c19mX3NxdWFyZWQgKiBNYXRoLnRhbihwLnkpKTtcbiAgfSBlbHNlIHtcbiAgICBsYXQgPSBwLnk7XG4gIH1cblxuICAvKiBDb252ZXJ0IHRoZSBpbnB1dCBsYXQsIGxvbiBpbnRvIHRoZXRhLCBwaGkgYXMgdXNlZCBieSBRU0MuXG4gICAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgY3ViZSBmYWNlIGFuZCB0aGUgYXJlYSBvbiBpdC5cbiAgICogRm9yIHRoZSB0b3AgYW5kIGJvdHRvbSBmYWNlLCB3ZSBjYW4gY29tcHV0ZSB0aGV0YSBhbmQgcGhpXG4gICAqIGRpcmVjdGx5IGZyb20gcGhpLCBsYW0uIEZvciB0aGUgb3RoZXIgZmFjZXMsIHdlIG11c3QgdXNlXG4gICAqIHVuaXQgc3BoZXJlIGNhcnRlc2lhbiBjb29yZGluYXRlcyBhcyBhbiBpbnRlcm1lZGlhdGUgc3RlcC4gKi9cbiAgbG9uID0gcC54OyAvL2xvbiA9IGxwLmxhbTtcbiAgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLlRPUCkge1xuICAgIHBoaSA9IEhBTEZfUEkgLSBsYXQ7XG4gICAgaWYgKGxvbiA+PSBGT1JUUEkgJiYgbG9uIDw9IEhBTEZfUEkgKyBGT1JUUEkpIHtcbiAgICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8wO1xuICAgICAgdGhldGEgPSBsb24gLSBIQUxGX1BJO1xuICAgIH0gZWxzZSBpZiAobG9uID4gSEFMRl9QSSArIEZPUlRQSSB8fCBsb24gPD0gLShIQUxGX1BJICsgRk9SVFBJKSkge1xuICAgICAgYXJlYS52YWx1ZSA9IEFSRUFfRU5VTS5BUkVBXzE7XG4gICAgICB0aGV0YSA9IChsb24gPiAwLjAgPyBsb24gLSBTUEkgOiBsb24gKyBTUEkpO1xuICAgIH0gZWxzZSBpZiAobG9uID4gLShIQUxGX1BJICsgRk9SVFBJKSAmJiBsb24gPD0gLUZPUlRQSSkge1xuICAgICAgYXJlYS52YWx1ZSA9IEFSRUFfRU5VTS5BUkVBXzI7XG4gICAgICB0aGV0YSA9IGxvbiArIEhBTEZfUEk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8zO1xuICAgICAgdGhldGEgPSBsb247XG4gICAgfVxuICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLkJPVFRPTSkge1xuICAgIHBoaSA9IEhBTEZfUEkgKyBsYXQ7XG4gICAgaWYgKGxvbiA+PSBGT1JUUEkgJiYgbG9uIDw9IEhBTEZfUEkgKyBGT1JUUEkpIHtcbiAgICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8wO1xuICAgICAgdGhldGEgPSAtbG9uICsgSEFMRl9QSTtcbiAgICB9IGVsc2UgaWYgKGxvbiA8IEZPUlRQSSAmJiBsb24gPj0gLUZPUlRQSSkge1xuICAgICAgYXJlYS52YWx1ZSA9IEFSRUFfRU5VTS5BUkVBXzE7XG4gICAgICB0aGV0YSA9IC1sb247XG4gICAgfSBlbHNlIGlmIChsb24gPCAtRk9SVFBJICYmIGxvbiA+PSAtKEhBTEZfUEkgKyBGT1JUUEkpKSB7XG4gICAgICBhcmVhLnZhbHVlID0gQVJFQV9FTlVNLkFSRUFfMjtcbiAgICAgIHRoZXRhID0gLWxvbiAtIEhBTEZfUEk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8zO1xuICAgICAgdGhldGEgPSAobG9uID4gMC4wID8gLWxvbiArIFNQSSA6IC1sb24gLSBTUEkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgcSwgciwgcztcbiAgICB2YXIgc2lubGF0LCBjb3NsYXQ7XG4gICAgdmFyIHNpbmxvbiwgY29zbG9uO1xuXG4gICAgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLlJJR0hUKSB7XG4gICAgICBsb24gPSBxc2Nfc2hpZnRfbG9uX29yaWdpbihsb24sICtIQUxGX1BJKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLkJBQ0spIHtcbiAgICAgIGxvbiA9IHFzY19zaGlmdF9sb25fb3JpZ2luKGxvbiwgK1NQSSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZhY2UgPT09IEZBQ0VfRU5VTS5MRUZUKSB7XG4gICAgICBsb24gPSBxc2Nfc2hpZnRfbG9uX29yaWdpbihsb24sIC1IQUxGX1BJKTtcbiAgICB9XG4gICAgc2lubGF0ID0gTWF0aC5zaW4obGF0KTtcbiAgICBjb3NsYXQgPSBNYXRoLmNvcyhsYXQpO1xuICAgIHNpbmxvbiA9IE1hdGguc2luKGxvbik7XG4gICAgY29zbG9uID0gTWF0aC5jb3MobG9uKTtcbiAgICBxID0gY29zbGF0ICogY29zbG9uO1xuICAgIHIgPSBjb3NsYXQgKiBzaW5sb247XG4gICAgcyA9IHNpbmxhdDtcblxuICAgIGlmICh0aGlzLmZhY2UgPT09IEZBQ0VfRU5VTS5GUk9OVCkge1xuICAgICAgcGhpID0gTWF0aC5hY29zKHEpO1xuICAgICAgdGhldGEgPSBxc2NfZndkX2VxdWF0X2ZhY2VfdGhldGEocGhpLCBzLCByLCBhcmVhKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLlJJR0hUKSB7XG4gICAgICBwaGkgPSBNYXRoLmFjb3Mocik7XG4gICAgICB0aGV0YSA9IHFzY19md2RfZXF1YXRfZmFjZV90aGV0YShwaGksIHMsIC1xLCBhcmVhKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLkJBQ0spIHtcbiAgICAgIHBoaSA9IE1hdGguYWNvcygtcSk7XG4gICAgICB0aGV0YSA9IHFzY19md2RfZXF1YXRfZmFjZV90aGV0YShwaGksIHMsIC1yLCBhcmVhKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLkxFRlQpIHtcbiAgICAgIHBoaSA9IE1hdGguYWNvcygtcik7XG4gICAgICB0aGV0YSA9IHFzY19md2RfZXF1YXRfZmFjZV90aGV0YShwaGksIHMsIHEsIGFyZWEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBJbXBvc3NpYmxlICovXG4gICAgICBwaGkgPSB0aGV0YSA9IDA7XG4gICAgICBhcmVhLnZhbHVlID0gQVJFQV9FTlVNLkFSRUFfMDtcbiAgICB9XG4gIH1cblxuICAvKiBDb21wdXRlIG11IGFuZCBudSBmb3IgdGhlIGFyZWEgb2YgZGVmaW5pdGlvbi5cbiAgICogRm9yIG11LCBzZWUgRXEuICgzLTIxKSBpbiBbT0w3Nl0sIGJ1dCBub3RlIHRoZSB0eXBvczpcbiAgICogY29tcGFyZSB3aXRoIEVxLiAoMy0xNCkuIEZvciBudSwgc2VlIEVxLiAoMy0zOCkuICovXG4gIG11ID0gTWF0aC5hdGFuKCgxMiAvIFNQSSkgKiAodGhldGEgKyBNYXRoLmFjb3MoTWF0aC5zaW4odGhldGEpICogTWF0aC5jb3MoRk9SVFBJKSkgLSBIQUxGX1BJKSk7XG4gIHQgPSBNYXRoLnNxcnQoKDEgLSBNYXRoLmNvcyhwaGkpKSAvIChNYXRoLmNvcyhtdSkgKiBNYXRoLmNvcyhtdSkpIC8gKDEgLSBNYXRoLmNvcyhNYXRoLmF0YW4oMSAvIE1hdGguY29zKHRoZXRhKSkpKSk7XG5cbiAgLyogQXBwbHkgdGhlIHJlc3VsdCB0byB0aGUgcmVhbCBhcmVhLiAqL1xuICBpZiAoYXJlYS52YWx1ZSA9PT0gQVJFQV9FTlVNLkFSRUFfMSkge1xuICAgIG11ICs9IEhBTEZfUEk7XG4gIH0gZWxzZSBpZiAoYXJlYS52YWx1ZSA9PT0gQVJFQV9FTlVNLkFSRUFfMikge1xuICAgIG11ICs9IFNQSTtcbiAgfSBlbHNlIGlmIChhcmVhLnZhbHVlID09PSBBUkVBX0VOVU0uQVJFQV8zKSB7XG4gICAgbXUgKz0gMS41ICogU1BJO1xuICB9XG5cbiAgLyogTm93IGNvbXB1dGUgeCwgeSBmcm9tIG11IGFuZCBudSAqL1xuICB4eS54ID0gdCAqIE1hdGguY29zKG11KTtcbiAgeHkueSA9IHQgKiBNYXRoLnNpbihtdSk7XG4gIHh5LnggPSB4eS54ICogdGhpcy5hICsgdGhpcy54MDtcbiAgeHkueSA9IHh5LnkgKiB0aGlzLmEgKyB0aGlzLnkwO1xuXG4gIHAueCA9IHh5Lng7XG4gIHAueSA9IHh5Lnk7XG4gIHJldHVybiBwO1xufVxuXG4vLyBRU0MgaW52ZXJzZSBlcXVhdGlvbnMtLW1hcHBpbmcgeCx5IHRvIGxhdC9sb25nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICB2YXIgbHAgPSB7bGFtOiAwLCBwaGk6IDB9O1xuICB2YXIgbXUsIG51LCBjb3NtdSwgdGFubnU7XG4gIHZhciB0YW50aGV0YSwgdGhldGEsIGNvc3BoaSwgcGhpO1xuICB2YXIgdDtcbiAgdmFyIGFyZWEgPSB7dmFsdWU6IDB9O1xuXG4gIC8qIGRlLW9mZnNldCAqL1xuICBwLnggPSAocC54IC0gdGhpcy54MCkgLyB0aGlzLmE7XG4gIHAueSA9IChwLnkgLSB0aGlzLnkwKSAvIHRoaXMuYTtcblxuICAvKiBDb252ZXJ0IHRoZSBpbnB1dCB4LCB5IHRvIHRoZSBtdSBhbmQgbnUgYW5nbGVzIGFzIHVzZWQgYnkgUVNDLlxuICAgKiBUaGlzIGRlcGVuZHMgb24gdGhlIGFyZWEgb2YgdGhlIGN1YmUgZmFjZS4gKi9cbiAgbnUgPSBNYXRoLmF0YW4oTWF0aC5zcXJ0KHAueCAqIHAueCArIHAueSAqIHAueSkpO1xuICBtdSA9IE1hdGguYXRhbjIocC55LCBwLngpO1xuICBpZiAocC54ID49IDAuMCAmJiBwLnggPj0gTWF0aC5hYnMocC55KSkge1xuICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8wO1xuICB9IGVsc2UgaWYgKHAueSA+PSAwLjAgJiYgcC55ID49IE1hdGguYWJzKHAueCkpIHtcbiAgICBhcmVhLnZhbHVlID0gQVJFQV9FTlVNLkFSRUFfMTtcbiAgICBtdSAtPSBIQUxGX1BJO1xuICB9IGVsc2UgaWYgKHAueCA8IDAuMCAmJiAtcC54ID49IE1hdGguYWJzKHAueSkpIHtcbiAgICBhcmVhLnZhbHVlID0gQVJFQV9FTlVNLkFSRUFfMjtcbiAgICBtdSA9IChtdSA8IDAuMCA/IG11ICsgU1BJIDogbXUgLSBTUEkpO1xuICB9IGVsc2Uge1xuICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8zO1xuICAgIG11ICs9IEhBTEZfUEk7XG4gIH1cblxuICAvKiBDb21wdXRlIHBoaSBhbmQgdGhldGEgZm9yIHRoZSBhcmVhIG9mIGRlZmluaXRpb24uXG4gICAqIFRoZSBpbnZlcnNlIHByb2plY3Rpb24gaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgb3JpZ2luYWwgcGFwZXIsIGJ1dCBzb21lXG4gICAqIGdvb2QgaGludHMgY2FuIGJlIGZvdW5kIGhlcmUgKGFzIG9mIDIwMTEtMTItMTQpOlxuICAgKiBodHRwOi8vZml0cy5nc2ZjLm5hc2EuZ292L2ZpdHNiaXRzL3NhZi45My9zYWYuOTMwMlxuICAgKiAoc2VhcmNoIGZvciBcIk1lc3NhZ2UtSWQ6IDw5MzAyMTgxNzU5LkFBMjU0NzcgYXQgZml0cy5jdi5ucmFvLmVkdT5cIikgKi9cbiAgdCA9IChTUEkgLyAxMikgKiBNYXRoLnRhbihtdSk7XG4gIHRhbnRoZXRhID0gTWF0aC5zaW4odCkgLyAoTWF0aC5jb3ModCkgLSAoMSAvIE1hdGguc3FydCgyKSkpO1xuICB0aGV0YSA9IE1hdGguYXRhbih0YW50aGV0YSk7XG4gIGNvc211ID0gTWF0aC5jb3MobXUpO1xuICB0YW5udSA9IE1hdGgudGFuKG51KTtcbiAgY29zcGhpID0gMSAtIGNvc211ICogY29zbXUgKiB0YW5udSAqIHRhbm51ICogKDEgLSBNYXRoLmNvcyhNYXRoLmF0YW4oMSAvIE1hdGguY29zKHRoZXRhKSkpKTtcbiAgaWYgKGNvc3BoaSA8IC0xKSB7XG4gICAgY29zcGhpID0gLTE7XG4gIH0gZWxzZSBpZiAoY29zcGhpID4gKzEpIHtcbiAgICBjb3NwaGkgPSArMTtcbiAgfVxuXG4gIC8qIEFwcGx5IHRoZSByZXN1bHQgdG8gdGhlIHJlYWwgYXJlYSBvbiB0aGUgY3ViZSBmYWNlLlxuICAgKiBGb3IgdGhlIHRvcCBhbmQgYm90dG9tIGZhY2UsIHdlIGNhbiBjb21wdXRlIHBoaSBhbmQgbGFtIGRpcmVjdGx5LlxuICAgKiBGb3IgdGhlIG90aGVyIGZhY2VzLCB3ZSBtdXN0IHVzZSB1bml0IHNwaGVyZSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXNcbiAgICogYXMgYW4gaW50ZXJtZWRpYXRlIHN0ZXAuICovXG4gIGlmICh0aGlzLmZhY2UgPT09IEZBQ0VfRU5VTS5UT1ApIHtcbiAgICBwaGkgPSBNYXRoLmFjb3MoY29zcGhpKTtcbiAgICBscC5waGkgPSBIQUxGX1BJIC0gcGhpO1xuICAgIGlmIChhcmVhLnZhbHVlID09PSBBUkVBX0VOVU0uQVJFQV8wKSB7XG4gICAgICBscC5sYW0gPSB0aGV0YSArIEhBTEZfUEk7XG4gICAgfSBlbHNlIGlmIChhcmVhLnZhbHVlID09PSBBUkVBX0VOVU0uQVJFQV8xKSB7XG4gICAgICBscC5sYW0gPSAodGhldGEgPCAwLjAgPyB0aGV0YSArIFNQSSA6IHRoZXRhIC0gU1BJKTtcbiAgICB9IGVsc2UgaWYgKGFyZWEudmFsdWUgPT09IEFSRUFfRU5VTS5BUkVBXzIpIHtcbiAgICAgIGxwLmxhbSA9IHRoZXRhIC0gSEFMRl9QSTtcbiAgICB9IGVsc2UgLyogYXJlYS52YWx1ZSA9PSBBUkVBX0VOVU0uQVJFQV8zICovIHtcbiAgICAgIGxwLmxhbSA9IHRoZXRhO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0aGlzLmZhY2UgPT09IEZBQ0VfRU5VTS5CT1RUT00pIHtcbiAgICBwaGkgPSBNYXRoLmFjb3MoY29zcGhpKTtcbiAgICBscC5waGkgPSBwaGkgLSBIQUxGX1BJO1xuICAgIGlmIChhcmVhLnZhbHVlID09PSBBUkVBX0VOVU0uQVJFQV8wKSB7XG4gICAgICBscC5sYW0gPSAtdGhldGEgKyBIQUxGX1BJO1xuICAgIH0gZWxzZSBpZiAoYXJlYS52YWx1ZSA9PT0gQVJFQV9FTlVNLkFSRUFfMSkge1xuICAgICAgbHAubGFtID0gLXRoZXRhO1xuICAgIH0gZWxzZSBpZiAoYXJlYS52YWx1ZSA9PT0gQVJFQV9FTlVNLkFSRUFfMikge1xuICAgICAgbHAubGFtID0gLXRoZXRhIC0gSEFMRl9QSTtcbiAgICB9IGVsc2UgLyogYXJlYS52YWx1ZSA9PSBBUkVBX0VOVU0uQVJFQV8zICovIHtcbiAgICAgIGxwLmxhbSA9ICh0aGV0YSA8IDAuMCA/IC10aGV0YSAtIFNQSSA6IC10aGV0YSArIFNQSSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8qIENvbXB1dGUgcGhpIGFuZCBsYW0gdmlhIGNhcnRlc2lhbiB1bml0IHNwaGVyZSBjb29yZGluYXRlcy4gKi9cbiAgICB2YXIgcSwgciwgcztcbiAgICBxID0gY29zcGhpO1xuICAgIHQgPSBxICogcTtcbiAgICBpZiAodCA+PSAxKSB7XG4gICAgICBzID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyA9IE1hdGguc3FydCgxIC0gdCkgKiBNYXRoLnNpbih0aGV0YSk7XG4gICAgfVxuICAgIHQgKz0gcyAqIHM7XG4gICAgaWYgKHQgPj0gMSkge1xuICAgICAgciA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIgPSBNYXRoLnNxcnQoMSAtIHQpO1xuICAgIH1cbiAgICAvKiBSb3RhdGUgcSxyLHMgaW50byB0aGUgY29ycmVjdCBhcmVhLiAqL1xuICAgIGlmIChhcmVhLnZhbHVlID09PSBBUkVBX0VOVU0uQVJFQV8xKSB7XG4gICAgICB0ID0gcjtcbiAgICAgIHIgPSAtcztcbiAgICAgIHMgPSB0O1xuICAgIH0gZWxzZSBpZiAoYXJlYS52YWx1ZSA9PT0gQVJFQV9FTlVNLkFSRUFfMikge1xuICAgICAgciA9IC1yO1xuICAgICAgcyA9IC1zO1xuICAgIH0gZWxzZSBpZiAoYXJlYS52YWx1ZSA9PT0gQVJFQV9FTlVNLkFSRUFfMykge1xuICAgICAgdCA9IHI7XG4gICAgICByID0gcztcbiAgICAgIHMgPSAtdDtcbiAgICB9XG4gICAgLyogUm90YXRlIHEscixzIGludG8gdGhlIGNvcnJlY3QgY3ViZSBmYWNlLiAqL1xuICAgIGlmICh0aGlzLmZhY2UgPT09IEZBQ0VfRU5VTS5SSUdIVCkge1xuICAgICAgdCA9IHE7XG4gICAgICBxID0gLXI7XG4gICAgICByID0gdDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLkJBQ0spIHtcbiAgICAgIHEgPSAtcTtcbiAgICAgIHIgPSAtcjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLkxFRlQpIHtcbiAgICAgIHQgPSBxO1xuICAgICAgcSA9IHI7XG4gICAgICByID0gLXQ7XG4gICAgfVxuICAgIC8qIE5vdyBjb21wdXRlIHBoaSBhbmQgbGFtIGZyb20gdGhlIHVuaXQgc3BoZXJlIGNvb3JkaW5hdGVzLiAqL1xuICAgIGxwLnBoaSA9IE1hdGguYWNvcygtcykgLSBIQUxGX1BJO1xuICAgIGxwLmxhbSA9IE1hdGguYXRhbjIociwgcSk7XG4gICAgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLlJJR0hUKSB7XG4gICAgICBscC5sYW0gPSBxc2Nfc2hpZnRfbG9uX29yaWdpbihscC5sYW0sIC1IQUxGX1BJKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmFjZSA9PT0gRkFDRV9FTlVNLkJBQ0spIHtcbiAgICAgIGxwLmxhbSA9IHFzY19zaGlmdF9sb25fb3JpZ2luKGxwLmxhbSwgLVNQSSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZhY2UgPT09IEZBQ0VfRU5VTS5MRUZUKSB7XG4gICAgICBscC5sYW0gPSBxc2Nfc2hpZnRfbG9uX29yaWdpbihscC5sYW0sICtIQUxGX1BJKTtcbiAgICB9XG4gIH1cblxuICAvKiBBcHBseSB0aGUgc2hpZnQgZnJvbSB0aGUgc3BoZXJlIHRvIHRoZSBlbGxpcHNvaWQgYXMgZGVzY3JpYmVkXG4gICAqIGluIFtMSzEyXS4gKi9cbiAgaWYgKHRoaXMuZXMgIT09IDApIHtcbiAgICB2YXIgaW52ZXJ0X3NpZ247XG4gICAgdmFyIHRhbnBoaSwgeGE7XG4gICAgaW52ZXJ0X3NpZ24gPSAobHAucGhpIDwgMCA/IDEgOiAwKTtcbiAgICB0YW5waGkgPSBNYXRoLnRhbihscC5waGkpO1xuICAgIHhhID0gdGhpcy5iIC8gTWF0aC5zcXJ0KHRhbnBoaSAqIHRhbnBoaSArIHRoaXMub25lX21pbnVzX2Zfc3F1YXJlZCk7XG4gICAgbHAucGhpID0gTWF0aC5hdGFuKE1hdGguc3FydCh0aGlzLmEgKiB0aGlzLmEgLSB4YSAqIHhhKSAvICh0aGlzLm9uZV9taW51c19mICogeGEpKTtcbiAgICBpZiAoaW52ZXJ0X3NpZ24pIHtcbiAgICAgIGxwLnBoaSA9IC1scC5waGk7XG4gICAgfVxuICB9XG5cbiAgbHAubGFtICs9IHRoaXMubG9uZzA7XG4gIHAueCA9IGxwLmxhbTtcbiAgcC55ID0gbHAucGhpO1xuICByZXR1cm4gcDtcbn1cblxuLyogSGVscGVyIGZ1bmN0aW9uIGZvciBmb3J3YXJkIHByb2plY3Rpb246IGNvbXB1dGUgdGhlIHRoZXRhIGFuZ2xlXG4gKiBhbmQgZGV0ZXJtaW5lIHRoZSBhcmVhIG51bWJlci4gKi9cbmZ1bmN0aW9uIHFzY19md2RfZXF1YXRfZmFjZV90aGV0YShwaGksIHksIHgsIGFyZWEpIHtcbiAgdmFyIHRoZXRhO1xuICBpZiAocGhpIDwgRVBTTE4pIHtcbiAgICBhcmVhLnZhbHVlID0gQVJFQV9FTlVNLkFSRUFfMDtcbiAgICB0aGV0YSA9IDAuMDtcbiAgfSBlbHNlIHtcbiAgICB0aGV0YSA9IE1hdGguYXRhbjIoeSwgeCk7XG4gICAgaWYgKE1hdGguYWJzKHRoZXRhKSA8PSBGT1JUUEkpIHtcbiAgICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8wO1xuICAgIH0gZWxzZSBpZiAodGhldGEgPiBGT1JUUEkgJiYgdGhldGEgPD0gSEFMRl9QSSArIEZPUlRQSSkge1xuICAgICAgYXJlYS52YWx1ZSA9IEFSRUFfRU5VTS5BUkVBXzE7XG4gICAgICB0aGV0YSAtPSBIQUxGX1BJO1xuICAgIH0gZWxzZSBpZiAodGhldGEgPiBIQUxGX1BJICsgRk9SVFBJIHx8IHRoZXRhIDw9IC0oSEFMRl9QSSArIEZPUlRQSSkpIHtcbiAgICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8yO1xuICAgICAgdGhldGEgPSAodGhldGEgPj0gMC4wID8gdGhldGEgLSBTUEkgOiB0aGV0YSArIFNQSSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZWEudmFsdWUgPSBBUkVBX0VOVU0uQVJFQV8zO1xuICAgICAgdGhldGEgKz0gSEFMRl9QSTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoZXRhO1xufVxuXG4vKiBIZWxwZXIgZnVuY3Rpb246IHNoaWZ0IHRoZSBsb25naXR1ZGUuICovXG5mdW5jdGlvbiBxc2Nfc2hpZnRfbG9uX29yaWdpbihsb24sIG9mZnNldCkge1xuICB2YXIgc2xvbiA9IGxvbiArIG9mZnNldDtcbiAgaWYgKHNsb24gPCAtU1BJKSB7XG4gICAgc2xvbiArPSBUV09fUEk7XG4gIH0gZWxzZSBpZiAoc2xvbiA+ICtTUEkpIHtcbiAgICBzbG9uIC09IFRXT19QSTtcbiAgfVxuICByZXR1cm4gc2xvbjtcbn1cblxuZXhwb3J0IHZhciBuYW1lcyA9IFtcIlF1YWRyaWxhdGVyYWxpemVkIFNwaGVyaWNhbCBDdWJlXCIsIFwiUXVhZHJpbGF0ZXJhbGl6ZWRfU3BoZXJpY2FsX0N1YmVcIiwgXCJxc2NcIl07XG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGluaXQsXG4gIGZvcndhcmQ6IGZvcndhcmQsXG4gIGludmVyc2U6IGludmVyc2UsXG4gIG5hbWVzOiBuYW1lc1xufTtcblxuIiwiLy8gUm9iaW5zb24gcHJvamVjdGlvblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL09TR2VvL3Byb2ouNC9ibG9iL21hc3Rlci9zcmMvUEpfcm9iaW4uY1xuLy8gUG9seW5vbWlhbCBjb2VmaWNpZW50cyBmcm9tIGh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLmdpcy5wcm9qLTQuZGV2ZWwvNjAzOVxuXG5pbXBvcnQge0hBTEZfUEksIEQyUiwgUjJELCBFUFNMTn0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhbHVlcyc7XG5pbXBvcnQgYWRqdXN0X2xvbiBmcm9tICcuLi9jb21tb24vYWRqdXN0X2xvbic7XG5cbnZhciBDT0VGU19YID0gW1xuICAgIFsxLjAwMDAsIDIuMjE5OWUtMTcsIC03LjE1NTE1ZS0wNSwgMy4xMTAzZS0wNl0sXG4gICAgWzAuOTk4NiwgLTAuMDAwNDgyMjQzLCAtMi40ODk3ZS0wNSwgLTEuMzMwOWUtMDZdLFxuICAgIFswLjk5NTQsIC0wLjAwMDgzMTAzLCAtNC40ODYwNWUtMDUsIC05Ljg2NzAxZS0wN10sXG4gICAgWzAuOTkwMCwgLTAuMDAxMzUzNjQsIC01Ljk2NjFlLTA1LCAzLjY3NzdlLTA2XSxcbiAgICBbMC45ODIyLCAtMC4wMDE2NzQ0MiwgLTQuNDk1NDdlLTA2LCAtNS43MjQxMWUtMDZdLFxuICAgIFswLjk3MzAsIC0wLjAwMjE0ODY4LCAtOS4wMzU3MWUtMDUsIDEuODczNmUtMDhdLFxuICAgIFswLjk2MDAsIC0wLjAwMzA1MDg1LCAtOS4wMDc2MWUtMDUsIDEuNjQ5MTdlLTA2XSxcbiAgICBbMC45NDI3LCAtMC4wMDM4Mjc5MiwgLTYuNTMzODZlLTA1LCAtMi42MTU0ZS0wNl0sXG4gICAgWzAuOTIxNiwgLTAuMDA0Njc3NDYsIC0wLjAwMDEwNDU3LCA0LjgxMjQzZS0wNl0sXG4gICAgWzAuODk2MiwgLTAuMDA1MzYyMjMsIC0zLjIzODMxZS0wNSwgLTUuNDM0MzJlLTA2XSxcbiAgICBbMC44Njc5LCAtMC4wMDYwOTM2MywgLTAuMDAwMTEzODk4LCAzLjMyNDg0ZS0wNl0sXG4gICAgWzAuODM1MCwgLTAuMDA2OTgzMjUsIC02LjQwMjUzZS0wNSwgOS4zNDk1OWUtMDddLFxuICAgIFswLjc5ODYsIC0wLjAwNzU1MzM4LCAtNS4wMDAwOWUtMDUsIDkuMzUzMjRlLTA3XSxcbiAgICBbMC43NTk3LCAtMC4wMDc5ODMyNCwgLTMuNTk3MWUtMDUsIC0yLjI3NjI2ZS0wNl0sXG4gICAgWzAuNzE4NiwgLTAuMDA4NTEzNjcsIC03LjAxMTQ5ZS0wNSwgLTguNjMwM2UtMDZdLFxuICAgIFswLjY3MzIsIC0wLjAwOTg2MjA5LCAtMC4wMDAxOTk1NjksIDEuOTE5NzRlLTA1XSxcbiAgICBbMC42MjEzLCAtMC4wMTA0MTgsIDguODM5MjNlLTA1LCA2LjI0MDUxZS0wNl0sXG4gICAgWzAuNTcyMiwgLTAuMDA5MDY2MDEsIDAuMDAwMTgyLCA2LjI0MDUxZS0wNl0sXG4gICAgWzAuNTMyMiwgLTAuMDA2Nzc3OTcsIDAuMDAwMjc1NjA4LCA2LjI0MDUxZS0wNl1cbl07XG5cbnZhciBDT0VGU19ZID0gW1xuICAgIFstNS4yMDQxN2UtMTgsIDAuMDEyNCwgMS4yMTQzMWUtMTgsIC04LjQ1Mjg0ZS0xMV0sXG4gICAgWzAuMDYyMCwgMC4wMTI0LCAtMS4yNjc5M2UtMDksIDQuMjI2NDJlLTEwXSxcbiAgICBbMC4xMjQwLCAwLjAxMjQsIDUuMDcxNzFlLTA5LCAtMS42MDYwNGUtMDldLFxuICAgIFswLjE4NjAsIDAuMDEyMzk5OSwgLTEuOTAxODllLTA4LCA2LjAwMTUyZS0wOV0sXG4gICAgWzAuMjQ4MCwgMC4wMTI0MDAyLCA3LjEwMDM5ZS0wOCwgLTIuMjRlLTA4XSxcbiAgICBbMC4zMTAwLCAwLjAxMjM5OTIsIC0yLjY0OTk3ZS0wNywgOC4zNTk4NmUtMDhdLFxuICAgIFswLjM3MjAsIDAuMDEyNDAyOSwgOS44ODk4M2UtMDcsIC0zLjExOTk0ZS0wN10sXG4gICAgWzAuNDM0MCwgMC4wMTIzODkzLCAtMy42OTA5M2UtMDYsIC00LjM1NjIxZS0wN10sXG4gICAgWzAuNDk1OCwgMC4wMTIzMTk4LCAtMS4wMjI1MmUtMDUsIC0zLjQ1NTIzZS0wN10sXG4gICAgWzAuNTU3MSwgMC4wMTIxOTE2LCAtMS41NDA4MWUtMDUsIC01LjgyMjg4ZS0wN10sXG4gICAgWzAuNjE3NiwgMC4wMTE5OTM4LCAtMi40MTQyNGUtMDUsIC01LjI1MzI3ZS0wN10sXG4gICAgWzAuNjc2OSwgMC4wMTE3MTMsIC0zLjIwMjIzZS0wNSwgLTUuMTY0MDVlLTA3XSxcbiAgICBbMC43MzQ2LCAwLjAxMTM1NDEsIC0zLjk3Njg0ZS0wNSwgLTYuMDkwNTJlLTA3XSxcbiAgICBbMC43OTAzLCAwLjAxMDkxMDcsIC00Ljg5MDQyZS0wNSwgLTEuMDQ3MzllLTA2XSxcbiAgICBbMC44NDM1LCAwLjAxMDM0MzEsIC02LjQ2MTVlLTA1LCAtMS40MDM3NGUtMDldLFxuICAgIFswLjg5MzYsIDAuMDA5Njk2ODYsIC02LjQ2MzZlLTA1LCAtOC41NDdlLTA2XSxcbiAgICBbMC45Mzk0LCAwLjAwODQwOTQ3LCAtMC4wMDAxOTI4NDEsIC00LjIxMDZlLTA2XSxcbiAgICBbMC45NzYxLCAwLjAwNjE2NTI3LCAtMC4wMDAyNTYsIC00LjIxMDZlLTA2XSxcbiAgICBbMS4wMDAwLCAwLjAwMzI4OTQ3LCAtMC4wMDAzMTkxNTksIC00LjIxMDZlLTA2XVxuXTtcblxudmFyIEZYQyA9IDAuODQ4NztcbnZhciBGWUMgPSAxLjM1MjM7XG52YXIgQzEgPSBSMkQvNTsgLy8gcmFkIHRvIDUtZGVncmVlIGludGVydmFsXG52YXIgUkMxID0gMS9DMTtcbnZhciBOT0RFUyA9IDE4O1xuXG52YXIgcG9seTNfdmFsID0gZnVuY3Rpb24oY29lZnMsIHgpIHtcbiAgICByZXR1cm4gY29lZnNbMF0gKyB4ICogKGNvZWZzWzFdICsgeCAqIChjb2Vmc1syXSArIHggKiBjb2Vmc1szXSkpO1xufTtcblxudmFyIHBvbHkzX2RlciA9IGZ1bmN0aW9uKGNvZWZzLCB4KSB7XG4gICAgcmV0dXJuIGNvZWZzWzFdICsgeCAqICgyICogY29lZnNbMl0gKyB4ICogMyAqIGNvZWZzWzNdKTtcbn07XG5cbmZ1bmN0aW9uIG5ld3Rvbl9yYXBzaG9uKGZfZGYsIHN0YXJ0LCBtYXhfZXJyLCBpdGVycykge1xuICAgIHZhciB4ID0gc3RhcnQ7XG4gICAgZm9yICg7IGl0ZXJzOyAtLWl0ZXJzKSB7XG4gICAgICAgIHZhciB1cGQgPSBmX2RmKHgpO1xuICAgICAgICB4IC09IHVwZDtcbiAgICAgICAgaWYgKE1hdGguYWJzKHVwZCkgPCBtYXhfZXJyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdGhpcy54MCA9IHRoaXMueDAgfHwgMDtcbiAgICB0aGlzLnkwID0gdGhpcy55MCB8fCAwO1xuICAgIHRoaXMubG9uZzAgPSB0aGlzLmxvbmcwIHx8IDA7XG4gICAgdGhpcy5lcyA9IDA7XG4gICAgdGhpcy50aXRsZSA9IHRoaXMudGl0bGUgfHwgXCJSb2JpbnNvblwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZChsbCkge1xuICAgIHZhciBsb24gPSBhZGp1c3RfbG9uKGxsLnggLSB0aGlzLmxvbmcwKTtcblxuICAgIHZhciBkcGhpID0gTWF0aC5hYnMobGwueSk7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKGRwaGkgKiBDMSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICAgIGkgPSAwO1xuICAgIH0gZWxzZSBpZiAoaSA+PSBOT0RFUykge1xuICAgICAgICBpID0gTk9ERVMgLSAxO1xuICAgIH1cbiAgICBkcGhpID0gUjJEICogKGRwaGkgLSBSQzEgKiBpKTtcbiAgICB2YXIgeHkgPSB7XG4gICAgICAgIHg6IHBvbHkzX3ZhbChDT0VGU19YW2ldLCBkcGhpKSAqIGxvbixcbiAgICAgICAgeTogcG9seTNfdmFsKENPRUZTX1lbaV0sIGRwaGkpXG4gICAgfTtcbiAgICBpZiAobGwueSA8IDApIHtcbiAgICAgICAgeHkueSA9IC14eS55O1xuICAgIH1cblxuICAgIHh5LnggPSB4eS54ICogdGhpcy5hICogRlhDICsgdGhpcy54MDtcbiAgICB4eS55ID0geHkueSAqIHRoaXMuYSAqIEZZQyArIHRoaXMueTA7XG4gICAgcmV0dXJuIHh5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZSh4eSkge1xuICAgIHZhciBsbCA9IHtcbiAgICAgICAgeDogKHh5LnggLSB0aGlzLngwKSAvICh0aGlzLmEgKiBGWEMpLFxuICAgICAgICB5OiBNYXRoLmFicyh4eS55IC0gdGhpcy55MCkgLyAodGhpcy5hICogRllDKVxuICAgIH07XG5cbiAgICBpZiAobGwueSA+PSAxKSB7IC8vIHBhdGhvbG9naWMgY2FzZVxuICAgICAgICBsbC54IC89IENPRUZTX1hbTk9ERVNdWzBdO1xuICAgICAgICBsbC55ID0geHkueSA8IDAgPyAtSEFMRl9QSSA6IEhBTEZfUEk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZmluZCB0YWJsZSBpbnRlcnZhbFxuICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IobGwueSAqIE5PREVTKTtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChpID49IE5PREVTKSB7XG4gICAgICAgICAgICBpID0gTk9ERVMgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChDT0VGU19ZW2ldWzBdID4gbGwueSkge1xuICAgICAgICAgICAgICAgIC0taTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09FRlNfWVtpKzFdWzBdIDw9IGxsLnkpIHtcbiAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIDUgZGVncmVlIGludGVydmFsXG4gICAgICAgIHZhciBjb2VmcyA9IENPRUZTX1lbaV07XG4gICAgICAgIHZhciB0ID0gNSAqIChsbC55IC0gY29lZnNbMF0pIC8gKENPRUZTX1lbaSsxXVswXSAtIGNvZWZzWzBdKTtcbiAgICAgICAgLy8gZmluZCB0IHNvIHRoYXQgcG9seTNfdmFsKGNvZWZzLCB0KSA9IGxsLnlcbiAgICAgICAgdCA9IG5ld3Rvbl9yYXBzaG9uKGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgICAgIHJldHVybiAocG9seTNfdmFsKGNvZWZzLCB4KSAtIGxsLnkpIC8gcG9seTNfZGVyKGNvZWZzLCB4KTtcbiAgICAgICAgfSwgdCwgRVBTTE4sIDEwMCk7XG5cbiAgICAgICAgbGwueCAvPSBwb2x5M192YWwoQ09FRlNfWFtpXSwgdCk7XG4gICAgICAgIGxsLnkgPSAoNSAqIGkgKyB0KSAqIEQyUjtcbiAgICAgICAgaWYgKHh5LnkgPCAwKSB7XG4gICAgICAgICAgICBsbC55ID0gLWxsLnk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsbC54ID0gYWRqdXN0X2xvbihsbC54ICsgdGhpcy5sb25nMCk7XG4gICAgcmV0dXJuIGxsO1xufVxuXG5leHBvcnQgdmFyIG5hbWVzID0gW1wiUm9iaW5zb25cIiwgXCJyb2JpblwiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IHtcbiAgICBnZW9kZXRpY1RvR2VvY2VudHJpYyxcbiAgICBnZW9jZW50cmljVG9HZW9kZXRpY1xufSBmcm9tICcuLi9kYXR1bVV0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdGhpcy5uYW1lID0gJ2dlb2NlbnQnO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkKHApIHtcbiAgICB2YXIgcG9pbnQgPSBnZW9kZXRpY1RvR2VvY2VudHJpYyhwLCB0aGlzLmVzLCB0aGlzLmEpO1xuICAgIHJldHVybiBwb2ludDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2UocCkge1xuICAgIHZhciBwb2ludCA9IGdlb2NlbnRyaWNUb0dlb2RldGljKHAsIHRoaXMuZXMsIHRoaXMuYSwgdGhpcy5iKTtcbiAgICByZXR1cm4gcG9pbnQ7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJHZW9jZW50cmljXCIsICdnZW9jZW50cmljJywgXCJnZW9jZW50XCIsIFwiR2VvY2VudFwiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBpbml0OiBpbml0LFxuICAgIGZvcndhcmQ6IGZvcndhcmQsXG4gICAgaW52ZXJzZTogaW52ZXJzZSxcbiAgICBuYW1lczogbmFtZXNcbn07IiwiXG52YXIgbW9kZSA9IHtcbiAgTl9QT0xFOiAwLFxuICBTX1BPTEU6IDEsXG4gIEVRVUlUOiAyLFxuICBPQkxJUTogM1xufTtcblxuaW1wb3J0IHsgRDJSLCBIQUxGX1BJLCBFUFNMTiB9IGZyb20gXCIuLi9jb25zdGFudHMvdmFsdWVzXCI7XG5pbXBvcnQgaHlwb3QgZnJvbSBcIi4uL2NvbW1vbi9oeXBvdFwiO1xuXG52YXIgcGFyYW1zID0ge1xuICBoOiAgICAgeyBkZWY6IDEwMDAwMCwgbnVtOiB0cnVlIH0sICAgICAgICAgICAvLyBkZWZhdWx0IGlzIEthcm1hbiBsaW5lLCBubyBkZWZhdWx0IGluIFBST0ouN1xuICBhemk6ICAgeyBkZWY6IDAsIG51bTogdHJ1ZSwgZGVncmVlczogdHJ1ZSB9LCAvLyBkZWZhdWx0IGlzIE5vcnRoXG4gIHRpbHQ6ICB7IGRlZjogMCwgbnVtOiB0cnVlLCBkZWdyZWVzOiB0cnVlIH0sIC8vIGRlZmF1bHQgaXMgTmFkaXJcbiAgbG9uZzA6IHsgZGVmOiAwLCBudW06IHRydWUgfSwgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBHcmVlbndpY2gsIGNvbnZlcnNpb24gdG8gcmFkIGlzIGF1dG9tYXRpY1xuICBsYXQwOiAgeyBkZWY6IDAsIG51bTogdHJ1ZSB9ICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIEVxdWF0b3IsIGNvbnZlcnNpb24gdG8gcmFkIGlzIGF1dG9tYXRpY1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQoKSB7XG4gIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgIGlmICh0eXBlb2YgdGhpc1twXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpc1twXSA9IHBhcmFtc1twXS5kZWY7XG4gICAgfSBlbHNlIGlmIChwYXJhbXNbcF0ubnVtICYmIGlzTmFOKHRoaXNbcF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlciB2YWx1ZSwgbXVzdCBiZSBudW1lcmljIFwiICsgcCArIFwiID0gXCIgKyB0aGlzW3BdKTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtc1twXS5udW0pIHtcbiAgICAgIHRoaXNbcF0gPSBwYXJzZUZsb2F0KHRoaXNbcF0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zW3BdLmRlZ3JlZXMpIHtcbiAgICAgIHRoaXNbcF0gPSB0aGlzW3BdICogRDJSO1xuICAgIH1cbiAgfS5iaW5kKHRoaXMpKTtcblxuICBpZiAoTWF0aC5hYnMoKE1hdGguYWJzKHRoaXMubGF0MCkgLSBIQUxGX1BJKSkgPCBFUFNMTikge1xuICAgIHRoaXMubW9kZSA9IHRoaXMubGF0MCA8IDAgPyBtb2RlLlNfUE9MRSA6IG1vZGUuTl9QT0xFO1xuICB9IGVsc2UgaWYgKE1hdGguYWJzKHRoaXMubGF0MCkgPCBFUFNMTikge1xuICAgIHRoaXMubW9kZSA9IG1vZGUuRVFVSVQ7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZS5PQkxJUTtcbiAgICB0aGlzLnNpbnBoMCA9IE1hdGguc2luKHRoaXMubGF0MCk7XG4gICAgdGhpcy5jb3NwaDAgPSBNYXRoLmNvcyh0aGlzLmxhdDApO1xuICB9XG5cbiAgdGhpcy5wbjEgPSB0aGlzLmggLyB0aGlzLmE7ICAvLyBOb3JtYWxpemUgcmVsYXRpdmUgdG8gdGhlIEVhcnRoJ3MgcmFkaXVzXG5cbiAgaWYgKHRoaXMucG4xIDw9IDAgfHwgdGhpcy5wbjEgPiAxZTEwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoZWlnaHRcIik7XG4gIH1cbiAgXG4gIHRoaXMucCA9IDEgKyB0aGlzLnBuMTtcbiAgdGhpcy5ycCA9IDEgLyB0aGlzLnA7XG4gIHRoaXMuaDEgPSAxIC8gdGhpcy5wbjE7XG4gIHRoaXMucGZhY3QgPSAodGhpcy5wICsgMSkgKiB0aGlzLmgxO1xuICB0aGlzLmVzID0gMDtcblxuICB2YXIgb21lZ2EgPSB0aGlzLnRpbHQ7XG4gIHZhciBnYW1tYSA9IHRoaXMuYXppO1xuICB0aGlzLmNnID0gTWF0aC5jb3MoZ2FtbWEpO1xuICB0aGlzLnNnID0gTWF0aC5zaW4oZ2FtbWEpO1xuICB0aGlzLmN3ID0gTWF0aC5jb3Mob21lZ2EpO1xuICB0aGlzLnN3ID0gTWF0aC5zaW4ob21lZ2EpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZChwKSB7XG4gIHAueCAtPSB0aGlzLmxvbmcwO1xuICB2YXIgc2lucGhpID0gTWF0aC5zaW4ocC55KTtcbiAgdmFyIGNvc3BoaSA9IE1hdGguY29zKHAueSk7XG4gIHZhciBjb3NsYW0gPSBNYXRoLmNvcyhwLngpO1xuICB2YXIgeCwgeTtcbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICBjYXNlIG1vZGUuT0JMSVE6XG4gICAgICB5ID0gdGhpcy5zaW5waDAgKiBzaW5waGkgKyB0aGlzLmNvc3BoMCAqIGNvc3BoaSAqIGNvc2xhbTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgbW9kZS5FUVVJVDpcbiAgICAgIHkgPSBjb3NwaGkgKiBjb3NsYW07XG4gICAgICBicmVhaztcbiAgICBjYXNlIG1vZGUuU19QT0xFOlxuICAgICAgeSA9IC1zaW5waGk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG1vZGUuTl9QT0xFOlxuICAgICAgeSA9IHNpbnBoaTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHkgPSB0aGlzLnBuMSAvICh0aGlzLnAgLSB5KTtcbiAgeCA9IHkgKiBjb3NwaGkgKiBNYXRoLnNpbihwLngpO1xuXG4gIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgY2FzZSBtb2RlLk9CTElROlxuICAgICAgeSAqPSB0aGlzLmNvc3BoMCAqIHNpbnBoaSAtIHRoaXMuc2lucGgwICogY29zcGhpICogY29zbGFtO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBtb2RlLkVRVUlUOlxuICAgICAgeSAqPSBzaW5waGk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG1vZGUuTl9QT0xFOlxuICAgICAgeSAqPSAtKGNvc3BoaSAqIGNvc2xhbSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG1vZGUuU19QT0xFOlxuICAgICAgeSAqPSBjb3NwaGkgKiBjb3NsYW07XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIFRpbHQgXG4gIHZhciB5dCwgYmE7XG4gIHl0ID0geSAqIHRoaXMuY2cgKyB4ICogdGhpcy5zZztcbiAgYmEgPSAxIC8gKHl0ICogdGhpcy5zdyAqIHRoaXMuaDEgKyB0aGlzLmN3KTtcbiAgeCA9ICh4ICogdGhpcy5jZyAtIHkgKiB0aGlzLnNnKSAqIHRoaXMuY3cgKiBiYTtcbiAgeSA9IHl0ICogYmE7XG5cbiAgcC54ID0geCAqIHRoaXMuYTtcbiAgcC55ID0geSAqIHRoaXMuYTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgcC54IC89IHRoaXMuYTtcbiAgcC55IC89IHRoaXMuYTtcbiAgdmFyIHIgPSB7IHg6IHAueCwgeTogcC55IH07XG5cbiAgLy8gVW4tVGlsdFxuICB2YXIgYm0sIGJxLCB5dDtcbiAgeXQgPSAxIC8gKHRoaXMucG4xIC0gcC55ICogdGhpcy5zdyk7XG4gIGJtID0gdGhpcy5wbjEgKiBwLnggKiB5dDtcbiAgYnEgPSB0aGlzLnBuMSAqIHAueSAqIHRoaXMuY3cgKiB5dDtcbiAgcC54ID0gYm0gKiB0aGlzLmNnICsgYnEgKiB0aGlzLnNnO1xuICBwLnkgPSBicSAqIHRoaXMuY2cgLSBibSAqIHRoaXMuc2c7XG5cbiAgdmFyIHJoID0gaHlwb3QocC54LCBwLnkpO1xuICBpZiAoTWF0aC5hYnMocmgpIDwgRVBTTE4pIHtcbiAgICByLnggPSAwO1xuICAgIHIueSA9IHAueTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29zeiwgc2luejtcbiAgICBzaW56ID0gMSAtIHJoICogcmggKiB0aGlzLnBmYWN0O1xuICAgIHNpbnogPSAodGhpcy5wIC0gTWF0aC5zcXJ0KHNpbnopKSAvICh0aGlzLnBuMSAvIHJoICsgcmggLyB0aGlzLnBuMSk7XG4gICAgY29zeiA9IE1hdGguc3FydCgxIC0gc2lueiAqIHNpbnopO1xuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlIG1vZGUuT0JMSVE6XG4gICAgICAgIHIueSA9IE1hdGguYXNpbihjb3N6ICogdGhpcy5zaW5waDAgKyBwLnkgKiBzaW56ICogdGhpcy5jb3NwaDAgLyByaCk7XG4gICAgICAgIHAueSA9IChjb3N6IC0gdGhpcy5zaW5waDAgKiBNYXRoLnNpbihyLnkpKSAqIHJoO1xuICAgICAgICBwLnggKj0gc2lueiAqIHRoaXMuY29zcGgwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgbW9kZS5FUVVJVDpcbiAgICAgICAgci55ID0gTWF0aC5hc2luKHAueSAqIHNpbnogLyByaCk7XG4gICAgICAgIHAueSA9IGNvc3ogKiByaDtcbiAgICAgICAgcC54ICo9IHNpbno7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBtb2RlLk5fUE9MRTpcbiAgICAgICAgci55ID0gTWF0aC5hc2luKGNvc3opO1xuICAgICAgICBwLnkgPSAtcC55O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgbW9kZS5TX1BPTEU6XG4gICAgICAgIHIueSA9IC1NYXRoLmFzaW4oY29zeik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByLnggPSBNYXRoLmF0YW4yKHAueCwgcC55KTtcbiAgfVxuXG4gIHAueCA9IHIueCArIHRoaXMubG9uZzA7XG4gIHAueSA9IHIueTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJUaWx0ZWRfUGVyc3BlY3RpdmVcIiwgXCJ0cGVyc1wiXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogaW5pdCxcbiAgZm9yd2FyZDogZm9yd2FyZCxcbiAgaW52ZXJzZTogaW52ZXJzZSxcbiAgbmFtZXM6IG5hbWVzXG59O1xuIiwiaW1wb3J0IGh5cG90IGZyb20gJy4uL2NvbW1vbi9oeXBvdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAgIHRoaXMuZmxpcF9heGlzID0gKHRoaXMuc3dlZXAgPT09ICd4JyA/IDEgOiAwKTtcbiAgICB0aGlzLmggPSBOdW1iZXIodGhpcy5oKTtcbiAgICB0aGlzLnJhZGl1c19nXzEgPSB0aGlzLmggLyB0aGlzLmE7XG5cbiAgICBpZiAodGhpcy5yYWRpdXNfZ18xIDw9IDAgfHwgdGhpcy5yYWRpdXNfZ18xID4gMWUxMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJhZGl1c19nID0gMS4wICsgdGhpcy5yYWRpdXNfZ18xO1xuICAgIHRoaXMuQyA9IHRoaXMucmFkaXVzX2cgKiB0aGlzLnJhZGl1c19nIC0gMS4wO1xuXG4gICAgaWYgKHRoaXMuZXMgIT09IDAuMCkge1xuICAgICAgICB2YXIgb25lX2VzID0gMS4wIC0gdGhpcy5lcztcbiAgICAgICAgdmFyIHJvbmVfZXMgPSAxIC8gb25lX2VzO1xuXG4gICAgICAgIHRoaXMucmFkaXVzX3AgPSBNYXRoLnNxcnQob25lX2VzKTtcbiAgICAgICAgdGhpcy5yYWRpdXNfcDIgPSBvbmVfZXM7XG4gICAgICAgIHRoaXMucmFkaXVzX3BfaW52MiA9IHJvbmVfZXM7XG5cbiAgICAgICAgdGhpcy5zaGFwZSA9ICdlbGxpcHNlJzsgLy8gVXNlIGFzIGEgY29uZGl0aW9uIGluIHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIGZ1bmN0aW9ucy5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJhZGl1c19wID0gMS4wO1xuICAgICAgICB0aGlzLnJhZGl1c19wMiA9IDEuMDtcbiAgICAgICAgdGhpcy5yYWRpdXNfcF9pbnYyID0gMS4wO1xuXG4gICAgICAgIHRoaXMuc2hhcGUgPSAnc3BoZXJlJzsgIC8vIFVzZSBhcyBhIGNvbmRpdGlvbiBpbiB0aGUgZm9yd2FyZCBhbmQgaW52ZXJzZSBmdW5jdGlvbnMuXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnRpdGxlKSB7XG4gICAgICAgIHRoaXMudGl0bGUgPSBcIkdlb3N0YXRpb25hcnkgU2F0ZWxsaXRlIFZpZXdcIjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvcndhcmQocCkge1xuICAgIHZhciBsb24gPSBwLng7XG4gICAgdmFyIGxhdCA9IHAueTtcbiAgICB2YXIgdG1wLCB2X3gsIHZfeSwgdl96O1xuICAgIGxvbiA9IGxvbiAtIHRoaXMubG9uZzA7XG5cbiAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ2VsbGlwc2UnKSB7XG4gICAgICAgIGxhdCA9IE1hdGguYXRhbih0aGlzLnJhZGl1c19wMiAqIE1hdGgudGFuKGxhdCkpO1xuICAgICAgICB2YXIgciA9IHRoaXMucmFkaXVzX3AgLyBoeXBvdCh0aGlzLnJhZGl1c19wICogTWF0aC5jb3MobGF0KSwgTWF0aC5zaW4obGF0KSk7XG5cbiAgICAgICAgdl94ID0gciAqIE1hdGguY29zKGxvbikgKiBNYXRoLmNvcyhsYXQpO1xuICAgICAgICB2X3kgPSByICogTWF0aC5zaW4obG9uKSAqIE1hdGguY29zKGxhdCk7XG4gICAgICAgIHZfeiA9IHIgKiBNYXRoLnNpbihsYXQpO1xuXG4gICAgICAgIGlmICgoKHRoaXMucmFkaXVzX2cgLSB2X3gpICogdl94IC0gdl95ICogdl95IC0gdl96ICogdl96ICogdGhpcy5yYWRpdXNfcF9pbnYyKSA8IDAuMCkge1xuICAgICAgICAgICAgcC54ID0gTnVtYmVyLk5hTjtcbiAgICAgICAgICAgIHAueSA9IE51bWJlci5OYU47XG4gICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRtcCA9IHRoaXMucmFkaXVzX2cgLSB2X3g7XG4gICAgICAgIGlmICh0aGlzLmZsaXBfYXhpcykge1xuICAgICAgICAgICAgcC54ID0gdGhpcy5yYWRpdXNfZ18xICogTWF0aC5hdGFuKHZfeSAvIGh5cG90KHZfeiwgdG1wKSk7XG4gICAgICAgICAgICBwLnkgPSB0aGlzLnJhZGl1c19nXzEgKiBNYXRoLmF0YW4odl96IC8gdG1wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAueCA9IHRoaXMucmFkaXVzX2dfMSAqIE1hdGguYXRhbih2X3kgLyB0bXApO1xuICAgICAgICAgICAgcC55ID0gdGhpcy5yYWRpdXNfZ18xICogTWF0aC5hdGFuKHZfeiAvIGh5cG90KHZfeSwgdG1wKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2hhcGUgPT09ICdzcGhlcmUnKSB7XG4gICAgICAgIHRtcCA9IE1hdGguY29zKGxhdCk7XG4gICAgICAgIHZfeCA9IE1hdGguY29zKGxvbikgKiB0bXA7XG4gICAgICAgIHZfeSA9IE1hdGguc2luKGxvbikgKiB0bXA7XG4gICAgICAgIHZfeiA9IE1hdGguc2luKGxhdCk7XG4gICAgICAgIHRtcCA9IHRoaXMucmFkaXVzX2cgLSB2X3g7XG5cbiAgICAgICAgaWYgKHRoaXMuZmxpcF9heGlzKSB7XG4gICAgICAgICAgICBwLnggPSB0aGlzLnJhZGl1c19nXzEgKiBNYXRoLmF0YW4odl95IC8gaHlwb3Qodl96LCB0bXApKTtcbiAgICAgICAgICAgIHAueSA9IHRoaXMucmFkaXVzX2dfMSAqIE1hdGguYXRhbih2X3ogLyB0bXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC54ID0gdGhpcy5yYWRpdXNfZ18xICogTWF0aC5hdGFuKHZfeSAvIHRtcCk7XG4gICAgICAgICAgICBwLnkgPSB0aGlzLnJhZGl1c19nXzEgKiBNYXRoLmF0YW4odl96IC8gaHlwb3Qodl95LCB0bXApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwLnggPSBwLnggKiB0aGlzLmE7XG4gICAgcC55ID0gcC55ICogdGhpcy5hO1xuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiBpbnZlcnNlKHApIHtcbiAgICB2YXIgdl94ID0gLTEuMDtcbiAgICB2YXIgdl95ID0gMC4wO1xuICAgIHZhciB2X3ogPSAwLjA7XG4gICAgdmFyIGEsIGIsIGRldCwgaztcblxuICAgIHAueCA9IHAueCAvIHRoaXMuYTtcbiAgICBwLnkgPSBwLnkgLyB0aGlzLmE7XG5cbiAgICBpZiAodGhpcy5zaGFwZSA9PT0gJ2VsbGlwc2UnKSB7XG4gICAgICAgIGlmICh0aGlzLmZsaXBfYXhpcykge1xuICAgICAgICAgICAgdl96ID0gTWF0aC50YW4ocC55IC8gdGhpcy5yYWRpdXNfZ18xKTtcbiAgICAgICAgICAgIHZfeSA9IE1hdGgudGFuKHAueCAvIHRoaXMucmFkaXVzX2dfMSkgKiBoeXBvdCgxLjAsIHZfeik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2X3kgPSBNYXRoLnRhbihwLnggLyB0aGlzLnJhZGl1c19nXzEpO1xuICAgICAgICAgICAgdl96ID0gTWF0aC50YW4ocC55IC8gdGhpcy5yYWRpdXNfZ18xKSAqIGh5cG90KDEuMCwgdl95KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2X3pwID0gdl96IC8gdGhpcy5yYWRpdXNfcDtcbiAgICAgICAgYSA9IHZfeSAqIHZfeSArIHZfenAgKiB2X3pwICsgdl94ICogdl94O1xuICAgICAgICBiID0gMiAqIHRoaXMucmFkaXVzX2cgKiB2X3g7XG4gICAgICAgIGRldCA9IChiICogYikgLSA0ICogYSAqIHRoaXMuQztcblxuICAgICAgICBpZiAoZGV0IDwgMC4wKSB7XG4gICAgICAgICAgICBwLnggPSBOdW1iZXIuTmFOO1xuICAgICAgICAgICAgcC55ID0gTnVtYmVyLk5hTjtcbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9XG5cbiAgICAgICAgayA9ICgtYiAtIE1hdGguc3FydChkZXQpKSAvICgyLjAgKiBhKTtcbiAgICAgICAgdl94ID0gdGhpcy5yYWRpdXNfZyArIGsgKiB2X3g7XG4gICAgICAgIHZfeSAqPSBrO1xuICAgICAgICB2X3ogKj0gaztcblxuICAgICAgICBwLnggPSBNYXRoLmF0YW4yKHZfeSwgdl94KTtcbiAgICAgICAgcC55ID0gTWF0aC5hdGFuKHZfeiAqIE1hdGguY29zKHAueCkgLyB2X3gpO1xuICAgICAgICBwLnkgPSBNYXRoLmF0YW4odGhpcy5yYWRpdXNfcF9pbnYyICogTWF0aC50YW4ocC55KSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNoYXBlID09PSAnc3BoZXJlJykge1xuICAgICAgICBpZiAodGhpcy5mbGlwX2F4aXMpIHtcbiAgICAgICAgICAgIHZfeiA9IE1hdGgudGFuKHAueSAvIHRoaXMucmFkaXVzX2dfMSk7XG4gICAgICAgICAgICB2X3kgPSBNYXRoLnRhbihwLnggLyB0aGlzLnJhZGl1c19nXzEpICogTWF0aC5zcXJ0KDEuMCArIHZfeiAqIHZfeik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2X3kgPSBNYXRoLnRhbihwLnggLyB0aGlzLnJhZGl1c19nXzEpO1xuICAgICAgICAgICAgdl96ID0gTWF0aC50YW4ocC55IC8gdGhpcy5yYWRpdXNfZ18xKSAqIE1hdGguc3FydCgxLjAgKyB2X3kgKiB2X3kpO1xuICAgICAgICB9XG5cbiAgICAgICAgYSA9IHZfeSAqIHZfeSArIHZfeiAqIHZfeiArIHZfeCAqIHZfeDtcbiAgICAgICAgYiA9IDIgKiB0aGlzLnJhZGl1c19nICogdl94O1xuICAgICAgICBkZXQgPSAoYiAqIGIpIC0gNCAqIGEgKiB0aGlzLkM7XG4gICAgICAgIGlmIChkZXQgPCAwLjApIHtcbiAgICAgICAgICAgIHAueCA9IE51bWJlci5OYU47XG4gICAgICAgICAgICBwLnkgPSBOdW1iZXIuTmFOO1xuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgIH1cblxuICAgICAgICBrID0gKC1iIC0gTWF0aC5zcXJ0KGRldCkpIC8gKDIuMCAqIGEpO1xuICAgICAgICB2X3ggPSB0aGlzLnJhZGl1c19nICsgayAqIHZfeDtcbiAgICAgICAgdl95ICo9IGs7XG4gICAgICAgIHZfeiAqPSBrO1xuXG4gICAgICAgIHAueCA9IE1hdGguYXRhbjIodl95LCB2X3gpO1xuICAgICAgICBwLnkgPSBNYXRoLmF0YW4odl96ICogTWF0aC5jb3MocC54KSAvIHZfeCk7XG4gICAgfVxuICAgIHAueCA9IHAueCArIHRoaXMubG9uZzA7XG4gICAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCB2YXIgbmFtZXMgPSBbXCJHZW9zdGF0aW9uYXJ5IFNhdGVsbGl0ZSBWaWV3XCIsIFwiR2Vvc3RhdGlvbmFyeV9TYXRlbGxpdGVcIiwgXCJnZW9zXCJdO1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGluaXQ6IGluaXQsXG4gICAgZm9yd2FyZDogZm9yd2FyZCxcbiAgICBpbnZlcnNlOiBpbnZlcnNlLFxuICAgIG5hbWVzOiBuYW1lcyxcbn07XG5cbiIsImltcG9ydCB0bWVyYyBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy90bWVyYyc7XG5pbXBvcnQgZXRtZXJjIGZyb20gJy4vbGliL3Byb2plY3Rpb25zL2V0bWVyYyc7XG5pbXBvcnQgdXRtIGZyb20gJy4vbGliL3Byb2plY3Rpb25zL3V0bSc7XG5pbXBvcnQgc3RlcmVhIGZyb20gJy4vbGliL3Byb2plY3Rpb25zL3N0ZXJlYSc7XG5pbXBvcnQgc3RlcmUgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvc3RlcmUnO1xuaW1wb3J0IHNvbWVyYyBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy9zb21lcmMnO1xuaW1wb3J0IG9tZXJjIGZyb20gJy4vbGliL3Byb2plY3Rpb25zL29tZXJjJztcbmltcG9ydCBsY2MgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvbGNjJztcbmltcG9ydCBrcm92YWsgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMva3JvdmFrJztcbmltcG9ydCBjYXNzIGZyb20gJy4vbGliL3Byb2plY3Rpb25zL2Nhc3MnO1xuaW1wb3J0IGxhZWEgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvbGFlYSc7XG5pbXBvcnQgYWVhIGZyb20gJy4vbGliL3Byb2plY3Rpb25zL2FlYSc7XG5pbXBvcnQgZ25vbSBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy9nbm9tJztcbmltcG9ydCBjZWEgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvY2VhJztcbmltcG9ydCBlcWMgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvZXFjJztcbmltcG9ydCBwb2x5IGZyb20gJy4vbGliL3Byb2plY3Rpb25zL3BvbHknO1xuaW1wb3J0IG56bWcgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvbnptZyc7XG5pbXBvcnQgbWlsbCBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy9taWxsJztcbmltcG9ydCBzaW51IGZyb20gJy4vbGliL3Byb2plY3Rpb25zL3NpbnUnO1xuaW1wb3J0IG1vbGwgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvbW9sbCc7XG5pbXBvcnQgZXFkYyBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy9lcWRjJztcbmltcG9ydCB2YW5kZyBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy92YW5kZyc7XG5pbXBvcnQgYWVxZCBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy9hZXFkJztcbmltcG9ydCBvcnRobyBmcm9tICcuL2xpYi9wcm9qZWN0aW9ucy9vcnRobyc7XG5pbXBvcnQgcXNjIGZyb20gJy4vbGliL3Byb2plY3Rpb25zL3FzYyc7XG5pbXBvcnQgcm9iaW4gZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvcm9iaW4nO1xuaW1wb3J0IGdlb2NlbnQgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvZ2VvY2VudCc7XG5pbXBvcnQgdHBlcnMgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvdHBlcnMnO1xuaW1wb3J0IGdlb3MgZnJvbSAnLi9saWIvcHJvamVjdGlvbnMvZ2Vvcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwcm9qNCl7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKHRtZXJjKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQoZXRtZXJjKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQodXRtKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQoc3RlcmVhKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQoc3RlcmUpO1xuICBwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmFkZChzb21lcmMpO1xuICBwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmFkZChvbWVyYyk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKGxjYyk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKGtyb3Zhayk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKGNhc3MpO1xuICBwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmFkZChsYWVhKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQoYWVhKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQoZ25vbSk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKGNlYSk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKGVxYyk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKHBvbHkpO1xuICBwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmFkZChuem1nKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQobWlsbCk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKHNpbnUpO1xuICBwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmFkZChtb2xsKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQoZXFkYyk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKHZhbmRnKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQoYWVxZCk7XG4gIHByb2o0LlByb2oucHJvamVjdGlvbnMuYWRkKG9ydGhvKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQocXNjKTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQocm9iaW4pO1xuICBwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmFkZChnZW9jZW50KTtcbiAgcHJvajQuUHJvai5wcm9qZWN0aW9ucy5hZGQodHBlcnMpO1xuICBwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmFkZChnZW9zKTtcbn0iLCJpbXBvcnQgcHJvajQgZnJvbSAnLi9jb3JlJztcbmltcG9ydCBQcm9qIGZyb20gXCIuL1Byb2pcIjtcbmltcG9ydCBQb2ludCBmcm9tIFwiLi9Qb2ludFwiO1xuaW1wb3J0IGNvbW1vbiBmcm9tIFwiLi9jb21tb24vdG9Qb2ludFwiO1xuaW1wb3J0IGRlZnMgZnJvbSBcIi4vZGVmc1wiO1xuaW1wb3J0IG5hZGdyaWQgZnJvbSBcIi4vbmFkZ3JpZFwiO1xuaW1wb3J0IHRyYW5zZm9ybSBmcm9tIFwiLi90cmFuc2Zvcm1cIjtcbmltcG9ydCBtZ3JzIGZyb20gXCJtZ3JzXCI7XG5pbXBvcnQgaW5jbHVkZWRQcm9qZWN0aW9ucyBmcm9tIFwiLi4vcHJvanNcIjtcblxucHJvajQuZGVmYXVsdERhdHVtID0gJ1dHUzg0JzsgLy9kZWZhdWx0IGRhdHVtXG5wcm9qNC5Qcm9qID0gUHJvajtcbnByb2o0LldHUzg0ID0gbmV3IHByb2o0LlByb2ooJ1dHUzg0Jyk7XG5wcm9qNC5Qb2ludCA9IFBvaW50O1xucHJvajQudG9Qb2ludCA9IGNvbW1vbjtcbnByb2o0LmRlZnMgPSBkZWZzO1xucHJvajQubmFkZ3JpZCA9IG5hZGdyaWQ7XG5wcm9qNC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5wcm9qNC5tZ3JzID0gbWdycztcbnByb2o0LnZlcnNpb24gPSAnX19WRVJTSU9OX18nO1xuaW5jbHVkZWRQcm9qZWN0aW9ucyhwcm9qNCk7XG5leHBvcnQgZGVmYXVsdCBwcm9qNDtcbiIsIi8vIEBmbG93XHJcblxyXG4vKioqKiogU1RBUlQgV0FSTklORyAtIElGIFlPVSBVU0UgVEhJUyBDT0RFIFdJVEggTUFQQk9YIE1BUFBJTkcgQVBJUywgUkVNT1ZBTCBPUlxyXG4qIE1PRElGSUNBVElPTiBPRiBUSEUgRk9MTE9XSU5HIENPREUgVklPTEFURVMgVEhFIE1BUEJPWCBURVJNUyBPRiBTRVJWSUNFICAqKioqKipcclxuKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBhY2Nlc3MgTWFwYm94J3MgTWFwcGluZyBBUElzLiBSZW1vdmFsIG9yIG1vZGlmaWNhdGlvblxyXG4qIG9mIHRoaXMgY29kZSB3aGVuIHVzZWQgd2l0aCBNYXBib3gncyBNYXBwaW5nIEFQSXMgY2FuIHJlc3VsdCBpbiBoaWdoZXIgZmVlcyBhbmQvb3JcclxuKiB0ZXJtaW5hdGlvbiBvZiB5b3VyIGFjY291bnQgd2l0aCBNYXBib3guXHJcbipcclxuKiBVbmRlciB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UsIHlvdSBtYXkgbm90IHVzZSB0aGlzIGNvZGUgdG8gYWNjZXNzIE1hcGJveFxyXG4qIE1hcHBpbmcgQVBJcyBvdGhlciB0aGFuIHRocm91Z2ggTWFwYm94IFNES3MuXHJcbipcclxuKiBUaGUgTWFwcGluZyBBUElzIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2FwaS9tYXBzLyNtYXBzXHJcbiogYW5kIHRoZSBNYXBib3ggVGVybXMgb2YgU2VydmljZSBhcmUgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vdG9zL1xyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcclxuXHJcbmltcG9ydCBicm93c2VyIGZyb20gJy4vYnJvd3Nlcic7XHJcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xyXG5pbXBvcnQgd2VicFN1cHBvcnRlZCBmcm9tICcuL3dlYnBfc3VwcG9ydGVkJztcclxuaW1wb3J0IHtjcmVhdGVTa3VUb2tlbiwgU0tVX0lEfSBmcm9tICcuL3NrdV90b2tlbic7XHJcbmltcG9ydCB7dmVyc2lvbiBhcyBzZGtWZXJzaW9ufSBmcm9tICcuLi8uLi9wYWNrYWdlLmpzb24nO1xyXG5pbXBvcnQge3V1aWQsIHZhbGlkYXRlVXVpZCwgc3RvcmFnZUF2YWlsYWJsZSwgYjY0RGVjb2RlVW5pY29kZSwgYjY0RW5jb2RlVW5pY29kZSwgd2Fybk9uY2UsIGV4dGVuZH0gZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IHtwb3N0RGF0YSwgUmVzb3VyY2VUeXBlfSBmcm9tICcuL2FqYXgnO1xyXG5cclxuaW1wb3J0IHR5cGUge1JlcXVlc3RQYXJhbWV0ZXJzfSBmcm9tICcuL2FqYXgnO1xyXG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XHJcbmltcG9ydCB0eXBlIHtUaWxlSlNPTn0gZnJvbSAnLi4vdHlwZXMvdGlsZWpzb24nO1xyXG5cclxuaW1wb3J0IHByb2o0IGZyb20gJ3Byb2o0JztcclxudHlwZSBSZXNvdXJjZVR5cGVFbnVtID0gJEtleXM8dHlwZW9mIFJlc291cmNlVHlwZT47XHJcbmV4cG9ydCB0eXBlIFJlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbiA9ICh1cmw6IHN0cmluZywgcmVzb3VyY2VUeXBlPzogUmVzb3VyY2VUeXBlRW51bSkgPT4gUmVxdWVzdFBhcmFtZXRlcnM7XHJcblxyXG50eXBlIFVybE9iamVjdCA9IHt8XHJcbiAgICBwcm90b2NvbDogc3RyaW5nLFxyXG4gICAgYXV0aG9yaXR5OiBzdHJpbmcsXHJcbiAgICBwYXRoOiBzdHJpbmcsXHJcbiAgICBwYXJhbXM6IEFycmF5PHN0cmluZz5cclxufH07XHJcblxyXG5leHBvcnQgY2xhc3MgUmVxdWVzdE1hbmFnZXIge1xyXG4gICAgX3NrdVRva2VuOiBzdHJpbmc7XHJcbiAgICBfc2t1VG9rZW5FeHBpcmVzQXQ6IG51bWJlcjtcclxuICAgIF90cmFuc2Zvcm1SZXF1ZXN0Rm46ID9SZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb247XHJcbiAgICBfY3VzdG9tQWNjZXNzVG9rZW46ID9zdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtUmVxdWVzdEZuPzogUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uLCBjdXN0b21BY2Nlc3NUb2tlbj86IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbiA9IHRyYW5zZm9ybVJlcXVlc3RGbjtcclxuICAgICAgICB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiA9IGN1c3RvbUFjY2Vzc1Rva2VuO1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZVNrdVRva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NyZWF0ZVNrdVRva2VuKCkge1xyXG4gICAgICAgIGNvbnN0IHNrdVRva2VuID0gY3JlYXRlU2t1VG9rZW4oKTtcclxuICAgICAgICB0aGlzLl9za3VUb2tlbiA9IHNrdVRva2VuLnRva2VuO1xyXG4gICAgICAgIHRoaXMuX3NrdVRva2VuRXhwaXJlc0F0ID0gc2t1VG9rZW4udG9rZW5FeHBpcmVzQXQ7XHJcbiAgICB9XHJcblxyXG4gICAgX2lzU2t1VG9rZW5FeHBpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpID4gdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQ7XHJcbiAgICB9XHJcblxyXG4gICAgdHJhbnNmb3JtUmVxdWVzdCh1cmw6IHN0cmluZywgdHlwZTogUmVzb3VyY2VUeXBlRW51bSkge1xyXG4gICAgICAgIGlmICh0aGlzLl90cmFuc2Zvcm1SZXF1ZXN0Rm4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbih1cmwsIHR5cGUpIHx8IHt1cmx9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHt1cmx9O1xyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZVN0eWxlVVJMKHVybDogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xyXG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XHJcbiAgICAgICAgdXJsT2JqZWN0LnBhdGggPSBgL3N0eWxlcy92MSR7dXJsT2JqZWN0LnBhdGh9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGFjY2Vzc1Rva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBub3JtYWxpemVHbHlwaHNVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcclxuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvZm9udHMvdjEke3VybE9iamVjdC5wYXRofWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VBUElVUkwodXJsT2JqZWN0LCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbik7XHJcbiAgICB9XHJcblxyXG4gICAgbm9ybWFsaXplU291cmNlVVJMKHVybDogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xyXG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XHJcbiAgICAgICAgdXJsT2JqZWN0LnBhdGggPSBgL3Y0LyR7dXJsT2JqZWN0LmF1dGhvcml0eX0uanNvbmA7XHJcbiAgICAgICAgLy8gVGlsZUpTT04gcmVxdWVzdHMgbmVlZCBhIHNlY3VyZSBmbGFnIGFwcGVuZGVkIHRvIHRoZWlyIFVSTHMgc29cclxuICAgICAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cclxuICAgICAgICB1cmxPYmplY3QucGFyYW1zLnB1c2goJ3NlY3VyZScpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlQVBJVVJMKHVybE9iamVjdCwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZVNwcml0ZVVSTCh1cmw6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nLCBhY2Nlc3NUb2tlbj86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcclxuICAgICAgICBpZiAodXJsT2JqZWN0ICYmICF1cmxPYmplY3QucHJvdG9jb2wgJiYgdXJsT2JqZWN0LnBhdGgpIHtcclxuICAgICAgICAgICAgdXJsT2JqZWN0LnBhdGggKz0gYCR7Zm9ybWF0fSR7ZXh0ZW5zaW9ufWA7XHJcbiAgICAgICAgICAgIHJldHVybiB1cmxPYmplY3QucGF0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSB7XHJcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXRoICs9IGAke2Zvcm1hdH0ke2V4dGVuc2lvbn1gO1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0VXJsKHVybE9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHVybE9iamVjdC5wYXRoID0gYC9zdHlsZXMvdjEke3VybE9iamVjdC5wYXRofS9zcHJpdGUke2Zvcm1hdH0ke2V4dGVuc2lvbn1gO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlQVBJVVJMKHVybE9iamVjdCwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZVRpbGVVUkwodGlsZVVSTDogc3RyaW5nLCB0aWxlU2l6ZT86ID9udW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1NrdVRva2VuRXhwaXJlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVNrdVRva2VuKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGlsZVVSTCAmJiAhaXNNYXBib3hVUkwodGlsZVVSTCkpIHJldHVybiB0aWxlVVJMO1xyXG5cclxuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh0aWxlVVJMKTtcclxuICAgICAgICBjb25zdCBpbWFnZUV4dGVuc2lvblJlID0gLyhcXC4ocG5nfGpwZylcXGQqKSg/PSQpLztcclxuICAgICAgICBjb25zdCB0aWxlVVJMQVBJUHJlZml4UmUgPSAvXi4rXFwvdjRcXC8vO1xyXG5cclxuICAgICAgICAvLyBUaGUgdjQgbWFwYm94IHRpbGUgQVBJIHN1cHBvcnRzIDUxMng1MTIgaW1hZ2UgdGlsZXMgb25seSB3aGVuIEAyeFxyXG4gICAgICAgIC8vIGlzIGFwcGVuZGVkIHRvIHRoZSB0aWxlIFVSTC4gSWYgYHRpbGVTaXplOiA1MTJgIGlzIHNwZWNpZmllZCBmb3JcclxuICAgICAgICAvLyBhIE1hcGJveCByYXN0ZXIgc291cmNlIGZvcmNlIHRoZSBAMnggc3VmZml4IGV2ZW4gaWYgYSBub24gaGlkcGkgZGV2aWNlLlxyXG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+PSAyIHx8IHRpbGVTaXplID09PSA1MTIgPyAnQDJ4JyA6ICcnO1xyXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHdlYnBTdXBwb3J0ZWQuc3VwcG9ydGVkID8gJy53ZWJwJyA6ICckMSc7XHJcbiAgICAgICAgdXJsT2JqZWN0LnBhdGggPSB1cmxPYmplY3QucGF0aC5yZXBsYWNlKGltYWdlRXh0ZW5zaW9uUmUsIGAke3N1ZmZpeH0ke2V4dGVuc2lvbn1gKTtcclxuICAgICAgICB1cmxPYmplY3QucGF0aCA9IHVybE9iamVjdC5wYXRoLnJlcGxhY2UodGlsZVVSTEFQSVByZWZpeFJlLCAnLycpO1xyXG4gICAgICAgIHVybE9iamVjdC5wYXRoID0gYC92NCR7dXJsT2JqZWN0LnBhdGh9YDtcclxuXHJcbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBnZXRBY2Nlc3NUb2tlbih1cmxPYmplY3QucGFyYW1zKSB8fCBjb25maWcuQUNDRVNTX1RPS0VOO1xyXG4gICAgICAgIGlmIChjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4gJiYgYWNjZXNzVG9rZW4gJiYgdGhpcy5fc2t1VG9rZW4pIHtcclxuICAgICAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBza3U9JHt0aGlzLl9za3VUb2tlbn1gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlQVBJVVJMKHVybE9iamVjdCwgYWNjZXNzVG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbm9uaWNhbGl6ZVRpbGVVUkwodXJsOiBzdHJpbmcsIHJlbW92ZUFjY2Vzc1Rva2VuOiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IFwiL3Y0L1wiO1xyXG4gICAgICAgIC8vIG1hdGNoZXMgYW55IGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBieSBhIGRvdCBhbmQgb25lIG9yIG1vcmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcclxuICAgICAgICBjb25zdCBleHRlbnNpb25SZSA9IC9cXC5bXFx3XSskLztcclxuXHJcbiAgICAgICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcclxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgdmFsaWQgTWFwYm94IHRpbGUgVVJMLlxyXG4gICAgICAgIC8vIEhhcyB0byBiZWdpbiB3aXRoIC92NC8sIHdpdGggYSB2YWxpZCBmaWxlbmFtZSArIGV4dGVuc2lvblxyXG4gICAgICAgIGlmICghdXJsT2JqZWN0LnBhdGgubWF0Y2goLyheXFwvdjRcXC8pLykgfHwgIXVybE9iamVjdC5wYXRoLm1hdGNoKGV4dGVuc2lvblJlKSkge1xyXG4gICAgICAgICAgICAvLyBOb3QgYSBwcm9wZXIgTWFwYm94IHRpbGUgVVJMLlxyXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZWFzc2VtYmxlIHRoZSBjYW5vbmljYWwgVVJMIGZyb20gdGhlIHBhcnRzIHdlJ3ZlIHBhcnNlZCBiZWZvcmUuXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwibWFwYm94Oi8vdGlsZXMvXCI7XHJcbiAgICAgICAgcmVzdWx0ICs9ICB1cmxPYmplY3QucGF0aC5yZXBsYWNlKHZlcnNpb24sICcnKTtcclxuXHJcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBxdWVyeSBzdHJpbmcsIG1pbnVzIHRoZSBhY2Nlc3MgdG9rZW4gcGFyYW1ldGVyLlxyXG4gICAgICAgIGxldCBwYXJhbXMgPSB1cmxPYmplY3QucGFyYW1zO1xyXG4gICAgICAgIGlmIChyZW1vdmVBY2Nlc3NUb2tlbikge1xyXG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuZmlsdGVyKHAgPT4gIXAubWF0Y2goL15hY2Nlc3NfdG9rZW49LykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCkgcmVzdWx0ICs9IGA/JHtwYXJhbXMuam9pbignJicpfWA7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjYW5vbmljYWxpemVUaWxlc2V0KHRpbGVKU09OOiBUaWxlSlNPTiwgc291cmNlVVJMPzogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlQWNjZXNzVG9rZW4gPSBzb3VyY2VVUkwgPyBpc01hcGJveFVSTChzb3VyY2VVUkwpIDogZmFsc2U7XHJcbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgdGlsZUpTT04udGlsZXMgfHwgW10pIHtcclxuICAgICAgICAgICAgaWYgKGlzTWFwYm94SFRUUFVSTCh1cmwpKSB7XHJcbiAgICAgICAgICAgICAgICBjYW5vbmljYWwucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZVRpbGVVUkwodXJsLCByZW1vdmVBY2Nlc3NUb2tlbikpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2Fub25pY2FsLnB1c2godXJsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2Fub25pY2FsO1xyXG4gICAgfVxyXG5cclxuICAgIF9tYWtlQVBJVVJMKHVybE9iamVjdDogVXJsT2JqZWN0LCBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbCB8IHZvaWQpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGhlbHAgPSAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blcyc7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsT2JqZWN0ID0gcGFyc2VVcmwoY29uZmlnLkFQSV9VUkwpO1xyXG4gICAgICAgIHVybE9iamVjdC5wcm90b2NvbCA9IGFwaVVybE9iamVjdC5wcm90b2NvbDtcclxuICAgICAgICB1cmxPYmplY3QuYXV0aG9yaXR5ID0gYXBpVXJsT2JqZWN0LmF1dGhvcml0eTtcclxuXHJcbiAgICAgICAgaWYgKGFwaVVybE9iamVjdC5wYXRoICE9PSAnLycpIHtcclxuICAgICAgICAgICAgdXJsT2JqZWN0LnBhdGggPSBgJHthcGlVcmxPYmplY3QucGF0aH0ke3VybE9iamVjdC5wYXRofWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xyXG5cclxuICAgICAgICBhY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU47XHJcbiAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbilcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiBBUEkgYWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkIHRvIHVzZSBNYXBib3ggR0wuICR7aGVscH1gKTtcclxuICAgICAgICBpZiAoYWNjZXNzVG9rZW5bMF0gPT09ICdzJylcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2UgYSBwdWJsaWMgYWNjZXNzIHRva2VuIChway4qKSB3aXRoIE1hcGJveCBHTCwgbm90IGEgc2VjcmV0IGFjY2VzcyB0b2tlbiAoc2suKikuICR7aGVscH1gKTtcclxuXHJcbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcyA9IHVybE9iamVjdC5wYXJhbXMuZmlsdGVyKChkKSA9PiBkLmluZGV4T2YoJ2FjY2Vzc190b2tlbicpID09PSAtMSk7XHJcbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKTtcclxuICAgICAgICByZXR1cm4gZm9ybWF0VXJsKHVybE9iamVjdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTWFwYm94VVJMKHVybDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdXJsLmluZGV4T2YoJ21hcGJveDonKSA9PT0gMDtcclxufVxyXG5cclxuY29uc3QgbWFwYm94SFRUUFVSTFJlID0gL14oKGh0dHBzPzopP1xcL1xcLyk/KFteXFwvXStcXC4pP21hcGJveFxcLmMobnxvbSkoXFwvfFxcP3wkKS9pO1xyXG5mdW5jdGlvbiBpc01hcGJveEhUVFBVUkwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBtYXBib3hIVFRQVVJMUmUudGVzdCh1cmwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYXNDYWNoZURlZmVhdGluZ1NrdSh1cmw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHVybC5pbmRleE9mKCdza3U9JykgPiAwICYmIGlzTWFwYm94SFRUUFVSTCh1cmwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbihwYXJhbXM6IEFycmF5PHN0cmluZz4pOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBwYXJhbS5tYXRjaCgvXmFjY2Vzc190b2tlbj0oLiopJC8pO1xyXG4gICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbmNvbnN0IHVybFJlID0gL14oXFx3Kyk6XFwvXFwvKFteLz9dKikoXFwvW14/XSspP1xcPz8oLispPy87XHJcblxyXG5mdW5jdGlvbiBwYXJzZVVybCh1cmw6IHN0cmluZyk6IFVybE9iamVjdCB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IHVybC5tYXRjaCh1cmxSZSk7XHJcbiAgICBpZiAoIXBhcnRzKSB7XHJcbiAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgVVJMIG9iamVjdCcpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8vIHByb3RvY29sOiBwYXJ0c1sxXSxcclxuICAgICAgICAgICAgLy8gYXV0aG9yaXR5OiBwYXJ0c1syXSxcclxuICAgICAgICAgICAgcGF0aDogdXJsLFxyXG4gICAgICAgICAgICBwYXJhbXM6ICBbXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHByb3RvY29sOiBwYXJ0c1sxXSxcclxuICAgICAgICBhdXRob3JpdHk6IHBhcnRzWzJdLFxyXG4gICAgICAgIHBhdGg6IHBhcnRzWzNdIHx8ICcvJyxcclxuICAgICAgICBwYXJhbXM6IHBhcnRzWzRdID8gcGFydHNbNF0uc3BsaXQoJyYnKSA6IFtdXHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXRVcmwob2JqOiBVcmxPYmplY3QpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFyYW1zID0gb2JqLnBhcmFtcy5sZW5ndGggPyBgPyR7b2JqLnBhcmFtcy5qb2luKCcmJyl9YCA6ICcnO1xyXG4gICAgcmV0dXJuIGAke29iai5wcm90b2NvbH06Ly8ke29iai5hdXRob3JpdHl9JHtvYmoucGF0aH0ke3BhcmFtc31gO1xyXG59XHJcblxyXG5leHBvcnQge3Byb2o0LCBpc01hcGJveFVSTCwgaXNNYXBib3hIVFRQVVJMLCBoYXNDYWNoZURlZmVhdGluZ1NrdX07XHJcblxyXG5jb25zdCB0ZWxlbUV2ZW50S2V5ID0gJ21hcGJveC5ldmVudERhdGEnO1xyXG5cclxuZnVuY3Rpb24gcGFyc2VBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbjogP3N0cmluZykge1xyXG4gICAgaWYgKCFhY2Nlc3NUb2tlbikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcnRzID0gYWNjZXNzVG9rZW4uc3BsaXQoJy4nKTtcclxuICAgIGlmICghcGFydHMgfHwgcGFydHMubGVuZ3RoICE9PSAzKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoYjY0RGVjb2RlVW5pY29kZShwYXJ0c1sxXSkpO1xyXG4gICAgICAgIHJldHVybiBqc29uRGF0YTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxudHlwZSBUZWxlbWV0cnlFdmVudFR5cGUgPSAnYXBwVXNlclR1cm5zdGlsZScgfCAnbWFwLmxvYWQnO1xyXG5cclxuY2xhc3MgVGVsZW1ldHJ5RXZlbnQge1xyXG4gICAgZXZlbnREYXRhOiBhbnk7XHJcbiAgICBhbm9uSWQ6ID9zdHJpbmc7XHJcbiAgICBxdWV1ZTogQXJyYXk8YW55PjtcclxuICAgIHR5cGU6IFRlbGVtZXRyeUV2ZW50VHlwZTtcclxuICAgIHBlbmRpbmdSZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcclxuICAgIF9jdXN0b21BY2Nlc3NUb2tlbjogP3N0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUZWxlbWV0cnlFdmVudFR5cGUpIHtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHRoaXMuYW5vbklkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV2ZW50RGF0YSA9IHt9O1xyXG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcclxuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdG9yYWdlS2V5KGRvbWFpbjogP3N0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHRva2VuRGF0YSA9IHBhcnNlQWNjZXNzVG9rZW4oY29uZmlnLkFDQ0VTU19UT0tFTik7XHJcbiAgICAgICAgbGV0IHUgPSAnJztcclxuICAgICAgICBpZiAodG9rZW5EYXRhICYmIHRva2VuRGF0YVsndSddKSB7XHJcbiAgICAgICAgICAgIHUgPSBiNjRFbmNvZGVVbmljb2RlKHRva2VuRGF0YVsndSddKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB1ID0gY29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRvbWFpbiA/XHJcbiAgICAgICAgICAgIGAke3RlbGVtRXZlbnRLZXl9LiR7ZG9tYWlufToke3V9YCA6XHJcbiAgICAgICAgICAgIGAke3RlbGVtRXZlbnRLZXl9OiR7dX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGZldGNoRXZlbnREYXRhKCkge1xyXG4gICAgICAgIGNvbnN0IGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlID0gc3RvcmFnZUF2YWlsYWJsZSgnbG9jYWxTdG9yYWdlJyk7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgpO1xyXG4gICAgICAgIGNvbnN0IHV1aWRLZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoJ3V1aWQnKTtcclxuXHJcbiAgICAgICAgaWYgKGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgICAgIC8vUmV0cmlldmUgY2FjaGVkIGRhdGFcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnREYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHV1aWRLZXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHV1aWQpIHRoaXMuYW5vbklkID0gdXVpZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ1VuYWJsZSB0byByZWFkIGZyb20gTG9jYWxTdG9yYWdlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUV2ZW50RGF0YSgpIHtcclxuICAgICAgICBjb25zdCBpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSA9IHN0b3JhZ2VBdmFpbGFibGUoJ2xvY2FsU3RvcmFnZScpO1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSAgdGhpcy5nZXRTdG9yYWdlS2V5KCk7XHJcbiAgICAgICAgY29uc3QgdXVpZEtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgndXVpZCcpO1xyXG4gICAgICAgIGlmIChpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHV1aWRLZXksIHRoaXMuYW5vbklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmV2ZW50RGF0YSkubGVuZ3RoID49IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5ldmVudERhdGEpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ1VuYWJsZSB0byB3cml0ZSB0byBMb2NhbFN0b3JhZ2UnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1JlcXVlc3RzKF86ID9zdHJpbmcpIHt9XHJcblxyXG4gICAgLypcclxuICAgICogSWYgYW55IGV2ZW50IGRhdGEgc2hvdWxkIGJlIHBlcnNpc3RlZCBhZnRlciB0aGUgUE9TVCByZXF1ZXN0LCB0aGUgY2FsbGJhY2sgc2hvdWxkIG1vZGlmeSBldmVudERhdGFgXHJcbiAgICAqIHRvIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgc2F2ZWQuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIHByaW9yIHRvIHRoZSBjYWxsXHJcbiAgICAqIHRvIFRlbGVtZXRyeUV2ZW50I3NhdmVEYXRhXHJcbiAgICAqL1xyXG4gICAgcG9zdEV2ZW50KHRpbWVzdGFtcDogbnVtYmVyLCBhZGRpdGlvbmFsUGF5bG9hZDoge1tfOiBzdHJpbmddOiBhbnl9LCBjYWxsYmFjazogKGVycjogP0Vycm9yKSA9PiB2b2lkLCBjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcclxuICAgICAgICBpZiAoIWNvbmZpZy5FVkVOVFNfVVJMKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgZXZlbnRzVXJsT2JqZWN0OiBVcmxPYmplY3QgPSBwYXJzZVVybChjb25maWcuRVZFTlRTX1VSTCk7XHJcbiAgICAgICAgZXZlbnRzVXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBhY2Nlc3NfdG9rZW49JHtjdXN0b21BY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOIHx8ICcnfWApO1xyXG5cclxuICAgICAgICBjb25zdCBwYXlsb2FkOiBPYmplY3QgPSB7XHJcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKHRpbWVzdGFtcCkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICAgc2RrSWRlbnRpZmllcjogJ21hcGJveC1nbC1qcycsXHJcbiAgICAgICAgICAgIHNka1ZlcnNpb24sXHJcbiAgICAgICAgICAgIHNrdUlkOiBTS1VfSUQsXHJcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy5hbm9uSWRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBmaW5hbFBheWxvYWQgPSBhZGRpdGlvbmFsUGF5bG9hZCA/IGV4dGVuZChwYXlsb2FkLCBhZGRpdGlvbmFsUGF5bG9hZCkgOiBwYXlsb2FkO1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IFJlcXVlc3RQYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICB1cmw6IGZvcm1hdFVybChldmVudHNVcmxPYmplY3QpLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nIC8vU2tpcCB0aGUgcHJlLWZsaWdodCBPUFRJT05TIHJlcXVlc3RcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoW2ZpbmFsUGF5bG9hZF0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHBvc3REYXRhKHJlcXVlc3QsIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudERhdGEoKTtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXVlUmVxdWVzdChldmVudDogbnVtYmVyIHwge2lkOiBudW1iZXIsIHRpbWVzdGFtcDogbnVtYmVyfSwgY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKGV2ZW50KTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NSZXF1ZXN0cyhjdXN0b21BY2Nlc3NUb2tlbik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNYXBMb2FkRXZlbnQgZXh0ZW5kcyBUZWxlbWV0cnlFdmVudCB7XHJcbiAgICArc3VjY2Vzczoge1tfOiBudW1iZXJdOiBib29sZWFufTtcclxuICAgIHNrdVRva2VuOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoJ21hcC5sb2FkJyk7XHJcbiAgICAgICAgdGhpcy5zdWNjZXNzID0ge307XHJcbiAgICAgICAgdGhpcy5za3VUb2tlbiA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RNYXBMb2FkRXZlbnQodGlsZVVybHM6IEFycmF5PHN0cmluZz4sIG1hcElkOiBudW1iZXIsIHNrdVRva2VuOiBzdHJpbmcsIGN1c3RvbUFjY2Vzc1Rva2VuOiBzdHJpbmcpIHtcclxuICAgICAgICAvL0VuYWJsZWQgb25seSB3aGVuIE1hcGJveCBBY2Nlc3MgVG9rZW4gaXMgc2V0IGFuZCBhIHNvdXJjZSB1c2VzXHJcbiAgICAgICAgLy8gbWFwYm94IHRpbGVzLlxyXG4gICAgICAgIHRoaXMuc2t1VG9rZW4gPSBza3VUb2tlbjtcclxuXHJcbiAgICAgICAgaWYgKGNvbmZpZy5FVkVOVFNfVVJMICYmXHJcbiAgICAgICAgICAgIGN1c3RvbUFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU4gJiZcclxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aWxlVXJscykgJiZcclxuICAgICAgICAgICAgdGlsZVVybHMuc29tZSh1cmwgPT4gaXNNYXBib3hVUkwodXJsKSB8fCBpc01hcGJveEhUVFBVUkwodXJsKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5xdWV1ZVJlcXVlc3Qoe2lkOiBtYXBJZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QgfHwgdGhpcy5xdWV1ZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgICBjb25zdCB7aWQsIHRpbWVzdGFtcH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XHJcblxyXG4gICAgICAgIC8vIE9ubHkgb25lIGxvYWQgZXZlbnQgc2hvdWxkIGZpcmUgcGVyIG1hcFxyXG4gICAgICAgIGlmIChpZCAmJiB0aGlzLnN1Y2Nlc3NbaWRdKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hbm9uSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEV2ZW50RGF0YSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF2YWxpZGF0ZVV1aWQodGhpcy5hbm9uSWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYW5vbklkID0gdXVpZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wb3N0RXZlbnQodGltZXN0YW1wLCB7c2t1VG9rZW46IHRoaXMuc2t1VG9rZW59LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHRoaXMuc3VjY2Vzc1tpZF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHVybnN0aWxlRXZlbnQgZXh0ZW5kcyBUZWxlbWV0cnlFdmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignYXBwVXNlclR1cm5zdGlsZScpO1xyXG4gICAgICAgIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuID0gY3VzdG9tQWNjZXNzVG9rZW47XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFR1cm5zdGlsZUV2ZW50KHRpbGVVcmxzOiBBcnJheTxzdHJpbmc+LCBjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcclxuICAgICAgICAvL0VuYWJsZWQgb25seSB3aGVuIE1hcGJveCBBY2Nlc3MgVG9rZW4gaXMgc2V0IGFuZCBhIHNvdXJjZSB1c2VzXHJcbiAgICAgICAgLy8gbWFwYm94IHRpbGVzLlxyXG4gICAgICAgIGlmIChjb25maWcuRVZFTlRTX1VSTCAmJlxyXG4gICAgICAgICAgICBjb25maWcuQUNDRVNTX1RPS0VOICYmXHJcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGlsZVVybHMpICYmXHJcbiAgICAgICAgICAgIHRpbGVVcmxzLnNvbWUodXJsID0+IGlzTWFwYm94VVJMKHVybCkgfHwgaXNNYXBib3hIVFRQVVJMKHVybCkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVldWVSZXF1ZXN0KERhdGUubm93KCksIGN1c3RvbUFjY2Vzc1Rva2VuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0IHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hbm9uSWQgfHwgIXRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzIHx8ICF0aGlzLmV2ZW50RGF0YS50b2tlblUpIHtcclxuICAgICAgICAgICAgLy9SZXRyaWV2ZSBjYWNoZWQgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLmZldGNoRXZlbnREYXRhKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSBwYXJzZUFjY2Vzc1Rva2VuKGNvbmZpZy5BQ0NFU1NfVE9LRU4pO1xyXG4gICAgICAgIGNvbnN0IHRva2VuVSA9IHRva2VuRGF0YSA/IHRva2VuRGF0YVsndSddIDogY29uZmlnLkFDQ0VTU19UT0tFTjtcclxuICAgICAgICAvL1Jlc2V0IGV2ZW50IGRhdGEgY2FjaGUgaWYgdGhlIGFjY2VzcyB0b2tlbiBvd25lciBjaGFuZ2VkLlxyXG4gICAgICAgIGxldCBkdWVGb3JFdmVudCA9IHRva2VuVSAhPT0gdGhpcy5ldmVudERhdGEudG9rZW5VO1xyXG5cclxuICAgICAgICBpZiAoIXZhbGlkYXRlVXVpZCh0aGlzLmFub25JZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5hbm9uSWQgPSB1dWlkKCk7XHJcbiAgICAgICAgICAgIGR1ZUZvckV2ZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5leHRVcGRhdGUgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XHJcbiAgICAgICAgLy8gUmVjb3JkIHR1cm5zdGlsZSBldmVudCBvbmNlIHBlciBjYWxlbmRhciBkYXkuXHJcbiAgICAgICAgaWYgKHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RVcGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2Vzcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHREYXRlID0gbmV3IERhdGUobmV4dFVwZGF0ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRheXNFbGFwc2VkID0gKG5leHRVcGRhdGUgLSB0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2VzcykgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7XHJcbiAgICAgICAgICAgIGR1ZUZvckV2ZW50ID0gZHVlRm9yRXZlbnQgfHwgZGF5c0VsYXBzZWQgPj0gMSB8fCBkYXlzRWxhcHNlZCA8IC0xIHx8IGxhc3RVcGRhdGUuZ2V0RGF0ZSgpICE9PSBuZXh0RGF0ZS5nZXREYXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHVlRm9yRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFkdWVGb3JFdmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVxdWVzdHMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucG9zdEV2ZW50KG5leHRVcGRhdGUsIHtcImVuYWJsZWQudGVsZW1ldHJ5XCI6IGZhbHNlfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWVycikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MgPSBuZXh0VXBkYXRlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEudG9rZW5VID0gdG9rZW5VO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCB0dXJuc3RpbGVFdmVudF8gPSBuZXcgVHVybnN0aWxlRXZlbnQoKTtcclxuZXhwb3J0IGNvbnN0IHBvc3RUdXJuc3RpbGVFdmVudCA9IHR1cm5zdGlsZUV2ZW50Xy5wb3N0VHVybnN0aWxlRXZlbnQuYmluZCh0dXJuc3RpbGVFdmVudF8pO1xyXG5cclxuY29uc3QgbWFwTG9hZEV2ZW50XyA9IG5ldyBNYXBMb2FkRXZlbnQoKTtcclxuZXhwb3J0IGNvbnN0IHBvc3RNYXBMb2FkRXZlbnQgPSBtYXBMb2FkRXZlbnRfLnBvc3RNYXBMb2FkRXZlbnQuYmluZChtYXBMb2FkRXZlbnRfKTtcclxuXHJcbi8qKioqKiBFTkQgV0FSTklORyAtIFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRIRVxyXG5QUkVDRURJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKi9cclxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt3YXJuT25jZSwgcGFyc2VDYWNoZUNvbnRyb2x9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcblxuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuL2Rpc3BhdGNoZXInO1xuXG5jb25zdCBDQUNIRV9OQU1FID0gJ21hcGJveC10aWxlcyc7XG5sZXQgY2FjaGVMaW1pdCA9IDUwMDsgLy8gNTBNQiAvICgxMDBLQi90aWxlKSB+PSA1MDAgdGlsZXNcbmxldCBjYWNoZUNoZWNrVGhyZXNob2xkID0gNTA7XG5cbmNvbnN0IE1JTl9USU1FX1VOVElMX0VYUElSWSA9IDEwMDAgKiA2MCAqIDc7IC8vIDcgbWludXRlcy4gU2tpcCBjYWNoaW5nIHRpbGVzIHdpdGggYSBzaG9ydCBlbm91Z2ggbWF4IGFnZS5cblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VPcHRpb25zID0ge1xuICAgIHN0YXR1czogbnVtYmVyLFxuICAgIHN0YXR1c1RleHQ6IHN0cmluZyxcbiAgICBoZWFkZXJzOiB3aW5kb3cuSGVhZGVyc1xufTtcblxuLy8gV2UncmUgdXNpbmcgYSBnbG9iYWwgc2hhcmVkIGNhY2hlIG9iamVjdC4gTm9ybWFsbHksIHJlcXVlc3RpbmcgYWQtaG9jIENhY2hlIG9iamVjdHMgaXMgZmluZSwgYnV0XG4vLyBTYWZhcmkgaGFzIGEgbWVtb3J5IGxlYWsgaW4gd2hpY2ggaXQgZmFpbHMgdG8gcmVsZWFzZSBtZW1vcnkgd2hlbiByZXF1ZXN0aW5nIGtleXMoKSBmcm9tIGEgQ2FjaGVcbi8vIG9iamVjdC4gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDM5OTEgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5sZXQgc2hhcmVkQ2FjaGU6ID9Qcm9taXNlPENhY2hlPjtcblxuZnVuY3Rpb24gY2FjaGVPcGVuKCkge1xuICAgIGlmICh3aW5kb3cuY2FjaGVzICYmICFzaGFyZWRDYWNoZSkge1xuICAgICAgICBzaGFyZWRDYWNoZSA9IHdpbmRvdy5jYWNoZXMub3BlbihDQUNIRV9OQU1FKTtcbiAgICB9XG59XG5cbi8vIFdlJ3JlIG5ldmVyIGNsb3NpbmcgdGhlIGNhY2hlLCBidXQgb3VyIHVuaXQgdGVzdHMgcmVseSBvbiBjaGFuZ2luZyBvdXQgdGhlIGdsb2JhbCB3aW5kb3cuY2FjaGVzXG4vLyBvYmplY3QsIHNvIHdlIGhhdmUgYSBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgZm9yIHVuaXQgdGVzdHMgdGhhdCBhbGxvd3MgcmVzZXR0aW5nIHRoZSBzaGFyZWQgY2FjaGUuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVDbG9zZSgpIHtcbiAgICBzaGFyZWRDYWNoZSA9IHVuZGVmaW5lZDtcbn1cblxubGV0IHJlc3BvbnNlQ29uc3RydWN0b3JTdXBwb3J0c1JlYWRhYmxlU3RyZWFtO1xuZnVuY3Rpb24gcHJlcGFyZUJvZHkocmVzcG9uc2U6IFJlc3BvbnNlLCBjYWxsYmFjaykge1xuICAgIGlmIChyZXNwb25zZUNvbnN0cnVjdG9yU3VwcG9ydHNSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgUmVzcG9uc2UobmV3IFJlYWRhYmxlU3RyZWFtKCkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgICByZXNwb25zZUNvbnN0cnVjdG9yU3VwcG9ydHNSZWFkYWJsZVN0cmVhbSA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEVkZ2VcbiAgICAgICAgICAgIHJlc3BvbnNlQ29uc3RydWN0b3JTdXBwb3J0c1JlYWRhYmxlU3RyZWFtID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2VDb25zdHJ1Y3RvclN1cHBvcnRzUmVhZGFibGVTdHJlYW0pIHtcbiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UuYm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2UuYmxvYigpLnRoZW4oY2FsbGJhY2spO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlUHV0KHJlcXVlc3Q6IFJlcXVlc3QsIHJlc3BvbnNlOiBSZXNwb25zZSwgcmVxdWVzdFRpbWU6IG51bWJlcikge1xuICAgIGNhY2hlT3BlbigpO1xuICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IFJlc3BvbnNlT3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyB3aW5kb3cuSGVhZGVycygpXG4gICAgfTtcbiAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHYsIGspID0+IG9wdGlvbnMuaGVhZGVycy5zZXQoaywgdikpO1xuXG4gICAgY29uc3QgY2FjaGVDb250cm9sID0gcGFyc2VDYWNoZUNvbnRyb2wocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NhY2hlLUNvbnRyb2wnKSB8fCAnJyk7XG4gICAgaWYgKGNhY2hlQ29udHJvbFsnbm8tc3RvcmUnXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYWNoZUNvbnRyb2xbJ21heC1hZ2UnXSkge1xuICAgICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdFeHBpcmVzJywgbmV3IERhdGUocmVxdWVzdFRpbWUgKyBjYWNoZUNvbnRyb2xbJ21heC1hZ2UnXSAqIDEwMDApLnRvVVRDU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVVbnRpbEV4cGlyeSA9IG5ldyBEYXRlKG9wdGlvbnMuaGVhZGVycy5nZXQoJ0V4cGlyZXMnKSkuZ2V0VGltZSgpIC0gcmVxdWVzdFRpbWU7XG4gICAgaWYgKHRpbWVVbnRpbEV4cGlyeSA8IE1JTl9USU1FX1VOVElMX0VYUElSWSkgcmV0dXJuO1xuXG4gICAgcHJlcGFyZUJvZHkocmVzcG9uc2UsIGJvZHkgPT4ge1xuICAgICAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IG5ldyB3aW5kb3cuUmVzcG9uc2UoYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY2FjaGVPcGVuKCk7XG4gICAgICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybjtcbiAgICAgICAgc2hhcmVkQ2FjaGVcbiAgICAgICAgICAgIC50aGVuKGNhY2hlID0+IGNhY2hlLnB1dChzdHJpcFF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LnVybCksIGNsb25lZFJlc3BvbnNlKSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHdhcm5PbmNlKGUubWVzc2FnZSkpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzdHJpcFF1ZXJ5UGFyYW1ldGVycyh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICByZXR1cm4gc3RhcnQgPCAwID8gdXJsIDogdXJsLnNsaWNlKDAsIHN0YXJ0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlR2V0KHJlcXVlc3Q6IFJlcXVlc3QsIGNhbGxiYWNrOiAoZXJyb3I6ID9hbnksIHJlc3BvbnNlOiA/UmVzcG9uc2UsIGZyZXNoOiA/Ym9vbGVhbikgPT4gdm9pZCkge1xuICAgIGNhY2hlT3BlbigpO1xuICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgIGNvbnN0IHN0cmlwcGVkVVJMID0gc3RyaXBRdWVyeVBhcmFtZXRlcnMocmVxdWVzdC51cmwpO1xuXG4gICAgc2hhcmVkQ2FjaGVcbiAgICAgICAgLnRoZW4oY2FjaGUgPT4ge1xuICAgICAgICAgICAgLy8gbWFudWFsbHkgc3RyaXAgVVJMIGluc3RlYWQgb2YgYGlnbm9yZVNlYXJjaDogdHJ1ZWAgYmVjYXVzZSBvZiBhIGtub3duXG4gICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBpc3N1ZSBpbiBDaHJvbWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzg0MzFcbiAgICAgICAgICAgIGNhY2hlLm1hdGNoKHN0cmlwcGVkVVJMKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJlc2ggPSBpc0ZyZXNoKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWluc2VydCBpbnRvIGNhY2hlIHNvIHRoYXQgb3JkZXIgb2Yga2V5cyBpbiB0aGUgY2FjaGUgaXMgdGhlIG9yZGVyIG9mIGFjY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsaW5lIG1ha2VzIHRoZSBjYWNoZSBhIExSVSBpbnN0ZWFkIG9mIGEgRklGTyBjYWNoZS5cbiAgICAgICAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlKHN0cmlwcGVkVVJMKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXQoc3RyaXBwZWRVUkwsIHJlc3BvbnNlLmNsb25lKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UsIGZyZXNoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChjYWxsYmFjayk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChjYWxsYmFjayk7XG5cbn1cblxuZnVuY3Rpb24gaXNGcmVzaChyZXNwb25zZSkge1xuICAgIGlmICghcmVzcG9uc2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBleHBpcmVzID0gbmV3IERhdGUocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0V4cGlyZXMnKSB8fCAwKTtcbiAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSBwYXJzZUNhY2hlQ29udHJvbChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ2FjaGUtQ29udHJvbCcpIHx8ICcnKTtcbiAgICByZXR1cm4gZXhwaXJlcyA+IERhdGUubm93KCkgJiYgIWNhY2hlQ29udHJvbFsnbm8tY2FjaGUnXTtcbn1cblxuLy8gYEluZmluaXR5YCB0cmlnZ2VycyBhIGNhY2hlIGNoZWNrIGFmdGVyIHRoZSBmaXJzdCB0aWxlIGlzIGxvYWRlZFxuLy8gc28gdGhhdCBhIGNoZWNrIGlzIHJ1biBhdCBsZWFzdCBvbmNlIG9uIGVhY2ggcGFnZSBsb2FkLlxubGV0IGdsb2JhbEVudHJ5Q291bnRlciA9IEluZmluaXR5O1xuXG4vLyBUaGUgY2FjaGUgY2hlY2sgZ2V0cyBydW4gb24gYSB3b3JrZXIuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdFxuLy8gcHJvZmlsaW5nIHNvbWV0aW1lcyBzaG93cyB0aGlzIGFzIHRha2luZyB1cCBzaWduaWZpY2FudCB0aW1lIG9uIHRoZVxuLy8gdGhyZWFkIGl0IGdldHMgY2FsbGVkIGZyb20uIEFuZCBzb21ldGltZXMgaXQgZG9lc24ndC4gSXQgKm1heSogYmVcbi8vIGZpbmUgdG8gcnVuIHRoaXMgb24gdGhlIG1haW4gdGhyZWFkIGJ1dCBvdXQgb2YgY2F1dGlvbiB0aGlzIGlzIGJlaW5nXG4vLyBkaXNwYXRjaGVkIG9uIGEgd29ya2VyLiBUaGlzIGNhbiBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlciBpbiB0aGUgZnV0dXJlLlxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlRW50cnlQb3NzaWJseUFkZGVkKGRpc3BhdGNoZXI6IERpc3BhdGNoZXIpIHtcbiAgICBnbG9iYWxFbnRyeUNvdW50ZXIrKztcbiAgICBpZiAoZ2xvYmFsRW50cnlDb3VudGVyID4gY2FjaGVDaGVja1RocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaGVyLmdldEFjdG9yKCkuc2VuZCgnZW5mb3JjZUNhY2hlU2l6ZUxpbWl0JywgY2FjaGVMaW1pdCk7XG4gICAgICAgIGdsb2JhbEVudHJ5Q291bnRlciA9IDA7XG4gICAgfVxufVxuXG4vLyBydW5zIG9uIHdvcmtlciwgc2VlIGFib3ZlIGNvbW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlQ2FjaGVTaXplTGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIGNhY2hlT3BlbigpO1xuICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybjtcblxuICAgIHNoYXJlZENhY2hlXG4gICAgICAgIC50aGVuKGNhY2hlID0+IHtcbiAgICAgICAgICAgIGNhY2hlLmtleXMoKS50aGVuKGtleXMgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSBsaW1pdDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlLmRlbGV0ZShrZXlzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRpbGVDYWNoZShjYWxsYmFjaz86IChlcnI6ID9FcnJvcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IHByb21pc2UgPSB3aW5kb3cuY2FjaGVzLmRlbGV0ZShDQUNIRV9OQU1FKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgcHJvbWlzZS5jYXRjaChjYWxsYmFjaykudGhlbigoKSA9PiBjYWxsYmFjaygpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWNoZUxpbWl0cyhsaW1pdDogbnVtYmVyLCBjaGVja1RocmVzaG9sZDogbnVtYmVyKSB7XG4gICAgY2FjaGVMaW1pdCA9IGxpbWl0O1xuICAgIGNhY2hlQ2hlY2tUaHJlc2hvbGQgPSBjaGVja1RocmVzaG9sZDtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcblxubGV0IHN1cHBvcnRzT2Zmc2NyZWVuQ2FudmFzOiA/Ym9vbGVhbjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmIChzdXBwb3J0c09mZnNjcmVlbkNhbnZhcyA9PSBudWxsKSB7XG4gICAgICAgIHN1cHBvcnRzT2Zmc2NyZWVuQ2FudmFzID0gd2luZG93Lk9mZnNjcmVlbkNhbnZhcyAmJlxuICAgICAgICAgICAgbmV3IHdpbmRvdy5PZmZzY3JlZW5DYW52YXMoMSwgMSkuZ2V0Q29udGV4dCgnMmQnKSAmJlxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwcG9ydHNPZmZzY3JlZW5DYW52YXM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcbmltcG9ydCB7ZXh0ZW5kLCB3YXJuT25jZSwgaXNXb3JrZXJ9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge2lzTWFwYm94SFRUUFVSTCwgaGFzQ2FjaGVEZWZlYXRpbmdTa3V9IGZyb20gJy4vbWFwYm94JztcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtjYWNoZUdldCwgY2FjaGVQdXR9IGZyb20gJy4vdGlsZV9yZXF1ZXN0X2NhY2hlJztcbmltcG9ydCB3ZWJwU3VwcG9ydGVkIGZyb20gJy4vd2VicF9zdXBwb3J0ZWQnO1xuaW1wb3J0IG9mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCBmcm9tICcuL29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydGVkJztcblxuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgYSByZXNvdXJjZS5cbiAqIEBwcml2YXRlXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJlc291cmNlVHlwZSA9IHtcbiAgICBVbmtub3duOiAnVW5rbm93bicsXG4gICAgU3R5bGU6ICdTdHlsZScsXG4gICAgU291cmNlOiAnU291cmNlJyxcbiAgICBUaWxlOiAnVGlsZScsXG4gICAgR2x5cGhzOiAnR2x5cGhzJyxcbiAgICBTcHJpdGVJbWFnZTogJ1Nwcml0ZUltYWdlJyxcbiAgICBTcHJpdGVKU09OOiAnU3ByaXRlSlNPTicsXG4gICAgSW1hZ2U6ICdJbWFnZSdcbn07XG5leHBvcnQge1Jlc291cmNlVHlwZX07XG5cbmlmICh0eXBlb2YgT2JqZWN0LmZyZWV6ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmZyZWV6ZShSZXNvdXJjZVR5cGUpO1xufVxuXG4vKipcbiAqIEEgYFJlcXVlc3RQYXJhbWV0ZXJzYCBvYmplY3QgdG8gYmUgcmV0dXJuZWQgZnJvbSBNYXAub3B0aW9ucy50cmFuc2Zvcm1SZXF1ZXN0IGNhbGxiYWNrcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcmVxdWVzdGVkLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGhlYWRlcnMgVGhlIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGhvZCBSZXF1ZXN0IG1ldGhvZCBgJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJ2AuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYm9keSBSZXF1ZXN0IGJvZHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBSZXNwb25zZSBib2R5IHR5cGUgdG8gYmUgcmV0dXJuZWQgYCdzdHJpbmcnIHwgJ2pzb24nIHwgJ2FycmF5QnVmZmVyJ2AuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlZGVudGlhbHMgYCdzYW1lLW9yaWdpbid8J2luY2x1ZGUnYCBVc2UgJ2luY2x1ZGUnIHRvIHNlbmQgY29va2llcyB3aXRoIGNyb3NzLW9yaWdpbiByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29sbGVjdFJlc291cmNlVGltaW5nIElmIHRydWUsIFJlc291cmNlIFRpbWluZyBBUEkgaW5mb3JtYXRpb24gd2lsbCBiZSBjb2xsZWN0ZWQgZm9yIHRoZXNlIHRyYW5zZm9ybWVkIHJlcXVlc3RzIGFuZCByZXR1cm5lZCBpbiBhIHJlc291cmNlVGltaW5nIHByb3BlcnR5IG9mIHJlbGV2YW50IGRhdGEgZXZlbnRzLlxuICogQGV4YW1wbGVcbiAqIC8vIHVzZSB0cmFuc2Zvcm1SZXF1ZXN0IHRvIG1vZGlmeSByZXF1ZXN0cyB0aGF0IGJlZ2luIHdpdGggYGh0dHA6Ly9teUhvc3RgXG4gKiB0cmFuc2Zvcm1SZXF1ZXN0OiBmdW5jdGlvbih1cmwsIHJlc291cmNlVHlwZSkge1xuICogIGlmIChyZXNvdXJjZVR5cGUgPT09ICdTb3VyY2UnICYmIHVybC5pbmRleE9mKCdodHRwOi8vbXlIb3N0JykgPiAtMSkge1xuICogICAgcmV0dXJuIHtcbiAqICAgICAgdXJsOiB1cmwucmVwbGFjZSgnaHR0cCcsICdodHRwcycpLFxuICogICAgICBoZWFkZXJzOiB7ICdteS1jdXN0b20taGVhZGVyJzogdHJ1ZSB9LFxuICogICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnICAvLyBJbmNsdWRlIGNvb2tpZXMgZm9yIGNyb3NzLW9yaWdpbiByZXF1ZXN0c1xuICogICAgfVxuICogICB9XG4gKiAgfVxuICpcbiAqL1xuZXhwb3J0IHR5cGUgUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgaGVhZGVycz86IE9iamVjdCxcbiAgICBtZXRob2Q/OiAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnLFxuICAgIGJvZHk/OiBzdHJpbmcsXG4gICAgdHlwZT86ICdzdHJpbmcnIHwgJ2pzb24nIHwgJ2FycmF5QnVmZmVyJyxcbiAgICBjcmVkZW50aWFscz86ICdzYW1lLW9yaWdpbicgfCAnaW5jbHVkZScsXG4gICAgY29sbGVjdFJlc291cmNlVGltaW5nPzogYm9vbGVhblxufTtcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDYWxsYmFjazxUPiA9IChlcnJvcjogP0Vycm9yLCBkYXRhOiA/VCwgY2FjaGVDb250cm9sOiA/c3RyaW5nLCBleHBpcmVzOiA/c3RyaW5nKSA9PiB2b2lkO1xuXG5jbGFzcyBBSkFYRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgdXJsOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gNDAxICYmIGlzTWFwYm94SFRUUFVSTCh1cmwpKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9ICc6IHlvdSBtYXkgaGF2ZSBwcm92aWRlZCBhbiBpbnZhbGlkIE1hcGJveCBhY2Nlc3MgdG9rZW4uIFNlZSBodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uLyNhY2Nlc3MtdG9rZW5zLWFuZC10b2tlbi1zY29wZXMnO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gd29yayBhcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9SaWNoLUhhcnJpcy9idWJsZS9pc3N1ZXMvNDBcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9ICgke3RoaXMuc3RhdHVzfSk6ICR7dGhpcy51cmx9YDtcbiAgICB9XG59XG5cbi8vIEVuc3VyZSB0aGF0IHdlJ3JlIHNlbmRpbmcgdGhlIGNvcnJlY3QgcmVmZXJyZXIgZnJvbSBibG9iIFVSTCB3b3JrZXIgYnVuZGxlcy5cbi8vIEZvciBmaWxlcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0sIGBsb2NhdGlvbi5vcmlnaW5gIHdpbGwgYmUgc2V0XG4vLyB0byB0aGUgc3RyaW5nKCEpIFwibnVsbFwiIChGaXJlZm94KSwgb3IgXCJmaWxlOi8vXCIgKENocm9tZSwgU2FmYXJpLCBFZGdlLCBJRSksXG4vLyBhbmQgd2Ugd2lsbCBzZXQgYW4gZW1wdHkgcmVmZXJyZXIuIE90aGVyd2lzZSwgd2UncmUgdXNpbmcgdGhlIGRvY3VtZW50J3MgVVJMLlxuLyogZ2xvYmFsIHNlbGYgKi9cbmV4cG9ydCBjb25zdCBnZXRSZWZlcnJlciA9IGlzV29ya2VyKCkgP1xuICAgICgpID0+IHNlbGYud29ya2VyICYmIHNlbGYud29ya2VyLnJlZmVycmVyIDpcbiAgICAoKSA9PiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnYmxvYjonID8gd2luZG93LnBhcmVudCA6IHdpbmRvdykubG9jYXRpb24uaHJlZjtcblxuLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGEgVVJMIGlzIGEgZmlsZTovLyBVUkwuIFRoaXMgaXMgb2J2aW91c2x5IHRoZSBjYXNlIGlmIGl0IGJlZ2luc1xuLy8gd2l0aCBmaWxlOi8vLiBSZWxhdGl2ZSBVUkxzIGFyZSBhbHNvIGZpbGU6Ly8gVVJMcyBpZmYgdGhlIG9yaWdpbmFsIGRvY3VtZW50IHdhcyBsb2FkZWRcbi8vIHZpYSBhIGZpbGU6Ly8gVVJMLlxuY29uc3QgaXNGaWxlVVJMID0gdXJsID0+IC9eZmlsZTovLnRlc3QodXJsKSB8fCAoL15maWxlOi8udGVzdChnZXRSZWZlcnJlcigpKSAmJiAhL15cXHcrOi8udGVzdCh1cmwpKTtcblxuZnVuY3Rpb24gbWFrZUZldGNoUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPGFueT4pOiBDYW5jZWxhYmxlIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IHdpbmRvdy5BYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IHdpbmRvdy5SZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzLnVybCwge1xuICAgICAgICBtZXRob2Q6IHJlcXVlc3RQYXJhbWV0ZXJzLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgICAgYm9keTogcmVxdWVzdFBhcmFtZXRlcnMuYm9keSxcbiAgICAgICAgY3JlZGVudGlhbHM6IHJlcXVlc3RQYXJhbWV0ZXJzLmNyZWRlbnRpYWxzLFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0UGFyYW1ldGVycy5oZWFkZXJzLFxuICAgICAgICByZWZlcnJlcjogZ2V0UmVmZXJyZXIoKSxcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuICAgIH0pO1xuICAgIGxldCBjb21wbGV0ZSA9IGZhbHNlO1xuICAgIGxldCBhYm9ydGVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBjYWNoZUlnbm9yaW5nU2VhcmNoID0gaGFzQ2FjaGVEZWZlYXRpbmdTa3UocmVxdWVzdC51cmwpO1xuXG4gICAgaWYgKHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdqc29uJykge1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlT3JGZXRjaCA9IChlcnIsIGNhY2hlZFJlc3BvbnNlLCByZXNwb25zZUlzRnJlc2gpID0+IHtcbiAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVybjtcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAvLyBEbyBmZXRjaCBpbiBjYXNlIG9mIGNhY2hlIGVycm9yLlxuICAgICAgICAgICAgLy8gSFRUUCBwYWdlcyBpbiBFZGdlIHRyaWdnZXIgYSBzZWN1cml0eSBlcnJvciB0aGF0IGNhbiBiZSBpZ25vcmVkLlxuICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAnU2VjdXJpdHlFcnJvcicpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhY2hlZFJlc3BvbnNlICYmIHJlc3BvbnNlSXNGcmVzaCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFJlcXVlc3QoY2FjaGVkUmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhY2hlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW4ndCBkbyByZXZhbGlkYXRpb24gd2l0aCAnSWYtTm9uZS1NYXRjaCcgYmVjYXVzZSB0aGVuIHRoZVxuICAgICAgICAgICAgLy8gcmVxdWVzdCBkb2Vzbid0IGhhdmUgc2ltcGxlIGNvcnMgaGVhZGVycy5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICB3aW5kb3cuZmV0Y2gocmVxdWVzdCkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWFibGVSZXNwb25zZSA9IGNhY2hlSWdub3JpbmdTZWFyY2ggPyByZXNwb25zZS5jbG9uZSgpIDogbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoUmVxdWVzdChyZXNwb25zZSwgY2FjaGVhYmxlUmVzcG9uc2UsIHJlcXVlc3RUaW1lKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEFKQVhFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCByZXNwb25zZS5zdGF0dXMsIHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMjApIHtcbiAgICAgICAgICAgICAgICAvLyBzaWxlbmNlIGV4cGVjdGVkIEFib3J0RXJyb3JcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgZmluaXNoUmVxdWVzdCA9IChyZXNwb25zZSwgY2FjaGVhYmxlUmVzcG9uc2UsIHJlcXVlc3RUaW1lKSA9PiB7XG4gICAgICAgIChcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdhcnJheUJ1ZmZlcicgPyByZXNwb25zZS5hcnJheUJ1ZmZlcigpIDpcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdqc29uJyA/IHJlc3BvbnNlLmpzb24oKSA6XG4gICAgICAgICAgICByZXNwb25zZS50ZXh0KClcbiAgICAgICAgKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBpZiAoYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGNhY2hlYWJsZVJlc3BvbnNlICYmIHJlcXVlc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNlIG5lZWRzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGNhY2hlIGFmdGVyIGl0IGhhcyBjb21wbGV0ZWx5IGxvYWRlZC5cbiAgICAgICAgICAgICAgICAvLyBVbnRpbCBpdCBpcyBmdWxseSBsb2FkZWQgdGhlcmUgaXMgYSBjaGFuY2UgaXQgd2lsbCBiZSBhYm9ydGVkLiBBYm9ydGluZyB3aGlsZVxuICAgICAgICAgICAgICAgIC8vIHJlYWRpbmcgdGhlIGJvZHkgY2FuIGNhdXNlIHRoZSBjYWNoZSBpbnNlcnRpb24gdG8gZXJyb3IuIFdlIGNvdWxkIGNhdGNoIHRoaXMgZXJyb3JcbiAgICAgICAgICAgICAgICAvLyBpbiBtb3N0IGJyb3dzZXJzIGJ1dCBpbiBGaXJlZm94IGl0IHNlZW1zIHRvIHNvbWV0aW1lcyBjcmFzaCB0aGUgdGFiLiBBZGRpbmdcbiAgICAgICAgICAgICAgICAvLyBpdCB0byB0aGUgY2FjaGUgaGVyZSBhdm9pZHMgdGhhdCBlcnJvci5cbiAgICAgICAgICAgICAgICBjYWNoZVB1dChyZXF1ZXN0LCBjYWNoZWFibGVSZXNwb25zZSwgcmVxdWVzdFRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0LCByZXNwb25zZS5oZWFkZXJzLmdldCgnQ2FjaGUtQ29udHJvbCcpLCByZXNwb25zZS5oZWFkZXJzLmdldCgnRXhwaXJlcycpKTtcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGlmICghYWJvcnRlZCkgY2FsbGJhY2sobmV3IEVycm9yKGVyci5tZXNzYWdlKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAoY2FjaGVJZ25vcmluZ1NlYXJjaCkge1xuICAgICAgICBjYWNoZUdldChyZXF1ZXN0LCB2YWxpZGF0ZU9yRmV0Y2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRlT3JGZXRjaChudWxsLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2NhbmNlbDogKCkgPT4ge1xuICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFjb21wbGV0ZSkgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIH19O1xufVxuXG5mdW5jdGlvbiBtYWtlWE1MSHR0cFJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgeGhyOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIHhoci5vcGVuKHJlcXVlc3RQYXJhbWV0ZXJzLm1ldGhvZCB8fCAnR0VUJywgcmVxdWVzdFBhcmFtZXRlcnMudXJsLCB0cnVlKTtcbiAgICBpZiAocmVxdWVzdFBhcmFtZXRlcnMudHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICB9XG4gICAgZm9yIChjb25zdCBrIGluIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaywgcmVxdWVzdFBhcmFtZXRlcnMuaGVhZGVyc1trXSk7XG4gICAgfVxuICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICd0ZXh0JztcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0UGFyYW1ldGVycy5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnO1xuICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoeGhyLnN0YXR1c1RleHQpKTtcbiAgICB9O1xuICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGlmICgoKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHx8IHhoci5zdGF0dXMgPT09IDApICYmIHhoci5yZXNwb25zZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGRhdGE6IG1peGVkID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG1hbnVhbGx5IHBhcnNpbmcgSlNPTiBoZXJlIHRvIGdldCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDYWNoZS1Db250cm9sJyksIHhoci5nZXRSZXNwb25zZUhlYWRlcignRXhwaXJlcycpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBBSkFYRXJyb3IoeGhyLnN0YXR1c1RleHQsIHhoci5zdGF0dXMsIHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB4aHIuc2VuZChyZXF1ZXN0UGFyYW1ldGVycy5ib2R5KTtcbiAgICByZXR1cm4ge2NhbmNlbDogKCkgPT4geGhyLmFib3J0KCl9O1xufVxuXG5leHBvcnQgY29uc3QgbWFrZVJlcXVlc3QgPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPGFueT4pOiBDYW5jZWxhYmxlIHtcbiAgICAvLyBXZSdyZSB0cnlpbmcgdG8gdXNlIHRoZSBGZXRjaCBBUEkgaWYgcG9zc2libGUuIEhvd2V2ZXIsIGluIHNvbWUgc2l0dWF0aW9ucyB3ZSBjYW4ndCB1c2UgaXQ6XG4gICAgLy8gLSBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBpdCBhdCBhbGwuIEluIHRoaXMgY2FzZSwgd2UgZGlzcGF0Y2ggdGhlIHJlcXVlc3QgdG8gdGhlIG1haW4gdGhyZWFkIHNvXG4gICAgLy8gICB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjcnVhdGUgcmVmZXJyZXIgaGVhZGVyLlxuICAgIC8vIC0gU2FmYXJpIGV4cG9zZXMgd2luZG93LkFib3J0Q29udHJvbGxlciwgYnV0IGl0IGRvZXNuJ3Qgd29yayBhY3R1YWxseSBhYm9ydCBhbnkgcmVxdWVzdHMgaW5cbiAgICAvLyAgIHNvbWUgdmVyc2lvbnMgKHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0OTgwI2MyKVxuICAgIC8vIC0gUmVxdWVzdHMgZm9yIHJlc291cmNlcyB3aXRoIHRoZSBmaWxlOi8vIFVSSSBzY2hlbWUgZG9uJ3Qgd29yayB3aXRoIHRoZSBGZXRjaCBBUEkgZWl0aGVyLiBJblxuICAgIC8vICAgdGhpcyBjYXNlIHdlIHVuY29uZGl0aW9uYWxseSB1c2UgWEhSIG9uIHRoZSBjdXJyZW50IHRocmVhZCBzaW5jZSByZWZlcnJlcnMgZG9uJ3QgbWF0dGVyLlxuICAgIGlmICghaXNGaWxlVVJMKHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5mZXRjaCAmJiB3aW5kb3cuUmVxdWVzdCAmJiB3aW5kb3cuQWJvcnRDb250cm9sbGVyICYmIHdpbmRvdy5SZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnc2lnbmFsJykpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlRmV0Y2hSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV29ya2VyKCkgJiYgc2VsZi53b3JrZXIgJiYgc2VsZi53b3JrZXIuYWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlT25NYWluVGhyZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLndvcmtlci5hY3Rvci5zZW5kKCdnZXRSZXNvdXJjZScsIHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjaywgdW5kZWZpbmVkLCBxdWV1ZU9uTWFpblRocmVhZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VYTUxIdHRwUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEpTT04gPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pOiBDYW5jZWxhYmxlIHtcbiAgICByZXR1cm4gbWFrZVJlcXVlc3QoZXh0ZW5kKHJlcXVlc3RQYXJhbWV0ZXJzLCB7dHlwZTogJ2pzb24nfSksIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8QXJyYXlCdWZmZXI+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge3R5cGU6ICdhcnJheUJ1ZmZlcid9KSwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvc3REYXRhID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxzdHJpbmc+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge21ldGhvZDogJ1BPU1QnfSksIGNhbGxiYWNrKTtcbn07XG5cbmZ1bmN0aW9uIHNhbWVPcmlnaW4odXJsKSB7XG4gICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICByZXR1cm4gYS5wcm90b2NvbCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICYmIGEuaG9zdCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLmhvc3Q7XG59XG5cbmNvbnN0IHRyYW5zcGFyZW50UG5nVXJsID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDMGxFUVZRWVYyTmdBQUlBQUFVQUFhclZ5RkVBQUFBQVNVVk9SSzVDWUlJPSc7XG5cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9JbWFnZShkYXRhOiBBcnJheUJ1ZmZlciwgY2FsbGJhY2s6IChlcnI6ID9FcnJvciwgaW1hZ2U6ID9IVE1MSW1hZ2VFbGVtZW50KSA9PiB2b2lkLCBjYWNoZUNvbnRyb2w6ID9zdHJpbmcsIGV4cGlyZXM6ID9zdHJpbmcpIHtcbiAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgY29uc3QgVVJMID0gd2luZG93LlVSTDtcbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBpbWcpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGltZy5zcmMpO1xuICAgIH07XG4gICAgaW1nLm9uZXJyb3IgPSAoKSA9PiBjYWxsYmFjayhuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGltYWdlLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhIHN1cHBvcnRlZCBpbWFnZSB0eXBlIHN1Y2ggYXMgUE5HIG9yIEpQRUcuIE5vdGUgdGhhdCBTVkdzIGFyZSBub3Qgc3VwcG9ydGVkLicpKTtcbiAgICBjb25zdCBibG9iOiBCbG9iID0gbmV3IHdpbmRvdy5CbG9iKFtuZXcgVWludDhBcnJheShkYXRhKV0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xuICAgIChpbWc6IGFueSkuY2FjaGVDb250cm9sID0gY2FjaGVDb250cm9sO1xuICAgIChpbWc6IGFueSkuZXhwaXJlcyA9IGV4cGlyZXM7XG4gICAgaW1nLnNyYyA9IGRhdGEuYnl0ZUxlbmd0aCA/IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYikgOiB0cmFuc3BhcmVudFBuZ1VybDtcbn1cblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0ltYWdlQml0bWFwKGRhdGE6IEFycmF5QnVmZmVyLCBjYWxsYmFjazogKGVycjogP0Vycm9yLCBpbWFnZTogP0ltYWdlQml0bWFwKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgYmxvYjogQmxvYiA9IG5ldyB3aW5kb3cuQmxvYihbbmV3IFVpbnQ4QXJyYXkoZGF0YSldLCB7dHlwZTogJ2ltYWdlL3BuZyd9KTtcbiAgICB3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAoYmxvYikudGhlbigoaW1nQml0bWFwKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGltZ0JpdG1hcCk7XG4gICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGBDb3VsZCBub3QgbG9hZCBpbWFnZSBiZWNhdXNlIG9mICR7ZS5tZXNzYWdlfS4gUGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgYSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZSBzdWNoIGFzIFBORyBvciBKUEVHLiBOb3RlIHRoYXQgU1ZHcyBhcmUgbm90IHN1cHBvcnRlZC5gKSk7XG4gICAgfSk7XG59XG5cbmxldCBpbWFnZVF1ZXVlLCBudW1JbWFnZVJlcXVlc3RzO1xuZXhwb3J0IGNvbnN0IHJlc2V0SW1hZ2VSZXF1ZXN0UXVldWUgPSAoKSA9PiB7XG4gICAgaW1hZ2VRdWV1ZSA9IFtdO1xuICAgIG51bUltYWdlUmVxdWVzdHMgPSAwO1xufTtcbnJlc2V0SW1hZ2VSZXF1ZXN0UXVldWUoKTtcblxuZXhwb3J0IGNvbnN0IGdldEltYWdlID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwPik6IENhbmNlbGFibGUge1xuICAgIGlmICh3ZWJwU3VwcG9ydGVkLnN1cHBvcnRlZCkge1xuICAgICAgICBpZiAoIXJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy5oZWFkZXJzLmFjY2VwdCA9ICdpbWFnZS93ZWJwLCovKic7XG4gICAgfVxuXG4gICAgLy8gbGltaXQgY29uY3VycmVudCBpbWFnZSBsb2FkcyB0byBoZWxwIHdpdGggcmFzdGVyIHNvdXJjZXMgcGVyZm9ybWFuY2Ugb24gYmlnIHNjcmVlbnNcbiAgICBpZiAobnVtSW1hZ2VSZXF1ZXN0cyA+PSBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZCA9IHtcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsKCkgeyB0aGlzLmNhbmNlbGxlZCA9IHRydWU7IH1cbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2VRdWV1ZS5wdXNoKHF1ZXVlZCk7XG4gICAgICAgIHJldHVybiBxdWV1ZWQ7XG4gICAgfVxuICAgIG51bUltYWdlUmVxdWVzdHMrKztcblxuICAgIGxldCBhZHZhbmNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFkdmFuY2VJbWFnZVJlcXVlc3RRdWV1ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGFkdmFuY2VkKSByZXR1cm47XG4gICAgICAgIGFkdmFuY2VkID0gdHJ1ZTtcbiAgICAgICAgbnVtSW1hZ2VSZXF1ZXN0cy0tO1xuICAgICAgICBhc3NlcnQobnVtSW1hZ2VSZXF1ZXN0cyA+PSAwKTtcbiAgICAgICAgd2hpbGUgKGltYWdlUXVldWUubGVuZ3RoICYmIG51bUltYWdlUmVxdWVzdHMgPCBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbWFnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCB7cmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrLCBjYW5jZWxsZWR9ID0gcmVxdWVzdDtcbiAgICAgICAgICAgIGlmICghY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5jYW5jZWwgPSBnZXRJbWFnZShyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2spLmNhbmNlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyByZXF1ZXN0IHRoZSBpbWFnZSB3aXRoIFhIUiB0byB3b3JrIGFyb3VuZCBjYWNoaW5nIGlzc3Vlc1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMTQ3MFxuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRBcnJheUJ1ZmZlcihyZXF1ZXN0UGFyYW1ldGVycywgKGVycjogP0Vycm9yLCBkYXRhOiA/QXJyYXlCdWZmZXIsIGNhY2hlQ29udHJvbDogP3N0cmluZywgZXhwaXJlczogP3N0cmluZykgPT4ge1xuXG4gICAgICAgIGFkdmFuY2VJbWFnZVJlcXVlc3RRdWV1ZSgpO1xuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKG9mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlCdWZmZXJUb0ltYWdlQml0bWFwKGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlCdWZmZXJUb0ltYWdlKGRhdGEsIGNhbGxiYWNrLCBjYWNoZUNvbnRyb2wsIGV4cGlyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICBhZHZhbmNlSW1hZ2VSZXF1ZXN0UXVldWUoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTFZpZGVvRWxlbWVudD4pOiBDYW5jZWxhYmxlIHtcbiAgICBjb25zdCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcbiAgICB2aWRlby5vbmxvYWRzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB2aWRlbyk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgczogSFRNTFNvdXJjZUVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJyk7XG4gICAgICAgIGlmICghc2FtZU9yaWdpbih1cmxzW2ldKSkge1xuICAgICAgICAgICAgdmlkZW8uY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgICAgICBzLnNyYyA9IHVybHNbaV07XG4gICAgICAgIHZpZGVvLmFwcGVuZENoaWxkKHMpO1xuICAgIH1cbiAgICByZXR1cm4ge2NhbmNlbDogKCkgPT4ge319O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHcmlkSW5kZXg7XG5cbnZhciBOVU1fUEFSQU1TID0gMztcblxuZnVuY3Rpb24gR3JpZEluZGV4KGV4dGVudCwgbiwgcGFkZGluZykge1xuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHMgPSBbXTtcblxuICAgIGlmIChleHRlbnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gZXh0ZW50O1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgSW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgZXh0ZW50ID0gYXJyYXlbMF07XG4gICAgICAgIG4gPSBhcnJheVsxXTtcbiAgICAgICAgcGFkZGluZyA9IGFycmF5WzJdO1xuXG4gICAgICAgIHRoaXMuZCA9IG4gKyAyICogcGFkZGluZztcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmQgKiB0aGlzLmQ7IGsrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGtdO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGFycmF5W05VTV9QQVJBTVMgKyBrICsgMV07XG4gICAgICAgICAgICBjZWxscy5wdXNoKHN0YXJ0ID09PSBlbmQgP1xuICAgICAgICAgICAgICAgICAgICBudWxsIDpcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3ViYXJyYXkoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXlzT2Zmc2V0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aF07XG4gICAgICAgIHZhciBiYm94ZXNPZmZzZXQgPSBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV07XG4gICAgICAgIHRoaXMua2V5cyA9IGFycmF5LnN1YmFycmF5KGtleXNPZmZzZXQsIGJib3hlc09mZnNldCk7XG4gICAgICAgIHRoaXMuYmJveGVzID0gYXJyYXkuc3ViYXJyYXkoYmJveGVzT2Zmc2V0KTtcblxuICAgICAgICB0aGlzLmluc2VydCA9IHRoaXMuX2luc2VydFJlYWRvbmx5O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kID0gbiArIDIgKiBwYWRkaW5nO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZCAqIHRoaXMuZDsgaSsrKSB7XG4gICAgICAgICAgICBjZWxscy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdGhpcy5zY2FsZSA9IG4gLyBleHRlbnQ7XG4gICAgdGhpcy51aWQgPSAwO1xuXG4gICAgdmFyIHAgPSAocGFkZGluZyAvIG4pICogZXh0ZW50O1xuICAgIHRoaXMubWluID0gLXA7XG4gICAgdGhpcy5tYXggPSBleHRlbnQgKyBwO1xufVxuXG5cbkdyaWRJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24oa2V5LCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9pbnNlcnRDZWxsLCB0aGlzLnVpZCsrKTtcbiAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTIpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHkgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyAnQ2Fubm90IGluc2VydCBpbnRvIGEgR3JpZEluZGV4IGNyZWF0ZWQgZnJvbSBhbiBBcnJheUJ1ZmZlci4nO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHVpZCkge1xuICAgIHRoaXMuY2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgIGlmICh4MSA8PSBtaW4gJiYgeTEgPD0gbWluICYmIG1heCA8PSB4MiAmJiBtYXggPD0geTIgJiYgIWludGVyc2VjdGlvblRlc3QpIHtcbiAgICAgICAgLy8gV2UgdXNlIGBBcnJheSNzbGljZWAgYmVjYXVzZSBgdGhpcy5rZXlzYCBtYXkgYmUgYSBgSW50MzJBcnJheWAgYW5kXG4gICAgICAgIC8vIHNvbWUgYnJvd3NlcnMgKFNhZmFyaSBhbmQgSUUpIGRvIG5vdCBzdXBwb3J0IGBUeXBlZEFycmF5I3NsaWNlYFxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UeXBlZEFycmF5L3NsaWNlI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIHNlZW5VaWRzID0ge307XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGwsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbY2VsbEluZGV4XTtcbiAgICBpZiAoY2VsbCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIga2V5cyA9IHRoaXMua2V5cztcbiAgICAgICAgdmFyIGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IGNlbGwubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciB1aWQgPSBjZWxsW3VdO1xuICAgICAgICAgICAgaWYgKHNlZW5VaWRzW3VpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSB1aWQgKiA0O1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ID9cbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uVGVzdChiYm94ZXNbb2Zmc2V0ICsgMF0sIGJib3hlc1tvZmZzZXQgKyAxXSwgYmJveGVzW29mZnNldCArIDJdLCBiYm94ZXNbb2Zmc2V0ICsgM10pIDpcbiAgICAgICAgICAgICAgICAgICAgKCh4MSA8PSBiYm94ZXNbb2Zmc2V0ICsgMl0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MSA8PSBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMV0pKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5c1t1aWRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fZm9yRWFjaENlbGwgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgZm4sIGFyZzEsIGFyZzIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY3gxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgxKTtcbiAgICB2YXIgY3kxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkxKTtcbiAgICB2YXIgY3gyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgyKTtcbiAgICB2YXIgY3kyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkyKTtcbiAgICBmb3IgKHZhciB4ID0gY3gxOyB4IDw9IGN4MjsgeCsrKSB7XG4gICAgICAgIGZvciAodmFyIHkgPSBjeTE7IHkgPD0gY3kyOyB5KyspIHtcbiAgICAgICAgICAgIHZhciBjZWxsSW5kZXggPSB0aGlzLmQgKiB5ICsgeDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ICYmICFpbnRlcnNlY3Rpb25UZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoeCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZCh5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHggKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHkgKyAxKSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpcywgeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgYXJnMSwgYXJnMiwgaW50ZXJzZWN0aW9uVGVzdCkpIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2NvbnZlcnRGcm9tQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMucGFkZGluZykgLyB0aGlzLnNjYWxlO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fY29udmVydFRvQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmQgLSAxLCBNYXRoLmZsb29yKHggKiB0aGlzLnNjYWxlKSArIHRoaXMucGFkZGluZykpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYXJyYXlCdWZmZXIpIHJldHVybiB0aGlzLmFycmF5QnVmZmVyO1xuXG4gICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscztcblxuICAgIHZhciBtZXRhZGF0YUxlbmd0aCA9IE5VTV9QQVJBTVMgKyB0aGlzLmNlbGxzLmxlbmd0aCArIDEgKyAxO1xuICAgIHZhciB0b3RhbENlbGxMZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbENlbGxMZW5ndGggKz0gdGhpcy5jZWxsc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5ID0gbmV3IEludDMyQXJyYXkobWV0YWRhdGFMZW5ndGggKyB0b3RhbENlbGxMZW5ndGggKyB0aGlzLmtleXMubGVuZ3RoICsgdGhpcy5iYm94ZXMubGVuZ3RoKTtcbiAgICBhcnJheVswXSA9IHRoaXMuZXh0ZW50O1xuICAgIGFycmF5WzFdID0gdGhpcy5uO1xuICAgIGFycmF5WzJdID0gdGhpcy5wYWRkaW5nO1xuXG4gICAgdmFyIG9mZnNldCA9IG1ldGFkYXRhTGVuZ3RoO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY2VsbHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGNlbGwgPSBjZWxsc1trXTtcbiAgICAgICAgYXJyYXlbTlVNX1BBUkFNUyArIGtdID0gb2Zmc2V0O1xuICAgICAgICBhcnJheS5zZXQoY2VsbCwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGNlbGwubGVuZ3RoO1xuICAgIH1cblxuICAgIGFycmF5W05VTV9QQVJBTVMgKyBjZWxscy5sZW5ndGhdID0gb2Zmc2V0O1xuICAgIGFycmF5LnNldCh0aGlzLmtleXMsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHRoaXMua2V5cy5sZW5ndGg7XG5cbiAgICBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV0gPSBvZmZzZXQ7XG4gICAgYXJyYXkuc2V0KHRoaXMuYmJveGVzLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmJib3hlcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gYXJyYXkuYnVmZmVyO1xufTtcbiIsIi8vIChjKSBEZWFuIE1jTmFtZWUgPGRlYW5AZ21haWwuY29tPiwgMjAxMi5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVhbm0vY3NzLWNvbG9yLXBhcnNlci1qc1xuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4vLyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4vLyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvXG52YXIga0NTU0NvbG9yVGFibGUgPSB7XG4gIFwidHJhbnNwYXJlbnRcIjogWzAsMCwwLDBdLCBcImFsaWNlYmx1ZVwiOiBbMjQwLDI0OCwyNTUsMV0sXG4gIFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsMjM1LDIxNSwxXSwgXCJhcXVhXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiYXF1YW1hcmluZVwiOiBbMTI3LDI1NSwyMTIsMV0sIFwiYXp1cmVcIjogWzI0MCwyNTUsMjU1LDFdLFxuICBcImJlaWdlXCI6IFsyNDUsMjQ1LDIyMCwxXSwgXCJiaXNxdWVcIjogWzI1NSwyMjgsMTk2LDFdLFxuICBcImJsYWNrXCI6IFswLDAsMCwxXSwgXCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LDIzNSwyMDUsMV0sXG4gIFwiYmx1ZVwiOiBbMCwwLDI1NSwxXSwgXCJibHVldmlvbGV0XCI6IFsxMzgsNDMsMjI2LDFdLFxuICBcImJyb3duXCI6IFsxNjUsNDIsNDIsMV0sIFwiYnVybHl3b29kXCI6IFsyMjIsMTg0LDEzNSwxXSxcbiAgXCJjYWRldGJsdWVcIjogWzk1LDE1OCwxNjAsMV0sIFwiY2hhcnRyZXVzZVwiOiBbMTI3LDI1NSwwLDFdLFxuICBcImNob2NvbGF0ZVwiOiBbMjEwLDEwNSwzMCwxXSwgXCJjb3JhbFwiOiBbMjU1LDEyNyw4MCwxXSxcbiAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLDE0OSwyMzcsMV0sIFwiY29ybnNpbGtcIjogWzI1NSwyNDgsMjIwLDFdLFxuICBcImNyaW1zb25cIjogWzIyMCwyMCw2MCwxXSwgXCJjeWFuXCI6IFswLDI1NSwyNTUsMV0sXG4gIFwiZGFya2JsdWVcIjogWzAsMCwxMzksMV0sIFwiZGFya2N5YW5cIjogWzAsMTM5LDEzOSwxXSxcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFsxODQsMTM0LDExLDFdLCBcImRhcmtncmF5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJrZ3JlZW5cIjogWzAsMTAwLDAsMV0sIFwiZGFya2dyZXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtraGFraVwiOiBbMTg5LDE4MywxMDcsMV0sIFwiZGFya21hZ2VudGFcIjogWzEzOSwwLDEzOSwxXSxcbiAgXCJkYXJrb2xpdmVncmVlblwiOiBbODUsMTA3LDQ3LDFdLCBcImRhcmtvcmFuZ2VcIjogWzI1NSwxNDAsMCwxXSxcbiAgXCJkYXJrb3JjaGlkXCI6IFsxNTMsNTAsMjA0LDFdLCBcImRhcmtyZWRcIjogWzEzOSwwLDAsMV0sXG4gIFwiZGFya3NhbG1vblwiOiBbMjMzLDE1MCwxMjIsMV0sIFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsMTg4LDE0MywxXSxcbiAgXCJkYXJrc2xhdGVibHVlXCI6IFs3Miw2MSwxMzksMV0sIFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsNzksNzksMV0sXG4gIFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsNzksNzksMV0sIFwiZGFya3R1cnF1b2lzZVwiOiBbMCwyMDYsMjA5LDFdLFxuICBcImRhcmt2aW9sZXRcIjogWzE0OCwwLDIxMSwxXSwgXCJkZWVwcGlua1wiOiBbMjU1LDIwLDE0NywxXSxcbiAgXCJkZWVwc2t5Ymx1ZVwiOiBbMCwxOTEsMjU1LDFdLCBcImRpbWdyYXlcIjogWzEwNSwxMDUsMTA1LDFdLFxuICBcImRpbWdyZXlcIjogWzEwNSwxMDUsMTA1LDFdLCBcImRvZGdlcmJsdWVcIjogWzMwLDE0NCwyNTUsMV0sXG4gIFwiZmlyZWJyaWNrXCI6IFsxNzgsMzQsMzQsMV0sIFwiZmxvcmFsd2hpdGVcIjogWzI1NSwyNTAsMjQwLDFdLFxuICBcImZvcmVzdGdyZWVuXCI6IFszNCwxMzksMzQsMV0sIFwiZnVjaHNpYVwiOiBbMjU1LDAsMjU1LDFdLFxuICBcImdhaW5zYm9yb1wiOiBbMjIwLDIyMCwyMjAsMV0sIFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LDI0OCwyNTUsMV0sXG4gIFwiZ29sZFwiOiBbMjU1LDIxNSwwLDFdLCBcImdvbGRlbnJvZFwiOiBbMjE4LDE2NSwzMiwxXSxcbiAgXCJncmF5XCI6IFsxMjgsMTI4LDEyOCwxXSwgXCJncmVlblwiOiBbMCwxMjgsMCwxXSxcbiAgXCJncmVlbnllbGxvd1wiOiBbMTczLDI1NSw0NywxXSwgXCJncmV5XCI6IFsxMjgsMTI4LDEyOCwxXSxcbiAgXCJob25leWRld1wiOiBbMjQwLDI1NSwyNDAsMV0sIFwiaG90cGlua1wiOiBbMjU1LDEwNSwxODAsMV0sXG4gIFwiaW5kaWFucmVkXCI6IFsyMDUsOTIsOTIsMV0sIFwiaW5kaWdvXCI6IFs3NSwwLDEzMCwxXSxcbiAgXCJpdm9yeVwiOiBbMjU1LDI1NSwyNDAsMV0sIFwia2hha2lcIjogWzI0MCwyMzAsMTQwLDFdLFxuICBcImxhdmVuZGVyXCI6IFsyMzAsMjMwLDI1MCwxXSwgXCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsMjQwLDI0NSwxXSxcbiAgXCJsYXduZ3JlZW5cIjogWzEyNCwyNTIsMCwxXSwgXCJsZW1vbmNoaWZmb25cIjogWzI1NSwyNTAsMjA1LDFdLFxuICBcImxpZ2h0Ymx1ZVwiOiBbMTczLDIxNiwyMzAsMV0sIFwibGlnaHRjb3JhbFwiOiBbMjQwLDEyOCwxMjgsMV0sXG4gIFwibGlnaHRjeWFuXCI6IFsyMjQsMjU1LDI1NSwxXSwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLDI1MCwyMTAsMV0sXG4gIFwibGlnaHRncmF5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodGdyZWVuXCI6IFsxNDQsMjM4LDE0NCwxXSxcbiAgXCJsaWdodGdyZXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0cGlua1wiOiBbMjU1LDE4MiwxOTMsMV0sXG4gIFwibGlnaHRzYWxtb25cIjogWzI1NSwxNjAsMTIyLDFdLCBcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLDE3OCwxNzAsMV0sXG4gIFwibGlnaHRza3libHVlXCI6IFsxMzUsMjA2LDI1MCwxXSwgXCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LDEzNiwxNTMsMV0sXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwxMzYsMTUzLDFdLCBcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsMTk2LDIyMiwxXSxcbiAgXCJsaWdodHllbGxvd1wiOiBbMjU1LDI1NSwyMjQsMV0sIFwibGltZVwiOiBbMCwyNTUsMCwxXSxcbiAgXCJsaW1lZ3JlZW5cIjogWzUwLDIwNSw1MCwxXSwgXCJsaW5lblwiOiBbMjUwLDI0MCwyMzAsMV0sXG4gIFwibWFnZW50YVwiOiBbMjU1LDAsMjU1LDFdLCBcIm1hcm9vblwiOiBbMTI4LDAsMCwxXSxcbiAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsMjA1LDE3MCwxXSwgXCJtZWRpdW1ibHVlXCI6IFswLDAsMjA1LDFdLFxuICBcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LDg1LDIxMSwxXSwgXCJtZWRpdW1wdXJwbGVcIjogWzE0NywxMTIsMjE5LDFdLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwxNzksMTEzLDFdLCBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLDEwNCwyMzgsMV0sXG4gIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsMjUwLDE1NCwxXSwgXCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLDIwOSwyMDQsMV0sXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksMjEsMTMzLDFdLCBcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsMjUsMTEyLDFdLFxuICBcIm1pbnRjcmVhbVwiOiBbMjQ1LDI1NSwyNTAsMV0sIFwibWlzdHlyb3NlXCI6IFsyNTUsMjI4LDIyNSwxXSxcbiAgXCJtb2NjYXNpblwiOiBbMjU1LDIyOCwxODEsMV0sIFwibmF2YWpvd2hpdGVcIjogWzI1NSwyMjIsMTczLDFdLFxuICBcIm5hdnlcIjogWzAsMCwxMjgsMV0sIFwib2xkbGFjZVwiOiBbMjUzLDI0NSwyMzAsMV0sXG4gIFwib2xpdmVcIjogWzEyOCwxMjgsMCwxXSwgXCJvbGl2ZWRyYWJcIjogWzEwNywxNDIsMzUsMV0sXG4gIFwib3JhbmdlXCI6IFsyNTUsMTY1LDAsMV0sIFwib3JhbmdlcmVkXCI6IFsyNTUsNjksMCwxXSxcbiAgXCJvcmNoaWRcIjogWzIxOCwxMTIsMjE0LDFdLCBcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwyMzIsMTcwLDFdLFxuICBcInBhbGVncmVlblwiOiBbMTUyLDI1MSwxNTIsMV0sIFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LDIzOCwyMzgsMV0sXG4gIFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LDExMiwxNDcsMV0sIFwicGFwYXlhd2hpcFwiOiBbMjU1LDIzOSwyMTMsMV0sXG4gIFwicGVhY2hwdWZmXCI6IFsyNTUsMjE4LDE4NSwxXSwgXCJwZXJ1XCI6IFsyMDUsMTMzLDYzLDFdLFxuICBcInBpbmtcIjogWzI1NSwxOTIsMjAzLDFdLCBcInBsdW1cIjogWzIyMSwxNjAsMjIxLDFdLFxuICBcInBvd2RlcmJsdWVcIjogWzE3NiwyMjQsMjMwLDFdLCBcInB1cnBsZVwiOiBbMTI4LDAsMTI4LDFdLFxuICBcInJlYmVjY2FwdXJwbGVcIjogWzEwMiw1MSwxNTMsMV0sXG4gIFwicmVkXCI6IFsyNTUsMCwwLDFdLCBcInJvc3licm93blwiOiBbMTg4LDE0MywxNDMsMV0sXG4gIFwicm95YWxibHVlXCI6IFs2NSwxMDUsMjI1LDFdLCBcInNhZGRsZWJyb3duXCI6IFsxMzksNjksMTksMV0sXG4gIFwic2FsbW9uXCI6IFsyNTAsMTI4LDExNCwxXSwgXCJzYW5keWJyb3duXCI6IFsyNDQsMTY0LDk2LDFdLFxuICBcInNlYWdyZWVuXCI6IFs0NiwxMzksODcsMV0sIFwic2Vhc2hlbGxcIjogWzI1NSwyNDUsMjM4LDFdLFxuICBcInNpZW5uYVwiOiBbMTYwLDgyLDQ1LDFdLCBcInNpbHZlclwiOiBbMTkyLDE5MiwxOTIsMV0sXG4gIFwic2t5Ymx1ZVwiOiBbMTM1LDIwNiwyMzUsMV0sIFwic2xhdGVibHVlXCI6IFsxMDYsOTAsMjA1LDFdLFxuICBcInNsYXRlZ3JheVwiOiBbMTEyLDEyOCwxNDQsMV0sIFwic2xhdGVncmV5XCI6IFsxMTIsMTI4LDE0NCwxXSxcbiAgXCJzbm93XCI6IFsyNTUsMjUwLDI1MCwxXSwgXCJzcHJpbmdncmVlblwiOiBbMCwyNTUsMTI3LDFdLFxuICBcInN0ZWVsYmx1ZVwiOiBbNzAsMTMwLDE4MCwxXSwgXCJ0YW5cIjogWzIxMCwxODAsMTQwLDFdLFxuICBcInRlYWxcIjogWzAsMTI4LDEyOCwxXSwgXCJ0aGlzdGxlXCI6IFsyMTYsMTkxLDIxNiwxXSxcbiAgXCJ0b21hdG9cIjogWzI1NSw5OSw3MSwxXSwgXCJ0dXJxdW9pc2VcIjogWzY0LDIyNCwyMDgsMV0sXG4gIFwidmlvbGV0XCI6IFsyMzgsMTMwLDIzOCwxXSwgXCJ3aGVhdFwiOiBbMjQ1LDIyMiwxNzksMV0sXG4gIFwid2hpdGVcIjogWzI1NSwyNTUsMjU1LDFdLCBcIndoaXRlc21va2VcIjogWzI0NSwyNDUsMjQ1LDFdLFxuICBcInllbGxvd1wiOiBbMjU1LDI1NSwwLDFdLCBcInllbGxvd2dyZWVuXCI6IFsxNTQsMjA1LDUwLDFdfVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfYnl0ZShpKSB7ICAvLyBDbGFtcCB0byBpbnRlZ2VyIDAgLi4gMjU1LlxuICBpID0gTWF0aC5yb3VuZChpKTsgIC8vIFNlZW1zIHRvIGJlIHdoYXQgQ2hyb21lIGRvZXMgKHZzIHRydW5jYXRpb24pLlxuICByZXR1cm4gaSA8IDAgPyAwIDogaSA+IDI1NSA/IDI1NSA6IGk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19mbG9hdChmKSB7ICAvLyBDbGFtcCB0byBmbG9hdCAwLjAgLi4gMS4wLlxuICByZXR1cm4gZiA8IDAgPyAwIDogZiA+IDEgPyAxIDogZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2ludChzdHIpIHsgIC8vIGludCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUZsb2F0KHN0cikgLyAxMDAgKiAyNTUpO1xuICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VJbnQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19mbG9hdChzdHIpIHsgIC8vIGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikgLyAxMDApO1xuICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSk7XG59XG5cbmZ1bmN0aW9uIGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkge1xuICBpZiAoaCA8IDApIGggKz0gMTtcbiAgZWxzZSBpZiAoaCA+IDEpIGggLT0gMTtcblxuICBpZiAoaCAqIDYgPCAxKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiBoICogNjtcbiAgaWYgKGggKiAyIDwgMSkgcmV0dXJuIG0yO1xuICBpZiAoaCAqIDMgPCAyKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMi8zIC0gaCkgKiA2O1xuICByZXR1cm4gbTE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ1NTQ29sb3IoY3NzX3N0cikge1xuICAvLyBSZW1vdmUgYWxsIHdoaXRlc3BhY2UsIG5vdCBjb21wbGlhbnQsIGJ1dCBzaG91bGQganVzdCBiZSBtb3JlIGFjY2VwdGluZy5cbiAgdmFyIHN0ciA9IGNzc19zdHIucmVwbGFjZSgvIC9nLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDb2xvciBrZXl3b3JkcyAoYW5kIHRyYW5zcGFyZW50KSBsb29rdXAuXG4gIGlmIChzdHIgaW4ga0NTU0NvbG9yVGFibGUpIHJldHVybiBrQ1NTQ29sb3JUYWJsZVtzdHJdLnNsaWNlKCk7ICAvLyBkdXAuXG5cbiAgLy8gI2FiYyBhbmQgI2FiYzEyMyBzeW50YXguXG4gIGlmIChzdHJbMF0gPT09ICcjJykge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSA0KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWygoaXYgJiAweGYwMCkgPj4gNCkgfCAoKGl2ICYgMHhmMDApID4+IDgpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYwKSB8ICgoaXYgJiAweGYwKSA+PiA0KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmKSB8ICgoaXYgJiAweGYpIDw8IDQpLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9IGVsc2UgaWYgKHN0ci5sZW5ndGggPT09IDcpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZmZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKGl2ICYgMHhmZjAwMDApID4+IDE2LFxuICAgICAgICAgICAgICAoaXYgJiAweGZmMDApID4+IDgsXG4gICAgICAgICAgICAgIGl2ICYgMHhmZixcbiAgICAgICAgICAgICAgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgb3AgPSBzdHIuaW5kZXhPZignKCcpLCBlcCA9IHN0ci5pbmRleE9mKCcpJyk7XG4gIGlmIChvcCAhPT0gLTEgJiYgZXAgKyAxID09PSBzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGZuYW1lID0gc3RyLnN1YnN0cigwLCBvcCk7XG4gICAgdmFyIHBhcmFtcyA9IHN0ci5zdWJzdHIob3ArMSwgZXAtKG9wKzEpKS5zcGxpdCgnLCcpO1xuICAgIHZhciBhbHBoYSA9IDE7ICAvLyBUbyBhbGxvdyBjYXNlIGZhbGx0aHJvdWdoLlxuICAgIHN3aXRjaCAoZm5hbWUpIHtcbiAgICAgIGNhc2UgJ3JnYmEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ3JnYic6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFtwYXJzZV9jc3NfaW50KHBhcmFtc1swXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMV0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzJdKSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBjYXNlICdoc2xhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdoc2wnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBoID0gKCgocGFyc2VGbG9hdChwYXJhbXNbMF0pICUgMzYwKSArIDM2MCkgJSAzNjApIC8gMzYwOyAgLy8gMCAuLiAxXG4gICAgICAgIC8vIE5PVEUoZGVhbm0pOiBBY2NvcmRpbmcgdG8gdGhlIENTUyBzcGVjIHMvbCBzaG91bGQgb25seSBiZVxuICAgICAgICAvLyBwZXJjZW50YWdlcywgYnV0IHdlIGRvbid0IGJvdGhlciBhbmQgbGV0IGZsb2F0IG9yIHBlcmNlbnRhZ2UuXG4gICAgICAgIHZhciBzID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1sxXSk7XG4gICAgICAgIHZhciBsID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtc1syXSk7XG4gICAgICAgIHZhciBtMiA9IGwgPD0gMC41ID8gbCAqIChzICsgMSkgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgbTEgPSBsICogMiAtIG0yO1xuICAgICAgICByZXR1cm4gW2NsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCsxLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpICogMjU1KSxcbiAgICAgICAgICAgICAgICBjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgtMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnRyeSB7IGV4cG9ydHMucGFyc2VDU1NDb2xvciA9IHBhcnNlQ1NTQ29sb3IgfSBjYXRjaChlKSB7IH1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7cGFyc2VDU1NDb2xvcn0gZnJvbSAnY3NzY29sb3JwYXJzZXInO1xuXG4vKipcbiAqIEFuIFJHQkEgY29sb3IgdmFsdWUuIENyZWF0ZSBpbnN0YW5jZXMgZnJvbSBjb2xvciBzdHJpbmdzIHVzaW5nIHRoZSBzdGF0aWNcbiAqIG1ldGhvZCBgQ29sb3IucGFyc2VgLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBSR0IgY2hhbm5lbCB2YWx1ZXMgaW4gdGhlIHJhbmdlXG4gKiBgWzAsIDFdYCwgcHJlbXVsdGlwbGllZCBieSBBLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByIFRoZSByZWQgY2hhbm5lbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBnIFRoZSBncmVlbiBjaGFubmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGIgVGhlIGJsdWUgY2hhbm5lbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhIFRoZSBhbHBoYSBjaGFubmVsLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29sb3Ige1xuICAgIHI6IG51bWJlcjtcbiAgICBnOiBudW1iZXI7XG4gICAgYjogbnVtYmVyO1xuICAgIGE6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciA9IDEpIHtcbiAgICAgICAgdGhpcy5yID0gcjtcbiAgICAgICAgdGhpcy5nID0gZztcbiAgICAgICAgdGhpcy5iID0gYjtcbiAgICAgICAgdGhpcy5hID0gYTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYmxhY2s6IENvbG9yO1xuICAgIHN0YXRpYyB3aGl0ZTogQ29sb3I7XG4gICAgc3RhdGljIHRyYW5zcGFyZW50OiBDb2xvcjtcbiAgICBzdGF0aWMgcmVkOiBDb2xvcjtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB2YWxpZCBDU1MgY29sb3Igc3RyaW5ncyBhbmQgcmV0dXJucyBhIGBDb2xvcmAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQSBgQ29sb3JgIGluc3RhbmNlLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgaW5wdXQgaXMgbm90IGEgdmFsaWQgY29sb3Igc3RyaW5nLlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShpbnB1dD86IHN0cmluZyB8IENvbG9yIHwgbnVsbCk6IENvbG9yIHwgdm9pZCB7XG4gICAgICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZ2JhID0gcGFyc2VDU1NDb2xvcihpbnB1dCk7XG4gICAgICAgIGlmICghcmdiYSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoXG4gICAgICAgICAgICByZ2JhWzBdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbMV0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVsyXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzNdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBSR0JBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbG9yIHZhbHVlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gUkdCQSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcHVycGxlID0gbmV3IENvbG9yLnBhcnNlKCdwdXJwbGUnKTtcbiAgICAgKiBwdXJwbGUudG9TdHJpbmc7IC8vID0gXCJyZ2JhKDEyOCwwLDEyOCwxKVwiXG4gICAgICogdmFyIHRyYW5zbHVjZW50R3JlZW4gPSBuZXcgQ29sb3IucGFyc2UoJ3JnYmEoMjYsIDIwNywgMjYsIC43MyknKTtcbiAgICAgKiB0cmFuc2x1Y2VudEdyZWVuLnRvU3RyaW5nKCk7IC8vID0gXCJyZ2JhKDI2LDIwNywyNiwwLjczKVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgW3IsIGcsIGIsIGFdID0gdGhpcy50b0FycmF5KCk7XG4gICAgICAgIHJldHVybiBgcmdiYSgke01hdGgucm91bmQocil9LCR7TWF0aC5yb3VuZChnKX0sJHtNYXRoLnJvdW5kKGIpfSwke2F9KWA7XG4gICAgfVxuXG4gICAgdG9BcnJheSgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHtyLCBnLCBiLCBhfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBhID09PSAwID8gWzAsIDAsIDAsIDBdIDogW1xuICAgICAgICAgICAgciAqIDI1NSAvIGEsXG4gICAgICAgICAgICBnICogMjU1IC8gYSxcbiAgICAgICAgICAgIGIgKiAyNTUgLyBhLFxuICAgICAgICAgICAgYVxuICAgICAgICBdO1xuICAgIH1cbn1cblxuQ29sb3IuYmxhY2sgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMSk7XG5Db2xvci53aGl0ZSA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcbkNvbG9yLnRyYW5zcGFyZW50ID0gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xuQ29sb3IucmVkID0gbmV3IENvbG9yKDEsIDAsIDAsIDEpO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xvcjtcbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChvdXRwdXQ6IGFueSwgLi4uaW5wdXRzOiBBcnJheTxhbnk+KSB7XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrIGluIGlucHV0KSB7XG4gICAgICAgICAgICBvdXRwdXRba10gPSBpbnB1dFtrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIiwiLy8gQGZsb3dcblxuY2xhc3MgUGFyc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGtleTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNpbmdFcnJvcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24nO1xuXG4vKipcbiAqIFRyYWNrcyBgbGV0YCBiaW5kaW5ncyBkdXJpbmcgZXhwcmVzc2lvbiBwYXJzaW5nLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU2NvcGUge1xuICAgIHBhcmVudDogP1Njb3BlO1xuICAgIGJpbmRpbmdzOiB7W186IHN0cmluZ106IEV4cHJlc3Npb259O1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudD86IFNjb3BlLCBiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+ID0gW10pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZXhwcmVzc2lvbl0gb2YgYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbbmFtZV0gPSBleHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uY2F0KGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY29wZSh0aGlzLCBiaW5kaW5ncyk7XG4gICAgfVxuXG4gICAgZ2V0KG5hbWU6IHN0cmluZyk6IEV4cHJlc3Npb24ge1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1tuYW1lXSkgeyByZXR1cm4gdGhpcy5iaW5kaW5nc1tuYW1lXTsgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgcmV0dXJuIHRoaXMucGFyZW50LmdldChuYW1lKTsgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gbm90IGZvdW5kIGluIHNjb3BlLmApO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbbmFtZV0pIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5oYXMobmFtZSkgOiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjb3BlO1xuIiwiLy8gQGZsb3dcblxuZXhwb3J0IHR5cGUgTnVsbFR5cGVUID0geyBraW5kOiAnbnVsbCcgfTtcbmV4cG9ydCB0eXBlIE51bWJlclR5cGVUID0geyBraW5kOiAnbnVtYmVyJyB9O1xuZXhwb3J0IHR5cGUgU3RyaW5nVHlwZVQgPSB7IGtpbmQ6ICdzdHJpbmcnIH07XG5leHBvcnQgdHlwZSBCb29sZWFuVHlwZVQgPSB7IGtpbmQ6ICdib29sZWFuJyB9O1xuZXhwb3J0IHR5cGUgQ29sb3JUeXBlVCA9IHsga2luZDogJ2NvbG9yJyB9O1xuZXhwb3J0IHR5cGUgT2JqZWN0VHlwZVQgPSB7IGtpbmQ6ICdvYmplY3QnIH07XG5leHBvcnQgdHlwZSBWYWx1ZVR5cGVUID0geyBraW5kOiAndmFsdWUnIH07XG5leHBvcnQgdHlwZSBFcnJvclR5cGVUID0geyBraW5kOiAnZXJyb3InIH07XG5leHBvcnQgdHlwZSBDb2xsYXRvclR5cGVUID0geyBraW5kOiAnY29sbGF0b3InIH07XG5leHBvcnQgdHlwZSBGb3JtYXR0ZWRUeXBlVCA9IHsga2luZDogJ2Zvcm1hdHRlZCcgfTtcbmV4cG9ydCB0eXBlIFJlc29sdmVkSW1hZ2VUeXBlVCA9IHsga2luZDogJ3Jlc29sdmVkSW1hZ2UnIH07XG5cbmV4cG9ydCB0eXBlIEV2YWx1YXRpb25LaW5kID0gJ2NvbnN0YW50JyB8ICdzb3VyY2UnIHwgJ2NhbWVyYScgfCAnY29tcG9zaXRlJztcblxuZXhwb3J0IHR5cGUgVHlwZSA9XG4gICAgTnVsbFR5cGVUIHxcbiAgICBOdW1iZXJUeXBlVCB8XG4gICAgU3RyaW5nVHlwZVQgfFxuICAgIEJvb2xlYW5UeXBlVCB8XG4gICAgQ29sb3JUeXBlVCB8XG4gICAgT2JqZWN0VHlwZVQgfFxuICAgIFZhbHVlVHlwZVQgfFxuICAgIEFycmF5VHlwZSB8IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBFcnJvclR5cGVUIHxcbiAgICBDb2xsYXRvclR5cGVUIHxcbiAgICBGb3JtYXR0ZWRUeXBlVCB8XG4gICAgUmVzb2x2ZWRJbWFnZVR5cGVUXG5cbmV4cG9ydCB0eXBlIEFycmF5VHlwZSA9IHtcbiAgICBraW5kOiAnYXJyYXknLFxuICAgIGl0ZW1UeXBlOiBUeXBlLFxuICAgIE46ID9udW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgTmF0aXZlVHlwZSA9ICdudW1iZXInIHwgJ3N0cmluZycgfCAnYm9vbGVhbicgfCAnbnVsbCcgfCAnYXJyYXknIHwgJ29iamVjdCdcblxuZXhwb3J0IGNvbnN0IE51bGxUeXBlID0ge2tpbmQ6ICdudWxsJ307XG5leHBvcnQgY29uc3QgTnVtYmVyVHlwZSA9IHtraW5kOiAnbnVtYmVyJ307XG5leHBvcnQgY29uc3QgU3RyaW5nVHlwZSA9IHtraW5kOiAnc3RyaW5nJ307XG5leHBvcnQgY29uc3QgQm9vbGVhblR5cGUgPSB7a2luZDogJ2Jvb2xlYW4nfTtcbmV4cG9ydCBjb25zdCBDb2xvclR5cGUgPSB7a2luZDogJ2NvbG9yJ307XG5leHBvcnQgY29uc3QgT2JqZWN0VHlwZSA9IHtraW5kOiAnb2JqZWN0J307XG5leHBvcnQgY29uc3QgVmFsdWVUeXBlID0ge2tpbmQ6ICd2YWx1ZSd9O1xuZXhwb3J0IGNvbnN0IEVycm9yVHlwZSA9IHtraW5kOiAnZXJyb3InfTtcbmV4cG9ydCBjb25zdCBDb2xsYXRvclR5cGUgPSB7a2luZDogJ2NvbGxhdG9yJ307XG5leHBvcnQgY29uc3QgRm9ybWF0dGVkVHlwZSA9IHtraW5kOiAnZm9ybWF0dGVkJ307XG5leHBvcnQgY29uc3QgUmVzb2x2ZWRJbWFnZVR5cGUgPSB7a2luZDogJ3Jlc29sdmVkSW1hZ2UnfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KGl0ZW1UeXBlOiBUeXBlLCBOOiA/bnVtYmVyKTogQXJyYXlUeXBlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnYXJyYXknLFxuICAgICAgICBpdGVtVHlwZSxcbiAgICAgICAgTlxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyh0eXBlOiBUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdG9TdHJpbmcodHlwZS5pdGVtVHlwZSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdHlwZS5OID09PSAnbnVtYmVyJyA/XG4gICAgICAgICAgICBgYXJyYXk8JHtpdGVtVHlwZX0sICR7dHlwZS5OfT5gIDpcbiAgICAgICAgICAgIHR5cGUuaXRlbVR5cGUua2luZCA9PT0gJ3ZhbHVlJyA/ICdhcnJheScgOiBgYXJyYXk8JHtpdGVtVHlwZX0+YDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHlwZS5raW5kO1xuICAgIH1cbn1cblxuY29uc3QgdmFsdWVNZW1iZXJUeXBlcyA9IFtcbiAgICBOdWxsVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgQm9vbGVhblR5cGUsXG4gICAgQ29sb3JUeXBlLFxuICAgIEZvcm1hdHRlZFR5cGUsXG4gICAgT2JqZWN0VHlwZSxcbiAgICBhcnJheShWYWx1ZVR5cGUpLFxuICAgIFJlc29sdmVkSW1hZ2VUeXBlXG5dO1xuXG4vKipcbiAqIFJldHVybnMgbnVsbCBpZiBgdGAgaXMgYSBzdWJ0eXBlIG9mIGBleHBlY3RlZGA7IG90aGVyd2lzZSByZXR1cm5zIGFuXG4gKiBlcnJvciBtZXNzYWdlLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrU3VidHlwZShleHBlY3RlZDogVHlwZSwgdDogVHlwZSk6ID9zdHJpbmcge1xuICAgIGlmICh0LmtpbmQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgLy8gRXJyb3IgaXMgYSBzdWJ0eXBlIG9mIGV2ZXJ5IHR5cGVcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmICh0LmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICgodC5OID09PSAwICYmIHQuaXRlbVR5cGUua2luZCA9PT0gJ3ZhbHVlJykgfHwgIWNoZWNrU3VidHlwZShleHBlY3RlZC5pdGVtVHlwZSwgdC5pdGVtVHlwZSkpICYmXG4gICAgICAgICAgICAodHlwZW9mIGV4cGVjdGVkLk4gIT09ICdudW1iZXInIHx8IGV4cGVjdGVkLk4gPT09IHQuTikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSB0LmtpbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChleHBlY3RlZC5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVyVHlwZSBvZiB2YWx1ZU1lbWJlclR5cGVzKSB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrU3VidHlwZShtZW1iZXJUeXBlLCB0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGBFeHBlY3RlZCAke3RvU3RyaW5nKGV4cGVjdGVkKX0gYnV0IGZvdW5kICR7dG9TdHJpbmcodCl9IGluc3RlYWQuYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUeXBlKHByb3ZpZGVkOiBUeXBlLCBhbGxvd2VkVHlwZXM6IEFycmF5PFR5cGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5zb21lKHQgPT4gdC5raW5kID09PSBwcm92aWRlZC5raW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWROYXRpdmVUeXBlKHByb3ZpZGVkOiBhbnksIGFsbG93ZWRUeXBlczogQXJyYXk8TmF0aXZlVHlwZT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYWxsb3dlZFR5cGVzLnNvbWUodCA9PiB7XG4gICAgICAgIGlmICh0ID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlZCA9PT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICh0ID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwcm92aWRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAodCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlZCAmJiAhQXJyYXkuaXNBcnJheShwcm92aWRlZCkgJiYgdHlwZW9mIHByb3ZpZGVkID09PSAnb2JqZWN0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0ID09PSB0eXBlb2YgcHJvdmlkZWQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsIi8vIEBmbG93XG5cbi8vIEZsb3cgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIEludGwgY3JpYmJlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTI3MFxuXG5kZWNsYXJlIHZhciBJbnRsOiB7XG4gICAgQ29sbGF0b3I6IENsYXNzPEludGwkQ29sbGF0b3I+XG59O1xuXG5kZWNsYXJlIGNsYXNzIEludGwkQ29sbGF0b3Ige1xuICAgIGNvbnN0cnVjdG9yIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogQ29sbGF0b3JPcHRpb25zXG4gICAgKTogSW50bCRDb2xsYXRvcjtcblxuICAgIHN0YXRpYyAoXG4gICAgICAgIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IENvbGxhdG9yT3B0aW9uc1xuICAgICk6IEludGwkQ29sbGF0b3I7XG5cbiAgICBjb21wYXJlIChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlcjtcblxuICAgIHJlc29sdmVkT3B0aW9ucygpOiBhbnk7XG59XG5cbnR5cGUgQ29sbGF0b3JPcHRpb25zID0ge1xuICAgIGxvY2FsZU1hdGNoZXI/OiAnbG9va3VwJyB8ICdiZXN0IGZpdCcsXG4gICAgdXNhZ2U/OiAnc29ydCcgfCAnc2VhcmNoJyxcbiAgICBzZW5zaXRpdml0eT86ICdiYXNlJyB8ICdhY2NlbnQnIHwgJ2Nhc2UnIHwgJ3ZhcmlhbnQnLFxuICAgIGlnbm9yZVB1bmN0dWF0aW9uPzogYm9vbGVhbixcbiAgICBudW1lcmljPzogYm9vbGVhbixcbiAgICBjYXNlRmlyc3Q/OiAndXBwZXInIHwgJ2xvd2VyJyB8ICdmYWxzZSdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3Ige1xuICAgIGxvY2FsZTogc3RyaW5nIHwgbnVsbDtcbiAgICBzZW5zaXRpdml0eTogJ2Jhc2UnIHwgJ2FjY2VudCcgfCAnY2FzZScgfCAndmFyaWFudCc7XG4gICAgY29sbGF0b3I6IEludGwkQ29sbGF0b3I7XG5cbiAgICBjb25zdHJ1Y3RvcihjYXNlU2Vuc2l0aXZlOiBib29sZWFuLCBkaWFjcml0aWNTZW5zaXRpdmU6IGJvb2xlYW4sIGxvY2FsZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAoY2FzZVNlbnNpdGl2ZSlcbiAgICAgICAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSBkaWFjcml0aWNTZW5zaXRpdmUgPyAndmFyaWFudCcgOiAnY2FzZSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSBkaWFjcml0aWNTZW5zaXRpdmUgPyAnYWNjZW50JyA6ICdiYXNlJztcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICAgICAgdGhpcy5jb2xsYXRvciA9IG5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUgOiBbXSxcbiAgICAgICAgICAgIHtzZW5zaXRpdml0eTogdGhpcy5zZW5zaXRpdml0eSwgdXNhZ2U6ICdzZWFyY2gnfSk7XG4gICAgfVxuXG4gICAgY29tcGFyZShsaHM6IHN0cmluZywgcmhzOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2xsYXRvci5jb21wYXJlKGxocywgcmhzKTtcbiAgICB9XG5cbiAgICByZXNvbHZlZExvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICAvLyBXZSBjcmVhdGUgYSBDb2xsYXRvciB3aXRob3V0IFwidXNhZ2U6IHNlYXJjaFwiIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudFxuICAgICAgICAvLyB0aGUgc2VhcmNoIG9wdGlvbnMgZW5jb2RlZCBpbiBvdXIgcmVzdWx0IChlLmcuIFwiZW4tdS1jby1zZWFyY2hcIilcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkNvbGxhdG9yKHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUgOiBbXSlcbiAgICAgICAgICAgIC5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3V0aWwvY29sb3InO1xuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi90eXBlcy9yZXNvbHZlZF9pbWFnZSc7XG5cbmV4cG9ydCBjbGFzcyBGb3JtYXR0ZWRTZWN0aW9uIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgaW1hZ2U6IFJlc29sdmVkSW1hZ2UgfCBudWxsO1xuICAgIHNjYWxlOiBudW1iZXIgfCBudWxsO1xuICAgIGZvbnRTdGFjazogc3RyaW5nIHwgbnVsbDtcbiAgICB0ZXh0Q29sb3I6IENvbG9yIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKHRleHQ6IHN0cmluZywgaW1hZ2U6IFJlc29sdmVkSW1hZ2UgfCBudWxsLCBzY2FsZTogbnVtYmVyIHwgbnVsbCwgZm9udFN0YWNrOiBzdHJpbmcgfCBudWxsLCB0ZXh0Q29sb3I6IENvbG9yIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgdGhpcy5mb250U3RhY2sgPSBmb250U3RhY2s7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybWF0dGVkIHtcbiAgICBzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbj4pIHtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IHNlY3Rpb25zO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBGb3JtYXR0ZWQge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZChbbmV3IEZvcm1hdHRlZFNlY3Rpb24odW5mb3JtYXR0ZWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpXSk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlY3Rpb25zLnNvbWUoc2VjdGlvbiA9PiBzZWN0aW9uLnRleHQubGVuZ3RoICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjdGlvbi5pbWFnZSAmJiBzZWN0aW9uLmltYWdlLm5hbWUubGVuZ3RoICE9PSAwKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZhY3RvcnkodGV4dDogRm9ybWF0dGVkIHwgc3RyaW5nKTogRm9ybWF0dGVkIHtcbiAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25zLm1hcChzZWN0aW9uID0+IHNlY3Rpb24udGV4dCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IEFycmF5PG1peGVkPiA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKFtcImltYWdlXCIsIHNlY3Rpb24uaW1hZ2UubmFtZV0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHNlY3Rpb24udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IG1peGVkIH0gPSB7fTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnRTdGFjaykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbXCJ0ZXh0LWZvbnRcIl0gPSBbXCJsaXRlcmFsXCIsIHNlY3Rpb24uZm9udFN0YWNrLnNwbGl0KCcsJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1wiZm9udC1zY2FsZVwiXSA9IHNlY3Rpb24uc2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi50ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1widGV4dC1jb2xvclwiXSA9IChbXCJyZ2JhXCJdOiBBcnJheTxtaXhlZD4pLmNvbmNhdChzZWN0aW9uLnRleHRDb2xvci50b0FycmF5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIFJlc29sdmVkSW1hZ2VPcHRpb25zID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhdmFpbGFibGU6IGJvb2xlYW5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlc29sdmVkSW1hZ2Uge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhdmFpbGFibGU6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZEltYWdlT3B0aW9ucykge1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlID0gb3B0aW9ucy5hdmFpbGFibGU7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0cmluZyhuYW1lOiBzdHJpbmcpOiBSZXNvbHZlZEltYWdlIHwgbnVsbCB7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7IC8vIHRyZWF0IGVtcHR5IHZhbHVlcyBhcyBubyBpbWFnZVxuICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkSW1hZ2Uoe25hbWUsIGF2YWlsYWJsZTogZmFsc2V9KTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBbXCJpbWFnZVwiLCB0aGlzLm5hbWVdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3V0aWwvY29sb3InO1xuaW1wb3J0IENvbGxhdG9yIGZyb20gJy4vdHlwZXMvY29sbGF0b3InO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcbmltcG9ydCB7TnVsbFR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIEJvb2xlYW5UeXBlLCBDb2xvclR5cGUsIE9iamVjdFR5cGUsIFZhbHVlVHlwZSwgQ29sbGF0b3JUeXBlLCBGb3JtYXR0ZWRUeXBlLCBSZXNvbHZlZEltYWdlVHlwZSwgYXJyYXl9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJHQkEocjogbWl4ZWQsIGc6IG1peGVkLCBiOiBtaXhlZCwgYT86IG1peGVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCEoXG4gICAgICAgIHR5cGVvZiByID09PSAnbnVtYmVyJyAmJiByID49IDAgJiYgciA8PSAyNTUgJiZcbiAgICAgICAgdHlwZW9mIGcgPT09ICdudW1iZXInICYmIGcgPj0gMCAmJiBnIDw9IDI1NSAmJlxuICAgICAgICB0eXBlb2YgYiA9PT0gJ251bWJlcicgJiYgYiA+PSAwICYmIGIgPD0gMjU1XG4gICAgKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBhID09PSAnbnVtYmVyJyA/IFtyLCBnLCBiLCBhXSA6IFtyLCBnLCBiXTtcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7dmFsdWUuam9pbignLCAnKX1dOiAncicsICdnJywgYW5kICdiJyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LmA7XG4gICAgfVxuXG4gICAgaWYgKCEoXG4gICAgICAgIHR5cGVvZiBhID09PSAndW5kZWZpbmVkJyB8fCAodHlwZW9mIGEgPT09ICdudW1iZXInICYmIGEgPj0gMCAmJiBhIDw9IDEpXG4gICAgKSkge1xuICAgICAgICByZXR1cm4gYEludmFsaWQgcmdiYSB2YWx1ZSBbJHtbciwgZywgYiwgYV0uam9pbignLCAnKX1dOiAnYScgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuYDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgVmFsdWUgPSBudWxsIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IENvbG9yIHwgQ29sbGF0b3IgfCBGb3JtYXR0ZWQgfCBSZXNvbHZlZEltYWdlIHwgJFJlYWRPbmx5QXJyYXk8VmFsdWU+IHwgeyArW3N0cmluZ106IFZhbHVlIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsdWUobWl4ZWQ6IG1peGVkKTogYm9vbGVhbiB7XG4gICAgaWYgKG1peGVkID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1peGVkID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIENvbGxhdG9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1peGVkKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWl4ZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNWYWx1ZShtaXhlZFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZU9mKHZhbHVlOiBWYWx1ZSk6IFR5cGUge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTnVsbFR5cGU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmdUeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW5UeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gTnVtYmVyVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGF0b3IpIHtcbiAgICAgICAgcmV0dXJuIENvbGxhdG9yVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiBGb3JtYXR0ZWRUeXBlO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlKSB7XG4gICAgICAgIHJldHVybiBSZXNvbHZlZEltYWdlVHlwZTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgbGV0IGl0ZW1UeXBlOiBUeXBlIHwgdHlwZW9mIHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0eXBlT2YoaXRlbSk7XG4gICAgICAgICAgICBpZiAoIWl0ZW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSA9PT0gdCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IFZhbHVlVHlwZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheShpdGVtVHlwZSB8fCBWYWx1ZVR5cGUsIGxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpO1xuICAgICAgICByZXR1cm4gT2JqZWN0VHlwZTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZTogVmFsdWUpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yIHx8IHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVzb2x2ZWRJbWFnZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IHtDb2xvciwgQ29sbGF0b3J9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtpc1ZhbHVlLCB0eXBlT2YsIENvbG9yfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSAgZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5cbmNsYXNzIExpdGVyYWwgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHZhbHVlOiBWYWx1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIHZhbHVlOiBWYWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCdsaXRlcmFsJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbHVlKGFyZ3NbMV0pKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYGludmFsaWQgdmFsdWVgKTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChhcmdzWzFdOiBhbnkpO1xuICAgICAgICBsZXQgdHlwZSA9IHR5cGVPZih2YWx1ZSk7XG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBpbmZlciB0aGUgaXRlbSB0eXBlIGlmIHBvc3NpYmxlIGZvciB6ZXJvLWxlbmd0aCBhcnJheXNcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlLk4gPT09IDAgJiZcbiAgICAgICAgICAgIGV4cGVjdGVkICYmXG4gICAgICAgICAgICBleHBlY3RlZC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAodHlwZW9mIGV4cGVjdGVkLk4gIT09ICdudW1iZXInIHx8IGV4cGVjdGVkLk4gPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHlwZSA9IGV4cGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsKHR5cGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdhcnJheScgfHwgdGhpcy50eXBlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gW1wibGl0ZXJhbFwiLCB0aGlzLnZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgICAgICAgIC8vIENvbnN0YW50LWZvbGRpbmcgY2FuIGdlbmVyYXRlIExpdGVyYWwgZXhwcmVzc2lvbnMgdGhhdCB5b3VcbiAgICAgICAgICAgIC8vIGNvdWxkbid0IGFjdHVhbGx5IGdlbmVyYXRlIHdpdGggYSBcImxpdGVyYWxcIiBleHByZXNzaW9uLFxuICAgICAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBpbXBsZW1lbnQgYW4gZXF1aXZhbGVudCBzZXJpYWxpemF0aW9uIGhlcmVcbiAgICAgICAgICAgIHJldHVybiBbXCJyZ2JhXCJdLmNvbmNhdCh0aGlzLnZhbHVlLnRvQXJyYXkoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICAgICAgLy8gU2FtZSBhcyBDb2xvclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuc2VyaWFsaXplKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQodGhpcy52YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXRlcmFsO1xuIiwiLy8gQGZsb3dcblxuY2xhc3MgUnVudGltZUVycm9yIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubmFtZSA9ICdFeHByZXNzaW9uRXZhbHVhdGlvbkVycm9yJztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSdW50aW1lRXJyb3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7XG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBOdW1iZXJUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIGNoZWNrU3VidHlwZSxcbiAgICB0b1N0cmluZyxcbiAgICBhcnJheVxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgc3RyaW5nOiBTdHJpbmdUeXBlLFxuICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICBvYmplY3Q6IE9iamVjdFR5cGVcbn07XG5cbmNsYXNzIEFzc2VydGlvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgIGxldCB0eXBlO1xuXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgbGV0IGl0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBhcmdzWzFdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgISh0eXBlIGluIHR5cGVzKSB8fCB0eXBlID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBpdGVtIHR5cGUgYXJndW1lbnQgb2YgXCJhcnJheVwiIG11c3QgYmUgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuJywgMSk7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSB0eXBlc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gVmFsdWVUeXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgTjtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1syXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGFyZ3NbMl0gIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzJdIDwgMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSAhPT0gTWF0aC5mbG9vcihhcmdzWzJdKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ1RoZSBsZW5ndGggYXJndW1lbnQgdG8gXCJhcnJheVwiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwnLCAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTiA9IGFyZ3NbMl07XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0eXBlID0gYXJyYXkoaXRlbVR5cGUsIE4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVzW25hbWVdLCBuYW1lKTtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlc1tuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgICAgICBmb3IgKDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBwYXJzZWQucHVzaChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbih0eXBlLCBwYXJzZWQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5hcmdzW2ldLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGNoZWNrU3VidHlwZSh0aGlzLnR5cGUsIHR5cGVPZih2YWx1ZSkpO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gdGhpcy5hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlICR7dG9TdHJpbmcodGhpcy50eXBlKX0sIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZih2YWx1ZSkpfSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncy5ldmVyeShhcmcgPT4gYXJnLm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbdHlwZS5raW5kXTtcbiAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0eXBlLml0ZW1UeXBlO1xuICAgICAgICAgICAgaWYgKGl0ZW1UeXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICBpdGVtVHlwZS5raW5kID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goaXRlbVR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgTiA9IHR5cGUuTjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE4gPT09ICdudW1iZXInIHx8IHRoaXMuYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChOKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQuY29uY2F0KHRoaXMuYXJncy5tYXAoYXJnID0+IGFyZy5zZXJpYWxpemUoKSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXNzZXJ0aW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtOdW1iZXJUeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIGFycmF5LCBTdHJpbmdUeXBlLCBDb2xvclR5cGUsIFJlc29sdmVkSW1hZ2VUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgRm9ybWF0dGVkLCB7Rm9ybWF0dGVkU2VjdGlvbn0gZnJvbSAnLi4vdHlwZXMvZm9ybWF0dGVkJztcbmltcG9ydCB7dG9TdHJpbmcsIHR5cGVPZn0gZnJvbSAnLi4vdmFsdWVzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uID0ge1xuICAgIC8vIENvbnRlbnQgb2YgYSBzZWN0aW9uIG1heSBiZSBJbWFnZSBleHByZXNzaW9uIG9yIG90aGVyXG4gICAgLy8gdHlwZSBvZiBleHByZXNzaW9uIHRoYXQgaXMgY29lcmNhYmxlIHRvICdzdHJpbmcnLlxuICAgIGNvbnRlbnQ6IEV4cHJlc3Npb24sXG4gICAgc2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIGZvbnQ6IEV4cHJlc3Npb24gfCBudWxsO1xuICAgIHRleHRDb2xvcjogRXhwcmVzc2lvbiB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEZvcm1hdHRlZFR5cGU7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0QXJnID0gYXJnc1sxXTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpcnN0QXJnKSAmJiB0eXBlb2YgZmlyc3RBcmcgPT09ICdvYmplY3QnKSAge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gaW1hZ2Ugb3IgdGV4dCBzZWN0aW9uLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICBsZXQgbmV4dFRva2VuTWF5QmVPYmplY3QgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYXJncy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZyA9IChhcmdzW2ldOiBhbnkpO1xuXG4gICAgICAgICAgICBpZiAobmV4dFRva2VuTWF5QmVPYmplY3QgJiYgdHlwZW9mIGFyZyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgICAgICAgbmV4dFRva2VuTWF5QmVPYmplY3QgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGxldCBzY2FsZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1snZm9udC1zY2FsZSddKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gY29udGV4dC5wYXJzZShhcmdbJ2ZvbnQtc2NhbGUnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2NhbGUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBmb250ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXJnWyd0ZXh0LWZvbnQnXSkge1xuICAgICAgICAgICAgICAgICAgICBmb250ID0gY29udGV4dC5wYXJzZShhcmdbJ3RleHQtZm9udCddLCAxLCBhcnJheShTdHJpbmdUeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm9udCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHRleHRDb2xvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1sndGV4dC1jb2xvciddKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvciA9IGNvbnRleHQucGFyc2UoYXJnWyd0ZXh0LWNvbG9yJ10sIDEsIENvbG9yVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGV4dENvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RXhwcmVzc2lvbiA9IHNlY3Rpb25zW3NlY3Rpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGxhc3RFeHByZXNzaW9uLnNjYWxlID0gc2NhbGU7XG4gICAgICAgICAgICAgICAgbGFzdEV4cHJlc3Npb24uZm9udCA9IGZvbnQ7XG4gICAgICAgICAgICAgICAgbGFzdEV4cHJlc3Npb24udGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBraW5kID0gY29udGVudC50eXBlLmtpbmQ7XG4gICAgICAgICAgICAgICAgaWYgKGtpbmQgIT09ICdzdHJpbmcnICYmIGtpbmQgIT09ICd2YWx1ZScgJiYga2luZCAhPT0gJ251bGwnICYmIGtpbmQgIT09ICdyZXNvbHZlZEltYWdlJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEZvcm1hdHRlZCB0ZXh0IHR5cGUgbXVzdCBiZSAnc3RyaW5nJywgJ3ZhbHVlJywgJ2ltYWdlJyBvciAnbnVsbCcuYCk7XG5cbiAgICAgICAgICAgICAgICBuZXh0VG9rZW5NYXlCZU9iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7Y29udGVudCwgc2NhbGU6IG51bGwsIGZvbnQ6IG51bGwsIHRleHRDb2xvcjogbnVsbH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeHByZXNzaW9uKHNlY3Rpb25zKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlU2VjdGlvbiA9IHNlY3Rpb24gPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkQ29udGVudCA9IHNlY3Rpb24uY29udGVudC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgaWYgKHR5cGVPZihldmFsdWF0ZWRDb250ZW50KSA9PT0gUmVzb2x2ZWRJbWFnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZFNlY3Rpb24oJycsIGV2YWx1YXRlZENvbnRlbnQsIG51bGwsIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZFNlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKGV2YWx1YXRlZENvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLnNjYWxlID8gc2VjdGlvbi5zY2FsZS5ldmFsdWF0ZShjdHgpIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5mb250ID8gc2VjdGlvbi5mb250LmV2YWx1YXRlKGN0eCkuam9pbignLCcpIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi50ZXh0Q29sb3IgPyBzZWN0aW9uLnRleHRDb2xvci5ldmFsdWF0ZShjdHgpIDogbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlZCh0aGlzLnNlY3Rpb25zLm1hcChldmFsdWF0ZVNlY3Rpb24pKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBmbihzZWN0aW9uLmNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBmbihzZWN0aW9uLnNjYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnQpIHtcbiAgICAgICAgICAgICAgICBmbihzZWN0aW9uLmZvbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi50ZXh0Q29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhlIGNvbWJpbmF0b3JpYyBzZXQgb2YgYWxsIGNoaWxkcmVuXG4gICAgICAgIC8vIFVzdWFsbHksIHRoaXMudGV4dCB3aWxsIGJlIHVuZGVmaW5lZCBhbnl3YXlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImZvcm1hdFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZWN0aW9uLmNvbnRlbnQuc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWydmb250LXNjYWxlJ10gPSBzZWN0aW9uLnNjYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24uZm9udCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbJ3RleHQtZm9udCddID0gc2VjdGlvbi5mb250LnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1sndGV4dC1jb2xvciddID0gc2VjdGlvbi50ZXh0Q29sb3Iuc2VyaWFsaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2gob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtSZXNvbHZlZEltYWdlVHlwZSwgU3RyaW5nVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBSZXNvbHZlZEltYWdlVHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE5vIGltYWdlIG5hbWUgcHJvdmlkZWQuYCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUV4cHJlc3Npb24obmFtZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRJbWFnZU5hbWUgPSB0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBSZXNvbHZlZEltYWdlLmZyb21TdHJpbmcoZXZhbHVhdGVkSW1hZ2VOYW1lKTtcbiAgICAgICAgaWYgKHZhbHVlICYmIGN0eC5hdmFpbGFibGVJbWFnZXMpIHZhbHVlLmF2YWlsYWJsZSA9IGN0eC5hdmFpbGFibGVJbWFnZXMuaW5kZXhPZihldmFsdWF0ZWRJbWFnZU5hbWUpID4gLTE7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgLy8gVGhlIG91dHB1dCBvZiBpbWFnZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbWFnZXMgaW4gdGhlIGV2YWx1YXRpb24gY29udGV4dFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1wiaW1hZ2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBDb2xvclR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIFZhbHVlVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtDb2xvciwgdG9TdHJpbmcgYXMgdmFsdWVUb1N0cmluZywgdmFsaWRhdGVSR0JBfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vdHlwZXMvZm9ybWF0dGVkJztcbmltcG9ydCBGb3JtYXRFeHByZXNzaW9uIGZyb20gJy4uL2RlZmluaXRpb25zL2Zvcm1hdCc7XG5pbXBvcnQgSW1hZ2VFeHByZXNzaW9uIGZyb20gJy4uL2RlZmluaXRpb25zL2ltYWdlJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCB0eXBlcyA9IHtcbiAgICAndG8tYm9vbGVhbic6IEJvb2xlYW5UeXBlLFxuICAgICd0by1jb2xvcic6IENvbG9yVHlwZSxcbiAgICAndG8tbnVtYmVyJzogTnVtYmVyVHlwZSxcbiAgICAndG8tc3RyaW5nJzogU3RyaW5nVHlwZVxufTtcblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGVycm9yLWNvYWxlc2NpbmcgY29lcmNpb24gZXhwcmVzc2lvbnMgXCJ0by1udW1iZXJcIixcbiAqIFwidG8tY29sb3JcIi4gIFNpbmNlIHRoZXNlIGNvZXJjaW9ucyBjYW4gZmFpbCBhdCBydW50aW1lLCB0aGV5IGFjY2VwdCBtdWx0aXBsZVxuICogYXJndW1lbnRzLCBvbmx5IGV2YWx1YXRpbmcgb25lIGF0IGEgdGltZSB1bnRpbCBvbmUgc3VjY2VlZHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29lcmNpb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYXJnczogQXJyYXk8RXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGFzc2VydCh0eXBlc1tuYW1lXSwgbmFtZSk7XG5cbiAgICAgICAgaWYgKChuYW1lID09PSAndG8tYm9vbGVhbicgfHwgbmFtZSA9PT0gJ3RvLXN0cmluZycpICYmIGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbbmFtZV07XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29lcmNpb24odHlwZSwgcGFyc2VkKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGxldCBpbnB1dDtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGN0eC5wYXJzZUNvbG9yKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmxlbmd0aCA8IDMgfHwgaW5wdXQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBgSW52YWxpZCByYmdhIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoaW5wdXQpfTogZXhwZWN0ZWQgYW4gYXJyYXkgY29udGFpbmluZyBlaXRoZXIgdGhyZWUgb3IgZm91ciBudW1lcmljIHZhbHVlcy5gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSB2YWxpZGF0ZVJHQkEoaW5wdXRbMF0sIGlucHV0WzFdLCBpbnB1dFsyXSwgaW5wdXRbM10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3IoKGlucHV0WzBdOiBhbnkpIC8gMjU1LCAoaW5wdXRbMV06IGFueSkgLyAyNTUsIChpbnB1dFsyXTogYW55KSAvIDI1NSwgKGlucHV0WzNdOiBhbnkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IgfHwgYENvdWxkIG5vdCBwYXJzZSBjb2xvciBmcm9tIHZhbHVlICcke3R5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IFN0cmluZyhKU09OLnN0cmluZ2lmeShpbnB1dCkpfSdgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYENvdWxkIG5vdCBjb252ZXJ0ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSB0byBudW1iZXIuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBleHBsaWNpdCAndG8tZm9ybWF0dGVkJyBidXQgdGhpcyBjb2VyY2lvbiBjYW4gYmUgaW1wbGljaXRseVxuICAgICAgICAgICAgLy8gY3JlYXRlZCBieSBwcm9wZXJ0aWVzIHRoYXQgZXhwZWN0IHRoZSAnZm9ybWF0dGVkJyB0eXBlLlxuICAgICAgICAgICAgcmV0dXJuIEZvcm1hdHRlZC5mcm9tU3RyaW5nKHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKHZhbHVlVG9TdHJpbmcodGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVRvU3RyaW5nKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoYXJnID0+IGFyZy5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAnZm9ybWF0dGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeHByZXNzaW9uKFt7Y29udGVudDogdGhpcy5hcmdzWzBdLCBzY2FsZTogbnVsbCwgZm9udDogbnVsbCwgdGV4dENvbG9yOiBudWxsfV0pLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAncmVzb2x2ZWRJbWFnZScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VFeHByZXNzaW9uKHRoaXMuYXJnc1swXSkuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW2B0by0ke3RoaXMudHlwZS5raW5kfWBdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvZXJjaW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi92YWx1ZXMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkJztcbmltcG9ydCB0eXBlIHtHbG9iYWxQcm9wZXJ0aWVzLCBGZWF0dXJlLCBGZWF0dXJlU3RhdGV9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQnO1xuXG5jb25zdCBnZW9tZXRyeVR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5jbGFzcyBFdmFsdWF0aW9uQ29udGV4dCB7XG4gICAgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcztcbiAgICBmZWF0dXJlOiA/RmVhdHVyZTtcbiAgICBmZWF0dXJlU3RhdGU6ID9GZWF0dXJlU3RhdGU7XG4gICAgZm9ybWF0dGVkU2VjdGlvbjogP0Zvcm1hdHRlZFNlY3Rpb247XG4gICAgYXZhaWxhYmxlSW1hZ2VzOiA/QXJyYXk8c3RyaW5nPjtcbiAgICBjYW5vbmljYWw6ID9DYW5vbmljYWxUaWxlSUQ7XG5cbiAgICBfcGFyc2VDb2xvckNhY2hlOiB7W186IHN0cmluZ106ID9Db2xvcn07XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxzID0gKG51bGw6IGFueSk7XG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmVhdHVyZVN0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3JtYXR0ZWRTZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcGFyc2VDb2xvckNhY2hlID0ge307XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlSW1hZ2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBudWxsO1xuICAgIH1cblxuICAgIGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmICdpZCcgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmlkIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZW9tZXRyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgPyB0eXBlb2YgdGhpcy5mZWF0dXJlLnR5cGUgPT09ICdudW1iZXInID8gZ2VvbWV0cnlUeXBlc1t0aGlzLmZlYXR1cmUudHlwZV0gOiB0aGlzLmZlYXR1cmUudHlwZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2VvbWV0cnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgJ2dlb21ldHJ5JyBpbiB0aGlzLmZlYXR1cmUgPyB0aGlzLmZlYXR1cmUuZ2VvbWV0cnkgOiBudWxsO1xuICAgIH1cblxuICAgIGNhbm9uaWNhbElEKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWw7XG4gICAgfVxuXG4gICAgcHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiB0aGlzLmZlYXR1cmUucHJvcGVydGllcyB8fCB7fTtcbiAgICB9XG5cbiAgICBwYXJzZUNvbG9yKGlucHV0OiBzdHJpbmcpOiA/Q29sb3Ige1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fcGFyc2VDb2xvckNhY2hlW2lucHV0XTtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICAgIGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF0gPSBDb2xvci5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2YWx1YXRpb25Db250ZXh0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt0b1N0cmluZ30gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgRXhwcmVzc2lvblJlZ2lzdHJ5fSBmcm9tICcuL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSBmcm9tICcuL3ZhbHVlcyc7XG5cbmV4cG9ydCB0eXBlIFZhcmFyZ3MgPSB7fCB0eXBlOiBUeXBlIHx9O1xudHlwZSBTaWduYXR1cmUgPSBBcnJheTxUeXBlPiB8IFZhcmFyZ3M7XG50eXBlIEV2YWx1YXRlID0gKEV2YWx1YXRpb25Db250ZXh0LCBBcnJheTxFeHByZXNzaW9uPikgPT4gVmFsdWU7XG50eXBlIERlZmluaXRpb24gPSBbVHlwZSwgU2lnbmF0dXJlLCBFdmFsdWF0ZV0gfFxuICAgIHt8dHlwZTogVHlwZSwgb3ZlcmxvYWRzOiBBcnJheTxbU2lnbmF0dXJlLCBFdmFsdWF0ZV0+fH07XG5cbmNsYXNzIENvbXBvdW5kRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBUeXBlO1xuICAgIF9ldmFsdWF0ZTogRXZhbHVhdGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBzdGF0aWMgZGVmaW5pdGlvbnM6IHtbXzogc3RyaW5nXTogRGVmaW5pdGlvbiB9O1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlOiBUeXBlLCBldmFsdWF0ZTogRXZhbHVhdGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRlID0gZXZhbHVhdGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGUoY3R4LCB0aGlzLmFyZ3MpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLm5hbWVdLmNvbmNhdCh0aGlzLmFyZ3MubWFwKGFyZyA9PiBhcmcuc2VyaWFsaXplKCkpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgY29uc3Qgb3A6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zW29wXTtcbiAgICAgICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biBleHByZXNzaW9uIFwiJHtvcH1cIi4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS5gLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdyBjaGVjayBhcmd1bWVudCB0eXBlcyBhZ2FpbnN0IGVhY2ggc2lnbmF0dXJlXG4gICAgICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KGRlZmluaXRpb24pID9cbiAgICAgICAgICAgIGRlZmluaXRpb25bMF0gOiBkZWZpbml0aW9uLnR5cGU7XG5cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlT3ZlcmxvYWRzID0gQXJyYXkuaXNBcnJheShkZWZpbml0aW9uKSA/XG4gICAgICAgICAgICBbW2RlZmluaXRpb25bMV0sIGRlZmluaXRpb25bMl1dXSA6XG4gICAgICAgICAgICBkZWZpbml0aW9uLm92ZXJsb2FkcztcblxuICAgICAgICBjb25zdCBvdmVybG9hZHMgPSBhdmFpbGFibGVPdmVybG9hZHMuZmlsdGVyKChbc2lnbmF0dXJlXSkgPT4gKFxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSB8fCAvLyB2YXJhZ3NcbiAgICAgICAgICAgIHNpZ25hdHVyZS5sZW5ndGggPT09IGFyZ3MubGVuZ3RoIC0gMSAvLyBjb3JyZWN0IHBhcmFtIGNvdW50XG4gICAgICAgICkpO1xuXG4gICAgICAgIGxldCBzaWduYXR1cmVDb250ZXh0OiBQYXJzaW5nQ29udGV4dCA9IChudWxsOiBhbnkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhcmFtcywgZXZhbHVhdGVdIG9mIG92ZXJsb2Fkcykge1xuICAgICAgICAgICAgLy8gVXNlIGEgZnJlc2ggY29udGV4dCBmb3IgZWFjaCBhdHRlbXB0ZWQgc2lnbmF0dXJlIHNvIHRoYXQsIGlmXG4gICAgICAgICAgICAvLyB3ZSBldmVudHVhbGx5IHN1Y2NlZWQsIHdlIGhhdmVuJ3QgcG9sbHV0ZWQgYGNvbnRleHQuZXJyb3JzYC5cbiAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQgPSBuZXcgUGFyc2luZ0NvbnRleHQoY29udGV4dC5yZWdpc3RyeSwgY29udGV4dC5wYXRoLCBudWxsLCBjb250ZXh0LnNjb3BlKTtcblxuICAgICAgICAgICAgLy8gRmlyc3QgcGFyc2UgYWxsIHRoZSBhcmdzLCBwb3RlbnRpYWxseSBjb2VyY2luZyB0byB0aGVcbiAgICAgICAgICAgIC8vIHR5cGVzIGV4cGVjdGVkIGJ5IHRoaXMgb3ZlcmxvYWQuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzOiBBcnJheTxFeHByZXNzaW9uPiA9IFtdO1xuICAgICAgICAgICAgbGV0IGFyZ1BhcnNlRmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpIC0gMV0gOlxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudHlwZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHNpZ25hdHVyZUNvbnRleHQucGFyc2UoYXJnLCAxICsgcGFyc2VkQXJncy5sZW5ndGgsIGV4cGVjdGVkVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnUGFyc2VGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyc2VkQXJncy5wdXNoKHBhcnNlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJnUGFyc2VGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBDb3VsZG4ndCBjb2VyY2UgYXJncyBvZiB0aGlzIG92ZXJsb2FkIHRvIGV4cGVjdGVkIHR5cGUsIG1vdmVcbiAgICAgICAgICAgICAgICAvLyBvbiB0byBuZXh0IG9uZS5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSBwYXJzZWRBcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVDb250ZXh0LmVycm9yKGBFeHBlY3RlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50cywgYnV0IGZvdW5kICR7cGFyc2VkQXJncy5sZW5ndGh9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZWRBcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBwYXJhbXNbaV0gOiBwYXJhbXMudHlwZTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBwYXJzZWRBcmdzW2ldO1xuICAgICAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQuY29uY2F0KGkgKyAxKS5jaGVja1N1YnR5cGUoZXhwZWN0ZWQsIGFyZy50eXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNpZ25hdHVyZUNvbnRleHQuZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRFeHByZXNzaW9uKG9wLCB0eXBlLCBldmFsdWF0ZSwgcGFyc2VkQXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoIXNpZ25hdHVyZUNvbnRleHQgfHwgc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgaWYgKG92ZXJsb2Fkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goLi4uc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBvdmVybG9hZHMubGVuZ3RoID8gb3ZlcmxvYWRzIDogYXZhaWxhYmxlT3ZlcmxvYWRzO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGV4cGVjdGVkXG4gICAgICAgICAgICAgICAgLm1hcCgoW3BhcmFtc10pID0+IHN0cmluZ2lmeVNpZ25hdHVyZShwYXJhbXMpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgfCAnKTtcblxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVHlwZXMgPSBbXTtcbiAgICAgICAgICAgIC8vIEZvciBlcnJvciBtZXNzYWdlLCByZS1wYXJzZSBhcmd1bWVudHMgd2l0aG91dCB0cnlpbmcgdG9cbiAgICAgICAgICAgIC8vIGFwcGx5IGFueSBjb2VyY2lvbnNcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgMSArIGFjdHVhbFR5cGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVzLnB1c2godG9TdHJpbmcocGFyc2VkLnR5cGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50cyBvZiB0eXBlICR7c2lnbmF0dXJlc30sIGJ1dCBmb3VuZCAoJHthY3R1YWxUeXBlcy5qb2luKCcsICcpfSkgaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyByZWdpc3RlcihcbiAgICAgICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeSxcbiAgICAgICAgZGVmaW5pdGlvbnM6IHtbXzogc3RyaW5nXTogRGVmaW5pdGlvbiB9XG4gICAgKSB7XG4gICAgICAgIGFzc2VydCghQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zKTtcbiAgICAgICAgQ29tcG91bmRFeHByZXNzaW9uLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBkZWZpbml0aW9ucykge1xuICAgICAgICAgICAgcmVnaXN0cnlbbmFtZV0gPSBDb21wb3VuZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVNpZ25hdHVyZShzaWduYXR1cmU6IFNpZ25hdHVyZSk6IHN0cmluZyB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2lnbmF0dXJlKSkge1xuICAgICAgICByZXR1cm4gYCgke3NpZ25hdHVyZS5tYXAodG9TdHJpbmcpLmpvaW4oJywgJyl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAoJHt0b1N0cmluZyhzaWduYXR1cmUudHlwZSl9Li4uKWA7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21wb3VuZEV4cHJlc3Npb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1N0cmluZ1R5cGUsIEJvb2xlYW5UeXBlLCBDb2xsYXRvclR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBDb2xsYXRvciBmcm9tICcuLi90eXBlcy9jb2xsYXRvcic7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3JFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBjYXNlU2Vuc2l0aXZlOiBFeHByZXNzaW9uO1xuICAgIGRpYWNyaXRpY1NlbnNpdGl2ZTogRXhwcmVzc2lvbjtcbiAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogRXhwcmVzc2lvbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBFeHByZXNzaW9uLCBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENvbGxhdG9yVHlwZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG4gICAgICAgIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlID0gZGlhY3JpdGljU2Vuc2l0aXZlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1sxXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gY29udGV4dC5wYXJzZShcbiAgICAgICAgICAgIG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSwgMSwgQm9vbGVhblR5cGUpO1xuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRpYWNyaXRpY1NlbnNpdGl2ZSA9IGNvbnRleHQucGFyc2UoXG4gICAgICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddLCAxLCBCb29sZWFuVHlwZSk7XG4gICAgICAgIGlmICghZGlhY3JpdGljU2Vuc2l0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2xvY2FsZSddKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2xvY2FsZSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3JFeHByZXNzaW9uKGNhc2VTZW5zaXRpdmUsIGRpYWNyaXRpY1NlbnNpdGl2ZSwgbG9jYWxlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3IodGhpcy5jYXNlU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlLmV2YWx1YXRlKGN0eCksIHRoaXMubG9jYWxlID8gdGhpcy5sb2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5jYXNlU2Vuc2l0aXZlKTtcbiAgICAgICAgZm4odGhpcy5kaWFjcml0aWNTZW5zaXRpdmUpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIC8vIFRlY2huaWNhbGx5IHRoZSBzZXQgb2YgcG9zc2libGUgb3V0cHV0cyBpcyB0aGUgY29tYmluYXRvcmljIHNldCBvZiBDb2xsYXRvcnMgcHJvZHVjZWRcbiAgICAgICAgLy8gYnkgYWxsIHBvc3NpYmxlIG91dHB1dHMgb2YgbG9jYWxlL2Nhc2VTZW5zaXRpdmUvZGlhY3JpdGljU2Vuc2l0aXZlXG4gICAgICAgIC8vIEJ1dCBmb3IgdGhlIHByaW1hcnkgdXNlIG9mIENvbGxhdG9ycyBpbiBjb21wYXJpc29uIG9wZXJhdG9ycywgd2UgaWdub3JlIHRoZSBDb2xsYXRvcidzXG4gICAgICAgIC8vIHBvc3NpYmxlIG91dHB1dHMgYW55d2F5LCBzbyB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBsZWF2aW5nIHRoaXMgZmFsc2UgZm9yIG5vdy5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICBvcHRpb25zWydjYXNlLXNlbnNpdGl2ZSddID0gdGhpcy5jYXNlU2Vuc2l0aXZlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPSB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBvcHRpb25zWydsb2NhbGUnXSA9IHRoaXMubG9jYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJjb2xsYXRvclwiLCBvcHRpb25zXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2lzVmFsdWV9IGZyb20gJy4uL3ZhbHVlcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtCb29sZWFuVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTiwgR2VvSlNPTlBvbHlnb24sIEdlb0pTT05NdWx0aVBvbHlnb259IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5cbnR5cGUgR2VvSlNPTlBvbHlnb25zID18IEdlb0pTT05Qb2x5Z29uIHwgR2VvSlNPTk11bHRpUG9seWdvbjtcblxuLy8gbWluWCwgbWluWSwgbWF4WCwgbWF4WVxudHlwZSBCQm94ID0gW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5jb25zdCBFWFRFTlQgPSA4MTkyO1xuXG5mdW5jdGlvbiB1cGRhdGVCQm94KGJib3g6IEJCb3gsIGNvb3JkOiBQb2ludCkge1xuICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBjb29yZFswXSk7XG4gICAgYmJveFsxXSA9IE1hdGgubWluKGJib3hbMV0sIGNvb3JkWzFdKTtcbiAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgY29vcmRbMF0pO1xuICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCBjb29yZFsxXSk7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWGZyb21MbmcobG5nOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCArIGxuZykgLyAzNjA7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWWZyb21MYXQobGF0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCAtICgxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBsYXQgKiBNYXRoLlBJIC8gMzYwKSkpKSAvIDM2MDtcbn1cblxuZnVuY3Rpb24gYm94V2l0aGluQm94KGJib3gxOiBCQm94LCBiYm94MjogQkJveCkge1xuICAgIGlmIChiYm94MVswXSA8PSBiYm94MlswXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsyXSA+PSBiYm94MlsyXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsxXSA8PSBiYm94MlsxXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVszXSA+PSBiYm94MlszXSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRUaWxlQ29vcmRpbmF0ZXMocCwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCB4ID0gbWVyY2F0b3JYZnJvbUxuZyhwWzBdKTtcbiAgICBjb25zdCB5ID0gbWVyY2F0b3JZZnJvbUxhdChwWzFdKTtcbiAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcbiAgICByZXR1cm4gW01hdGgucm91bmQoeCAqIHRpbGVzQXRab29tICogRVhURU5UKSwgTWF0aC5yb3VuZCh5ICogdGlsZXNBdFpvb20gKiBFWFRFTlQpXTtcbn1cblxuZnVuY3Rpb24gb25Cb3VuZGFyeShwLCBwMSwgcDIpIHtcbiAgICBjb25zdCB4MSA9IHBbMF0gLSBwMVswXTtcbiAgICBjb25zdCB5MSA9IHBbMV0gLSBwMVsxXTtcbiAgICBjb25zdCB4MiA9IHBbMF0gLSBwMlswXTtcbiAgICBjb25zdCB5MiA9IHBbMV0gLSBwMlsxXTtcbiAgICByZXR1cm4gKHgxICogeTIgLSB4MiAqIHkxID09PSAwKSAmJiAoeDEgKiB4MiA8PSAwKSAmJiAoeTEgKiB5MiA8PSAwKTtcbn1cblxuZnVuY3Rpb24gcmF5SW50ZXJzZWN0KHAsIHAxLCBwMikge1xuICAgIHJldHVybiAoKHAxWzFdID4gcFsxXSkgIT09IChwMlsxXSA+IHBbMV0pKSAmJiAocFswXSA8IChwMlswXSAtIHAxWzBdKSAqIChwWzFdIC0gcDFbMV0pIC8gKHAyWzFdIC0gcDFbMV0pICsgcDFbMF0pO1xufVxuXG4vLyByYXkgY2FzdGluZyBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBpZiBwb2ludCBpcyBpbiBwb2x5Z29uXG5mdW5jdGlvbiBwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHJpbmdzKSB7XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcmluZ3NbaV07XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW4yID0gcmluZy5sZW5ndGg7IGogPCBsZW4yIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBpZiAob25Cb3VuZGFyeShwb2ludCwgcmluZ1tqXSwgcmluZ1tqICsgMV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAocmF5SW50ZXJzZWN0KHBvaW50LCByaW5nW2pdLCByaW5nW2ogKyAxXSkpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuZnVuY3Rpb24gcG9pbnRXaXRoaW5Qb2x5Z29ucyhwb2ludCwgcG9seWdvbnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGVycCh2MSwgdjIpIHtcbiAgICByZXR1cm4gKHYxWzBdICogdjJbMV0gLSB2MVsxXSAqIHYyWzBdKTtcbn1cblxuLy8gY2hlY2sgaWYgcDEgYW5kIHAyIGFyZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2YgbGluZSBzZWdtZW50IHExLT5xMlxuZnVuY3Rpb24gIHR3b1NpZGVkKHAxLCBwMiwgcTEsIHEyKSB7XG4gICAgLy8gcTEtPnAxICh4MSwgeTEpLCBxMS0+cDIgKHgyLCB5MiksIHExLT5xMiAoeDMsIHkzKVxuICAgIGNvbnN0IHgxID0gcDFbMF0gLSBxMVswXTtcbiAgICBjb25zdCB5MSA9IHAxWzFdIC0gcTFbMV07XG4gICAgY29uc3QgeDIgPSBwMlswXSAtIHExWzBdO1xuICAgIGNvbnN0IHkyID0gcDJbMV0gLSBxMVsxXTtcbiAgICBjb25zdCB4MyA9IHEyWzBdIC0gcTFbMF07XG4gICAgY29uc3QgeTMgPSBxMlsxXSAtIHExWzFdO1xuICAgIGNvbnN0IGRldDEgPSAoeDEgKiB5MyAtIHgzICogeTEpO1xuICAgIGNvbnN0IGRldDIgPSAgKHgyICogeTMgLSB4MyAqIHkyKTtcbiAgICBpZiAoKGRldDEgPiAwICYmIGRldDIgPCAwKSB8fCAoZGV0MSA8IDAgJiYgZGV0MiA+IDApKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBhLCBiIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQxLCBjIGFuZCBkIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQyXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0TGluZShhLCBiLCBjLCBkKSB7XG4gICAgLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGFyZSBwYXJhbGxlbCBvciBub3RcbiAgICAvLyBwcmVjb25kaXRpb24gaXMgZW5kIHBvaW50IGEsIGIgaXMgaW5zaWRlIHBvbHlnb24sIGlmIGxpbmUgYS0+YiBpc1xuICAgIC8vIHBhcmFsbGVsIHRvIHBvbHlnb24gZWRnZSBjLT5kLCB0aGVuIGEtPmIgd29uJ3QgaW50ZXJzZWN0IHdpdGggYy0+ZFxuICAgIGNvbnN0IHZlY3RvclAgPSBbYlswXSAtIGFbMF0sIGJbMV0gLSBhWzFdXTtcbiAgICBjb25zdCB2ZWN0b3JRID0gW2RbMF0gLSBjWzBdLCBkWzFdIC0gY1sxXV07XG4gICAgaWYgKHBlcnAodmVjdG9yUSwgdmVjdG9yUCkgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIElmIGxpbmVzIGFyZSBpbnRlcnNlY3Rpbmcgd2l0aCBlYWNoIG90aGVyLCB0aGUgcmVsYXRpdmUgbG9jYXRpb24gc2hvdWxkIGJlOlxuICAgIC8vIGEgYW5kIGIgbGllIGluIGRpZmZlcmVudCBzaWRlcyBvZiBzZWdtZW50IGMtPmRcbiAgICAvLyBjIGFuZCBkIGxpZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2Ygc2VnbWVudCBhLT5iXG4gICAgaWYgKHR3b1NpZGVkKGEsIGIsIGMsIGQpICYmIHR3b1NpZGVkKGMsIGQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RQb2x5Z29uKHAxLCBwMiwgcG9seWdvbikge1xuICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBldmVyeSBlZGdlIG9mIHRoZSByaW5nXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmluZy5sZW5ndGggLSAxOyArK2opIHtcbiAgICAgICAgICAgIGlmIChsaW5lSW50ZXJzZWN0TGluZShwMSwgcDIsIHJpbmdbal0sIHJpbmdbaiArIDFdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZVN0cmluZ1dpdGhpblBvbHlnb24obGluZSwgcG9seWdvbikge1xuICAgIC8vIEZpcnN0LCBjaGVjayBpZiBnZW9tZXRyeSBwb2ludHMgb2YgbGluZSBzZWdtZW50cyBhcmUgYWxsIGluc2lkZSBwb2x5Z29uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICghcG9pbnRXaXRoaW5Qb2x5Z29uKGxpbmVbaV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIGNoZWNrIGlmIHRoZXJlIGlzIGxpbmUgc2VnbWVudCBpbnRlcnNlY3RpbmcgcG9seWdvbiBlZGdlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpZiAobGluZUludGVyc2VjdFBvbHlnb24obGluZVtpXSwgbGluZVtpICsgMV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29ucyhsaW5lLCBwb2x5Z29ucykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvbHlnb24oY29vcmRpbmF0ZXMsIGJib3gsIGNhbm9uaWNhbCkge1xuICAgIGNvbnN0IHBvbHlnb24gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb29yZGluYXRlc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY29vcmQgPSBnZXRUaWxlQ29vcmRpbmF0ZXMoY29vcmRpbmF0ZXNbaV1bal0sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICB1cGRhdGVCQm94KGJib3gsIGNvb3JkKTtcbiAgICAgICAgICAgIHJpbmcucHVzaChjb29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgcG9seWdvbi5wdXNoKHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gcG9seWdvbjtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvbHlnb25zKGNvb3JkaW5hdGVzLCBiYm94LCBjYW5vbmljYWwpIHtcbiAgICBjb25zdCBwb2x5Z29ucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IGdldFRpbGVQb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBiYm94LCBjYW5vbmljYWwpO1xuICAgICAgICBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgIH1cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvaW50KHAsIGJib3gsIHBvbHlCQm94LCB3b3JsZFNpemUpIHtcbiAgICBpZiAocFswXSA8IHBvbHlCQm94WzBdIHx8IHBbMF0gPiBwb2x5QkJveFsyXSkge1xuICAgICAgICBjb25zdCBoYWxmV29ybGRTaXplID0gd29ybGRTaXplICogMC41O1xuICAgICAgICBsZXQgc2hpZnQgPSAocFswXSAtIHBvbHlCQm94WzBdID4gaGFsZldvcmxkU2l6ZSkgPyAtd29ybGRTaXplIDogKHBvbHlCQm94WzBdIC0gcFswXSA+IGhhbGZXb3JsZFNpemUpID8gd29ybGRTaXplIDogMDtcbiAgICAgICAgaWYgKHNoaWZ0ID09PSAwKSB7XG4gICAgICAgICAgICBzaGlmdCA9IChwWzBdIC0gcG9seUJCb3hbMl0gPiBoYWxmV29ybGRTaXplKSA/IC13b3JsZFNpemUgOiAocG9seUJCb3hbMl0gLSBwWzBdID4gaGFsZldvcmxkU2l6ZSkgPyB3b3JsZFNpemUgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHBbMF0gKz0gc2hpZnQ7XG4gICAgfVxuICAgIHVwZGF0ZUJCb3goYmJveCwgcCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0QkJveChiYm94KSB7XG4gICAgYmJveFswXSA9IGJib3hbMV0gPSBJbmZpbml0eTtcbiAgICBiYm94WzJdID0gYmJveFszXSA9IC1JbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvaW50cyhnZW9tZXRyeSwgcG9pbnRCQm94LCBwb2x5QkJveCwgY2Fub25pY2FsKSB7XG4gICAgY29uc3Qgd29ybGRTaXplID0gTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogRVhURU5UO1xuICAgIGNvbnN0IHNoaWZ0cyA9IFtjYW5vbmljYWwueCAqIEVYVEVOVCwgY2Fub25pY2FsLnkgKiBFWFRFTlRdO1xuICAgIGNvbnN0IHRpbGVQb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBvaW50cyBvZiBnZW9tZXRyeSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtwb2ludC54ICsgc2hpZnRzWzBdLCBwb2ludC55ICsgc2hpZnRzWzFdXTtcbiAgICAgICAgICAgIHVwZGF0ZVBvaW50KHAsIHBvaW50QkJveCwgcG9seUJCb3gsIHdvcmxkU2l6ZSk7XG4gICAgICAgICAgICB0aWxlUG9pbnRzLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpbGVQb2ludHM7XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVMaW5lcyhnZW9tZXRyeSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpIHtcbiAgICBjb25zdCB3b3JsZFNpemUgPSBNYXRoLnBvdygyLCBjYW5vbmljYWwueikgKiBFWFRFTlQ7XG4gICAgY29uc3Qgc2hpZnRzID0gW2Nhbm9uaWNhbC54ICogRVhURU5ULCBjYW5vbmljYWwueSAqIEVYVEVOVF07XG4gICAgY29uc3QgdGlsZUxpbmVzID0gW107XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHRpbGVMaW5lID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgbGluZSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtwb2ludC54ICsgc2hpZnRzWzBdLCBwb2ludC55ICsgc2hpZnRzWzFdXTtcbiAgICAgICAgICAgIHVwZGF0ZUJCb3gobGluZUJCb3gsIHApO1xuICAgICAgICAgICAgdGlsZUxpbmUucHVzaChwKTtcbiAgICAgICAgfVxuICAgICAgICB0aWxlTGluZXMucHVzaCh0aWxlTGluZSk7XG4gICAgfVxuICAgIGlmIChsaW5lQkJveFsyXSAtIGxpbmVCQm94WzBdIDw9IHdvcmxkU2l6ZSAvIDIpIHtcbiAgICAgICAgcmVzZXRCQm94KGxpbmVCQm94KTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRpbGVMaW5lcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIGxpbmUpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb2ludChwLCBsaW5lQkJveCwgcG9seUJCb3gsIHdvcmxkU2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpbGVMaW5lcztcbn1cblxuZnVuY3Rpb24gcG9pbnRzV2l0aGluUG9seWdvbnMoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgcG9seWdvbkdlb21ldHJ5OiBHZW9KU09OUG9seWdvbnMpIHtcbiAgICBjb25zdCBwb2ludEJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgY29uc3QgcG9seUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG5cbiAgICBjb25zdCBjYW5vbmljYWwgPSBjdHguY2Fub25pY2FsSUQoKTtcblxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29uID0gZ2V0VGlsZVBvbHlnb24ocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbihwb2ludCwgdGlsZVBvbHlnb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb25HZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBjb25zdCB0aWxlUG9seWdvbnMgPSBnZXRUaWxlUG9seWdvbnMocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbnMocG9pbnQsIHRpbGVQb2x5Z29ucykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsaW5lc1dpdGhpblBvbHlnb25zKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIHBvbHlnb25HZW9tZXRyeTogR2VvSlNPTlBvbHlnb25zKSB7XG4gICAgY29uc3QgbGluZUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgY29uc3QgcG9seUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG5cbiAgICBjb25zdCBjYW5vbmljYWwgPSBjdHguY2Fub25pY2FsSUQoKTtcblxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29uID0gZ2V0VGlsZVBvbHlnb24ocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZUxpbmVzID0gZ2V0VGlsZUxpbmVzKGN0eC5nZW9tZXRyeSgpLCBsaW5lQkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KGxpbmVCQm94LCBwb2x5QkJveCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGlsZUxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHRpbGVQb2x5Z29uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgY29uc3QgdGlsZVBvbHlnb25zID0gZ2V0VGlsZVBvbHlnb25zKHBvbHlnb25HZW9tZXRyeS5jb29yZGluYXRlcywgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IHRpbGVMaW5lcyA9IGdldFRpbGVMaW5lcyhjdHguZ2VvbWV0cnkoKSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBpZiAoIWJveFdpdGhpbkJveChsaW5lQkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRpbGVMaW5lcykge1xuICAgICAgICAgICAgaWYgKCFsaW5lU3RyaW5nV2l0aGluUG9seWdvbnMobGluZSwgdGlsZVBvbHlnb25zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5jbGFzcyBXaXRoaW4gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGdlb2pzb246IEdlb0pTT05cbiAgICBnZW9tZXRyaWVzOiBHZW9KU09OUG9seWdvbnM7XG5cbiAgICBjb25zdHJ1Y3RvcihnZW9qc29uOiBHZW9KU09OLCBnZW9tZXRyaWVzOiBHZW9KU09OUG9seWdvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQm9vbGVhblR5cGU7XG4gICAgICAgIHRoaXMuZ2VvanNvbiA9IGdlb2pzb247XG4gICAgICAgIHRoaXMuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd3aXRoaW4nIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgaWYgKGlzVmFsdWUoYXJnc1sxXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdlb2pzb24gPSAoYXJnc1sxXTogT2JqZWN0KTtcbiAgICAgICAgICAgIGlmIChnZW9qc29uLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlb2pzb24uZmVhdHVyZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdlb2pzb24uZmVhdHVyZXNbaV0uZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXRoaW4oZ2VvanNvbiwgZ2VvanNvbi5mZWF0dXJlc1tpXS5nZW9tZXRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdlb2pzb24udHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdlb2pzb24uZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2l0aGluKGdlb2pzb24sIGdlb2pzb24uZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VvanNvbi50eXBlICA9PT0gJ1BvbHlnb24nIHx8IGdlb2pzb24udHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpdGhpbihnZW9qc29uLCBnZW9qc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgJ3dpdGhpbicgZXhwcmVzc2lvbiByZXF1aXJlcyB2YWxpZCBnZW9qc29uIG9iamVjdCB0aGF0IGNvbnRhaW5zIHBvbHlnb24gZ2VvbWV0cnkgdHlwZS5gKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmIChjdHguZ2VvbWV0cnkoKSAhPSBudWxsICYmIGN0eC5jYW5vbmljYWxJRCgpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRzV2l0aGluUG9seWdvbnMoY3R4LCB0aGlzLmdlb21ldHJpZXMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaW5lc1dpdGhpblBvbHlnb25zKGN0eCwgdGhpcy5nZW9tZXRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICByZXR1cm4gW1wid2l0aGluXCIsIHRoaXMuZ2VvanNvbl07XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFdpdGhpbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi9jb21wb3VuZF9leHByZXNzaW9uJztcbmltcG9ydCBXaXRoaW4gZnJvbSAnLi9kZWZpbml0aW9ucy93aXRoaW4nO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5cbmZ1bmN0aW9uIGlzRmVhdHVyZUNvbnN0YW50KGU6IEV4cHJlc3Npb24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbikge1xuICAgICAgICBpZiAoZS5uYW1lID09PSAnZ2V0JyAmJiBlLmFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5uYW1lID09PSAnZmVhdHVyZS1zdGF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChlLm5hbWUgPT09ICdoYXMnICYmIGUuYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ3Byb3BlcnRpZXMnIHx8XG4gICAgICAgICAgICBlLm5hbWUgPT09ICdnZW9tZXRyeS10eXBlJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnaWQnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKC9eZmlsdGVyLS8udGVzdChlLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIFdpdGhpbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNGZWF0dXJlQ29uc3RhbnQoYXJnKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoYXJnID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNTdGF0ZUNvbnN0YW50KGFyZykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoZTogRXhwcmVzc2lvbiwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmIHByb3BlcnRpZXMuaW5kZXhPZihlLm5hbWUpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZS5lYWNoQ2hpbGQoKGFyZykgPT4ge1xuICAgICAgICBpZiAocmVzdWx0ICYmICFpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQoYXJnLCBwcm9wZXJ0aWVzKSkgeyByZXN1bHQgPSBmYWxzZTsgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7aXNGZWF0dXJlQ29uc3RhbnQsIGlzR2xvYmFsUHJvcGVydHlDb25zdGFudCwgaXNTdGF0ZUNvbnN0YW50fTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgIGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5cbmNsYXNzIFZhciBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGJvdW5kRXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgYm91bmRFeHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IGJvdW5kRXhwcmVzc2lvbi50eXBlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmJvdW5kRXhwcmVzc2lvbiA9IGJvdW5kRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIgfHwgdHlwZW9mIGFyZ3NbMV0gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd2YXInIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgc3RyaW5nIGxpdGVyYWwgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbMV07XG4gICAgICAgIGlmICghY29udGV4dC5zY29wZS5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIHZhcmlhYmxlIFwiJHtuYW1lfVwiLiBNYWtlIHN1cmUgXCIke25hbWV9XCIgaGFzIGJlZW4gYm91bmQgaW4gYW4gZW5jbG9zaW5nIFwibGV0XCIgZXhwcmVzc2lvbiBiZWZvcmUgdXNpbmcgaXQuYCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFZhcihuYW1lLCBjb250ZXh0LnNjb3BlLmdldChuYW1lKSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZEV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcInZhclwiLCB0aGlzLm5hbWVdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmFyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFNjb3BlIGZyb20gJy4vc2NvcGUnO1xuaW1wb3J0IHtjaGVja1N1YnR5cGV9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL3BhcnNpbmdfZXJyb3InO1xuaW1wb3J0IExpdGVyYWwgZnJvbSAnLi9kZWZpbml0aW9ucy9saXRlcmFsJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9kZWZpbml0aW9ucy9hc3NlcnRpb24nO1xuaW1wb3J0IENvZXJjaW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvY29lcmNpb24nO1xuaW1wb3J0IEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi9jb21wb3VuZF9leHByZXNzaW9uJztcbmltcG9ydCBDb2xsYXRvckV4cHJlc3Npb24gZnJvbSAnLi9kZWZpbml0aW9ucy9jb2xsYXRvcic7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vZGVmaW5pdGlvbnMvd2l0aGluJztcbmltcG9ydCB7aXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50LCBpc0ZlYXR1cmVDb25zdGFudH0gZnJvbSAnLi9pc19jb25zdGFudCc7XG5pbXBvcnQgVmFyIGZyb20gJy4vZGVmaW5pdGlvbnMvdmFyJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIEV4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBTdGF0ZSBhc3NvY2lhdGVkIHBhcnNpbmcgYXQgYSBnaXZlbiBwb2ludCBpbiBhbiBleHByZXNzaW9uIHRyZWUuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQYXJzaW5nQ29udGV4dCB7XG4gICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeTtcbiAgICBwYXRoOiBBcnJheTxudW1iZXI+O1xuICAgIGtleTogc3RyaW5nO1xuICAgIHNjb3BlOiBTY29wZTtcbiAgICBlcnJvcnM6IEFycmF5PFBhcnNpbmdFcnJvcj47XG5cbiAgICAvLyBUaGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGlzIGV4cHJlc3Npb24uIFByb3ZpZGVkIG9ubHkgdG8gYWxsb3cgRXhwcmVzc2lvblxuICAgIC8vIGltcGxlbWVudGF0aW9ucyB0byBpbmZlciBhcmd1bWVudCB0eXBlczogRXhwcmVzc2lvbiNwYXJzZSgpIG5lZWQgbm90XG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHBhcnNlZCBleHByZXNzaW9uIG1hdGNoZXNcbiAgICAvLyBgZXhwZWN0ZWRUeXBlYC5cbiAgICBleHBlY3RlZFR5cGU6ID9UeXBlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJlZ2lzdHJ5OiBFeHByZXNzaW9uUmVnaXN0cnksXG4gICAgICAgIHBhdGg6IEFycmF5PG51bWJlcj4gPSBbXSxcbiAgICAgICAgZXhwZWN0ZWRUeXBlOiA/VHlwZSxcbiAgICAgICAgc2NvcGU6IFNjb3BlID0gbmV3IFNjb3BlKCksXG4gICAgICAgIGVycm9yczogQXJyYXk8UGFyc2luZ0Vycm9yPiA9IFtdXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5rZXkgPSBwYXRoLm1hcChwYXJ0ID0+IGBbJHtwYXJ0fV1gKS5qb2luKCcnKTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgdGhpcy5leHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGV4cHIgdGhlIEpTT04gZXhwcmVzc2lvbiB0byBwYXJzZVxuICAgICAqIEBwYXJhbSBpbmRleCB0aGUgb3B0aW9uYWwgYXJndW1lbnQgaW5kZXggaWYgdGhpcyBleHByZXNzaW9uIGlzIGFuIGFyZ3VtZW50IG9mIGEgcGFyZW50IGV4cHJlc3Npb24gdGhhdCdzIGJlaW5nIHBhcnNlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMub21pdFR5cGVBbm5vdGF0aW9ucyBzZXQgdHJ1ZSB0byBvbWl0IGluZmVycmVkIHR5cGUgYW5ub3RhdGlvbnMuICBDYWxsZXIgYmV3YXJlOiB3aXRoIHRoaXMgb3B0aW9uIHNldCwgdGhlIHBhcnNlZCBleHByZXNzaW9uJ3MgdHlwZSB3aWxsIE5PVCBzYXRpc2Z5IGBleHBlY3RlZFR5cGVgIGlmIGl0IHdvdWxkIG5vcm1hbGx5IGJlIHdyYXBwZWQgaW4gYW4gaW5mZXJyZWQgYW5ub3RhdGlvbi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBhcnNlKFxuICAgICAgICBleHByOiBtaXhlZCxcbiAgICAgICAgaW5kZXg/OiBudW1iZXIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT86ID9UeXBlLFxuICAgICAgICBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPixcbiAgICAgICAgb3B0aW9uczoge3R5cGVBbm5vdGF0aW9uPzogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0J30gPSB7fVxuICAgICk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25jYXQoaW5kZXgsIGV4cGVjdGVkVHlwZSwgYmluZGluZ3MpLl9wYXJzZShleHByLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2UoZXhwciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgX3BhcnNlKGV4cHI6IG1peGVkLCBvcHRpb25zOiB7dHlwZUFubm90YXRpb24/OiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnfSk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGV4cHIgPT09IG51bGwgfHwgdHlwZW9mIGV4cHIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBleHByID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGV4cHIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBleHByID0gWydsaXRlcmFsJywgZXhwcl07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhbm5vdGF0ZShwYXJzZWQsIHR5cGUsIHR5cGVBbm5vdGF0aW9uOiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZUFubm90YXRpb24gPT09ICdhc3NlcnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odHlwZSwgW3BhcnNlZF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQW5ub3RhdGlvbiA9PT0gJ2NvZXJjZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvZXJjaW9uKHR5cGUsIFtwYXJzZWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFtdXS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3AgPSBleHByWzBdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBFeHByZXNzaW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIG9wfSBpbnN0ZWFkLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBFeHByID0gdGhpcy5yZWdpc3RyeVtvcF07XG4gICAgICAgICAgICBpZiAoRXhwcikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBFeHByLnBhcnNlKGV4cHIsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cGVjdGVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMuZXhwZWN0ZWRUeXBlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWwgPSBwYXJzZWQudHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGV4cGVjdCBhIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBvciBhcnJheSBidXQgaGF2ZSBhIHZhbHVlLCB3cmFwIGl0IGluIGFuIGFzc2VydGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBleHBlY3QgYSBjb2xvciBvciBmb3JtYXR0ZWQgc3RyaW5nLCBidXQgaGF2ZSBhIHN0cmluZyBvciB2YWx1ZSwgd3JhcCBpdCBpbiBhIGNvZXJjaW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvIHN0YXRpYyB0eXBlLWNoZWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBiZWhhdmlvcnMgYXJlIG92ZXJyaWRhYmxlIGZvcjpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFRoZSBcImNvYWxlc2NlXCIgb3BlcmF0b3IsIHdoaWNoIG5lZWRzIHRvIG9taXQgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFN0cmluZy12YWx1ZWQgcHJvcGVydGllcyAoZS5nLiBgdGV4dC1maWVsZGApLCB3aGVyZSBjb2VyY2lvbiBpcyBtb3JlIGNvbnZlbmllbnQgdGhhbiBhc3NlcnRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ3N0cmluZycgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ251bWJlcicgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ2Jvb2xlYW4nIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdvYmplY3QnIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScpICYmIGFjdHVhbC5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdhc3NlcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ2NvbG9yJyB8fCBleHBlY3RlZC5raW5kID09PSAnZm9ybWF0dGVkJyB8fCBleHBlY3RlZC5raW5kID09PSAncmVzb2x2ZWRJbWFnZScpICYmIChhY3R1YWwua2luZCA9PT0gJ3ZhbHVlJyB8fCBhY3R1YWwua2luZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdjb2VyY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYWN0dWFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBleHByZXNzaW9uJ3MgYXJndW1lbnRzIGFyZSBhbGwgbGl0ZXJhbHMsIHdlIGNhbiBldmFsdWF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0IGltbWVkaWF0ZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBsaXRlcmFsIHZhbHVlIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcnNlZC9jb21waWxlZCByZXN1bHQuIEV4cHJlc3Npb25zIHRoYXQgZXhwZWN0IGFuIGltYWdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIG5vdCBiZSByZXNvbHZlZCBoZXJlIHNvIHdlIGNhbiBsYXRlciBnZXQgdGhlIGF2YWlsYWJsZSBpbWFnZXMuXG4gICAgICAgICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGl0ZXJhbCkgJiYgKHBhcnNlZC50eXBlLmtpbmQgIT09ICdyZXNvbHZlZEltYWdlJykgJiYgaXNDb25zdGFudChwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVjID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBuZXcgTGl0ZXJhbChwYXJzZWQudHlwZSwgcGFyc2VkLmV2YWx1YXRlKGVjKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiBcIiR7b3B9XCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgJ3VuZGVmaW5lZCcgdmFsdWUgaW52YWxpZC4gVXNlIG51bGwgaW5zdGVhZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBCYXJlIG9iamVjdHMgaW52YWxpZC4gVXNlIFtcImxpdGVyYWxcIiwgey4uLn1dIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXksIGJ1dCBmb3VuZCAke3R5cGVvZiBleHByfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBjb250ZXh0IHN1aXRhYmxlIGZvciBwYXJzaW5nIHRoZSBzdWJleHByZXNzaW9uIGF0XG4gICAgICogaW5kZXggYGluZGV4YCwgb3B0aW9uYWxseSBhcHBlbmRpbmcgdG8gJ2xldCcgYmluZGluZyBtYXAuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYGVycm9yc2AgcHJvcGVydHksIGludGVuZGVkIGZvciBjb2xsZWN0aW5nIGVycm9ycyB3aGlsZVxuICAgICAqIHBhcnNpbmcsIGlzIGNvcGllZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY2xvbmVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uY2F0KGluZGV4OiBudW1iZXIsIGV4cGVjdGVkVHlwZT86ID9UeXBlLCBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPikge1xuICAgICAgICBjb25zdCBwYXRoID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IHRoaXMucGF0aC5jb25jYXQoaW5kZXgpIDogdGhpcy5wYXRoO1xuICAgICAgICBjb25zdCBzY29wZSA9IGJpbmRpbmdzID8gdGhpcy5zY29wZS5jb25jYXQoYmluZGluZ3MpIDogdGhpcy5zY29wZTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzaW5nQ29udGV4dChcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnksXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlIHx8IG51bGwsXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHVzaCBhIHBhcnNpbmcgKG9yIHR5cGUgY2hlY2tpbmcpIGVycm9yIGludG8gdGhlIGB0aGlzLmVycm9yc2BcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ga2V5cyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IgYXQgYSBjaGlsZFxuICAgICAqIG9mIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gYXQgYHRoaXMua2V5YC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGVycm9yKGVycm9yOiBzdHJpbmcsIC4uLmtleXM6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7dGhpcy5rZXl9JHtrZXlzLm1hcChrID0+IGBbJHtrfV1gKS5qb2luKCcnKX1gO1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBQYXJzaW5nRXJyb3Ioa2V5LCBlcnJvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbnVsbCBpZiBgdGAgaXMgYSBzdWJ0eXBlIG9mIGBleHBlY3RlZGA7IG90aGVyd2lzZSByZXR1cm5zIGFuXG4gICAgICogZXJyb3IgbWVzc2FnZSBhbmQgYWxzbyBwdXNoZXMgaXQgdG8gYHRoaXMuZXJyb3JzYC5cbiAgICAgKi9cbiAgICBjaGVja1N1YnR5cGUoZXhwZWN0ZWQ6IFR5cGUsIHQ6IFR5cGUpOiA/c3RyaW5nIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBjaGVja1N1YnR5cGUoZXhwZWN0ZWQsIHQpO1xuICAgICAgICBpZiAoZXJyb3IpIHRoaXMuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzaW5nQ29udGV4dDtcblxuZnVuY3Rpb24gaXNDb25zdGFudChleHByZXNzaW9uOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBWYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uc3RhbnQoZXhwcmVzc2lvbi5ib3VuZEV4cHJlc3Npb24pO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJiBleHByZXNzaW9uLm5hbWUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbGxhdG9yRXhwcmVzc2lvbikge1xuICAgICAgICAvLyBBbHRob3VnaCB0aGUgcmVzdWx0cyBvZiBhIENvbGxhdG9yIGV4cHJlc3Npb24gd2l0aCBmaXhlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZ2VuZXJhbGx5IHNob3VsZG4ndCBjaGFuZ2UgYmV0d2VlbiBleGVjdXRpb25zLCB3ZSBjYW4ndCBzZXJpYWxpemUgdGhlbVxuICAgICAgICAvLyBhcyBjb25zdGFudCBleHByZXNzaW9ucyBiZWNhdXNlIHJlc3VsdHMgY2hhbmdlIGJhc2VkIG9uIGVudmlyb25tZW50LlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgV2l0aGluKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1R5cGVBbm5vdGF0aW9uID0gZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvZXJjaW9uIHx8XG4gICAgICAgIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBc3NlcnRpb247XG5cbiAgICBsZXQgY2hpbGRyZW5Db25zdGFudCA9IHRydWU7XG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoY2hpbGQgPT4ge1xuICAgICAgICAvLyBXZSBjYW4gX2FsbW9zdF8gYXNzdW1lIHRoYXQgaWYgYGV4cHJlc3Npb25zYCBjaGlsZHJlbiBhcmUgY29uc3RhbnQsXG4gICAgICAgIC8vIHRoZXkgd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gZXZhbHVhdGVkIHRvIExpdGVyYWwgdmFsdWVzIHdoZW4gdGhleVxuICAgICAgICAvLyB3ZXJlIHBhcnNlZC4gIFR5cGUgYW5ub3RhdGlvbnMgYXJlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgdGhleSBtaWdodFxuICAgICAgICAvLyBoYXZlIGJlZW4gaW5mZXJyZWQgYW5kIGFkZGVkIGFmdGVyIGEgY2hpbGQgd2FzIHBhcnNlZC5cblxuICAgICAgICAvLyBTbyB3ZSByZWN1cnNlIGludG8gaXNDb25zdGFudCgpIGZvciB0aGUgY2hpbGRyZW4gb2YgdHlwZSBhbm5vdGF0aW9ucyxcbiAgICAgICAgLy8gYnV0IG90aGVyd2lzZSBzaW1wbHkgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBMaXRlcmFscy5cbiAgICAgICAgaWYgKGlzVHlwZUFubm90YXRpb24pIHtcbiAgICAgICAgICAgIGNoaWxkcmVuQ29uc3RhbnQgPSBjaGlsZHJlbkNvbnN0YW50ICYmIGlzQ29uc3RhbnQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGRyZW5Db25zdGFudCA9IGNoaWxkcmVuQ29uc3RhbnQgJiYgY2hpbGQgaW5zdGFuY2VvZiBMaXRlcmFsO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFjaGlsZHJlbkNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGZWF0dXJlQ29uc3RhbnQoZXhwcmVzc2lvbikgJiZcbiAgICAgICAgaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGV4cHJlc3Npb24sIFsnem9vbScsICdoZWF0bWFwLWRlbnNpdHknLCAnbGluZS1wcm9ncmVzcycsICdhY2N1bXVsYXRlZCcsICdpcy1zdXBwb3J0ZWQtc2NyaXB0J10pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuL3J1bnRpbWVfZXJyb3InO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi9leHByZXNzaW9uJztcblxuZXhwb3J0IHR5cGUgU3RvcHMgPSBBcnJheTxbbnVtYmVyLCBFeHByZXNzaW9uXT47XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RvcCA8PSBpbnB1dCwgb3IgMCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8oc3RvcHM6IEFycmF5PG51bWJlcj4sIGlucHV0OiBudW1iZXIpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSBzdG9wcy5sZW5ndGggLSAxO1xuICAgIGxldCBsb3dlckluZGV4ID0gMDtcbiAgICBsZXQgdXBwZXJJbmRleCA9IGxhc3RJbmRleDtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICBsZXQgY3VycmVudFZhbHVlLCBuZXh0VmFsdWU7XG5cbiAgICB3aGlsZSAobG93ZXJJbmRleCA8PSB1cHBlckluZGV4KSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCA9IE1hdGguZmxvb3IoKGxvd2VySW5kZXggKyB1cHBlckluZGV4KSAvIDIpO1xuICAgICAgICBjdXJyZW50VmFsdWUgPSBzdG9wc1tjdXJyZW50SW5kZXhdO1xuICAgICAgICBuZXh0VmFsdWUgPSBzdG9wc1tjdXJyZW50SW5kZXggKyAxXTtcblxuICAgICAgICBpZiAoY3VycmVudFZhbHVlIDw9IGlucHV0KSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBsYXN0SW5kZXggfHwgaW5wdXQgPCBuZXh0VmFsdWUpIHsgLy8gU2VhcmNoIGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG93ZXJJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlID4gaW5wdXQpIHtcbiAgICAgICAgICAgIHVwcGVySW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcignSW5wdXQgaXMgbm90IGEgbnVtYmVyLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge051bWJlclR5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvfSBmcm9tICcuLi9zdG9wcyc7XG5cbmltcG9ydCB0eXBlIHtTdG9wc30gZnJvbSAnLi4vc3RvcHMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jbGFzcyBTdGVwIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuICAgIGxhYmVsczogQXJyYXk8bnVtYmVyPjtcbiAgICBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGlucHV0OiBFeHByZXNzaW9uLCBzdG9wczogU3RvcHMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAxIDwgNCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBzdG9wczogU3RvcHMgPSBbXTtcblxuICAgICAgICBsZXQgb3V0cHV0VHlwZTogVHlwZSA9IChudWxsOiBhbnkpO1xuICAgICAgICBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGkgPT09IDEgPyAtSW5maW5pdHkgOiBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW2kgKyAxXTtcblxuICAgICAgICAgICAgY29uc3QgbGFiZWxLZXkgPSBpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBpICsgMTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG9wcy5sZW5ndGggJiYgc3RvcHNbc3RvcHMubGVuZ3RoIC0gMV1bMF0gPj0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGFycmFuZ2VkIHdpdGggaW5wdXQgdmFsdWVzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlci4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UodmFsdWUsIHZhbHVlS2V5LCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xuICAgICAgICAgICAgc3RvcHMucHVzaChbbGFiZWwsIHBhcnNlZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwKG91dHB1dFR5cGUsIGlucHV0LCBzdG9wcyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVscztcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMub3V0cHV0cztcblxuICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk6IG51bWJlcik7XG4gICAgICAgIGlmICh2YWx1ZSA8PSBsYWJlbHNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9wQ291bnQgPSBsYWJlbHMubGVuZ3RoO1xuICAgICAgICBpZiAodmFsdWUgPj0gbGFiZWxzW3N0b3BDb3VudCAtIDFdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1tzdG9wQ291bnQgLSAxXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKGxhYmVscywgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgICAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICBmbihleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm91dHB1dHMuZXZlcnkob3V0ID0+IG91dC5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcInN0ZXBcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaCh0aGlzLmxhYmVsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdXRwdXRzW2ldLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0ZXA7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sb3IgZnJvbSAnLi9jb2xvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIoYTogbnVtYmVyLCBiOiBudW1iZXIsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiAoYSAqICgxIC0gdCkpICsgKGIgKiB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yKGZyb206IENvbG9yLCB0bzogQ29sb3IsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgQ29sb3IoXG4gICAgICAgIG51bWJlcihmcm9tLnIsIHRvLnIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5nLCB0by5nLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uYiwgdG8uYiwgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmEsIHRvLmEsIHQpXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KGZyb206IEFycmF5PG51bWJlcj4sIHRvOiBBcnJheTxudW1iZXI+LCB0OiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcbiAgICByZXR1cm4gZnJvbS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIG51bWJlcihkLCB0b1tpXSwgdCk7XG4gICAgfSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sb3IgZnJvbSAnLi9jb2xvcic7XG5cbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlTnVtYmVyfSBmcm9tICcuL2ludGVycG9sYXRlJztcblxudHlwZSBMQUJDb2xvciA9IHtcbiAgICBsOiBudW1iZXIsXG4gICAgYTogbnVtYmVyLFxuICAgIGI6IG51bWJlcixcbiAgICBhbHBoYTogbnVtYmVyXG59O1xuXG50eXBlIEhDTENvbG9yID0ge1xuICAgIGg6IG51bWJlcixcbiAgICBjOiBudW1iZXIsXG4gICAgbDogbnVtYmVyLFxuICAgIGFscGhhOiBudW1iZXJcbn07XG5cbi8vIENvbnN0YW50c1xuY29uc3QgWG4gPSAwLjk1MDQ3MCwgLy8gRDY1IHN0YW5kYXJkIHJlZmVyZW50XG4gICAgWW4gPSAxLFxuICAgIFpuID0gMS4wODg4MzAsXG4gICAgdDAgPSA0IC8gMjksXG4gICAgdDEgPSA2IC8gMjksXG4gICAgdDIgPSAzICogdDEgKiB0MSxcbiAgICB0MyA9IHQxICogdDEgKiB0MSxcbiAgICBkZWcycmFkID0gTWF0aC5QSSAvIDE4MCxcbiAgICByYWQyZGVnID0gMTgwIC8gTWF0aC5QSTtcblxuLy8gVXRpbGl0aWVzXG5mdW5jdGlvbiB4eXoybGFiKHQ6IG51bWJlcikge1xuICAgIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eih0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24geHl6MnJnYih4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gMjU1ICogKHggPD0gMC4wMDMxMzA4ID8gMTIuOTIgKiB4IDogMS4wNTUgKiBNYXRoLnBvdyh4LCAxIC8gMi40KSAtIDAuMDU1KTtcbn1cblxuZnVuY3Rpb24gcmdiMnh5eih4OiBudW1iZXIpIHtcbiAgICB4IC89IDI1NTtcbiAgICByZXR1cm4geCA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbn1cblxuLy8gTEFCXG5mdW5jdGlvbiByZ2JUb0xhYihyZ2JDb2xvcjogQ29sb3IpOiBMQUJDb2xvciB7XG4gICAgY29uc3QgYiA9IHJnYjJ4eXoocmdiQ29sb3IuciksXG4gICAgICAgIGEgPSByZ2IyeHl6KHJnYkNvbG9yLmcpLFxuICAgICAgICBsID0gcmdiMnh5eihyZ2JDb2xvci5iKSxcbiAgICAgICAgeCA9IHh5ejJsYWIoKDAuNDEyNDU2NCAqIGIgKyAwLjM1NzU3NjEgKiBhICsgMC4xODA0Mzc1ICogbCkgLyBYbiksXG4gICAgICAgIHkgPSB4eXoybGFiKCgwLjIxMjY3MjkgKiBiICsgMC43MTUxNTIyICogYSArIDAuMDcyMTc1MCAqIGwpIC8gWW4pLFxuICAgICAgICB6ID0geHl6MmxhYigoMC4wMTkzMzM5ICogYiArIDAuMTE5MTkyMCAqIGEgKyAwLjk1MDMwNDEgKiBsKSAvIFpuKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGw6IDExNiAqIHkgLSAxNixcbiAgICAgICAgYTogNTAwICogKHggLSB5KSxcbiAgICAgICAgYjogMjAwICogKHkgLSB6KSxcbiAgICAgICAgYWxwaGE6IHJnYkNvbG9yLmFcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBsYWJUb1JnYihsYWJDb2xvcjogTEFCQ29sb3IpOiBDb2xvciB7XG4gICAgbGV0IHkgPSAobGFiQ29sb3IubCArIDE2KSAvIDExNixcbiAgICAgICAgeCA9IGlzTmFOKGxhYkNvbG9yLmEpID8geSA6IHkgKyBsYWJDb2xvci5hIC8gNTAwLFxuICAgICAgICB6ID0gaXNOYU4obGFiQ29sb3IuYikgPyB5IDogeSAtIGxhYkNvbG9yLmIgLyAyMDA7XG4gICAgeSA9IFluICogbGFiMnh5eih5KTtcbiAgICB4ID0gWG4gKiBsYWIyeHl6KHgpO1xuICAgIHogPSBabiAqIGxhYjJ4eXooeik7XG4gICAgcmV0dXJuIG5ldyBDb2xvcihcbiAgICAgICAgeHl6MnJnYigzLjI0MDQ1NDIgKiB4IC0gMS41MzcxMzg1ICogeSAtIDAuNDk4NTMxNCAqIHopLCAvLyBENjUgLT4gc1JHQlxuICAgICAgICB4eXoycmdiKC0wLjk2OTI2NjAgKiB4ICsgMS44NzYwMTA4ICogeSArIDAuMDQxNTU2MCAqIHopLFxuICAgICAgICB4eXoycmdiKDAuMDU1NjQzNCAqIHggLSAwLjIwNDAyNTkgKiB5ICsgMS4wNTcyMjUyICogeiksXG4gICAgICAgIGxhYkNvbG9yLmFscGhhXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVMYWIoZnJvbTogTEFCQ29sb3IsIHRvOiBMQUJDb2xvciwgdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5sLCB0by5sLCB0KSxcbiAgICAgICAgYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hLCB0by5hLCB0KSxcbiAgICAgICAgYjogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5iLCB0by5iLCB0KSxcbiAgICAgICAgYWxwaGE6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYWxwaGEsIHRvLmFscGhhLCB0KVxuICAgIH07XG59XG5cbi8vIEhDTFxuZnVuY3Rpb24gcmdiVG9IY2wocmdiQ29sb3I6IENvbG9yKTogSENMQ29sb3Ige1xuICAgIGNvbnN0IHtsLCBhLCBifSA9IHJnYlRvTGFiKHJnYkNvbG9yKTtcbiAgICBjb25zdCBoID0gTWF0aC5hdGFuMihiLCBhKSAqIHJhZDJkZWc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaDogaCA8IDAgPyBoICsgMzYwIDogaCxcbiAgICAgICAgYzogTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpLFxuICAgICAgICBsLFxuICAgICAgICBhbHBoYTogcmdiQ29sb3IuYVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhjbFRvUmdiKGhjbENvbG9yOiBIQ0xDb2xvcik6IENvbG9yIHtcbiAgICBjb25zdCBoID0gaGNsQ29sb3IuaCAqIGRlZzJyYWQsXG4gICAgICAgIGMgPSBoY2xDb2xvci5jLFxuICAgICAgICBsID0gaGNsQ29sb3IubDtcbiAgICByZXR1cm4gbGFiVG9SZ2Ioe1xuICAgICAgICBsLFxuICAgICAgICBhOiBNYXRoLmNvcyhoKSAqIGMsXG4gICAgICAgIGI6IE1hdGguc2luKGgpICogYyxcbiAgICAgICAgYWxwaGE6IGhjbENvbG9yLmFscGhhXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlSHVlKGE6IG51bWJlciwgYjogbnVtYmVyLCB0OiBudW1iZXIpIHtcbiAgICBjb25zdCBkID0gYiAtIGE7XG4gICAgcmV0dXJuIGEgKyB0ICogKGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUhjbChmcm9tOiBIQ0xDb2xvciwgdG86IEhDTENvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBpbnRlcnBvbGF0ZUh1ZShmcm9tLmgsIHRvLmgsIHQpLFxuICAgICAgICBjOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmMsIHRvLmMsIHQpLFxuICAgICAgICBsOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmwsIHRvLmwsIHQpLFxuICAgICAgICBhbHBoYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hbHBoYSwgdG8uYWxwaGEsIHQpXG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGxhYiA9IHtcbiAgICBmb3J3YXJkOiByZ2JUb0xhYixcbiAgICByZXZlcnNlOiBsYWJUb1JnYixcbiAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGVMYWJcbn07XG5cbmV4cG9ydCBjb25zdCBoY2wgPSB7XG4gICAgZm9yd2FyZDogcmdiVG9IY2wsXG4gICAgcmV2ZXJzZTogaGNsVG9SZ2IsXG4gICAgaW50ZXJwb2xhdGU6IGludGVycG9sYXRlSGNsXG59O1xuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCBVbml0QmV6aWVyIGZyb20gJ0BtYXBib3gvdW5pdGJlemllcic7XHJcblxyXG5pbXBvcnQgKiBhcyBpbnRlcnBvbGF0ZSBmcm9tICcuLi8uLi91dGlsL2ludGVycG9sYXRlJztcclxuaW1wb3J0IHt0b1N0cmluZywgTnVtYmVyVHlwZSwgQ29sb3JUeXBlfSBmcm9tICcuLi90eXBlcyc7XHJcbmltcG9ydCB7ZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUb30gZnJvbSAnLi4vc3RvcHMnO1xyXG5pbXBvcnQge2hjbCwgbGFifSBmcm9tICcuLi8uLi91dGlsL2NvbG9yX3NwYWNlcyc7XHJcblxyXG5pbXBvcnQgdHlwZSB7U3RvcHN9IGZyb20gJy4uL3N0b3BzJztcclxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xyXG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xyXG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xyXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuZXhwb3J0IHR5cGUgSW50ZXJwb2xhdGlvblR5cGUgPVxyXG4gICAgeyBuYW1lOiAnbGluZWFyJyB9IHxcclxuICAgIHsgbmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogbnVtYmVyIH0gfFxyXG4gICAgeyBuYW1lOiAnY3ViaWMtYmV6aWVyJywgY29udHJvbFBvaW50czogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfTtcclxuXHJcbmNsYXNzIEludGVycG9sYXRlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XHJcbiAgICB0eXBlOiBUeXBlO1xyXG5cclxuICAgIG9wZXJhdG9yOiAnaW50ZXJwb2xhdGUnIHwgJ2ludGVycG9sYXRlLWhjbCcgfCAnaW50ZXJwb2xhdGUtbGFiJztcclxuICAgIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlO1xyXG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XHJcbiAgICBsYWJlbHM6IEFycmF5PG51bWJlcj47XHJcbiAgICBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBvcGVyYXRvcjogJ2ludGVycG9sYXRlJyB8ICdpbnRlcnBvbGF0ZS1oY2wnIHwgJ2ludGVycG9sYXRlLWxhYicsIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgc3RvcHM6IFN0b3BzKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcclxuICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XHJcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcclxuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XHJcblxyXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XHJcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBbbGFiZWwsIGV4cHJlc3Npb25dIG9mIHN0b3BzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xyXG4gICAgICAgICAgICB0aGlzLm91dHB1dHMucHVzaChleHByZXNzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGludGVycG9sYXRpb25GYWN0b3IoaW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGlvblR5cGUsIGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgdCA9IDA7XHJcbiAgICAgICAgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2V4cG9uZW50aWFsJykge1xyXG4gICAgICAgICAgICB0ID0gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCBpbnRlcnBvbGF0aW9uLmJhc2UsIGxvd2VyLCB1cHBlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XHJcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIDEsIGxvd2VyLCB1cHBlcik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdjdWJpYy1iZXppZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbnRlcnBvbGF0aW9uLmNvbnRyb2xQb2ludHM7XHJcbiAgICAgICAgICAgIGNvbnN0IHViID0gbmV3IFVuaXRCZXppZXIoY1swXSwgY1sxXSwgY1syXSwgY1szXSk7XHJcbiAgICAgICAgICAgIHQgPSB1Yi5zb2x2ZShleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIDEsIGxvd2VyLCB1cHBlcikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xyXG4gICAgICAgIGxldCBbb3BlcmF0b3IsIGludGVycG9sYXRpb24sIGlucHV0LCAuLi5yZXN0XSA9IGFyZ3M7XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnRlcnBvbGF0aW9uKSB8fCBpbnRlcnBvbGF0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gaW50ZXJwb2xhdGlvbiB0eXBlIGV4cHJlc3Npb24uYCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2xpbmVhcicpIHtcclxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHtuYW1lOiAnbGluZWFyJ307XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnZXhwb25lbnRpYWwnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBpbnRlcnBvbGF0aW9uWzFdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cG9uZW50aWFsIGludGVycG9sYXRpb24gcmVxdWlyZXMgYSBudW1lcmljIGJhc2UuYCwgMSwgMSk7XHJcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnZXhwb25lbnRpYWwnLFxyXG4gICAgICAgICAgICAgICAgYmFzZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2N1YmljLWJlemllcicpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbFBvaW50cyA9IGludGVycG9sYXRpb24uc2xpY2UoMSk7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHMubGVuZ3RoICE9PSA0IHx8XHJcbiAgICAgICAgICAgICAgICBjb250cm9sUG9pbnRzLnNvbWUodCA9PiB0eXBlb2YgdCAhPT0gJ251bWJlcicgfHwgdCA8IDAgfHwgdCA+IDEpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0N1YmljIGJlemllciBpbnRlcnBvbGF0aW9uIHJlcXVpcmVzIGZvdXIgbnVtZXJpYyBhcmd1bWVudHMgd2l0aCB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAxLicsIDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2N1YmljLWJlemllcicsXHJcbiAgICAgICAgICAgICAgICBjb250cm9sUG9pbnRzOiAoY29udHJvbFBvaW50czogYW55KVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIGludGVycG9sYXRpb24gdHlwZSAke1N0cmluZyhpbnRlcnBvbGF0aW9uWzBdKX1gLCAxLCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIDEgPCA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKChhcmdzLmxlbmd0aCAtIDEpICUgMiAhPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGlucHV0LCAyLCBOdW1iZXJUeXBlKTtcclxuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RvcHM6IFN0b3BzID0gW107XHJcblxyXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XHJcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJyB8fCBvcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWxhYicpIHtcclxuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IENvbG9yVHlwZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcclxuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSAyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gcmVzdFtpXTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0W2kgKyAxXTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsS2V5ID0gaSArIDM7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gaSArIDQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgZGVmaW5lZCB1c2luZyBsaXRlcmFsIG51bWVyaWMgdmFsdWVzIChub3QgY29tcHV0ZWQgZXhwcmVzc2lvbnMpIGZvciB0aGUgaW5wdXQgdmFsdWVzLicsIGxhYmVsS2V5KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHN0b3BzLmxlbmd0aCAmJiBzdG9wc1tzdG9wcy5sZW5ndGggLSAxXVswXSA+PSBsYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsIGxhYmVsS2V5KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgdmFsdWVLZXksIG91dHB1dFR5cGUpO1xyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xyXG4gICAgICAgICAgICBzdG9wcy5wdXNoKFtsYWJlbCwgcGFyc2VkXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3V0cHV0VHlwZS5raW5kICE9PSAnbnVtYmVyJyAmJlxyXG4gICAgICAgICAgICBvdXRwdXRUeXBlLmtpbmQgIT09ICdjb2xvcicgJiZcclxuICAgICAgICAgICAgIShcclxuICAgICAgICAgICAgICAgIG91dHB1dFR5cGUua2luZCA9PT0gJ2FycmF5JyAmJlxyXG4gICAgICAgICAgICAgICAgb3V0cHV0VHlwZS5pdGVtVHlwZS5raW5kID09PSAnbnVtYmVyJyAmJlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIG91dHB1dFR5cGUuTiA9PT0gJ251bWJlcidcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVHlwZSAke3RvU3RyaW5nKG91dHB1dFR5cGUpfSBpcyBub3QgaW50ZXJwb2xhdGFibGUuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV3IEludGVycG9sYXRlKG91dHB1dFR5cGUsIChvcGVyYXRvcjogYW55KSwgaW50ZXJwb2xhdGlvbiwgaW5wdXQsIHN0b3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XHJcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMub3V0cHV0cztcclxuXHJcbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk6IG51bWJlcik7XHJcbiAgICAgICAgaWYgKHZhbHVlIDw9IGxhYmVsc1swXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcclxuICAgICAgICBpZiAodmFsdWUgPj0gbGFiZWxzW3N0b3BDb3VudCAtIDFdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzW3N0b3BDb3VudCAtIDFdLmV2YWx1YXRlKGN0eCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpbmRleCA9IGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8obGFiZWxzLCB2YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgbG93ZXIgPSBsYWJlbHNbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IHVwcGVyID0gbGFiZWxzW2luZGV4ICsgMV07XHJcbiAgICAgICAgY29uc3QgdCA9IEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uLCB2YWx1ZSwgbG93ZXIsIHVwcGVyKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3V0cHV0TG93ZXIgPSBvdXRwdXRzW2luZGV4XS5ldmFsdWF0ZShjdHgpO1xyXG4gICAgICAgIGNvbnN0IG91dHB1dFVwcGVyID0gb3V0cHV0c1tpbmRleCArIDFdLmV2YWx1YXRlKGN0eCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoaW50ZXJwb2xhdGVbdGhpcy50eXBlLmtpbmQudG9Mb3dlckNhc2UoKV06IGFueSkob3V0cHV0TG93ZXIsIG91dHB1dFVwcGVyLCB0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJykge1xyXG4gICAgICAgICAgICByZXR1cm4gaGNsLnJldmVyc2UoaGNsLmludGVycG9sYXRlKGhjbC5mb3J3YXJkKG91dHB1dExvd2VyKSwgaGNsLmZvcndhcmQob3V0cHV0VXBwZXIpLCB0KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxhYi5yZXZlcnNlKGxhYi5pbnRlcnBvbGF0ZShsYWIuZm9yd2FyZChvdXRwdXRMb3dlciksIGxhYi5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xyXG4gICAgICAgICAgICBmbihleHByZXNzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRzLmV2ZXJ5KG91dCA9PiBvdXQub3V0cHV0RGVmaW5lZCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcclxuICAgICAgICBsZXQgaW50ZXJwb2xhdGlvbjtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdsaW5lYXInKSB7XHJcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJsaW5lYXJcIl07XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmludGVycG9sYXRpb24ubmFtZSA9PT0gJ2V4cG9uZW50aWFsJykge1xyXG4gICAgICAgICAgICBpZiAgKHRoaXMuaW50ZXJwb2xhdGlvbi5iYXNlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wibGluZWFyXCJdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImV4cG9uZW50aWFsXCIsIHRoaXMuaW50ZXJwb2xhdGlvbi5iYXNlXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJjdWJpYy1iZXppZXJcIiBdLmNvbmNhdCh0aGlzLmludGVycG9sYXRpb24uY29udHJvbFBvaW50cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW3RoaXMub3BlcmF0b3IsIGludGVycG9sYXRpb24sIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChcclxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzW2ldLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRzW2ldLnNlcmlhbGl6ZSgpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxyXG4gKiBzdG9wcy5cclxuICogSG93IGl0IHdvcmtzOiBUd28gY29uc2VjdXRpdmUgc3RvcCB2YWx1ZXMgZGVmaW5lIGEgKHNjYWxlZCBhbmQgc2hpZnRlZCkgZXhwb25lbnRpYWwgZnVuY3Rpb24gYGYoeCkgPSBhICogYmFzZV54ICsgYmAsIHdoZXJlIGBiYXNlYCBpcyB0aGUgdXNlci1zcGVjaWZpZWQgYmFzZSxcclxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxyXG4gKiB0aGUgZnVuY3Rpb24gdG8gdGhlIGdpdmVuIHN0b3BzLlxyXG4gKlxyXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxyXG4gKiB2YWx1ZXMgd2l0aG91dCBleHBsaWNpdGx5IHNvbHZpbmcgZm9yIGBhYCBhbmQgYGJgOlxyXG4gKlxyXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcclxuICogU2Vjb25kIHN0b3AgdmFsdWU6IGBmKHgxKSA9IHkxID0gYSAqIGJhc2VeeDEgKyBiYFxyXG4gKiA9PiBgeTEgLSB5MCA9IGEoYmFzZV54MSAtIGJhc2VeeDApYFxyXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxyXG4gKlxyXG4gKiBEZXNpcmVkIHZhbHVlOiBgZih4KSA9IHkgPSBhICogYmFzZV54ICsgYmBcclxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXHJcbiAqXHJcbiAqIEZyb20gdGhlIGFib3ZlLCB3ZSBjYW4gcmVwbGFjZSB0aGUgYGFgIGluIGBhICogKGJhc2VeeCAtIGJhc2VeeDApYCBhbmQgZG8gYVxyXG4gKiBsaXR0bGUgYWxnZWJyYTpcclxuICogYGBgXHJcbiAqIGEgKiAoYmFzZV54IC0gYmFzZV54MCkgPSAoeTEgLSB5MCkvKGJhc2VeeDEgLSBiYXNlXngwKSAqIChiYXNlXnggLSBiYXNlXngwKVxyXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxyXG4gKiBgYGBcclxuICpcclxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxyXG4gKiBgZih4KSA9IHkwICsgKHkxIC0geTApICogcmF0aW9gLiAgSW4gb3RoZXIgd29yZHMsIGByYXRpb2AgbWF5IGJlIHRyZWF0ZWQgYXNcclxuICogYW4gaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiB0aGUgdHdvIHN0b3BzJyBvdXRwdXQgdmFsdWVzLlxyXG4gKlxyXG4gKiAoTm90ZTogYSBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybSBmb3IgYHJhdGlvYCxcclxuICogYChiYXNlXih4LXgwKSAtIDEpIC8gKGJhc2VeKHgxLXgwKSAtIDEpIGAsIGlzIGVxdWl2YWxlbnQsIGJ1dCByZXF1aXJlcyBmZXdlclxyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4qL1xyXG5mdW5jdGlvbiBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIGJhc2UsIGxvd2VyVmFsdWUsIHVwcGVyVmFsdWUpIHtcclxuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB1cHBlclZhbHVlIC0gbG93ZXJWYWx1ZTtcclxuICAgIGNvbnN0IHByb2dyZXNzID0gaW5wdXQgLSBsb3dlclZhbHVlO1xyXG5cclxuICAgIGlmIChkaWZmZXJlbmNlID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDEpIHtcclxuICAgICAgICByZXR1cm4gcHJvZ3Jlc3MgLyBkaWZmZXJlbmNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gKE1hdGgucG93KGJhc2UsIHByb2dyZXNzKSAtIDEpIC8gKE1hdGgucG93KGJhc2UsIGRpZmZlcmVuY2UpIC0gMSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEludGVycG9sYXRlO1xyXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7Y2hlY2tTdWJ0eXBlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jbGFzcyBDb2FsZXNjZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKFwiRXhwZWN0ZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0cHV0VHlwZTogVHlwZSA9IChudWxsOiBhbnkpO1xuICAgICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgaWYgKGV4cGVjdGVkVHlwZSAmJiBleHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncy5zbGljZSgxKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZShhcmcsIDEgKyBwYXJzZWRBcmdzLmxlbmd0aCwgb3V0cHV0VHlwZSwgdW5kZWZpbmVkLCB7dHlwZUFubm90YXRpb246ICdvbWl0J30pO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcGFyc2VkLnR5cGU7XG4gICAgICAgICAgICBwYXJzZWRBcmdzLnB1c2gocGFyc2VkKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQob3V0cHV0VHlwZSk7XG5cbiAgICAgICAgLy8gQWJvdmUsIHdlIHBhcnNlIGFyZ3VtZW50cyB3aXRob3V0IGluZmVycmVkIHR5cGUgYW5ub3RhdGlvbiBzbyB0aGF0XG4gICAgICAgIC8vIHRoZXkgZG9uJ3QgcHJvZHVjZSBhIHJ1bnRpbWUgZXJyb3IgZm9yIGBudWxsYCBpbnB1dCwgd2hpY2ggd291bGRcbiAgICAgICAgLy8gcHJlZW1wdCB0aGUgZGVzaXJlZCBudWxsLWNvYWxlc2NpbmcgYmVoYXZpb3IuXG4gICAgICAgIC8vIFRodXMsIGlmIGFueSBvZiBvdXIgYXJndW1lbnRzIHdvdWxkIGhhdmUgbmVlZGVkIGFuIGFubm90YXRpb24sIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gd3JhcCB0aGUgZW5jbG9zaW5nIGNvYWxlc2NlIGV4cHJlc3Npb24gd2l0aCBpdCBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBuZWVkc0Fubm90YXRpb24gPSBleHBlY3RlZFR5cGUgJiZcbiAgICAgICAgICAgIHBhcnNlZEFyZ3Muc29tZShhcmcgPT4gY2hlY2tTdWJ0eXBlKGV4cGVjdGVkVHlwZSwgYXJnLnR5cGUpKTtcblxuICAgICAgICByZXR1cm4gbmVlZHNBbm5vdGF0aW9uID9cbiAgICAgICAgICAgIG5ldyBDb2FsZXNjZShWYWx1ZVR5cGUsIHBhcnNlZEFyZ3MpIDpcbiAgICAgICAgICAgIG5ldyBDb2FsZXNjZSgob3V0cHV0VHlwZTogYW55KSwgcGFyc2VkQXJncyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgbGV0IGFyZ0NvdW50ID0gMDtcbiAgICAgICAgbGV0IHJlcXVlc3RlZEltYWdlTmFtZTtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICBhcmdDb3VudCsrO1xuICAgICAgICAgICAgcmVzdWx0ID0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGZpcnN0IHJlcXVlc3RlZCBpbWFnZSBpbiBhIGNvYWxlc2NlIHN0YXRlbWVudFxuICAgICAgICAgICAgLy8gaWYgY29hbGVzY2UgY2FuJ3QgZmluZCBhIHZhbGlkIGltYWdlLCB3ZSByZXR1cm4gdGhlIGZpcnN0IGltYWdlIG5hbWUgc28gc3R5bGVpbWFnZW1pc3NpbmcgY2FuIGZpcmVcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0IGluc3RhbmNlb2YgUmVzb2x2ZWRJbWFnZSAmJiAhcmVzdWx0LmF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdGVkSW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEltYWdlTmFtZSA9IHJlc3VsdC5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhcmdDb3VudCA9PT0gdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXF1ZXN0ZWRJbWFnZU5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoYXJnID0+IGFyZy5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImNvYWxlc2NlXCJdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvYWxlc2NlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCAgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcblxuY2xhc3MgTGV0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+O1xuICAgIHJlc3VsdDogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4sIHJlc3VsdDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSByZXN1bHQudHlwZTtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IFtdLmNvbmNhdChiaW5kaW5ncyk7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0LmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgdGhpcy5iaW5kaW5ncykge1xuICAgICAgICAgICAgZm4oYmluZGluZ1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm4odGhpcy5yZXN1bHQpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBjb25zdCBiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBhcmdzW2ldO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIG5hbWV9IGluc3RlYWQuYCwgaSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvW15hLXpBLVowLTlfXS8udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBWYXJpYWJsZSBuYW1lcyBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciAnXycuYCwgaSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29udGV4dC5wYXJzZShhcmdzW2kgKyAxXSwgaSArIDEpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGJpbmRpbmdzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSwgYXJncy5sZW5ndGggLSAxLCBjb250ZXh0LmV4cGVjdGVkVHlwZSwgYmluZGluZ3MpO1xuICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMZXQoYmluZGluZ3MsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0Lm91dHB1dERlZmluZWQoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJsZXRcIl07XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGV4cHJdIG9mIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChuYW1lLCBleHByLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5yZXN1bHQuc2VyaWFsaXplKCkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7YXJyYXksIFZhbHVlVHlwZSwgTnVtYmVyVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtUeXBlLCBBcnJheVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi4vdmFsdWVzJztcblxuY2xhc3MgQXQgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGluZGV4OiBFeHByZXNzaW9uO1xuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgaW5kZXg6IEV4cHJlc3Npb24sIGlucHV0OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAyIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIGFycmF5KGNvbnRleHQuZXhwZWN0ZWRUeXBlIHx8IFZhbHVlVHlwZSkpO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0OiBBcnJheVR5cGUgPSAoaW5wdXQudHlwZTogYW55KTtcbiAgICAgICAgcmV0dXJuIG5ldyBBdCh0Lml0ZW1UeXBlLCBpbmRleCwgaW5wdXQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoKHRoaXMuaW5kZXguZXZhbHVhdGUoY3R4KTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgY29uc3QgYXJyYXkgPSAoKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTogQXJyYXk8VmFsdWU+KTtcblxuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzOiAke2luZGV4fSA8IDAuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPj0gYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBBcnJheSBpbmRleCBvdXQgb2YgYm91bmRzOiAke2luZGV4fSA+ICR7YXJyYXkubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggIT09IE1hdGguZmxvb3IoaW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBBcnJheSBpbmRleCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBmb3VuZCAke2luZGV4fSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFycmF5W2luZGV4XTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5kZXgpO1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gW1wiYXRcIiwgdGhpcy5pbmRleC5zZXJpYWxpemUoKSwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBdDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Qm9vbGVhblR5cGUsIFN0cmluZ1R5cGUsIFZhbHVlVHlwZSwgTnVsbFR5cGUsIHRvU3RyaW5nLCBOdW1iZXJUeXBlLCBpc1ZhbGlkVHlwZSwgaXNWYWxpZE5hdGl2ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jbGFzcyBJbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmVlZGxlOiBFeHByZXNzaW9uO1xuICAgIGhheXN0YWNrOiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IobmVlZGxlOiBFeHByZXNzaW9uLCBoYXlzdGFjazogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBCb29sZWFuVHlwZTtcbiAgICAgICAgdGhpcy5uZWVkbGUgPSBuZWVkbGU7XG4gICAgICAgIHRoaXMuaGF5c3RhY2sgPSBoYXlzdGFjaztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAyIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmVlZGxlID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuXG4gICAgICAgIGNvbnN0IGhheXN0YWNrID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBWYWx1ZVR5cGUpO1xuXG4gICAgICAgIGlmICghbmVlZGxlIHx8ICFoYXlzdGFjaykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZShuZWVkbGUudHlwZSwgW0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBOdW1iZXJUeXBlLCBOdWxsVHlwZSwgVmFsdWVUeXBlXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKG5lZWRsZS50eXBlKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbihuZWVkbGUsIGhheXN0YWNrKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IG5lZWRsZSA9ICh0aGlzLm5lZWRsZS5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuICAgICAgICBjb25zdCBoYXlzdGFjayA9ICh0aGlzLmhheXN0YWNrLmV2YWx1YXRlKGN0eCk6IGFueSk7XG5cbiAgICAgICAgaWYgKCFoYXlzdGFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUobmVlZGxlLCBbJ2Jvb2xlYW4nLCAnc3RyaW5nJywgJ251bWJlcicsICdudWxsJ10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihuZWVkbGUpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUoaGF5c3RhY2ssIFsnc3RyaW5nJywgJ2FycmF5J10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihoYXlzdGFjaykpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluZGV4T2YobmVlZGxlKSA+PSAwO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5uZWVkbGUpO1xuICAgICAgICBmbih0aGlzLmhheXN0YWNrKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBbXCJpblwiLCB0aGlzLm5lZWRsZS5zZXJpYWxpemUoKSwgdGhpcy5oYXlzdGFjay5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Qm9vbGVhblR5cGUsIFN0cmluZ1R5cGUsIFZhbHVlVHlwZSwgTnVsbFR5cGUsIHRvU3RyaW5nLCBOdW1iZXJUeXBlLCBpc1ZhbGlkVHlwZSwgaXNWYWxpZE5hdGl2ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jbGFzcyBJbmRleE9mIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBuZWVkbGU6IEV4cHJlc3Npb247XG4gICAgaGF5c3RhY2s6IEV4cHJlc3Npb247XG4gICAgZnJvbUluZGV4OiA/RXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKG5lZWRsZTogRXhwcmVzc2lvbiwgaGF5c3RhY2s6IEV4cHJlc3Npb24sIGZyb21JbmRleD86IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gTnVtYmVyVHlwZTtcbiAgICAgICAgdGhpcy5uZWVkbGUgPSBuZWVkbGU7XG4gICAgICAgIHRoaXMuaGF5c3RhY2sgPSBoYXlzdGFjaztcbiAgICAgICAgdGhpcy5mcm9tSW5kZXggPSBmcm9tSW5kZXg7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDIgfHwgIGFyZ3MubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAzIG9yIDQgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZWVkbGUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgaWYgKCFuZWVkbGUgfHwgIWhheXN0YWNrKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZShuZWVkbGUudHlwZSwgW0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBOdW1iZXJUeXBlLCBOdWxsVHlwZSwgVmFsdWVUeXBlXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKG5lZWRsZS50eXBlKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tSW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbM10sIDMsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFmcm9tSW5kZXgpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleE9mKG5lZWRsZSwgaGF5c3RhY2ssIGZyb21JbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4T2YobmVlZGxlLCBoYXlzdGFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IG5lZWRsZSA9ICh0aGlzLm5lZWRsZS5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuICAgICAgICBjb25zdCBoYXlzdGFjayA9ICh0aGlzLmhheXN0YWNrLmV2YWx1YXRlKGN0eCk6IGFueSk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTmF0aXZlVHlwZShuZWVkbGUsIFsnYm9vbGVhbicsICdzdHJpbmcnLCAnbnVtYmVyJywgJ251bGwnXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKG5lZWRsZSkpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTmF0aXZlVHlwZShoYXlzdGFjaywgWydzdHJpbmcnLCAnYXJyYXknXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHNlY29uZCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKGhheXN0YWNrKSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mcm9tSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21JbmRleCA9ICh0aGlzLmZyb21JbmRleC5ldmFsdWF0ZShjdHgpOiBudW1iZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluZGV4T2YobmVlZGxlLCBmcm9tSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluZGV4T2YobmVlZGxlKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMubmVlZGxlKTtcbiAgICAgICAgZm4odGhpcy5oYXlzdGFjayk7XG4gICAgICAgIGlmICh0aGlzLmZyb21JbmRleCkge1xuICAgICAgICAgICAgZm4odGhpcy5mcm9tSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbUluZGV4ICE9IG51bGwgJiYgdGhpcy5mcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gdGhpcy5mcm9tSW5kZXguc2VyaWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gW1wiaW5kZXgtb2ZcIiwgdGhpcy5uZWVkbGUuc2VyaWFsaXplKCksIHRoaXMuaGF5c3RhY2suc2VyaWFsaXplKCksIGZyb21JbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcImluZGV4LW9mXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEluZGV4T2Y7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMnO1xuaW1wb3J0IHtWYWx1ZVR5cGUsIHR5cGUgVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcblxuLy8gTWFwIGlucHV0IGxhYmVsIHZhbHVlcyB0byBvdXRwdXQgZXhwcmVzc2lvbiBpbmRleFxudHlwZSBDYXNlcyA9IHtbbnVtYmVyIHwgc3RyaW5nXTogbnVtYmVyfTtcblxuY2xhc3MgTWF0Y2ggaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGlucHV0VHlwZTogVHlwZTtcblxuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuICAgIGNhc2VzOiBDYXNlcztcbiAgICBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPjtcbiAgICBvdGhlcndpc2U6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dFR5cGU6IFR5cGUsIG91dHB1dFR5cGU6IFR5cGUsIGlucHV0OiBFeHByZXNzaW9uLCBjYXNlczogQ2FzZXMsIG91dHB1dHM6IEFycmF5PEV4cHJlc3Npb24+LCBvdGhlcndpc2U6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy5pbnB1dFR5cGUgPSBpbnB1dFR5cGU7XG4gICAgICAgIHRoaXMudHlwZSA9IG91dHB1dFR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5jYXNlcyA9IGNhc2VzO1xuICAgICAgICB0aGlzLm91dHB1dHMgPSBvdXRwdXRzO1xuICAgICAgICB0aGlzLm90aGVyd2lzZSA9IG90aGVyd2lzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA1KVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAlIDIgIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGxldCBpbnB1dFR5cGU7XG4gICAgICAgIGxldCBvdXRwdXRUeXBlO1xuICAgICAgICBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhc2VzID0ge307XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGxhYmVscyA9IGFyZ3NbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGFiZWxzKSkge1xuICAgICAgICAgICAgICAgIGxhYmVscyA9IFtsYWJlbHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbnRleHQgPSBjb250ZXh0LmNvbmNhdChpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcignRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGJyYW5jaCBsYWJlbC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBsYWJlbHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYEJyYW5jaCBsYWJlbHMgbXVzdCBiZSBudW1iZXJzIG9yIHN0cmluZ3MuYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInICYmIE1hdGguYWJzKGxhYmVsKSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYEJyYW5jaCBsYWJlbHMgbXVzdCBiZSBpbnRlZ2VycyBubyBsYXJnZXIgdGhhbiAke051bWJlci5NQVhfU0FGRV9JTlRFR0VSfS5gKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGxhYmVsKSAhPT0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgTnVtZXJpYyBicmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlciB2YWx1ZXMuYCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpbnB1dFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gdHlwZU9mKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsQ29udGV4dC5jaGVja1N1YnR5cGUoaW5wdXRUeXBlLCB0eXBlT2YobGFiZWwpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhc2VzW1N0cmluZyhsYWJlbCldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKCdCcmFuY2ggbGFiZWxzIG11c3QgYmUgdW5pcXVlLicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2VzW1N0cmluZyhsYWJlbCldID0gb3V0cHV0cy5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UodmFsdWUsIGksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcmVzdWx0LnR5cGU7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBvdGhlcndpc2UgPSBjb250ZXh0LnBhcnNlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSwgYXJncy5sZW5ndGggLSAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgaWYgKCFvdGhlcndpc2UpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGFzc2VydChpbnB1dFR5cGUgJiYgb3V0cHV0VHlwZSk7XG5cbiAgICAgICAgaWYgKGlucHV0LnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJiBjb250ZXh0LmNvbmNhdCgxKS5jaGVja1N1YnR5cGUoKGlucHV0VHlwZTogYW55KSwgaW5wdXQudHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNYXRjaCgoaW5wdXRUeXBlOiBhbnkpLCAob3V0cHV0VHlwZTogYW55KSwgaW5wdXQsIGNhc2VzLCBvdXRwdXRzLCBvdGhlcndpc2UpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSAodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSAodHlwZU9mKGlucHV0KSA9PT0gdGhpcy5pbnB1dFR5cGUgJiYgdGhpcy5vdXRwdXRzW3RoaXMuY2FzZXNbaW5wdXRdXSkgfHwgdGhpcy5vdGhlcndpc2U7XG4gICAgICAgIHJldHVybiBvdXRwdXQuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgICAgICB0aGlzLm91dHB1dHMuZm9yRWFjaChmbik7XG4gICAgICAgIGZuKHRoaXMub3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRzLmV2ZXJ5KG91dCA9PiBvdXQub3V0cHV0RGVmaW5lZCgpKSAmJiB0aGlzLm90aGVyd2lzZS5vdXRwdXREZWZpbmVkKCk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJtYXRjaFwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcblxuICAgICAgICAvLyBTb3J0IHNvIHNlcmlhbGl6YXRpb24gaGFzIGFuIGFyYml0cmFyeSBkZWZpbmVkIG9yZGVyLCBldmVuIHRob3VnaFxuICAgICAgICAvLyBicmFuY2ggb3JkZXIgZG9lc24ndCBhZmZlY3QgZXZhbHVhdGlvblxuICAgICAgICBjb25zdCBzb3J0ZWRMYWJlbHMgPSBPYmplY3Qua2V5cyh0aGlzLmNhc2VzKS5zb3J0KCk7XG5cbiAgICAgICAgLy8gR3JvdXAgYnJhbmNoZXMgYnkgdW5pcXVlIG1hdGNoIGV4cHJlc3Npb24gdG8gc3VwcG9ydCBjb25kZW5zZWRcbiAgICAgICAgLy8gc2VyaWFsaXphdGlvbnMgb2YgdGhlIGZvcm0gW2Nhc2UxLCBjYXNlMiwgLi4uXSAtPiBtYXRjaEV4cHJlc3Npb25cbiAgICAgICAgY29uc3QgZ3JvdXBlZEJ5T3V0cHV0OiBBcnJheTxbbnVtYmVyLCBBcnJheTxudW1iZXIgfCBzdHJpbmc+XT4gPSBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0TG9va3VwOiB7W2luZGV4OiBudW1iZXJdOiBudW1iZXJ9ID0ge307IC8vIGxvb2t1cCBpbmRleCBpbnRvIGdyb3VwZWRCeU91dHB1dCBmb3IgYSBnaXZlbiBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIHNvcnRlZExhYmVscykge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBvdXRwdXRMb29rdXBbdGhpcy5jYXNlc1tsYWJlbF1dO1xuICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBGaXJzdCB0aW1lIHNlZWluZyB0aGlzIG91dHB1dCwgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGdyb3VwZWQgbGlzdFxuICAgICAgICAgICAgICAgIG91dHB1dExvb2t1cFt0aGlzLmNhc2VzW2xhYmVsXV0gPSBncm91cGVkQnlPdXRwdXQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGdyb3VwZWRCeU91dHB1dC5wdXNoKFt0aGlzLmNhc2VzW2xhYmVsXSwgW2xhYmVsXV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSd2ZSBzZWVuIHRoaXMgZXhwcmVzc2lvbiBiZWZvcmUsIGFkZCB0aGUgbGFiZWwgdG8gdGhhdCBvdXRwdXQncyBncm91cFxuICAgICAgICAgICAgICAgIGdyb3VwZWRCeU91dHB1dFtvdXRwdXRJbmRleF1bMV0ucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2VyY2VMYWJlbCA9IChsYWJlbCkgPT4gdGhpcy5pbnB1dFR5cGUua2luZCA9PT0gJ251bWJlcicgPyBOdW1iZXIobGFiZWwpIDogbGFiZWw7XG5cbiAgICAgICAgZm9yIChjb25zdCBbb3V0cHV0SW5kZXgsIGxhYmVsc10gb2YgZ3JvdXBlZEJ5T3V0cHV0KSB7XG4gICAgICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgYSBzaW5nbGUgbGFiZWwgbWF0Y2hlcyB0aGlzIG91dHB1dCBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKGNvZXJjZUxhYmVsKGxhYmVsc1swXSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBcnJheSBvZiBsaXRlcmFsIGxhYmVscyBwb2ludGluZyB0byB0aGlzIG91dHB1dCBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKGxhYmVscy5tYXAoY29lcmNlTGFiZWwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaCh0aGlzLm91dHB1dHNbb3V0cHV0SW5kZXhdLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdGhlcndpc2Uuc2VyaWFsaXplKCkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hdGNoO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBCcmFuY2hlcyA9IEFycmF5PFtFeHByZXNzaW9uLCBFeHByZXNzaW9uXT47XG5cbmNsYXNzIENhc2UgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuXG4gICAgYnJhbmNoZXM6IEJyYW5jaGVzO1xuICAgIG90aGVyd2lzZTogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGJyYW5jaGVzOiBCcmFuY2hlcywgb3RoZXJ3aXNlOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYnJhbmNoZXMgPSBicmFuY2hlcztcbiAgICAgICAgdGhpcy5vdGhlcndpc2UgPSBvdGhlcndpc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiA/VHlwZTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJyYW5jaGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIEJvb2xlYW5UeXBlKTtcbiAgICAgICAgICAgIGlmICghdGVzdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1tpICsgMV0sIGkgKyAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYnJhbmNoZXMucHVzaChbdGVzdCwgcmVzdWx0XSk7XG5cbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHJlc3VsdC50eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJ3aXNlID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmICghb3RoZXJ3aXNlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBhc3NlcnQob3V0cHV0VHlwZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZSgob3V0cHV0VHlwZTogYW55KSwgYnJhbmNoZXMsIG90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0ZXN0LCBleHByZXNzaW9uXSBvZiB0aGlzLmJyYW5jaGVzKSB7XG4gICAgICAgICAgICBpZiAodGVzdC5ldmFsdWF0ZShjdHgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vdGhlcndpc2UuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3Rlc3QsIGV4cHJlc3Npb25dIG9mIHRoaXMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgIGZuKHRlc3QpO1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyYW5jaGVzLmV2ZXJ5KChbXywgb3V0XSkgPT4gb3V0Lm91dHB1dERlZmluZWQoKSkgJiYgdGhpcy5vdGhlcndpc2Uub3V0cHV0RGVmaW5lZCgpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImNhc2VcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FzZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7VmFsdWVUeXBlLCBOdW1iZXJUeXBlLCBTdHJpbmdUeXBlLCBhcnJheSwgdG9TdHJpbmcsIGlzVmFsaWRUeXBlLCBpc1ZhbGlkTmF0aXZlVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5cbmNsYXNzIFNsaWNlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBiZWdpbkluZGV4OiBFeHByZXNzaW9uO1xuICAgIGVuZEluZGV4OiA/RXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGlucHV0OiBFeHByZXNzaW9uLCBiZWdpbkluZGV4OiBFeHByZXNzaW9uLCBlbmRJbmRleD86IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmJlZ2luSW5kZXggPSBiZWdpbkluZGV4O1xuICAgICAgICB0aGlzLmVuZEluZGV4ID0gZW5kSW5kZXg7XG5cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMiB8fCAgYXJncy5sZW5ndGggPj0gNSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDMgb3IgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICBjb25zdCBiZWdpbkluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBOdW1iZXJUeXBlKTtcblxuICAgICAgICBpZiAoIWlucHV0IHx8ICFiZWdpbkluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIWlzVmFsaWRUeXBlKGlucHV0LnR5cGUsIFthcnJheShWYWx1ZVR5cGUpLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt0b1N0cmluZyhpbnB1dC50eXBlKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IGNvbnRleHQucGFyc2UoYXJnc1szXSwgMywgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWVuZEluZGV4KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UoaW5wdXQudHlwZSwgaW5wdXQsIGJlZ2luSW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UoaW5wdXQudHlwZSwgaW5wdXQsIGJlZ2luSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9ICh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IGJlZ2luSW5kZXggPSAodGhpcy5iZWdpbkluZGV4LmV2YWx1YXRlKGN0eCk6IG51bWJlcik7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTmF0aXZlVHlwZShpbnB1dCwgWydzdHJpbmcnLCAnYXJyYXknXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaW5wdXQpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmVuZEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9ICh0aGlzLmVuZEluZGV4LmV2YWx1YXRlKGN0eCk6IG51bWJlcik7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuc2xpY2UoYmVnaW5JbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlucHV0LnNsaWNlKGJlZ2luSW5kZXgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIGZuKHRoaXMuYmVnaW5JbmRleCk7XG4gICAgICAgIGlmICh0aGlzLmVuZEluZGV4KSB7XG4gICAgICAgICAgICBmbih0aGlzLmVuZEluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmVuZEluZGV4ICE9IG51bGwgJiYgdGhpcy5lbmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuZW5kSW5kZXguc2VyaWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gW1wic2xpY2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKSwgdGhpcy5iZWdpbkluZGV4LnNlcmlhbGl6ZSgpLCBlbmRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcInNsaWNlXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCksIHRoaXMuYmVnaW5JbmRleC5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTbGljZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7dG9TdHJpbmcsIFZhbHVlVHlwZSwgQm9vbGVhblR5cGUsIENvbGxhdG9yVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IEFzc2VydGlvbiBmcm9tICcuL2Fzc2VydGlvbic7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBDb21wYXJpc29uT3BlcmF0b3IgPSAnPT0nIHwgJyE9JyB8ICc8JyB8ICc+JyB8ICc8PScgfCAnPj0nIDtcblxuZnVuY3Rpb24gaXNDb21wYXJhYmxlVHlwZShvcDogQ29tcGFyaXNvbk9wZXJhdG9yLCB0eXBlOiBUeXBlKSB7XG4gICAgaWYgKG9wID09PSAnPT0nIHx8IG9wID09PSAnIT0nKSB7XG4gICAgICAgIC8vIGVxdWFsaXR5IG9wZXJhdG9yXG4gICAgICAgIHJldHVybiB0eXBlLmtpbmQgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnbnVsbCcgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ3ZhbHVlJztcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvcmRlcmluZyBvcGVyYXRvclxuICAgICAgICByZXR1cm4gdHlwZS5raW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAndmFsdWUnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZXEoY3R4LCBhLCBiKSB7IHJldHVybiBhID09PSBiOyB9XG5mdW5jdGlvbiBuZXEoY3R4LCBhLCBiKSB7IHJldHVybiBhICE9PSBiOyB9XG5mdW5jdGlvbiBsdChjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPCBiOyB9XG5mdW5jdGlvbiBndChjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPiBiOyB9XG5mdW5jdGlvbiBsdGVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSA8PSBiOyB9XG5mdW5jdGlvbiBndGVxKGN0eCwgYSwgYikgeyByZXR1cm4gYSA+PSBiOyB9XG5cbmZ1bmN0aW9uIGVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA9PT0gMDsgfVxuZnVuY3Rpb24gbmVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuICFlcUNvbGxhdGUoY3R4LCBhLCBiLCBjKTsgfVxuZnVuY3Rpb24gbHRDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpIDwgMDsgfVxuZnVuY3Rpb24gZ3RDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID4gMDsgfVxuZnVuY3Rpb24gbHRlcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPD0gMDsgfVxuZnVuY3Rpb24gZ3RlcUNvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPj0gMDsgfVxuXG4vKipcbiAqIFNwZWNpYWwgZm9ybSBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGltcGxlbWVudGluZyB0aGUgc2lnbmF0dXJlczpcbiAqIC0gKFQsIFQsID9Db2xsYXRvcikgPT4gYm9vbGVhblxuICogLSAoVCwgdmFsdWUsID9Db2xsYXRvcikgPT4gYm9vbGVhblxuICogLSAodmFsdWUsIFQsID9Db2xsYXRvcikgPT4gYm9vbGVhblxuICpcbiAqIEZvciBpbmVxdWFsaXRpZXMsIFQgbXVzdCBiZSBlaXRoZXIgdmFsdWUsIHN0cmluZywgb3IgbnVtYmVyLiBGb3IgPT0vIT0sIGl0XG4gKiBjYW4gYWxzbyBiZSBib29sZWFuIG9yIG51bGwuXG4gKlxuICogRXF1YWxpdHkgc2VtYW50aWNzIGFyZSBlcXVpdmFsZW50IHRvIEphdmFzY3JpcHQncyBzdHJpY3QgZXF1YWxpdHkgKD09PS8hPT0pXG4gKiAtLSBpLmUuLCB3aGVuIHRoZSBhcmd1bWVudHMnIHR5cGVzIGRvbid0IG1hdGNoLCA9PSBldmFsdWF0ZXMgdG8gZmFsc2UsICE9IHRvXG4gKiB0cnVlLlxuICpcbiAqIFdoZW4gdHlwZXMgZG9uJ3QgbWF0Y2ggaW4gYW4gb3JkZXJpbmcgY29tcGFyaXNvbiwgYSBydW50aW1lIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlQ29tcGFyaXNvbihvcDogQ29tcGFyaXNvbk9wZXJhdG9yLCBjb21wYXJlQmFzaWMsIGNvbXBhcmVXaXRoQ29sbGF0b3IpIHtcbiAgICBjb25zdCBpc09yZGVyQ29tcGFyaXNvbiA9IG9wICE9PSAnPT0nICYmIG9wICE9PSAnIT0nO1xuXG4gICAgcmV0dXJuIGNsYXNzIENvbXBhcmlzb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICAgICAgdHlwZTogVHlwZTtcbiAgICAgICAgbGhzOiBFeHByZXNzaW9uO1xuICAgICAgICByaHM6IEV4cHJlc3Npb247XG4gICAgICAgIGNvbGxhdG9yOiA/RXhwcmVzc2lvbjtcbiAgICAgICAgaGFzVW50eXBlZEFyZ3VtZW50OiBib29sZWFuO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGxoczogRXhwcmVzc2lvbiwgcmhzOiBFeHByZXNzaW9uLCBjb2xsYXRvcjogP0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEJvb2xlYW5UeXBlO1xuICAgICAgICAgICAgdGhpcy5saHMgPSBsaHM7XG4gICAgICAgICAgICB0aGlzLnJocyA9IHJocztcbiAgICAgICAgICAgIHRoaXMuY29sbGF0b3IgPSBjb2xsYXRvcjtcbiAgICAgICAgICAgIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50ID0gbGhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJyB8fCByaHMudHlwZS5raW5kID09PSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDMgJiYgYXJncy5sZW5ndGggIT09IDQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIHR3byBvciB0aHJlZSBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wOiBDb21wYXJpc29uT3BlcmF0b3IgPSAoYXJnc1swXTogYW55KTtcblxuICAgICAgICAgICAgbGV0IGxocyA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghbGhzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICghaXNDb21wYXJhYmxlVHlwZShvcCwgbGhzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29uY2F0KDEpLmVycm9yKGBcIiR7b3B9XCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJyR7dG9TdHJpbmcobGhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmhzID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFyaHMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKCFpc0NvbXBhcmFibGVUeXBlKG9wLCByaHMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jb25jYXQoMikuZXJyb3IoYFwiJHtvcH1cIiBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAnJHt0b1N0cmluZyhyaHMudHlwZSl9Jy5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09IHJocy50eXBlLmtpbmQgJiZcbiAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSAndmFsdWUnICYmXG4gICAgICAgICAgICAgICAgcmhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYENhbm5vdCBjb21wYXJlIHR5cGVzICcke3RvU3RyaW5nKGxocy50eXBlKX0nIGFuZCAnJHt0b1N0cmluZyhyaHMudHlwZSl9Jy5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT3JkZXJDb21wYXJpc29uKSB7XG4gICAgICAgICAgICAgICAgLy8gdHlwaW5nIHJ1bGVzIHNwZWNpZmljIHRvIGxlc3MvZ3JlYXRlciB0aGFuIG9wZXJhdG9yc1xuICAgICAgICAgICAgICAgIGlmIChsaHMudHlwZS5raW5kID09PSAndmFsdWUnICYmIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gKHZhbHVlLCBUKVxuICAgICAgICAgICAgICAgICAgICBsaHMgPSBuZXcgQXNzZXJ0aW9uKHJocy50eXBlLCBbbGhzXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaHMudHlwZS5raW5kICE9PSAndmFsdWUnICYmIHJocy50eXBlLmtpbmQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gKFQsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByaHMgPSBuZXcgQXNzZXJ0aW9uKGxocy50eXBlLCBbcmhzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29sbGF0b3IgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICByaHMudHlwZS5raW5kICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSAndmFsdWUnICYmXG4gICAgICAgICAgICAgICAgICAgIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZSdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYENhbm5vdCB1c2UgY29sbGF0b3IgdG8gY29tcGFyZSBub24tc3RyaW5nIHR5cGVzLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2xsYXRvciA9IGNvbnRleHQucGFyc2UoYXJnc1szXSwgMywgQ29sbGF0b3JUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbGxhdG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJpc29uKGxocywgcmhzLCBjb2xsYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBsaHMgPSB0aGlzLmxocy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgY29uc3QgcmhzID0gdGhpcy5yaHMuZXZhbHVhdGUoY3R4KTtcblxuICAgICAgICAgICAgaWYgKGlzT3JkZXJDb21wYXJpc29uICYmIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbHQgPSB0eXBlT2YobGhzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBydCA9IHR5cGVPZihyaHMpO1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdHlwZSBpcyBzdHJpbmcgb3IgbnVtYmVyLCBhbmQgZXF1YWxcbiAgICAgICAgICAgICAgICBpZiAobHQua2luZCAhPT0gcnQua2luZCB8fCAhKGx0LmtpbmQgPT09ICdzdHJpbmcnIHx8IGx0LmtpbmQgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBhcmd1bWVudHMgZm9yIFwiJHtvcH1cIiB0byBiZSAoc3RyaW5nLCBzdHJpbmcpIG9yIChudW1iZXIsIG51bWJlciksIGJ1dCBmb3VuZCAoJHtsdC5raW5kfSwgJHtydC5raW5kfSkgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbGxhdG9yICYmICFpc09yZGVyQ29tcGFyaXNvbiAmJiB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGx0ID0gdHlwZU9mKGxocyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnQgPSB0eXBlT2YocmhzKTtcbiAgICAgICAgICAgICAgICBpZiAobHQua2luZCAhPT0gJ3N0cmluZycgfHwgcnQua2luZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCYXNpYyhjdHgsIGxocywgcmhzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxhdG9yID9cbiAgICAgICAgICAgICAgICBjb21wYXJlV2l0aENvbGxhdG9yKGN0eCwgbGhzLCByaHMsIHRoaXMuY29sbGF0b3IuZXZhbHVhdGUoY3R4KSkgOlxuICAgICAgICAgICAgICAgIGNvbXBhcmVCYXNpYyhjdHgsIGxocywgcmhzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubGhzKTtcbiAgICAgICAgICAgIGZuKHRoaXMucmhzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbGxhdG9yKSB7XG4gICAgICAgICAgICAgICAgZm4odGhpcy5jb2xsYXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW29wXTtcbiAgICAgICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCBjb25zdCBFcXVhbHMgPSBtYWtlQ29tcGFyaXNvbignPT0nLCBlcSwgZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBOb3RFcXVhbHMgPSBtYWtlQ29tcGFyaXNvbignIT0nLCBuZXEsIG5lcUNvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IExlc3NUaGFuID0gbWFrZUNvbXBhcmlzb24oJzwnLCBsdCwgbHRDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBHcmVhdGVyVGhhbiA9IG1ha2VDb21wYXJpc29uKCc+JywgZ3QsIGd0Q29sbGF0ZSk7XG5leHBvcnQgY29uc3QgTGVzc1RoYW5PckVxdWFsID0gbWFrZUNvbXBhcmlzb24oJzw9JywgbHRlcSwgbHRlcUNvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXJUaGFuT3JFcXVhbCA9IG1ha2VDb21wYXJpc29uKCc+PScsIGd0ZXEsIGd0ZXFDb2xsYXRlKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7U3RyaW5nVHlwZSwgTnVtYmVyVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0JztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5cbmRlY2xhcmUgdmFyIEludGw6IHtcbiAgICBOdW1iZXJGb3JtYXQ6IENsYXNzPEludGwkTnVtYmVyRm9ybWF0PlxufTtcblxuZGVjbGFyZSBjbGFzcyBJbnRsJE51bWJlckZvcm1hdCB7XG4gICAgY29uc3RydWN0b3IgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBOdW1iZXJGb3JtYXRPcHRpb25zXG4gICAgKTogSW50bCROdW1iZXJGb3JtYXQ7XG5cbiAgICBzdGF0aWMgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBOdW1iZXJGb3JtYXRPcHRpb25zXG4gICAgKTogSW50bCROdW1iZXJGb3JtYXQ7XG5cbiAgICBmb3JtYXQoYTogbnVtYmVyKTogc3RyaW5nO1xuXG4gICAgcmVzb2x2ZWRPcHRpb25zKCk6IGFueTtcbn1cblxudHlwZSBOdW1iZXJGb3JtYXRPcHRpb25zID0ge1xuICAgIHN0eWxlPzogJ2RlY2ltYWwnIHwgJ2N1cnJlbmN5JyB8ICdwZXJjZW50JztcbiAgICBjdXJyZW5jeT86IG51bGwgfCBzdHJpbmc7XG4gICAgbWluaW11bUZyYWN0aW9uRGlnaXRzPzogbnVsbCB8IHN0cmluZztcbiAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM/OiBudWxsIHwgc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTnVtYmVyRm9ybWF0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBudW1iZXI6IEV4cHJlc3Npb247XG4gICAgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbDsgICAvLyBCQ1AgNDcgbGFuZ3VhZ2UgdGFnXG4gICAgY3VycmVuY3k6IEV4cHJlc3Npb24gfCBudWxsOyAvLyBJU08gNDIxNyBjdXJyZW5jeSBjb2RlLCByZXF1aXJlZCBpZiBzdHlsZT1jdXJyZW5jeVxuICAgIG1pbkZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gRGVmYXVsdCAwXG4gICAgbWF4RnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsOyAvLyBEZWZhdWx0IDNcblxuICAgIGNvbnN0cnVjdG9yKG51bWJlcjogRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsLFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBFeHByZXNzaW9uIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGwsXG4gICAgICAgICAgICAgICAgbWF4RnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFN0cmluZ1R5cGU7XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICAgICAgdGhpcy5jdXJyZW5jeSA9IGN1cnJlbmN5O1xuICAgICAgICB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzID0gbWluRnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIHRoaXMubWF4RnJhY3Rpb25EaWdpdHMgPSBtYXhGcmFjdGlvbkRpZ2l0cztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIHR3byBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgY29uc3QgbnVtYmVyID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFudW1iZXIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1syXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgTnVtYmVyRm9ybWF0IG9wdGlvbnMgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG5cbiAgICAgICAgbGV0IGxvY2FsZSA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydsb2NhbGUnXSkge1xuICAgICAgICAgICAgbG9jYWxlID0gY29udGV4dC5wYXJzZShvcHRpb25zWydsb2NhbGUnXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWxvY2FsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVuY3kgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snY3VycmVuY3knXSkge1xuICAgICAgICAgICAgY3VycmVuY3kgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2N1cnJlbmN5J10sIDEsIFN0cmluZ1R5cGUpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW5jeSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWluRnJhY3Rpb25EaWdpdHMgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snbWluLWZyYWN0aW9uLWRpZ2l0cyddKSB7XG4gICAgICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0cyA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snbWluLWZyYWN0aW9uLWRpZ2l0cyddLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgICAgIGlmICghbWluRnJhY3Rpb25EaWdpdHMpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heEZyYWN0aW9uRGlnaXRzID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ21heC1mcmFjdGlvbi1kaWdpdHMnXSkge1xuICAgICAgICAgICAgbWF4RnJhY3Rpb25EaWdpdHMgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ21heC1mcmFjdGlvbi1kaWdpdHMnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1heEZyYWN0aW9uRGlnaXRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyRm9ybWF0KG51bWJlciwgbG9jYWxlLCBjdXJyZW5jeSwgbWluRnJhY3Rpb25EaWdpdHMsIG1heEZyYWN0aW9uRGlnaXRzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZS5ldmFsdWF0ZShjdHgpIDogW10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuY3VycmVuY3kgPyBcImN1cnJlbmN5XCIgOiBcImRlY2ltYWxcIixcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSA/IHRoaXMuY3VycmVuY3kuZXZhbHVhdGUoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IHRoaXMubWluRnJhY3Rpb25EaWdpdHMgPyB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzLmV2YWx1YXRlKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID8gdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkuZm9ybWF0KHRoaXMubnVtYmVyLmV2YWx1YXRlKGN0eCkpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5udW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeSkge1xuICAgICAgICAgICAgZm4odGhpcy5jdXJyZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heEZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBmbih0aGlzLm1heEZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBvcHRpb25zWydsb2NhbGUnXSA9IHRoaXMubG9jYWxlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBvcHRpb25zWydjdXJyZW5jeSddID0gdGhpcy5jdXJyZW5jeS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5taW5GcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgb3B0aW9uc1snbWluLWZyYWN0aW9uLWRpZ2l0cyddID0gdGhpcy5taW5GcmFjdGlvbkRpZ2l0cy5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXhGcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgb3B0aW9uc1snbWF4LWZyYWN0aW9uLWRpZ2l0cyddID0gdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1wibnVtYmVyLWZvcm1hdFwiLCB0aGlzLm51bWJlci5zZXJpYWxpemUoKSwgb3B0aW9uc107XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtOdW1iZXJUeXBlLCB0b1N0cmluZ30gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvcic7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuY2xhc3MgTGVuZ3RoIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IE51bWJlclR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMSBhcmd1bWVudCwgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGlucHV0LnR5cGUua2luZCAhPT0gJ2FycmF5JyAmJiBpbnB1dC50eXBlLmtpbmQgIT09ICdzdHJpbmcnICYmIGlucHV0LnR5cGUua2luZCAhPT0gJ3ZhbHVlJylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhcmd1bWVudCBvZiB0eXBlIHN0cmluZyBvciBhcnJheSwgYnV0IGZvdW5kICR7dG9TdHJpbmcoaW5wdXQudHlwZSl9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMZW5ndGgoaW5wdXQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb2YgdHlwZSBzdHJpbmcgb3IgYXJyYXksIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihpbnB1dCkpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibGVuZ3RoXCJdO1xuICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExlbmd0aDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgdHlwZSBUeXBlLFxuICAgIE51bWJlclR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBDb2xvclR5cGUsXG4gICAgT2JqZWN0VHlwZSxcbiAgICBWYWx1ZVR5cGUsXG4gICAgRXJyb3JUeXBlLFxuICAgIENvbGxhdG9yVHlwZSxcbiAgICBhcnJheSxcbiAgICB0b1N0cmluZyBhcyB0eXBlVG9TdHJpbmdcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge3R5cGVPZiwgQ29sb3IsIHZhbGlkYXRlUkdCQSwgdG9TdHJpbmcgYXMgdmFsdWVUb1N0cmluZ30gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3InO1xuaW1wb3J0IExldCBmcm9tICcuL2xldCc7XG5pbXBvcnQgVmFyIGZyb20gJy4vdmFyJztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4vbGl0ZXJhbCc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vYXNzZXJ0aW9uJztcbmltcG9ydCBDb2VyY2lvbiBmcm9tICcuL2NvZXJjaW9uJztcbmltcG9ydCBBdCBmcm9tICcuL2F0JztcbmltcG9ydCBJbiBmcm9tICcuL2luJztcbmltcG9ydCBJbmRleE9mIGZyb20gJy4vaW5kZXhfb2YnO1xuaW1wb3J0IE1hdGNoIGZyb20gJy4vbWF0Y2gnO1xuaW1wb3J0IENhc2UgZnJvbSAnLi9jYXNlJztcbmltcG9ydCBTbGljZSBmcm9tICcuL3NsaWNlJztcbmltcG9ydCBTdGVwIGZyb20gJy4vc3RlcCc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgQ29hbGVzY2UgZnJvbSAnLi9jb2FsZXNjZSc7XG5pbXBvcnQge1xuICAgIEVxdWFscyxcbiAgICBOb3RFcXVhbHMsXG4gICAgTGVzc1RoYW4sXG4gICAgR3JlYXRlclRoYW4sXG4gICAgTGVzc1RoYW5PckVxdWFsLFxuICAgIEdyZWF0ZXJUaGFuT3JFcXVhbFxufSBmcm9tICcuL2NvbXBhcmlzb24nO1xuaW1wb3J0IENvbGxhdG9yRXhwcmVzc2lvbiBmcm9tICcuL2NvbGxhdG9yJztcbmltcG9ydCBOdW1iZXJGb3JtYXQgZnJvbSAnLi9udW1iZXJfZm9ybWF0JztcbmltcG9ydCBGb3JtYXRFeHByZXNzaW9uIGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCBJbWFnZUV4cHJlc3Npb24gZnJvbSAnLi9pbWFnZSc7XG5pbXBvcnQgTGVuZ3RoIGZyb20gJy4vbGVuZ3RoJztcbmltcG9ydCBXaXRoaW4gZnJvbSAnLi93aXRoaW4nO1xuXG5pbXBvcnQgdHlwZSB7VmFyYXJnc30gZnJvbSAnLi4vY29tcG91bmRfZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvblJlZ2lzdHJ5fSBmcm9tICcuLi9leHByZXNzaW9uJztcblxuY29uc3QgZXhwcmVzc2lvbnM6IEV4cHJlc3Npb25SZWdpc3RyeSA9IHtcbiAgICAvLyBzcGVjaWFsIGZvcm1zXG4gICAgJz09JzogRXF1YWxzLFxuICAgICchPSc6IE5vdEVxdWFscyxcbiAgICAnPic6IEdyZWF0ZXJUaGFuLFxuICAgICc8JzogTGVzc1RoYW4sXG4gICAgJz49JzogR3JlYXRlclRoYW5PckVxdWFsLFxuICAgICc8PSc6IExlc3NUaGFuT3JFcXVhbCxcbiAgICAnYXJyYXknOiBBc3NlcnRpb24sXG4gICAgJ2F0JzogQXQsXG4gICAgJ2Jvb2xlYW4nOiBBc3NlcnRpb24sXG4gICAgJ2Nhc2UnOiBDYXNlLFxuICAgICdjb2FsZXNjZSc6IENvYWxlc2NlLFxuICAgICdjb2xsYXRvcic6IENvbGxhdG9yRXhwcmVzc2lvbixcbiAgICAnZm9ybWF0JzogRm9ybWF0RXhwcmVzc2lvbixcbiAgICAnaW1hZ2UnOiBJbWFnZUV4cHJlc3Npb24sXG4gICAgJ2luJzogSW4sXG4gICAgJ2luZGV4LW9mJzogSW5kZXhPZixcbiAgICAnaW50ZXJwb2xhdGUnOiBJbnRlcnBvbGF0ZSxcbiAgICAnaW50ZXJwb2xhdGUtaGNsJzogSW50ZXJwb2xhdGUsXG4gICAgJ2ludGVycG9sYXRlLWxhYic6IEludGVycG9sYXRlLFxuICAgICdsZW5ndGgnOiBMZW5ndGgsXG4gICAgJ2xldCc6IExldCxcbiAgICAnbGl0ZXJhbCc6IExpdGVyYWwsXG4gICAgJ21hdGNoJzogTWF0Y2gsXG4gICAgJ251bWJlcic6IEFzc2VydGlvbixcbiAgICAnbnVtYmVyLWZvcm1hdCc6IE51bWJlckZvcm1hdCxcbiAgICAnb2JqZWN0JzogQXNzZXJ0aW9uLFxuICAgICdzbGljZSc6IFNsaWNlLFxuICAgICdzdGVwJzogU3RlcCxcbiAgICAnc3RyaW5nJzogQXNzZXJ0aW9uLFxuICAgICd0by1ib29sZWFuJzogQ29lcmNpb24sXG4gICAgJ3RvLWNvbG9yJzogQ29lcmNpb24sXG4gICAgJ3RvLW51bWJlcic6IENvZXJjaW9uLFxuICAgICd0by1zdHJpbmcnOiBDb2VyY2lvbixcbiAgICAndmFyJzogVmFyLFxuICAgICd3aXRoaW4nOiBXaXRoaW5cbn07XG5cbmZ1bmN0aW9uIHJnYmEoY3R4LCBbciwgZywgYiwgYV0pIHtcbiAgICByID0gci5ldmFsdWF0ZShjdHgpO1xuICAgIGcgPSBnLmV2YWx1YXRlKGN0eCk7XG4gICAgYiA9IGIuZXZhbHVhdGUoY3R4KTtcbiAgICBjb25zdCBhbHBoYSA9IGEgPyBhLmV2YWx1YXRlKGN0eCkgOiAxO1xuICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVSR0JBKHIsIGcsIGIsIGFscGhhKTtcbiAgICBpZiAoZXJyb3IpIHRocm93IG5ldyBSdW50aW1lRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBuZXcgQ29sb3IociAvIDI1NSAqIGFscGhhLCBnIC8gMjU1ICogYWxwaGEsIGIgLyAyNTUgKiBhbHBoYSwgYWxwaGEpO1xufVxuXG5mdW5jdGlvbiBoYXMoa2V5LCBvYmopIHtcbiAgICByZXR1cm4ga2V5IGluIG9iajtcbn1cblxuZnVuY3Rpb24gZ2V0KGtleSwgb2JqKSB7XG4gICAgY29uc3QgdiA9IG9ialtrZXldO1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogdjtcbn1cblxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKHYsIGEsIGksIGopIHtcbiAgICB3aGlsZSAoaSA8PSBqKSB7XG4gICAgICAgIGNvbnN0IG0gPSAoaSArIGopID4+IDE7XG4gICAgICAgIGlmIChhW21dID09PSB2KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhW21dID4gdilcbiAgICAgICAgICAgIGogPSBtIC0gMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaSA9IG0gKyAxO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHZhcmFyZ3ModHlwZTogVHlwZSk6IFZhcmFyZ3Mge1xuICAgIHJldHVybiB7dHlwZX07XG59XG5cbkNvbXBvdW5kRXhwcmVzc2lvbi5yZWdpc3RlcihleHByZXNzaW9ucywge1xuICAgICdlcnJvcic6IFtcbiAgICAgICAgRXJyb3JUeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4geyB0aHJvdyBuZXcgUnVudGltZUVycm9yKHYuZXZhbHVhdGUoY3R4KSk7IH1cbiAgICBdLFxuICAgICd0eXBlb2YnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbdl0pID0+IHR5cGVUb1N0cmluZyh0eXBlT2Yodi5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICd0by1yZ2JhJzogW1xuICAgICAgICBhcnJheShOdW1iZXJUeXBlLCA0KSxcbiAgICAgICAgW0NvbG9yVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHYuZXZhbHVhdGUoY3R4KS50b0FycmF5KCk7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdyZ2InOiBbXG4gICAgICAgIENvbG9yVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICByZ2JhXG4gICAgXSxcbiAgICAncmdiYSc6IFtcbiAgICAgICAgQ29sb3JUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZSwgTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIHJnYmFcbiAgICBdLFxuICAgICdoYXMnOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2tleV0pID0+IGhhcyhrZXkuZXZhbHVhdGUoY3R4KSwgY3R4LnByb3BlcnRpZXMoKSlcbiAgICAgICAgICAgIF0sIFtcbiAgICAgICAgICAgICAgICBbU3RyaW5nVHlwZSwgT2JqZWN0VHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2tleSwgb2JqXSkgPT4gaGFzKGtleS5ldmFsdWF0ZShjdHgpLCBvYmouZXZhbHVhdGUoY3R4KSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJ2dldCc6IHtcbiAgICAgICAgdHlwZTogVmFsdWVUeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2tleV0pID0+IGdldChrZXkuZXZhbHVhdGUoY3R4KSwgY3R4LnByb3BlcnRpZXMoKSlcbiAgICAgICAgICAgIF0sIFtcbiAgICAgICAgICAgICAgICBbU3RyaW5nVHlwZSwgT2JqZWN0VHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2tleSwgb2JqXSkgPT4gZ2V0KGtleS5ldmFsdWF0ZShjdHgpLCBvYmouZXZhbHVhdGUoY3R4KSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJ2ZlYXR1cmUtc3RhdGUnOiBbXG4gICAgICAgIFZhbHVlVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBba2V5XSkgPT4gZ2V0KGtleS5ldmFsdWF0ZShjdHgpLCBjdHguZmVhdHVyZVN0YXRlIHx8IHt9KVxuICAgIF0sXG4gICAgJ3Byb3BlcnRpZXMnOiBbXG4gICAgICAgIE9iamVjdFR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHgucHJvcGVydGllcygpXG4gICAgXSxcbiAgICAnZ2VvbWV0cnktdHlwZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nZW9tZXRyeVR5cGUoKVxuICAgIF0sXG4gICAgJ2lkJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguaWQoKVxuICAgIF0sXG4gICAgJ3pvb20nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy56b29tXG4gICAgXSxcbiAgICAnaGVhdG1hcC1kZW5zaXR5JzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuaGVhdG1hcERlbnNpdHkgfHwgMFxuICAgIF0sXG4gICAgJ2xpbmUtcHJvZ3Jlc3MnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy5saW5lUHJvZ3Jlc3MgfHwgMFxuICAgIF0sXG4gICAgJ2FjY3VtdWxhdGVkJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy5hY2N1bXVsYXRlZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN0eC5nbG9iYWxzLmFjY3VtdWxhdGVkXG4gICAgXSxcbiAgICAnKyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJyonOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSAxO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCAqPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICctJzoge1xuICAgICAgICB0eXBlOiBOdW1iZXJUeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgLSBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2FdKSA9PiAtYS5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICcvJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpIC8gYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnJSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAlIGIuZXZhbHVhdGUoY3R4KVxuICAgIF0sXG4gICAgJ2xuMic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguTE4yXG4gICAgXSxcbiAgICAncGknOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoKSA9PiBNYXRoLlBJXG4gICAgXSxcbiAgICAnZSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguRVxuICAgIF0sXG4gICAgJ14nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2IsIGVdKSA9PiBNYXRoLnBvdyhiLmV2YWx1YXRlKGN0eCksIGUuZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdzcXJ0JzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFt4XSkgPT4gTWF0aC5zcXJ0KHguZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cxMCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSkgLyBNYXRoLkxOMTBcbiAgICBdLFxuICAgICdsbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cyJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cobi5ldmFsdWF0ZShjdHgpKSAvIE1hdGguTE4yXG4gICAgXSxcbiAgICAnc2luJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5zaW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2Nvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguY29zKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICd0YW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLnRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXNpbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXNpbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYWNvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYWNvcyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXRhbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbWluJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBNYXRoLm1pbiguLi5hcmdzLm1hcChhcmcgPT4gYXJnLmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ21heCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gTWF0aC5tYXgoLi4uYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICdhYnMnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmFicyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAncm91bmQnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gbi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gSmF2YXNjcmlwdCdzIE1hdGgucm91bmQoKSByb3VuZHMgdG93YXJkcyArSW5maW5pdHkgZm9yIGhhbGZ3YXlcbiAgICAgICAgICAgIC8vIHZhbHVlcywgZXZlbiB3aGVuIHRoZXkncmUgbmVnYXRpdmUuIEl0J3MgbW9yZSBjb21tb24gdG8gcm91bmRcbiAgICAgICAgICAgIC8vIGF3YXkgZnJvbSAwIChlLmcuLCB0aGlzIGlzIHdoYXQgcHl0aG9uIGFuZCBDKysgZG8pXG4gICAgICAgICAgICByZXR1cm4gdiA8IDAgPyAtTWF0aC5yb3VuZCgtdikgOiBNYXRoLnJvdW5kKHYpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmxvb3InOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmZsb29yKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdjZWlsJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5jZWlsKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdmaWx0ZXItPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguaWQoKSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItdHlwZS09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICh2OiBhbnkpLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLTw9JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDw9IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPD0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPD0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci0+PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT49JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID49IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaGFzJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrXSkgPT4gKGs6IGFueSkudmFsdWUgaW4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2ZpbHRlci1oYXMtaWQnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gKGN0eC5pZCgpICE9PSBudWxsICYmIGN0eC5pZCgpICE9PSB1bmRlZmluZWQpXG4gICAgXSxcbiAgICAnZmlsdGVyLXR5cGUtaW4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbYXJyYXkoU3RyaW5nVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4Lmdlb21ldHJ5VHlwZSgpKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLWluJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW2FycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4LmlkKCkpID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaW4tc21hbGwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIC8vIGFzc3VtZXMgdiBpcyBhbiBhcnJheSBsaXRlcmFsXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gKHY6IGFueSkudmFsdWUuaW5kZXhPZihjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pbi1sYXJnZSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBhcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgLy8gYXNzdW1lcyB2IGlzIGEgYXJyYXkgbGl0ZXJhbCB3aXRoIHZhbHVlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBvZiBhIHNpbmdsZSB0eXBlXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gYmluYXJ5U2VhcmNoKGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdLCAodjogYW55KS52YWx1ZSwgMCwgKHY6IGFueSkudmFsdWUubGVuZ3RoIC0gMSlcbiAgICBdLFxuICAgICdhbGwnOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAmJiBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdhbnknOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSB8fCBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJyEnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbQm9vbGVhblR5cGVdLFxuICAgICAgICAoY3R4LCBbYl0pID0+ICFiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICdpcy1zdXBwb3J0ZWQtc2NyaXB0JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAvLyBBdCBwYXJzZSB0aW1lIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUsIHNvIHdlIG5lZWQgdG8gZXhjbHVkZSB0aGlzIGV4cHJlc3Npb24gd2l0aCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnRcbiAgICAgICAgKGN0eCwgW3NdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1N1cHBvcnRlZFNjcmlwdCA9IGN0eC5nbG9iYWxzICYmIGN0eC5nbG9iYWxzLmlzU3VwcG9ydGVkU2NyaXB0O1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkU2NyaXB0KHMuZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3VwY2FzZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbc10pID0+IHMuZXZhbHVhdGUoY3R4KS50b1VwcGVyQ2FzZSgpXG4gICAgXSxcbiAgICAnZG93bmNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9Mb3dlckNhc2UoKVxuICAgIF0sXG4gICAgJ2NvbmNhdCc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgdmFyYXJncyhWYWx1ZVR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBhcmdzLm1hcChhcmcgPT4gdmFsdWVUb1N0cmluZyhhcmcuZXZhbHVhdGUoY3R4KSkpLmpvaW4oJycpXG4gICAgXSxcbiAgICAncmVzb2x2ZWQtbG9jYWxlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbQ29sbGF0b3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW2NvbGxhdG9yXSkgPT4gY29sbGF0b3IuZXZhbHVhdGUoY3R4KS5yZXNvbHZlZExvY2FsZSgpXG4gICAgXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGV4cHJlc3Npb25zO1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBBIHR5cGUgdXNlZCBmb3IgcmV0dXJuaW5nIGFuZCBwcm9wYWdhdGluZyBlcnJvcnMuIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB1bmlvblxuICogcmVwcmVzZW50cyBzdWNjZXNzIGFuZCBjb250YWlucyBhIHZhbHVlLCBhbmQgdGhlIHNlY29uZCByZXByZXNlbnRzIGFuIGVycm9yIGFuZFxuICogY29udGFpbnMgYW4gZXJyb3IgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRT4gPVxuICAgIHwge3wgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlOiBUIHx9XG4gICAgfCB7fCByZXN1bHQ6ICdlcnJvcicsIHZhbHVlOiBFIHx9O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzczxULCBFPih2YWx1ZTogVCk6IFJlc3VsdDxULCBFPiB7XG4gICAgcmV0dXJuIHtyZXN1bHQ6ICdzdWNjZXNzJywgdmFsdWV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3I8VCwgRT4odmFsdWU6IEUpOiBSZXN1bHQ8VCwgRT4ge1xuICAgIHJldHVybiB7cmVzdWx0OiAnZXJyb3InLCB2YWx1ZX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3BlY1sncHJvcGVydHktdHlwZSddID09PSAnZGF0YS1kcml2ZW4nIHx8IHNwZWNbJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLnBhcmFtZXRlcnMuaW5kZXhPZignem9vbScpID4gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ludGVycG9sYXRpb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLmludGVycG9sYXRlZDtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFR5cGUodmFsOiBtaXhlZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWw7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgKiBhcyBjb2xvclNwYWNlcyBmcm9tICcuLi91dGlsL2NvbG9yX3NwYWNlcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vdXRpbC9jb2xvcic7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vdXRpbC9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuaW1wb3J0IHtzdXBwb3J0c0ludGVycG9sYXRpb259IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcyc7XG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL2V4cHJlc3Npb24vc3RvcHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHlGdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpIHtcbiAgICBjb25zdCBpc0NvbG9yID0gcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcic7XG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdID09PSAnb2JqZWN0JztcbiAgICBjb25zdCBmZWF0dXJlRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgcGFyYW1ldGVycy5wcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvb21EZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCAhZmVhdHVyZURlcGVuZGVudDtcbiAgICBjb25zdCB0eXBlID0gcGFyYW1ldGVycy50eXBlIHx8IChzdXBwb3J0c0ludGVycG9sYXRpb24ocHJvcGVydHlTcGVjKSA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnKTtcblxuICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBleHRlbmQoe30sIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzID0gcGFyYW1ldGVycy5zdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIENvbG9yLnBhcnNlKHN0b3BbMV0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocGFyYW1ldGVycy5kZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdCA9IENvbG9yLnBhcnNlKHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJyAmJiAhY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiAke3BhcmFtZXRlcnMuY29sb3JTcGFjZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgaW5uZXJGdW47XG4gICAgbGV0IGhhc2hlZFN0b3BzO1xuICAgIGxldCBjYXRlZ29yaWNhbEtleVR5cGU7XG4gICAgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbjtcblxuICAgICAgICAvLyBGb3IgY2F0ZWdvcmljYWwgZnVuY3Rpb25zLCBnZW5lcmF0ZSBhbiBPYmplY3QgYXMgYSBoYXNobWFwIG9mIHRoZSBzdG9wcyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAgICAgICAgaGFzaGVkU3RvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0b3Agb2YgcGFyYW1ldGVycy5zdG9wcykge1xuICAgICAgICAgICAgaGFzaGVkU3RvcHNbc3RvcFswXV0gPSBzdG9wWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIga2V5IHR5cGUgYmFzZWQgb24gZmlyc3Qgc3RvcCBrZXktLSB1c2VkIHRvIGVuY2ZvcmNlIHN0cmljdCB0eXBlIGNoZWNraW5nIGxhdGVyXG4gICAgICAgIGNhdGVnb3JpY2FsS2V5VHlwZSA9IHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJZGVudGl0eUZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdW5jdGlvbiB0eXBlIFwiJHt0eXBlfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKHpvb21BbmRGZWF0dXJlRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVGdW5jdGlvbnMgPSB7fTtcbiAgICAgICAgY29uc3Qgem9vbVN0b3BzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHBhcmFtZXRlcnMuc3RvcHNbc107XG4gICAgICAgICAgICBjb25zdCB6b29tID0gc3RvcFswXS56b29tO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHBhcmFtZXRlcnMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHBhcmFtZXRlcnMuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB6b29tU3RvcHMucHVzaCh6b29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0uc3RvcHMucHVzaChbc3RvcFswXS52YWx1ZSwgc3RvcFsxXV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB6IG9mIHpvb21TdG9wcykge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHMucHVzaChbZmVhdHVyZUZ1bmN0aW9uc1t6XS56b29tLCBjcmVhdGVGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25zW3pdLCBwcm9wZXJ0eVNwZWMpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25UeXBlID0gdHlwZSA9PT0gJ2V4cG9uZW50aWFsJyA/XG4gICAgICAgICAgICB7bmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogcGFyYW1ldGVycy5iYXNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmJhc2UgOiAxfSA6IG51bGw7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBwYXJhbWV0ZXJzLnN0b3BzLm1hcChzID0+IHNbMF0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICh7em9vbX0pID0+IGlubmVyRnVuKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgem9vbSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ3NvdXJjZScsXG4gICAgICAgICAgICBldmFsdWF0ZShfLCBmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcyA/IGZlYXR1cmUucHJvcGVydGllc1twYXJhbWV0ZXJzLnByb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHZhbHVlLCBoYXNoZWRTdG9wcywgY2F0ZWdvcmljYWxLZXlUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYTtcbiAgICBpZiAoYiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQsIGhhc2hlZFN0b3BzLCBrZXlUeXBlKSB7XG4gICAgY29uc3QgZXZhbHVhdGVkID0gdHlwZW9mIGlucHV0ID09PSBrZXlUeXBlID8gaGFzaGVkU3RvcHNbaW5wdXRdIDogdW5kZWZpbmVkOyAvLyBFbmZvcmNlIHN0cmljdCB0eXBpbmcgb24gaW5wdXRcbiAgICByZXR1cm4gY29hbGVzY2UoZXZhbHVhdGVkLCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQpIHtcbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBpbnB1dCkge1xuICAgIGNvbnN0IGJhc2UgPSBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDE7XG5cbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG5cbiAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgY29uc3QgY29sb3JzcGFjZSA9IGNvbG9yU3BhY2VzW3BhcmFtZXRlcnMuY29sb3JTcGFjZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBpbnRlcnAgPSAoYSwgYikgPT4gY29sb3JzcGFjZS5yZXZlcnNlKGNvbG9yc3BhY2UuaW50ZXJwb2xhdGUoY29sb3JzcGFjZS5mb3J3YXJkKGEpLCBjb2xvcnNwYWNlLmZvcndhcmQoYiksIHQpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG91dHB1dExvd2VyLmV2YWx1YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmFsdWF0ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkTG93ZXIgPSBvdXRwdXRMb3dlci5ldmFsdWF0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpbGwtb3V0bGluZS1jb2xvciwgd2hpY2ggaGFzIG5vIHNwZWMgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdGVkTG93ZXIgPT09IHVuZGVmaW5lZCB8fCBldmFsdWF0ZWRVcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAoZXZhbHVhdGVkTG93ZXIsIGV2YWx1YXRlZFVwcGVyLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJwKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIGlucHV0ID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgIGlucHV0ID0gRm9ybWF0dGVkLmZyb21TdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgIGlucHV0ID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKGlucHV0LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSBpZiAoZ2V0VHlwZShpbnB1dCkgIT09IHByb3BlcnR5U3BlYy50eXBlICYmIChwcm9wZXJ0eVNwZWMudHlwZSAhPT0gJ2VudW0nIHx8ICFwcm9wZXJ0eVNwZWMudmFsdWVzW2lucHV0XSkpIHtcbiAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjb2FsZXNjZShpbnB1dCwgcGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKlxuICogSG93IGl0IHdvcmtzOlxuICogVHdvIGNvbnNlY3V0aXZlIHN0b3AgdmFsdWVzIGRlZmluZSBhIChzY2FsZWQgYW5kIHNoaWZ0ZWQpIGV4cG9uZW50aWFsXG4gKiBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRpb25GYWN0b3IoaW5wdXQsIGJhc2UsIGxvd2VyVmFsdWUsIHVwcGVyVmFsdWUpIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdXBwZXJWYWx1ZSAtIGxvd2VyVmFsdWU7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBpbnB1dCAtIGxvd2VyVmFsdWU7XG5cbiAgICBpZiAoZGlmZmVyZW5jZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzIC8gZGlmZmVyZW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKE1hdGgucG93KGJhc2UsIHByb2dyZXNzKSAtIDEpIC8gKE1hdGgucG93KGJhc2UsIGRpZmZlcmVuY2UpIC0gMSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yJztcbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dCc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuL2NvbXBvdW5kX2V4cHJlc3Npb24nO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi9kZWZpbml0aW9ucy9zdGVwJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlJztcbmltcG9ydCBDb2FsZXNjZSBmcm9tICcuL2RlZmluaXRpb25zL2NvYWxlc2NlJztcbmltcG9ydCBMZXQgZnJvbSAnLi9kZWZpbml0aW9ucy9sZXQnO1xuaW1wb3J0IGRlZmluaXRpb25zIGZyb20gJy4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0ICogYXMgaXNDb25zdGFudCBmcm9tICcuL2lzX2NvbnN0YW50JztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi9ydW50aW1lX2Vycm9yJztcbmltcG9ydCB7c3VjY2VzcywgZXJyb3J9IGZyb20gJy4uL3V0aWwvcmVzdWx0JztcbmltcG9ydCB7c3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24sIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sIHN1cHBvcnRzSW50ZXJwb2xhdGlvbn0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1R5cGUsIEV2YWx1YXRpb25LaW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMnO1xuaW1wb3J0IHR5cGUge1Jlc3VsdH0gZnJvbSAnLi4vdXRpbC9yZXN1bHQnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlID0ge1xuICAgICt0eXBlOiAxIHwgMiB8IDMgfCAnVW5rbm93bicgfCAnUG9pbnQnIHwgJ011bHRpUG9pbnQnIHwgJ0xpbmVTdHJpbmcnIHwgJ011bHRpTGluZVN0cmluZycgfCAnUG9seWdvbicgfCAnTXVsdGlQb2x5Z29uJyxcbiAgICAraWQ/OiBhbnksXG4gICAgK3Byb3BlcnRpZXM6IHtbXzogc3RyaW5nXTogYW55fSxcbiAgICArcGF0dGVybnM/OiB7W186IHN0cmluZ106IHtcIm1pblwiOiBzdHJpbmcsIFwibWlkXCI6IHN0cmluZywgXCJtYXhcIjogc3RyaW5nfX0sXG4gICAgK2dlb21ldHJ5PzogQXJyYXk8QXJyYXk8UG9pbnQ+PlxufTtcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlID0ge1tfOiBzdHJpbmddOiBhbnl9O1xuXG5leHBvcnQgdHlwZSBHbG9iYWxQcm9wZXJ0aWVzID0gJFJlYWRPbmx5PHtcbiAgICB6b29tOiBudW1iZXIsXG4gICAgaGVhdG1hcERlbnNpdHk/OiBudW1iZXIsXG4gICAgbGluZVByb2dyZXNzPzogbnVtYmVyLFxuICAgIGlzU3VwcG9ydGVkU2NyaXB0PzogKF86IHN0cmluZykgPT4gYm9vbGVhbixcbiAgICBhY2N1bXVsYXRlZD86IFZhbHVlXG59PjtcblxuZXhwb3J0IGNsYXNzIFN0eWxlRXhwcmVzc2lvbiB7XG4gICAgZXhwcmVzc2lvbjogRXhwcmVzc2lvbjtcblxuICAgIF9ldmFsdWF0b3I6IEV2YWx1YXRpb25Db250ZXh0O1xuICAgIF9kZWZhdWx0VmFsdWU6IFZhbHVlO1xuICAgIF93YXJuaW5nSGlzdG9yeToge1trZXk6IHN0cmluZ106IGJvb2xlYW59O1xuICAgIF9lbnVtVmFsdWVzOiA/e1tfOiBzdHJpbmddOiBhbnl9O1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogRXhwcmVzc2lvbiwgcHJvcGVydHlTcGVjOiA/U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5fd2FybmluZ0hpc3RvcnkgPSB7fTtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHByb3BlcnR5U3BlYyA/IGdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eVNwZWMpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fZW51bVZhbHVlcyA9IHByb3BlcnR5U3BlYyAmJiBwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ2VudW0nID8gcHJvcGVydHlTcGVjLnZhbHVlcyA6IG51bGw7XG4gICAgfVxuXG4gICAgZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlU3RhdGUgPSBmZWF0dXJlU3RhdGU7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5jYW5vbmljYWwgPSBjYW5vbmljYWw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXMgPSBhdmFpbGFibGVJbWFnZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZvcm1hdHRlZFNlY3Rpb24gPSBmb3JtYXR0ZWRTZWN0aW9uO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVTdGF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gY2Fub25pY2FsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuYXZhaWxhYmxlSW1hZ2VzID0gYXZhaWxhYmxlSW1hZ2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbiB8fCBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCAhPT0gdmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZW51bVZhbHVlcyAmJiAhKHZhbCBpbiB0aGlzLl9lbnVtVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9uZSBvZiAke09iamVjdC5rZXlzKHRoaXMuX2VudW1WYWx1ZXMpLm1hcCh2ID0+IEpTT04uc3RyaW5naWZ5KHYpKS5qb2luKCcsICcpfSwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkodmFsKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fd2FybmluZ0hpc3RvcnlbZS5tZXNzYWdlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhcm5pbmdIaXN0b3J5W2UubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihleHByZXNzaW9uOiBtaXhlZCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pICYmIGV4cHJlc3Npb24ubGVuZ3RoID4gMCAmJlxuICAgICAgICB0eXBlb2YgZXhwcmVzc2lvblswXSA9PT0gJ3N0cmluZycgJiYgZXhwcmVzc2lvblswXSBpbiBkZWZpbml0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJzZSBhbmQgdHlwZWNoZWNrIHRoZSBnaXZlbiBzdHlsZSBzcGVjIEpTT04gZXhwcmVzc2lvbi4gIElmXG4gKiBvcHRpb25zLmRlZmF1bHRWYWx1ZSBpcyBwcm92aWRlZCwgdGhlbiB0aGUgcmVzdWx0aW5nIFN0eWxlRXhwcmVzc2lvbidzXG4gKiBgZXZhbHVhdGUoKWAgbWV0aG9kIHdpbGwgaGFuZGxlIGVycm9ycyBieSBsb2dnaW5nIGEgd2FybmluZyAob25jZSBwZXJcbiAqIG1lc3NhZ2UpIGFuZCByZXR1cm5pbmcgdGhlIGRlZmF1bHQgdmFsdWUuICBPdGhlcndpc2UsIGl0IHdpbGwgdGhyb3dcbiAqIGV2YWx1YXRpb24gZXJyb3JzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb246IG1peGVkLCBwcm9wZXJ0eVNwZWM6ID9TdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFJlc3VsdDxTdHlsZUV4cHJlc3Npb24sIEFycmF5PFBhcnNpbmdFcnJvcj4+IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2luZ0NvbnRleHQoZGVmaW5pdGlvbnMsIFtdLCBwcm9wZXJ0eVNwZWMgPyBnZXRFeHBlY3RlZFR5cGUocHJvcGVydHlTcGVjKSA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBGb3Igc3RyaW5nLXZhbHVlZCBwcm9wZXJ0aWVzLCBjb2VyY2UgdG8gc3RyaW5nIGF0IHRoZSB0b3AgbGV2ZWwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nLlxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlci5wYXJzZShleHByZXNzaW9uLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLFxuICAgICAgICBwcm9wZXJ0eVNwZWMgJiYgcHJvcGVydHlTcGVjLnR5cGUgPT09ICdzdHJpbmcnID8ge3R5cGVBbm5vdGF0aW9uOiAnY29lcmNlJ30gOiB1bmRlZmluZWQpO1xuXG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgICAgYXNzZXJ0KHBhcnNlci5lcnJvcnMubGVuZ3RoID4gMCk7XG4gICAgICAgIHJldHVybiBlcnJvcihwYXJzZXIuZXJyb3JzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcyhuZXcgU3R5bGVFeHByZXNzaW9uKHBhcnNlZCwgcHJvcGVydHlTcGVjKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBab29tQ29uc3RhbnRFeHByZXNzaW9uPEtpbmQ6IEV2YWx1YXRpb25LaW5kPiB7XG4gICAga2luZDogS2luZDtcbiAgICBpc1N0YXRlRGVwZW5kZW50OiBib29sZWFuO1xuICAgIF9zdHlsZUV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQ6IEtpbmQsIGV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBraW5kICE9PSAoJ2NvbnN0YW50JzogRXZhbHVhdGlvbktpbmQpICYmICFpc0NvbnN0YW50LmlzU3RhdGVDb25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBab29tRGVwZW5kZW50RXhwcmVzc2lvbjxLaW5kOiBFdmFsdWF0aW9uS2luZD4ge1xuICAgIGtpbmQ6IEtpbmQ7XG4gICAgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+O1xuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW47XG5cbiAgICBfc3R5bGVFeHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb247XG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGtpbmQ6IEtpbmQsIGV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbiwgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+LCBpbnRlcnBvbGF0aW9uVHlwZT86IEludGVycG9sYXRpb25UeXBlKSB7XG4gICAgICAgIHRoaXMua2luZCA9IGtpbmQ7XG4gICAgICAgIHRoaXMuem9vbVN0b3BzID0gem9vbVN0b3BzO1xuICAgICAgICB0aGlzLl9zdHlsZUV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLmlzU3RhdGVEZXBlbmRlbnQgPSBraW5kICE9PSAoJ2NhbWVyYSc6IEV2YWx1YXRpb25LaW5kKSAmJiAhaXNDb25zdGFudC5pc1N0YXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uVHlwZSA9IGludGVycG9sYXRpb25UeXBlO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yKGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnBvbGF0aW9uVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IodGhpcy5pbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQsIGxvd2VyLCB1cHBlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgQ29uc3RhbnRFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjb25zdGFudCcsXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KSA9PiBhbnksXG59XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ3NvdXJjZScsXG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbixcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSA9PiBhbnksXG59O1xuXG5leHBvcnQgdHlwZSBDYW1lcmFFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjYW1lcmEnLFxuICAgICtldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPikgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59O1xuXG5leHBvcnQgdHlwZSBDb21wb3NpdGVFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdjb21wb3NpdGUnLFxuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW4sXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikgPT4gYW55LFxuICAgICtpbnRlcnBvbGF0aW9uRmFjdG9yOiAoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiA9XG4gICAgfCBDb25zdGFudEV4cHJlc3Npb25cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENhbWVyYUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQsIHByb3BlcnR5U3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBSZXN1bHQ8U3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24sIEFycmF5PFBhcnNpbmdFcnJvcj4+IHtcbiAgICBleHByZXNzaW9uID0gY3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uLCBwcm9wZXJ0eVNwZWMpO1xuICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBleHByZXNzaW9uLnZhbHVlLmV4cHJlc3Npb247XG5cbiAgICBjb25zdCBpc0ZlYXR1cmVDb25zdGFudCA9IGlzQ29uc3RhbnQuaXNGZWF0dXJlQ29uc3RhbnQocGFyc2VkKTtcbiAgICBpZiAoIWlzRmVhdHVyZUNvbnN0YW50ICYmICFzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ2RhdGEgZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZCcpXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNab29tQ29uc3RhbnQgPSBpc0NvbnN0YW50LmlzR2xvYmFsUHJvcGVydHlDb25zdGFudChwYXJzZWQsIFsnem9vbSddKTtcbiAgICBpZiAoIWlzWm9vbUNvbnN0YW50ICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnem9vbSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkJyldKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b29tQ3VydmUgPSBmaW5kWm9vbUN1cnZlKHBhcnNlZCk7XG4gICAgaWYgKCF6b29tQ3VydmUgJiYgIWlzWm9vbUNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKV0pO1xuICAgIH0gZWxzZSBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbem9vbUN1cnZlXSk7XG4gICAgfSBlbHNlIGlmICh6b29tQ3VydmUgaW5zdGFuY2VvZiBJbnRlcnBvbGF0ZSAmJiAhc3VwcG9ydHNJbnRlcnBvbGF0aW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyBwcm9wZXJ0eScpXSk7XG4gICAgfVxuXG4gICAgaWYgKCF6b29tQ3VydmUpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MoaXNGZWF0dXJlQ29uc3RhbnQgP1xuICAgICAgICAgICAgKG5ldyBab29tQ29uc3RhbnRFeHByZXNzaW9uKCdjb25zdGFudCcsIGV4cHJlc3Npb24udmFsdWUpOiBDb25zdGFudEV4cHJlc3Npb24pIDpcbiAgICAgICAgICAgIChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignc291cmNlJywgZXhwcmVzc2lvbi52YWx1ZSk6IFNvdXJjZUV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHpvb21DdXJ2ZSBpbnN0YW5jZW9mIEludGVycG9sYXRlID8gem9vbUN1cnZlLmludGVycG9sYXRpb24gOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gc3VjY2Vzcyhpc0ZlYXR1cmVDb25zdGFudCA/XG4gICAgICAgIChuZXcgWm9vbURlcGVuZGVudEV4cHJlc3Npb24oJ2NhbWVyYScsIGV4cHJlc3Npb24udmFsdWUsIHpvb21DdXJ2ZS5sYWJlbHMsIGludGVycG9sYXRpb25UeXBlKTogQ2FtZXJhRXhwcmVzc2lvbikgOlxuICAgICAgICAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjb21wb3NpdGUnLCBleHByZXNzaW9uLnZhbHVlLCB6b29tQ3VydmUubGFiZWxzLCBpbnRlcnBvbGF0aW9uVHlwZSk6IENvbXBvc2l0ZUV4cHJlc3Npb24pKTtcbn1cblxuaW1wb3J0IHtpc0Z1bmN0aW9uLCBjcmVhdGVGdW5jdGlvbn0gZnJvbSAnLi4vZnVuY3Rpb24nO1xuaW1wb3J0IHtDb2xvcn0gZnJvbSAnLi92YWx1ZXMnO1xuXG4vLyBzZXJpYWxpemF0aW9uIHdyYXBwZXIgZm9yIG9sZC1zdHlsZSBzdG9wIGZ1bmN0aW9ucyBub3JtYWxpemVkIHRvIHRoZVxuLy8gZXhwcmVzc2lvbiBpbnRlcmZhY2VcbmV4cG9ydCBjbGFzcyBTdHlsZVByb3BlcnR5RnVuY3Rpb248VD4ge1xuICAgIF9wYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPjtcbiAgICBfc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBraW5kOiBFdmFsdWF0aW9uS2luZDtcbiAgICBldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlKSA9PiBhbnk7XG4gICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogPyhpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSA9PiBudW1iZXI7XG4gICAgem9vbVN0b3BzOiA/QXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgdGhpcy5fc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIGV4dGVuZCh0aGlzLCBjcmVhdGVGdW5jdGlvbih0aGlzLl9wYXJhbWV0ZXJzLCB0aGlzLl9zcGVjaWZpY2F0aW9uKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQ6IHtfcGFyYW1ldGVyczogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4sIF9zcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbn0pIHtcbiAgICAgICAgcmV0dXJuICgobmV3IFN0eWxlUHJvcGVydHlGdW5jdGlvbihzZXJpYWxpemVkLl9wYXJhbWV0ZXJzLCBzZXJpYWxpemVkLl9zcGVjaWZpY2F0aW9uKSk6IFN0eWxlUHJvcGVydHlGdW5jdGlvbjxUPik7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShpbnB1dDogU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfcGFyYW1ldGVyczogaW5wdXQuX3BhcmFtZXRlcnMsXG4gICAgICAgICAgICBfc3BlY2lmaWNhdGlvbjogaW5wdXQuX3NwZWNpZmljYXRpb25cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb248VD4odmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTogYW55KTtcblxuICAgIH0gZWxzZSBpZiAoaXNFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gY3JlYXRlUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24ucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGluIHZhbGlkYXRpb25cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihleHByZXNzaW9uLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY29uc3RhbnQ6IGFueSA9IHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzcGVjaWZpY2F0aW9uLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0YW50ID0gQ29sb3IucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICgpID0+IGNvbnN0YW50XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vLyBab29tLWRlcGVuZGVudCBleHByZXNzaW9ucyBtYXkgb25seSB1c2UgW1wiem9vbVwiXSBhcyB0aGUgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiXG4vLyBleHByZXNzaW9uIChjb2xsZWN0aXZlbHkgcmVmZXJyZWQgdG8gYXMgYSBcImN1cnZlXCIpLiBUaGUgY3VydmUgbWF5IGJlIHdyYXBwZWQgaW4gb25lIG9yIG1vcmUgXCJsZXRcIiBvclxuLy8gXCJjb2FsZXNjZVwiIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uOiBFeHByZXNzaW9uKTogU3RlcCB8IEludGVycG9sYXRlIHwgUGFyc2luZ0Vycm9yIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMZXQpIHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uLnJlc3VsdCk7XG5cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2FsZXNjZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByZXNzaW9uLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRab29tQ3VydmUoYXJnKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0ZXAgfHwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEludGVycG9sYXRlKSAmJlxuICAgICAgICBleHByZXNzaW9uLmlucHV0IGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmXG4gICAgICAgIGV4cHJlc3Npb24uaW5wdXQubmFtZSA9PT0gJ3pvb20nKSB7XG5cbiAgICAgICAgcmVzdWx0ID0gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZFpvb21DdXJ2ZShjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZFJlc3VsdCBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2hpbGRSZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdCAmJiBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgJiYgY2hpbGRSZXN1bHQgJiYgcmVzdWx0ICE9PSBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ09ubHkgb25lIHpvb20tYmFzZWQgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIHN1YmV4cHJlc3Npb24gbWF5IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuaW1wb3J0IHtDb2xvclR5cGUsIFN0cmluZ1R5cGUsIE51bWJlclR5cGUsIEJvb2xlYW5UeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIFJlc29sdmVkSW1hZ2VUeXBlLCBhcnJheX0gZnJvbSAnLi90eXBlcyc7XG5cbmZ1bmN0aW9uIGdldEV4cGVjdGVkVHlwZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFR5cGUge1xuICAgIGNvbnN0IHR5cGVzID0ge1xuICAgICAgICBjb2xvcjogQ29sb3JUeXBlLFxuICAgICAgICBzdHJpbmc6IFN0cmluZ1R5cGUsXG4gICAgICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICAgICAgZW51bTogU3RyaW5nVHlwZSxcbiAgICAgICAgYm9vbGVhbjogQm9vbGVhblR5cGUsXG4gICAgICAgIGZvcm1hdHRlZDogRm9ybWF0dGVkVHlwZSxcbiAgICAgICAgcmVzb2x2ZWRJbWFnZTogUmVzb2x2ZWRJbWFnZVR5cGVcbiAgICB9O1xuXG4gICAgaWYgKHNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gYXJyYXkodHlwZXNbc3BlYy52YWx1ZV0gfHwgVmFsdWVUeXBlLCBzcGVjLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzW3NwZWMudHlwZV07XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFZhbHVlIHtcbiAgICBpZiAoc3BlYy50eXBlID09PSAnY29sb3InICYmIGlzRnVuY3Rpb24oc3BlYy5kZWZhdWx0KSkge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGhlYXRtYXAtY29sb3I6IGl0IHVzZXMgdGhlICdkZWZhdWx0OicgdG8gZGVmaW5lIGFcbiAgICAgICAgLy8gZGVmYXVsdCBjb2xvciByYW1wLCBidXQgY3JlYXRlRXhwcmVzc2lvbiBleHBlY3RzIGEgc2ltcGxlIHZhbHVlIHRvIGZhbGxcbiAgICAgICAgLy8gYmFjayB0byBpbiBjYXNlIG9mIHJ1bnRpbWUgZXJyb3JzXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgfSBlbHNlIGlmIChzcGVjLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLnBhcnNlKHNwZWMuZGVmYXVsdCkgfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNwZWMuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzcGVjLmRlZmF1bHQ7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgR3JpZCBmcm9tICdncmlkLWluZGV4JztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IHtTdHlsZVByb3BlcnR5RnVuY3Rpb24sIFN0eWxlRXhwcmVzc2lvbiwgWm9vbURlcGVuZGVudEV4cHJlc3Npb24sIFpvb21Db25zdGFudEV4cHJlc3Npb259IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uJztcbmltcG9ydCBleHByZXNzaW9ucyBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuY29uc3Qge0ltYWdlRGF0YSwgSW1hZ2VCaXRtYXB9ID0gd2luZG93O1xuXG5pbXBvcnQgdHlwZSB7VHJhbnNmZXJhYmxlfSBmcm9tICcuLi90eXBlcy90cmFuc2ZlcmFibGUnO1xuXG50eXBlIFNlcmlhbGl6ZWRPYmplY3QgPSB7W186IHN0cmluZ106IFNlcmlhbGl6ZWQgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZCA9XG4gICAgfCBudWxsXG4gICAgfCB2b2lkXG4gICAgfCBib29sZWFuXG4gICAgfCBudW1iZXJcbiAgICB8IHN0cmluZ1xuICAgIHwgQm9vbGVhblxuICAgIHwgTnVtYmVyXG4gICAgfCBTdHJpbmdcbiAgICB8IERhdGVcbiAgICB8IFJlZ0V4cFxuICAgIHwgQXJyYXlCdWZmZXJcbiAgICB8ICRBcnJheUJ1ZmZlclZpZXdcbiAgICB8IEltYWdlRGF0YVxuICAgIHwgQXJyYXk8U2VyaWFsaXplZD5cbiAgICB8IFNlcmlhbGl6ZWRPYmplY3Q7XG5cbnR5cGUgUmVnaXN0cnkgPSB7XG4gICAgW186IHN0cmluZ106IHtcbiAgICAgICAga2xhc3M6IENsYXNzPGFueT4sXG4gICAgICAgIG9taXQ6ICRSZWFkT25seUFycmF5PHN0cmluZz4sXG4gICAgICAgIHNoYWxsb3c6ICRSZWFkT25seUFycmF5PHN0cmluZz5cbiAgICB9XG59O1xuXG50eXBlIFJlZ2lzdGVyT3B0aW9uczxUPiA9IHtcbiAgICBvbWl0PzogJFJlYWRPbmx5QXJyYXk8JEtleXM8VD4+LFxuICAgIHNoYWxsb3c/OiAkUmVhZE9ubHlBcnJheTwkS2V5czxUPj5cbn1cblxuY29uc3QgcmVnaXN0cnk6IFJlZ2lzdHJ5ID0ge307XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIGdpdmVuIGNsYXNzIGFzIHNlcmlhbGl6YWJsZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMub21pdCBMaXN0IG9mIHByb3BlcnRpZXMgdG8gb21pdCBmcm9tIHNlcmlhbGl6YXRpb24gKGUuZy4sIGNhY2hlZC9jb21wdXRlZCBwcm9wZXJ0aWVzKVxuICogQHBhcmFtIG9wdGlvbnMuc2hhbGxvdyBMaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgc2VyaWFsaXplZCBieSBhIHNpbXBsZSBzaGFsbG93IGNvcHksIHJhdGhlciB0aGFuIGJ5IGEgcmVjdXJzaXZlIGNhbGwgdG8gc2VyaWFsaXplKCkuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyPFQ6IGFueT4obmFtZTogc3RyaW5nLCBrbGFzczogQ2xhc3M8VD4sIG9wdGlvbnM6IFJlZ2lzdGVyT3B0aW9uczxUPiA9IHt9KSB7XG4gICAgYXNzZXJ0KCFyZWdpc3RyeVtuYW1lXSwgYCR7bmFtZX0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgIChPYmplY3QuZGVmaW5lUHJvcGVydHk6IGFueSkoa2xhc3MsICdfY2xhc3NSZWdpc3RyeUtleScsIHtcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHdyaXRlYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICByZWdpc3RyeVtuYW1lXSA9IHtcbiAgICAgICAga2xhc3MsXG4gICAgICAgIG9taXQ6IG9wdGlvbnMub21pdCB8fCBbXSxcbiAgICAgICAgc2hhbGxvdzogb3B0aW9ucy5zaGFsbG93IHx8IFtdXG4gICAgfTtcbn1cblxucmVnaXN0ZXIoJ09iamVjdCcsIE9iamVjdCk7XG5cbnR5cGUgU2VyaWFsaXplZEdyaWQgPSB7IGJ1ZmZlcjogQXJyYXlCdWZmZXIgfTtcblxuR3JpZC5zZXJpYWxpemUgPSBmdW5jdGlvbiBzZXJpYWxpemUoZ3JpZDogR3JpZCwgdHJhbnNmZXJhYmxlcz86IEFycmF5PFRyYW5zZmVyYWJsZT4pOiBTZXJpYWxpemVkR3JpZCB7XG4gICAgY29uc3QgYnVmZmVyID0gZ3JpZC50b0FycmF5QnVmZmVyKCk7XG4gICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGJ1ZmZlcik7XG4gICAgfVxuICAgIHJldHVybiB7YnVmZmVyfTtcbn07XG5cbkdyaWQuZGVzZXJpYWxpemUgPSBmdW5jdGlvbiBkZXNlcmlhbGl6ZShzZXJpYWxpemVkOiBTZXJpYWxpemVkR3JpZCk6IEdyaWQge1xuICAgIHJldHVybiBuZXcgR3JpZChzZXJpYWxpemVkLmJ1ZmZlcik7XG59O1xucmVnaXN0ZXIoJ0dyaWQnLCBHcmlkKTtcblxucmVnaXN0ZXIoJ0NvbG9yJywgQ29sb3IpO1xucmVnaXN0ZXIoJ0Vycm9yJywgRXJyb3IpO1xucmVnaXN0ZXIoJ1Jlc29sdmVkSW1hZ2UnLCBSZXNvbHZlZEltYWdlKTtcblxucmVnaXN0ZXIoJ1N0eWxlUHJvcGVydHlGdW5jdGlvbicsIFN0eWxlUHJvcGVydHlGdW5jdGlvbik7XG5yZWdpc3RlcignU3R5bGVFeHByZXNzaW9uJywgU3R5bGVFeHByZXNzaW9uLCB7b21pdDogWydfZXZhbHVhdG9yJ119KTtcblxucmVnaXN0ZXIoJ1pvb21EZXBlbmRlbnRFeHByZXNzaW9uJywgWm9vbURlcGVuZGVudEV4cHJlc3Npb24pO1xucmVnaXN0ZXIoJ1pvb21Db25zdGFudEV4cHJlc3Npb24nLCBab29tQ29uc3RhbnRFeHByZXNzaW9uKTtcbnJlZ2lzdGVyKCdDb21wb3VuZEV4cHJlc3Npb24nLCBDb21wb3VuZEV4cHJlc3Npb24sIHtvbWl0OiBbJ19ldmFsdWF0ZSddfSk7XG5mb3IgKGNvbnN0IG5hbWUgaW4gZXhwcmVzc2lvbnMpIHtcbiAgICBpZiAoKGV4cHJlc3Npb25zW25hbWVdOiBhbnkpLl9jbGFzc1JlZ2lzdHJ5S2V5KSBjb250aW51ZTtcbiAgICByZWdpc3RlcihgRXhwcmVzc2lvbl8ke25hbWV9YCwgZXhwcmVzc2lvbnNbbmFtZV0pO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCAmJiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICh2YWwgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCAodmFsLmNvbnN0cnVjdG9yICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXJyYXlCdWZmZXInKSk7XG59XG5cbmZ1bmN0aW9uIGlzSW1hZ2VCaXRtYXAodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSW1hZ2VCaXRtYXAgJiZcbiAgICAgICAgdmFsIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXA7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBnaXZlbiBvYmplY3QgZm9yIHRyYW5zZmVyIHRvIG9yIGZyb20gYSB3ZWIgd29ya2VyLlxuICpcbiAqIEZvciBub24tYnVpbHRpbiB0eXBlcywgcmVjdXJzaXZlbHkgc2VyaWFsaXplIGVhY2ggcHJvcGVydHkgKHBvc3NpYmx5XG4gKiBvbWl0dGluZyBjZXJ0YWluIHByb3BlcnRpZXMgLSBzZWUgcmVnaXN0ZXIoKSksIGFuZCBwYWNrYWdlIHRoZSByZXN1bHQgYWxvbmdcbiAqIHdpdGggdGhlIGNvbnN0cnVjdG9yJ3MgYG5hbWVgIHNvIHRoYXQgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIGNhbiBiZVxuICogbG9va2VkIHVwIGluIGBkZXNlcmlhbGl6ZSgpYC5cbiAqXG4gKiBJZiBhIGB0cmFuc2ZlcmFibGVzYCBhcnJheSBpcyBwcm92aWRlZCwgYWRkIGFueSB0cmFuc2ZlcmFibGUgb2JqZWN0cyAoaS5lLixcbiAqIGFueSBBcnJheUJ1ZmZlcnMgb3IgQXJyYXlCdWZmZXIgdmlld3MpIHRvIHRoZSBsaXN0LiAoSWYgYSBjb3B5IGlzIG5lZWRlZCxcbiAqIHRoaXMgc2hvdWxkIGhhcHBlbiBpbiB0aGUgY2xpZW50IGNvZGUsIGJlZm9yZSB1c2luZyBzZXJpYWxpemUoKS4pXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShpbnB1dDogbWl4ZWQsIHRyYW5zZmVyYWJsZXM6ID9BcnJheTxUcmFuc2ZlcmFibGU+KTogU2VyaWFsaXplZCB7XG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgIGlucHV0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIE51bWJlciB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5QnVmZmVyKGlucHV0KSB8fCBpc0ltYWdlQml0bWFwKGlucHV0KSkge1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKCgoaW5wdXQ6IGFueSk6IEFycmF5QnVmZmVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoaW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHZpZXc6ICRBcnJheUJ1ZmZlclZpZXcgPSAoaW5wdXQ6IGFueSk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2godmlldy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgIH1cblxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGlucHV0LmRhdGEuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IEFycmF5PFNlcmlhbGl6ZWQ+ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnB1dCkge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHNlcmlhbGl6ZShpdGVtLCB0cmFuc2ZlcmFibGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qga2xhc3MgPSAoaW5wdXQuY29uc3RydWN0b3I6IGFueSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBrbGFzcy5fY2xhc3NSZWdpc3RyeUtleTtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IHNlcmlhbGl6ZSBvYmplY3Qgb2YgdW5yZWdpc3RlcmVkIGNsYXNzYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHJlZ2lzdHJ5W25hbWVdKTtcblxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzOiBTZXJpYWxpemVkT2JqZWN0ID0ga2xhc3Muc2VyaWFsaXplID9cbiAgICAgICAgICAgIC8vIChUZW1wb3Jhcnkgd29ya2Fyb3VuZCkgYWxsb3cgYSBjbGFzcyB0byBwcm92aWRlIHN0YXRpY1xuICAgICAgICAgICAgLy8gYHNlcmlhbGl6ZSgpYCBhbmQgYGRlc2VyaWFsaXplKClgIG1ldGhvZHMgdG8gYnlwYXNzIHRoZSBnZW5lcmljXG4gICAgICAgICAgICAvLyBhcHByb2FjaC5cbiAgICAgICAgICAgIC8vIFRoaXMgdGVtcG9yYXJ5IHdvcmthcm91bmQgbGV0cyB1cyB1c2UgdGhlIGdlbmVyaWMgc2VyaWFsaXphdGlvblxuICAgICAgICAgICAgLy8gYXBwcm9hY2ggZm9yIG9iamVjdHMgd2hvc2UgbWVtYmVycyBpbmNsdWRlIGluc3RhbmNlcyBvZiBkeW5hbWljXG4gICAgICAgICAgICAvLyBTdHJ1Y3RBcnJheSB0eXBlcy4gT25jZSB3ZSByZWZhY3RvciBTdHJ1Y3RBcnJheSB0byBiZSBzdGF0aWMsXG4gICAgICAgICAgICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29tcGxleGl0eS5cbiAgICAgICAgICAgIChrbGFzcy5zZXJpYWxpemUoaW5wdXQsIHRyYW5zZmVyYWJsZXMpOiBTZXJpYWxpemVkT2JqZWN0KSA6IHt9O1xuXG4gICAgICAgIGlmICgha2xhc3Muc2VyaWFsaXplKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgICAgIC8vIGFueSBjYXN0IGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNTM5M1xuICAgICAgICAgICAgICAgIGlmICghKGlucHV0OiBhbnkpLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeVtuYW1lXS5vbWl0LmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IChpbnB1dDogYW55KVtrZXldO1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNba2V5XSA9IHJlZ2lzdHJ5W25hbWVdLnNoYWxsb3cuaW5kZXhPZihrZXkpID49IDAgP1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA6XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwcm9wZXJ0eSwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMubWVzc2FnZSA9IGlucHV0Lm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgc3RhdGljYWxseSBzZXJpYWxpemVkIG9iamVjdCBzdXJ2aXZlcyB0cmFuc2ZlciBvZiAkbmFtZSBwcm9wZXJ0eVxuICAgICAgICAgICAgYXNzZXJ0KCF0cmFuc2ZlcmFibGVzIHx8IHByb3BlcnRpZXMgIT09IHRyYW5zZmVyYWJsZXNbdHJhbnNmZXJhYmxlcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy4kbmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCckbmFtZSBwcm9wZXJ0eSBpcyByZXNlcnZlZCBmb3Igd29ya2VyIHNlcmlhbGl6YXRpb24gbG9naWMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgIT09ICdPYmplY3QnKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLiRuYW1lID0gbmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlICR7dHlwZW9mIGlucHV0fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUoaW5wdXQ6IFNlcmlhbGl6ZWQpOiBtaXhlZCB7XG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgIGlucHV0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIE51bWJlciB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAgICAgaXNBcnJheUJ1ZmZlcihpbnB1dCkgfHxcbiAgICAgICAgaXNJbWFnZUJpdG1hcChpbnB1dCkgfHxcbiAgICAgICAgQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoZGVzZXJpYWxpemUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAoaW5wdXQ6IGFueSkuJG5hbWUgfHwgJ09iamVjdCc7XG5cbiAgICAgICAgY29uc3Qge2tsYXNzfSA9IHJlZ2lzdHJ5W25hbWVdO1xuICAgICAgICBpZiAoIWtsYXNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGRlc2VyaWFsaXplIHVucmVnaXN0ZXJlZCBjbGFzcyAke25hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2xhc3MuZGVzZXJpYWxpemUpIHtcbiAgICAgICAgICAgIHJldHVybiAoa2xhc3MuZGVzZXJpYWxpemU6IHR5cGVvZiBkZXNlcmlhbGl6ZSkoaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShrbGFzcy5wcm90b3R5cGUpO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGlucHV0KSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJyRuYW1lJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IChpbnB1dDogU2VyaWFsaXplZE9iamVjdClba2V5XTtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcmVnaXN0cnlbbmFtZV0uc2hhbGxvdy5pbmRleE9mKGtleSkgPj0gMCA/IHZhbHVlIDogZGVzZXJpYWxpemUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGRlc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlICR7dHlwZW9mIGlucHV0fWApO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuXG5leHBvcnQgdHlwZSBTaXplID0ge1xuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXJcbn07XG5cbnR5cGUgUG9pbnQgPSB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlclxufTtcblxuZnVuY3Rpb24gY3JlYXRlSW1hZ2UoaW1hZ2U6ICosIHt3aWR0aCwgaGVpZ2h0fTogU2l6ZSwgY2hhbm5lbHM6IG51bWJlciwgZGF0YT86IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiBjaGFubmVscyk7XG4gICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoICE9PSB3aWR0aCAqIGhlaWdodCAqIGNoYW5uZWxzKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdtaXNtYXRjaGVkIGltYWdlIHNpemUnKTtcbiAgICB9XG4gICAgaW1hZ2Uud2lkdGggPSB3aWR0aDtcbiAgICBpbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgaW1hZ2UuZGF0YSA9IGRhdGE7XG4gICAgcmV0dXJuIGltYWdlO1xufVxuXG5mdW5jdGlvbiByZXNpemVJbWFnZShpbWFnZTogKiwge3dpZHRoLCBoZWlnaHR9OiBTaXplLCBjaGFubmVsczogbnVtYmVyKSB7XG4gICAgaWYgKHdpZHRoID09PSBpbWFnZS53aWR0aCAmJiBoZWlnaHQgPT09IGltYWdlLmhlaWdodCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3SW1hZ2UgPSBjcmVhdGVJbWFnZSh7fSwge3dpZHRoLCBoZWlnaHR9LCBjaGFubmVscyk7XG5cbiAgICBjb3B5SW1hZ2UoaW1hZ2UsIG5ld0ltYWdlLCB7eDogMCwgeTogMH0sIHt4OiAwLCB5OiAwfSwge1xuICAgICAgICB3aWR0aDogTWF0aC5taW4oaW1hZ2Uud2lkdGgsIHdpZHRoKSxcbiAgICAgICAgaGVpZ2h0OiBNYXRoLm1pbihpbWFnZS5oZWlnaHQsIGhlaWdodClcbiAgICB9LCBjaGFubmVscyk7XG5cbiAgICBpbWFnZS53aWR0aCA9IHdpZHRoO1xuICAgIGltYWdlLmhlaWdodCA9IGhlaWdodDtcbiAgICBpbWFnZS5kYXRhID0gbmV3SW1hZ2UuZGF0YTtcbn1cblxuZnVuY3Rpb24gY29weUltYWdlKHNyY0ltZzogKiwgZHN0SW1nOiAqLCBzcmNQdDogUG9pbnQsIGRzdFB0OiBQb2ludCwgc2l6ZTogU2l6ZSwgY2hhbm5lbHM6IG51bWJlcikge1xuICAgIGlmIChzaXplLndpZHRoID09PSAwIHx8IHNpemUuaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBkc3RJbWc7XG4gICAgfVxuXG4gICAgaWYgKHNpemUud2lkdGggPiBzcmNJbWcud2lkdGggfHxcbiAgICAgICAgc2l6ZS5oZWlnaHQgPiBzcmNJbWcuaGVpZ2h0IHx8XG4gICAgICAgIHNyY1B0LnggPiBzcmNJbWcud2lkdGggLSBzaXplLndpZHRoIHx8XG4gICAgICAgIHNyY1B0LnkgPiBzcmNJbWcuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBzb3VyY2UgY29vcmRpbmF0ZXMgZm9yIGltYWdlIGNvcHknKTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZS53aWR0aCA+IGRzdEltZy53aWR0aCB8fFxuICAgICAgICBzaXplLmhlaWdodCA+IGRzdEltZy5oZWlnaHQgfHxcbiAgICAgICAgZHN0UHQueCA+IGRzdEltZy53aWR0aCAtIHNpemUud2lkdGggfHxcbiAgICAgICAgZHN0UHQueSA+IGRzdEltZy5oZWlnaHQgLSBzaXplLmhlaWdodCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVzIGZvciBpbWFnZSBjb3B5Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3JjRGF0YSA9IHNyY0ltZy5kYXRhO1xuICAgIGNvbnN0IGRzdERhdGEgPSBkc3RJbWcuZGF0YTtcblxuICAgIGFzc2VydChzcmNEYXRhICE9PSBkc3REYXRhKTtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKykge1xuICAgICAgICBjb25zdCBzcmNPZmZzZXQgPSAoKHNyY1B0LnkgKyB5KSAqIHNyY0ltZy53aWR0aCArIHNyY1B0LngpICogY2hhbm5lbHM7XG4gICAgICAgIGNvbnN0IGRzdE9mZnNldCA9ICgoZHN0UHQueSArIHkpICogZHN0SW1nLndpZHRoICsgZHN0UHQueCkgKiBjaGFubmVscztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplLndpZHRoICogY2hhbm5lbHM7IGkrKykge1xuICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQgKyBpXSA9IHNyY0RhdGFbc3JjT2Zmc2V0ICsgaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRzdEltZztcbn1cblxuZXhwb3J0IGNsYXNzIEFscGhhSW1hZ2Uge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgZGF0YTogVWludDhBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKHNpemU6IFNpemUsIGRhdGE/OiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgY3JlYXRlSW1hZ2UodGhpcywgc2l6ZSwgMSwgZGF0YSk7XG4gICAgfVxuXG4gICAgcmVzaXplKHNpemU6IFNpemUpIHtcbiAgICAgICAgcmVzaXplSW1hZ2UodGhpcywgc2l6ZSwgMSk7XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxwaGFJbWFnZSh7d2lkdGg6IHRoaXMud2lkdGgsIGhlaWdodDogdGhpcy5oZWlnaHR9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29weShzcmNJbWc6IEFscGhhSW1hZ2UsIGRzdEltZzogQWxwaGFJbWFnZSwgc3JjUHQ6IFBvaW50LCBkc3RQdDogUG9pbnQsIHNpemU6IFNpemUpIHtcbiAgICAgICAgY29weUltYWdlKHNyY0ltZywgZHN0SW1nLCBzcmNQdCwgZHN0UHQsIHNpemUsIDEpO1xuICAgIH1cbn1cblxuLy8gTm90IHByZW11bHRpcGxpZWQsIGJlY2F1c2UgSW1hZ2VEYXRhIGlzIG5vdCBwcmVtdWx0aXBsaWVkLlxuLy8gVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIG11c3QgYmUgdXNlZCB3aGVuIHVwbG9hZGluZyB0byBhIHRleHR1cmUuXG5leHBvcnQgY2xhc3MgUkdCQUltYWdlIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuXG4gICAgLy8gZGF0YSBtdXN0IGJlIGEgVWludDhBcnJheSBpbnN0ZWFkIG9mIFVpbnQ4Q2xhbXBlZEFycmF5IGJlY2F1c2UgdGV4SW1hZ2UyRCBkb2VzIG5vdFxuICAgIC8vIHN1cHBvcnQgVWludDhDbGFtcGVkQXJyYXkgaW4gYWxsIGJyb3dzZXJzXG4gICAgZGF0YTogVWludDhBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKHNpemU6IFNpemUsIGRhdGE/OiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgY3JlYXRlSW1hZ2UodGhpcywgc2l6ZSwgNCwgZGF0YSk7XG4gICAgfVxuXG4gICAgcmVzaXplKHNpemU6IFNpemUpIHtcbiAgICAgICAgcmVzaXplSW1hZ2UodGhpcywgc2l6ZSwgNCk7XG4gICAgfVxuXG4gICAgcmVwbGFjZShkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksIGNvcHk/OiBib29sZWFuKSB7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0KGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IHRoaXMud2lkdGgsIGhlaWdodDogdGhpcy5oZWlnaHR9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29weShzcmNJbWc6IFJHQkFJbWFnZSB8IEltYWdlRGF0YSwgZHN0SW1nOiBSR0JBSW1hZ2UsIHNyY1B0OiBQb2ludCwgZHN0UHQ6IFBvaW50LCBzaXplOiBTaXplKSB7XG4gICAgICAgIGNvcHlJbWFnZShzcmNJbWcsIGRzdEltZywgc3JjUHQsIGRzdFB0LCBzaXplLCA0KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdBbHBoYUltYWdlJywgQWxwaGFJbWFnZSk7XG5yZWdpc3RlcignUkdCQUltYWdlJywgUkdCQUltYWdlKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuL3V0aWwnO1xuXG50eXBlIExpc3RlbmVyID0gKE9iamVjdCkgPT4gYW55O1xudHlwZSBMaXN0ZW5lcnMgPSB7W186IHN0cmluZ106IEFycmF5PExpc3RlbmVyPiB9O1xuXG5mdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBjb25zdCBsaXN0ZW5lckV4aXN0cyA9IGxpc3RlbmVyTGlzdFt0eXBlXSAmJiBsaXN0ZW5lckxpc3RbdHlwZV0uaW5kZXhPZihsaXN0ZW5lcikgIT09IC0xO1xuICAgIGlmICghbGlzdGVuZXJFeGlzdHMpIHtcbiAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdID0gbGlzdGVuZXJMaXN0W3R5cGVdIHx8IFtdO1xuICAgICAgICBsaXN0ZW5lckxpc3RbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBpZiAobGlzdGVuZXJMaXN0ICYmIGxpc3RlbmVyTGlzdFt0eXBlXSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVyTGlzdFt0eXBlXS5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudCB7XG4gICAgK3R5cGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIGRhdGEpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIEVycm9yTGlrZSB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBlcnJvcjogRXJyb3JMaWtlO1xuXG4gICAgY29uc3RydWN0b3IoZXJyb3I6IEVycm9yTGlrZSwgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgc3VwZXIoJ2Vycm9yJywgZXh0ZW5kKHtlcnJvcn0sIGRhdGEpKTtcbiAgICB9XG59XG5cbi8qKlxuICogTWV0aG9kcyBtaXhlZCBpbiB0byBvdGhlciBjbGFzc2VzIGZvciBldmVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQG1peGluIEV2ZW50ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50ZWQge1xuICAgIF9saXN0ZW5lcnM6IExpc3RlbmVycztcbiAgICBfb25lVGltZUxpc3RlbmVyczogTGlzdGVuZXJzO1xuICAgIF9ldmVudGVkUGFyZW50OiA/RXZlbnRlZDtcbiAgICBfZXZlbnRlZFBhcmVudERhdGE6ID8oT2JqZWN0IHwgKCkgPT4gT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byBhIHNwZWNpZmllZCBldmVudCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gYWRkIGEgbGlzdGVuIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqICAgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gYGZpcmVgLFxuICAgICAqICAgZXh0ZW5kZWQgd2l0aCBgdGFyZ2V0YCBhbmQgYHR5cGVgIHByb3BlcnRpZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgb24odHlwZTogKiwgbGlzdGVuZXI6IExpc3RlbmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyB8fCB7fTtcbiAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX2xpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgb2ZmKHR5cGU6ICosIGxpc3RlbmVyOiBMaXN0ZW5lcikge1xuICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fbGlzdGVuZXJzKTtcbiAgICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSB0byBhIHNwZWNpZmllZCBldmVudCB0eXBlLlxuICAgICAqXG4gICAgICogVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIGZpcnN0IHRpbWUgdGhlIGV2ZW50IGZpcmVzIGFmdGVyIHRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqL1xuICAgIG9uY2UodHlwZTogKiwgbGlzdGVuZXI6IExpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZmlyZShldmVudDogRXZlbnQsIHByb3BlcnRpZXM/OiBPYmplY3QpIHtcbiAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoICh0eXBlOiBzdHJpbmcsIHByb3BlcnRpZXM6IE9iamVjdCkgc2lnbmF0dXJlIGZyb20gcHJldmlvdXMgdmVyc2lvbnMuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjUyMixcbiAgICAgICAgLy8gICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWRyYXcvaXNzdWVzLzc2NlxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHByb3BlcnRpZXMgfHwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVucyh0eXBlKSkge1xuICAgICAgICAgICAgKGV2ZW50OiBhbnkpLnRhcmdldCA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhZGRpbmcgb3IgcmVtb3ZpbmcgbGlzdGVuZXJzIGluc2lkZSBvdGhlciBsaXN0ZW5lcnMgd29uJ3QgY2F1c2UgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA/IHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5zbGljZSgpIDogW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvbmVUaW1lTGlzdGVuZXJzID0gdGhpcy5fb25lVGltZUxpc3RlbmVycyAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3R5cGVdID8gdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXS5zbGljZSgpIDogW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIG9uZVRpbWVMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2V2ZW50ZWRQYXJlbnQ7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhID09PSAnZnVuY3Rpb24nID8gdGhpcy5fZXZlbnRlZFBhcmVudERhdGEoKSA6IHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuZmlyZShldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHRoYXQgbm8gZXJyb3IgZXZlbnRzIGFyZSBkcm9wcGVkLCBwcmludCB0aGVtIHRvIHRoZVxuICAgICAgICAvLyBjb25zb2xlIGlmIHRoZXkgaGF2ZSBubyBsaXN0ZW5lcnMuXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFcnJvckV2ZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB0cnVlIGlmIHRoaXMgaW5zdGFuY2Ugb2YgRXZlbnRlZCBvciBhbnkgZm9yd2FyZGVlZCBpbnN0YW5jZXMgb2YgRXZlbnRlZCBoYXZlIGEgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcmVnaXN0ZXJlZCBsaXN0ZW5lciBmb3Igc3BlY2lmaWVkIGV2ZW50IHR5cGUsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsaXN0ZW5zKHR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuX2xpc3RlbmVycyAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gJiYgdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAodGhpcy5fb25lVGltZUxpc3RlbmVycyAmJiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3R5cGVdICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICh0aGlzLl9ldmVudGVkUGFyZW50ICYmIHRoaXMuX2V2ZW50ZWRQYXJlbnQubGlzdGVucyh0eXBlKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWJibGUgYWxsIGV2ZW50cyBmaXJlZCBieSB0aGlzIGluc3RhbmNlIG9mIEV2ZW50ZWQgdG8gdGhpcyBwYXJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRFdmVudGVkUGFyZW50KHBhcmVudDogP0V2ZW50ZWQsIGRhdGE/OiBPYmplY3QgfCAoKSA9PiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPSBkYXRhO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbi8vIE5vdGU6IERvIG5vdCBpbmhlcml0IGZyb20gRXJyb3IuIEl0IGJyZWFrcyB3aGVuIHRyYW5zcGlsaW5nIHRvIEVTNS5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgaWRlbnRpZmllcjogP3N0cmluZztcbiAgICBsaW5lOiA/bnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3Ioa2V5OiA/c3RyaW5nLCB2YWx1ZTogP3sgX19saW5lX186IG51bWJlciB9LCBtZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gKGtleSA/IGAke2tleX06IGAgOiAnJykgKyBtZXNzYWdlO1xuICAgICAgICBpZiAoaWRlbnRpZmllcikgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcblxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5fX2xpbmVfXykge1xuICAgICAgICAgICAgdGhpcy5saW5lID0gdmFsdWUuX19saW5lX187XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29uc3RhbnRzKG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBjb25zdGFudHMgPSBvcHRpb25zLnZhbHVlO1xuXG4gICAgaWYgKGNvbnN0YW50cykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBjb25zdGFudHMsICdjb25zdGFudHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgdjgnKV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbi8vIFR1cm4ganNvbmxpbnQtbGluZXMtcHJpbWl0aXZlcyBvYmplY3RzIGludG8gcHJpbWl0aXZlIG9iamVjdHNcbmV4cG9ydCBmdW5jdGlvbiB1bmJ1bmRsZSh2YWx1ZTogbWl4ZWQpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBVbmJ1bmRsZSh2YWx1ZTogbWl4ZWQpOiBtaXhlZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZGVlcFVuYnVuZGxlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICEodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSkge1xuICAgICAgICBjb25zdCB1bmJ1bmRsZWRWYWx1ZTogeyBba2V5OiBzdHJpbmddOiBtaXhlZCB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICB1bmJ1bmRsZWRWYWx1ZVtrZXldID0gZGVlcFVuYnVuZGxlKHZhbHVlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmJ1bmRsZWRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5idW5kbGUodmFsdWUpO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgdmFsaWRhdGVTcGVjIGZyb20gJy4vdmFsaWRhdGUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChvcHRpb25zKSB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgb2JqZWN0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBlbGVtZW50U3BlY3MgPSBvcHRpb25zLnZhbHVlU3BlYyB8fCB7fTtcbiAgICBjb25zdCBlbGVtZW50VmFsaWRhdG9ycyA9IG9wdGlvbnMub2JqZWN0RWxlbWVudFZhbGlkYXRvcnMgfHwge307XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKG9iamVjdCk7XG4gICAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgYG9iamVjdCBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFNwZWNLZXkgPSBvYmplY3RLZXkuc3BsaXQoJy4nKVswXTsgLy8gdHJlYXQgJ3BhaW50LionIGFzICdwYWludCdcbiAgICAgICAgY29uc3QgZWxlbWVudFNwZWMgPSBlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldIHx8IGVsZW1lbnRTcGVjc1snKiddO1xuXG4gICAgICAgIGxldCB2YWxpZGF0ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV0pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IGVsZW1lbnRWYWxpZGF0b3JzW2VsZW1lbnRTcGVjS2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSB2YWxpZGF0ZVNwZWM7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFZhbGlkYXRvcnNbJyonXSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gZWxlbWVudFZhbGlkYXRvcnNbJyonXTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50U3BlY3NbJyonXSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gdmFsaWRhdGVTcGVjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdFtvYmplY3RLZXldLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7b2JqZWN0S2V5fVwiYCkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlRWxlbWVudCh7XG4gICAgICAgICAgICBrZXk6IChrZXkgPyBgJHtrZXl9LmAgOiBrZXkpICsgb2JqZWN0S2V5LFxuICAgICAgICAgICAgdmFsdWU6IG9iamVjdFtvYmplY3RLZXldLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBlbGVtZW50U3BlYyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjLFxuICAgICAgICAgICAgb2JqZWN0LFxuICAgICAgICAgICAgb2JqZWN0S2V5XG4gICAgICAgIH0sIG9iamVjdCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWxlbWVudFNwZWNLZXkgaW4gZWxlbWVudFNwZWNzKSB7XG4gICAgICAgIC8vIERvbid0IGNoZWNrIGByZXF1aXJlZGAgd2hlbiB0aGVyZSdzIGEgY3VzdG9tIHZhbGlkYXRvciBmb3IgdGhhdCBwcm9wZXJ0eS5cbiAgICAgICAgaWYgKGVsZW1lbnRWYWxpZGF0b3JzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XS5yZXF1aXJlZCAmJiBlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldWydkZWZhdWx0J10gPT09IHVuZGVmaW5lZCAmJiBvYmplY3RbZWxlbWVudFNwZWNLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3QsIGBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiJHtlbGVtZW50U3BlY0tleX1cImApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVBcnJheShvcHRpb25zKSB7XG4gICAgY29uc3QgYXJyYXkgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGFycmF5U3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB2YWxpZGF0ZUFycmF5RWxlbWVudCA9IG9wdGlvbnMuYXJyYXlFbGVtZW50VmFsaWRhdG9yIHx8IHZhbGlkYXRlO1xuXG4gICAgaWYgKGdldFR5cGUoYXJyYXkpICE9PSAnYXJyYXknKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCBgYXJyYXkgZXhwZWN0ZWQsICR7Z2V0VHlwZShhcnJheSl9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGlmIChhcnJheVNwZWMubGVuZ3RoICYmIGFycmF5Lmxlbmd0aCAhPT0gYXJyYXlTcGVjLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBhcnJheSwgYGFycmF5IGxlbmd0aCAke2FycmF5U3BlYy5sZW5ndGh9IGV4cGVjdGVkLCBsZW5ndGggJHthcnJheS5sZW5ndGh9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGlmIChhcnJheVNwZWNbJ21pbi1sZW5ndGgnXSAmJiBhcnJheS5sZW5ndGggPCBhcnJheVNwZWNbJ21pbi1sZW5ndGgnXSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBhcnJheSwgYGFycmF5IGxlbmd0aCBhdCBsZWFzdCAke2FycmF5U3BlY1snbWluLWxlbmd0aCddfSBleHBlY3RlZCwgbGVuZ3RoICR7YXJyYXkubGVuZ3RofSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBsZXQgYXJyYXlFbGVtZW50U3BlYyA9IHtcbiAgICAgICAgXCJ0eXBlXCI6IGFycmF5U3BlYy52YWx1ZSxcbiAgICAgICAgXCJ2YWx1ZXNcIjogYXJyYXlTcGVjLnZhbHVlc1xuICAgIH07XG5cbiAgICBpZiAoc3R5bGVTcGVjLiR2ZXJzaW9uIDwgNykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjLmZ1bmN0aW9uID0gYXJyYXlTcGVjLmZ1bmN0aW9uO1xuICAgIH1cblxuICAgIGlmIChnZXRUeXBlKGFycmF5U3BlYy52YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFycmF5RWxlbWVudFNwZWMgPSBhcnJheVNwZWMudmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5RWxlbWVudCh7XG4gICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgIGFycmF5SW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZTogYXJyYXlbaV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGFycmF5RWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWBcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgbGV0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHR5cGUgPSAnTmFOJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5pbXVtJyBpbiB2YWx1ZVNwZWMgJiYgdmFsdWUgPCB2YWx1ZVNwZWMubWluaW11bSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYCR7dmFsdWV9IGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAke3ZhbHVlU3BlYy5taW5pbXVtfWApXTtcbiAgICB9XG5cbiAgICBpZiAoJ21heGltdW0nIGluIHZhbHVlU3BlYyAmJiB2YWx1ZSA+IHZhbHVlU3BlYy5tYXhpbXVtKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgJHt2YWx1ZX0gaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlICR7dmFsdWVTcGVjLm1heGltdW19YCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0JztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXknO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyJztcbmltcG9ydCB7aXNFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQge1xuICAgIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sXG4gICAgc3VwcG9ydHNJbnRlcnBvbGF0aW9uXG59IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICBsZXQgc3RvcEtleVR5cGU7XG4gICAgbGV0IHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgbGV0IHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICBjb25zdCBpc1pvb21GdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNQcm9wZXJ0eUZ1bmN0aW9uID0gIWlzWm9vbUZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLmZ1bmN0aW9uLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICBkZWZhdWx0OiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknICYmIGlzWm9vbUZ1bmN0aW9uKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnaWRlbnRpdHknICYmICFvcHRpb25zLnZhbHVlLnN0b3BzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnZXhwb25lbnRpYWwnICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihvcHRpb25zLnZhbHVlU3BlYykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5RnVuY3Rpb24gJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyB8fCBpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3BzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnaWRlbnRpdHkgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGEgXCJzdG9wc1wiIHByb3BlcnR5JyldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5KHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy52YWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICBhcnJheUVsZW1lbnRWYWxpZGF0b3I6IHZhbGlkYXRlRnVuY3Rpb25TdG9wXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCB2YWx1ZSwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3Aob3B0aW9ucykge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgbGVuZ3RoIDIgZXhwZWN0ZWQsIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gZm91bmRgKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKGdldFR5cGUodmFsdWVbMF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgb2JqZWN0IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWVbMF0pfSBmb3VuZGApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS56b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgem9vbScpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RvcERvbWFpblpvb20gJiYgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA+IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pICE9PSBwcmV2aW91c1N0b3BEb21haW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA9IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge3pvb206IHt9fSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7em9vbTogdmFsaWRhdGVOdW1iZXIsIHZhbHVlOiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZX1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVTdG9wRG9tYWluVmFsdWUoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge30sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4cHJlc3Npb24oZGVlcFVuYnVuZGxlKHZhbHVlWzFdKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgJ2V4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiBzdG9wcy4nKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9WzFdYCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVsxXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZnVuY3Rpb25WYWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RvcERvbWFpblZhbHVlKG9wdGlvbnMsIHN0b3ApIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGUob3B0aW9ucy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0VmFsdWUgPSBvcHRpb25zLnZhbHVlICE9PSBudWxsID8gb3B0aW9ucy52YWx1ZSA6IHN0b3A7XG5cbiAgICAgICAgaWYgKCFzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgc3RvcEtleVR5cGUgPSB0eXBlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHN0b3BLZXlUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBgJHt0eXBlfSBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSAke3N0b3BLZXlUeXBlfWApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW4nKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSAhPT0gJ251bWJlcicgJiYgZnVuY3Rpb25UeXBlICE9PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgO1xuICAgICAgICAgICAgaWYgKHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKGZ1bmN0aW9uVmFsdWVTcGVjKSAmJiBmdW5jdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJ1xcbklmIHlvdSBpbnRlbmRlZCB0byB1c2UgYSBjYXRlZ29yaWNhbCBmdW5jdGlvbiwgc3BlY2lmeSBgXCJ0eXBlXCI6IFwiY2F0ZWdvcmljYWxcImAuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsIG1lc3NhZ2UpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdHlwZSA9PT0gJ251bWJlcicgJiYgKCFpc0Zpbml0ZSh2YWx1ZSkgfHwgTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYGludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICR7dmFsdWV9YCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiB0eXBlID09PSAnbnVtYmVyJyAmJiBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdmFsdWUgaW4gc3RvcERvbWFpblZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgJ3N0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZScpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbiwgY3JlYXRlUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uJztcbmltcG9ydCB7ZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCB7aXNTdGF0ZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuLi9leHByZXNzaW9uL2lzX2NvbnN0YW50JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnM6IGFueSk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ3Byb3BlcnR5JyA/IGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbiA6IGNyZWF0ZUV4cHJlc3Npb24pKGRlZXBVbmJ1bmRsZShvcHRpb25zLnZhbHVlKSwgb3B0aW9ucy52YWx1ZVNwZWMpO1xuICAgIGlmIChleHByZXNzaW9uLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZS5tYXAoKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihgJHtvcHRpb25zLmtleX0ke2Vycm9yLmtleX1gLCBvcHRpb25zLnZhbHVlLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwcmVzc2lvbk9iaiA9IChleHByZXNzaW9uLnZhbHVlOiBhbnkpLmV4cHJlc3Npb24gfHwgKGV4cHJlc3Npb24udmFsdWU6IGFueSkuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uO1xuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgJiYgKG9wdGlvbnMucHJvcGVydHlLZXkgPT09ICd0ZXh0LWZvbnQnKSAmJlxuICAgICAgICAhZXhwcmVzc2lvbk9iai5vdXRwdXREZWZpbmVkKCkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCBgSW52YWxpZCBkYXRhIGV4cHJlc3Npb24gZm9yIFwiJHtvcHRpb25zLnByb3BlcnR5S2V5fVwiLiBPdXRwdXQgdmFsdWVzIG11c3QgYmUgY29udGFpbmVkIGFzIGxpdGVyYWxzIHdpdGhpbiB0aGUgZXhwcmVzc2lvbi5gKV07XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgJiYgb3B0aW9ucy5wcm9wZXJ0eVR5cGUgPT09ICdsYXlvdXQnICYmXG4gICAgICAgICghaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcImZlYXR1cmUtc3RhdGVcIiBkYXRhIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggbGF5b3V0IHByb3BlcnRpZXMuJyldO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAnZmlsdGVyJyAmJiAhaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wiZmVhdHVyZS1zdGF0ZVwiIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBmaWx0ZXJzLicpXTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCAmJiBvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0LmluZGV4T2YoJ2NsdXN0ZXInKSA9PT0gMCkge1xuICAgICAgICBpZiAoIWlzR2xvYmFsUHJvcGVydHlDb25zdGFudChleHByZXNzaW9uT2JqLCBbJ3pvb20nLCAnZmVhdHVyZS1zdGF0ZSddKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJ6b29tXCIgYW5kIFwiZmVhdHVyZS1zdGF0ZVwiIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggY2x1c3RlciBwcm9wZXJ0aWVzLicpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ2NsdXN0ZXItaW5pdGlhbCcgJiYgIWlzRmVhdHVyZUNvbnN0YW50KGV4cHJlc3Npb25PYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdGZWF0dXJlIGRhdGEgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBpbml0aWFsIGV4cHJlc3Npb24gcGFydCBvZiBjbHVzdGVyIHByb3BlcnRpZXMuJyldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBib29sZWFuIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0IHtwYXJzZUNTU0NvbG9yfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCB7dW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUVudW0ob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlU3BlYy52YWx1ZXMpKSB7IC8vIDw9djdcbiAgICAgICAgaWYgKHZhbHVlU3BlYy52YWx1ZXMuaW5kZXhPZih1bmJ1bmRsZSh2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZXhwZWN0ZWQgb25lIG9mIFske3ZhbHVlU3BlYy52YWx1ZXMuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA+PXY4XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7T2JqZWN0LmtleXModmFsdWVTcGVjLnZhbHVlcykuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7R2xvYmFsUHJvcGVydGllcywgRmVhdHVyZX0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5cbnR5cGUgRmlsdGVyRXhwcmVzc2lvbiA9IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGJvb2xlYW47XG5leHBvcnQgdHlwZSBGZWF0dXJlRmlsdGVyID17ZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uLCBuZWVkR2VvbWV0cnk6IGJvb2xlYW59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGaWx0ZXI7XG5leHBvcnQge2lzRXhwcmVzc2lvbkZpbHRlcn07XG5cbmZ1bmN0aW9uIGlzRXhwcmVzc2lvbkZpbHRlcihmaWx0ZXI6IGFueSkge1xuICAgIGlmIChmaWx0ZXIgPT09IHRydWUgfHwgZmlsdGVyID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyKSB8fCBmaWx0ZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3dpdGNoIChmaWx0ZXJbMF0pIHtcbiAgICBjYXNlICdoYXMnOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCA+PSAyICYmIGZpbHRlclsxXSAhPT0gJyRpZCcgJiYgZmlsdGVyWzFdICE9PSAnJHR5cGUnO1xuXG4gICAgY2FzZSAnaW4nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCA+PSAzICYmICh0eXBlb2YgZmlsdGVyWzFdICE9PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGZpbHRlclsyXSkpO1xuXG4gICAgY2FzZSAnIWluJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgICAgICByZXR1cm4gZmlsdGVyLmxlbmd0aCAhPT0gMyB8fCAoQXJyYXkuaXNBcnJheShmaWx0ZXJbMV0pIHx8IEFycmF5LmlzQXJyYXkoZmlsdGVyWzJdKSk7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWx0ZXIuc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGYpICYmIHR5cGVvZiBmICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmNvbnN0IGZpbHRlclNwZWMgPSB7XG4gICAgJ3R5cGUnOiAnYm9vbGVhbicsXG4gICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAndHJhbnNpdGlvbic6IGZhbHNlLFxuICAgICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJyxcbiAgICAnZXhwcmVzc2lvbic6IHtcbiAgICAgICAgJ2ludGVycG9sYXRlZCc6IGZhbHNlLFxuICAgICAgICAncGFyYW1ldGVycyc6IFsnem9vbScsICdmZWF0dXJlJ11cbiAgICB9XG59O1xuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXI6IGFueSk6IEZlYXR1cmVGaWx0ZXIge1xuICAgIGlmIChmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtmaWx0ZXI6ICgpID0+IHRydWUsIG5lZWRHZW9tZXRyeTogZmFsc2V9O1xuICAgIH1cblxuICAgIGlmICghaXNFeHByZXNzaW9uRmlsdGVyKGZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gY29udmVydEZpbHRlcihmaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkID0gY3JlYXRlRXhwcmVzc2lvbihmaWx0ZXIsIGZpbHRlclNwZWMpO1xuICAgIGlmIChjb21waWxlZC5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gZ2VvbWV0cnlOZWVkZWQoZmlsdGVyKTtcbiAgICAgICAgcmV0dXJuIHtmaWx0ZXI6IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGNvbXBpbGVkLnZhbHVlLmV2YWx1YXRlKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgbmVlZEdlb21ldHJ5fTtcbiAgICB9XG59XG5cbi8vIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gc29ydCBudW1iZXJzIGFuZCBzdHJpbmdzXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIGdlb21ldHJ5TmVlZGVkKGZpbHRlcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGZpbHRlclswXSA9PT0gJ3dpdGhpbicpIHJldHVybiB0cnVlO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBmaWx0ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGlmIChnZW9tZXRyeU5lZWRlZChmaWx0ZXJbaW5kZXhdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29udmVydEZpbHRlcihmaWx0ZXI6ID9BcnJheTxhbnk+KTogbWl4ZWQge1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBvcCA9IGZpbHRlclswXTtcbiAgICBpZiAoZmlsdGVyLmxlbmd0aCA8PSAxKSByZXR1cm4gKG9wICE9PSAnYW55Jyk7XG4gICAgY29uc3QgY29udmVydGVkID1cbiAgICAgICAgb3AgPT09ICc9PScgPyBjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT0nKSA6XG4gICAgICAgIG9wID09PSAnIT0nID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRDb21wYXJpc29uT3AoZmlsdGVyWzFdLCBmaWx0ZXJbMl0sICc9PScpKSA6XG4gICAgICAgIG9wID09PSAnPCcgfHxcbiAgICAgICAgb3AgPT09ICc+JyB8fFxuICAgICAgICBvcCA9PT0gJzw9JyB8fFxuICAgICAgICBvcCA9PT0gJz49JyA/IGNvbnZlcnRDb21wYXJpc29uT3AoZmlsdGVyWzFdLCBmaWx0ZXJbMl0sIG9wKSA6XG4gICAgICAgIG9wID09PSAnYW55JyA/IGNvbnZlcnREaXNqdW5jdGlvbk9wKGZpbHRlci5zbGljZSgxKSkgOlxuICAgICAgICBvcCA9PT0gJ2FsbCcgPyBbJ2FsbCddLmNvbmNhdChmaWx0ZXIuc2xpY2UoMSkubWFwKGNvbnZlcnRGaWx0ZXIpKSA6XG4gICAgICAgIG9wID09PSAnbm9uZScgPyBbJ2FsbCddLmNvbmNhdChmaWx0ZXIuc2xpY2UoMSkubWFwKGNvbnZlcnRGaWx0ZXIpLm1hcChjb252ZXJ0TmVnYXRpb24pKSA6XG4gICAgICAgIG9wID09PSAnaW4nID8gY29udmVydEluT3AoZmlsdGVyWzFdLCBmaWx0ZXIuc2xpY2UoMikpIDpcbiAgICAgICAgb3AgPT09ICchaW4nID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRJbk9wKGZpbHRlclsxXSwgZmlsdGVyLnNsaWNlKDIpKSkgOlxuICAgICAgICBvcCA9PT0gJ2hhcycgPyBjb252ZXJ0SGFzT3AoZmlsdGVyWzFdKSA6XG4gICAgICAgIG9wID09PSAnIWhhcycgPyBjb252ZXJ0TmVnYXRpb24oY29udmVydEhhc09wKGZpbHRlclsxXSkpIDpcbiAgICAgICAgb3AgPT09ICd3aXRoaW4nID8gZmlsdGVyIDpcbiAgICAgICAgdHJ1ZTtcbiAgICByZXR1cm4gY29udmVydGVkO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q29tcGFyaXNvbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItdHlwZS0ke29wfWAsIHZhbHVlXTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaWQtJHtvcH1gLCB2YWx1ZV07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLSR7b3B9YCwgcHJvcGVydHksIHZhbHVlXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREaXNqdW5jdGlvbk9wKGZpbHRlcnM6IEFycmF5PEFycmF5PGFueT4+KSB7XG4gICAgcmV0dXJuIFsnYW55J10uY29uY2F0KGZpbHRlcnMubWFwKGNvbnZlcnRGaWx0ZXIpKTtcbn1cblxuZnVuY3Rpb24gY29udmVydEluT3AocHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBBcnJheTxhbnk+KSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLXR5cGUtaW5gLCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaWQtaW5gLCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDIwMCAmJiAhdmFsdWVzLnNvbWUodiA9PiB0eXBlb2YgdiAhPT0gdHlwZW9mIHZhbHVlc1swXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2ZpbHRlci1pbi1sYXJnZScsIHByb3BlcnR5LCBbJ2xpdGVyYWwnLCB2YWx1ZXMuc29ydChjb21wYXJlKV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFsnZmlsdGVyLWluLXNtYWxsJywgcHJvcGVydHksIFsnbGl0ZXJhbCcsIHZhbHVlc11dO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0SGFzT3AocHJvcGVydHk6IHN0cmluZykge1xuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJyRpZCc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci1oYXMtaWRgXTtcbiAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaGFzYCwgcHJvcGVydHldO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydE5lZ2F0aW9uKGZpbHRlcjogbWl4ZWQpIHtcbiAgICByZXR1cm4gWychJywgZmlsdGVyXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uJztcbmltcG9ydCB2YWxpZGF0ZUVudW0gZnJvbSAnLi92YWxpZGF0ZV9lbnVtJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0IHt1bmJ1bmRsZSwgZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb25GaWx0ZXJ9IGZyb20gJy4uL2ZlYXR1cmVfZmlsdGVyJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXIob3B0aW9ucykge1xuICAgIGlmIChpc0V4cHJlc3Npb25GaWx0ZXIoZGVlcFVuYnVuZGxlKG9wdGlvbnMudmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdmaWx0ZXInLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiB7dmFsdWU6ICdib29sZWFuJ31cbiAgICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIob3B0aW9ucyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgIGlmIChnZXRUeXBlKHZhbHVlKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBsZXQgdHlwZTtcblxuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGlmICh2YWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnQnKV07XG4gICAgfVxuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVudW0oe1xuICAgICAgICBrZXk6IGAke2tleX1bMF1gLFxuICAgICAgICB2YWx1ZTogdmFsdWVbMF0sXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmZpbHRlcl9vcGVyYXRvcixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICB9KSk7XG5cbiAgICBzd2l0Y2ggKHVuYnVuZGxlKHZhbHVlWzBdKSkge1xuICAgIGNhc2UgJzwnOlxuICAgIGNhc2UgJzw9JzpcbiAgICBjYXNlICc+JzpcbiAgICBjYXNlICc+PSc6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB1bmJ1bmRsZSh2YWx1ZVsxXSkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYFwiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIke3ZhbHVlWzBdfVwiYCkpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlICc9PSc6XG4gICAgY2FzZSAnIT0nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJHt2YWx1ZVswXX1cIiBtdXN0IGhhdmUgMyBlbGVtZW50c2ApKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSAnaW4nOlxuICAgIGNhc2UgJyFpbic6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbMV0pO1xuICAgICAgICAgICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbaV0pO1xuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzFdKSA9PT0gJyR0eXBlJykge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbnVtKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WyR7aX1dYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2ldLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5nZW9tZXRyeV90eXBlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ3N0cmluZycgJiYgdHlwZSAhPT0gJ251bWJlcicgJiYgdHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WyR7aX1dYCwgdmFsdWVbaV0sIGBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgJ2FueSc6XG4gICAgY2FzZSAnYWxsJzpcbiAgICBjYXNlICdub25lJzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU5vbkV4cHJlc3Npb25GaWx0ZXIoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2ldLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgJ2hhcyc6XG4gICAgY2FzZSAnIWhhcyc6XG4gICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBcIiR7dmFsdWVbMF19XCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHNgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3dpdGhpbic6XG4gICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBcIiR7dmFsdWVbMF19XCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHNgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgb2JqZWN0IGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZSc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gJy4uL2Z1bmN0aW9uJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQge3N1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi91dGlsL3Byb3BlcnRpZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsIHByb3BlcnR5VHlwZSkge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgcHJvcGVydHlLZXkgPSBvcHRpb25zLm9iamVjdEtleTtcbiAgICBjb25zdCBsYXllclNwZWMgPSBzdHlsZVNwZWNbYCR7cHJvcGVydHlUeXBlfV8ke29wdGlvbnMubGF5ZXJUeXBlfWBdO1xuXG4gICAgaWYgKCFsYXllclNwZWMpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHRyYW5zaXRpb25NYXRjaCA9IHByb3BlcnR5S2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdwYWludCcgJiYgdHJhbnNpdGlvbk1hdGNoICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIGxheWVyU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IGxheWVyU3BlY1twcm9wZXJ0eUtleV07XG4gICAgaWYgKCF2YWx1ZVNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGB1bmtub3duIHByb3BlcnR5IFwiJHtwcm9wZXJ0eUtleX1cImApXTtcbiAgICB9XG5cbiAgICBsZXQgdG9rZW5NYXRjaDtcbiAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdzdHJpbmcnICYmIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlU3BlYykgJiYgIXZhbHVlU3BlYy50b2tlbnMgJiYgKHRva2VuTWF0Y2ggPSAvXnsoW159XSspfSQvLmV4ZWModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBrZXksIHZhbHVlLFxuICAgICAgICAgICAgYFwiJHtwcm9wZXJ0eUtleX1cIiBkb2VzIG5vdCBzdXBwb3J0IGludGVycG9sYXRpb24gc3ludGF4XFxuYCArXG4gICAgICAgICAgICAgICAgYFVzZSBhbiBpZGVudGl0eSBwcm9wZXJ0eSBmdW5jdGlvbiBpbnN0ZWFkOiBcXGB7IFwidHlwZVwiOiBcImlkZW50aXR5XCIsIFwicHJvcGVydHlcIjogJHtKU09OLnN0cmluZ2lmeSh0b2tlbk1hdGNoWzFdKX0gfVxcYC5gKV07XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gW107XG5cbiAgICAvLyBpZiAob3B0aW9ucy5sYXllclR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgLy8gICAgIGlmIChwcm9wZXJ0eUtleSA9PT0gJ3RleHQtZmllbGQnICYmIHN0eWxlICYmICFzdHlsZS5nbHlwaHMpIHtcbiAgICAvLyAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ3VzZSBvZiBcInRleHQtZmllbGRcIiByZXF1aXJlcyBhIHN0eWxlIFwiZ2x5cGhzXCIgcHJvcGVydHknKSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgaWYgKHByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JyAmJiBpc0Z1bmN0aW9uKGRlZXBVbmJ1bmRsZSh2YWx1ZSkpICYmIHVuYnVuZGxlKHZhbHVlLnR5cGUpID09PSAnaWRlbnRpdHknKSB7XG4gICAgLy8gICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcInRleHQtZm9udFwiIGRvZXMgbm90IHN1cHBvcnQgaWRlbnRpdHkgZnVuY3Rpb25zJykpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdmFsdWVTcGVjLFxuICAgICAgICBzdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjLFxuICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ3Byb3BlcnR5JyxcbiAgICAgICAgcHJvcGVydHlUeXBlLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgIH0pKTtcbn1cbiIsIlxuaW1wb3J0IHZhbGlkYXRlUHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wcm9wZXJ0eSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlUGFpbnRQcm9wZXJ0eShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgJ3BhaW50Jyk7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZVByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfcHJvcGVydHknO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eShvcHRpb25zLCAnbGF5b3V0Jyk7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcic7XG5pbXBvcnQge3VuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50JztcbmltcG9ydCB2YWxpZGF0ZU9iamVjdCBmcm9tICcuL3ZhbGlkYXRlX29iamVjdCc7XG5pbXBvcnQgdmFsaWRhdGVGaWx0ZXIgZnJvbSAnLi92YWxpZGF0ZV9maWx0ZXInO1xuaW1wb3J0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5JztcbmltcG9ydCB2YWxpZGF0ZUxheW91dFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5JztcbmltcG9ydCB2YWxpZGF0ZVNwZWMgZnJvbSAnLi92YWxpZGF0ZSc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcihvcHRpb25zKSB7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3QgbGF5ZXIgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICghbGF5ZXIudHlwZSAmJiAhbGF5ZXIucmVmKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ2VpdGhlciBcInR5cGVcIiBvciBcInJlZlwiIGlzIHJlcXVpcmVkJykpO1xuICAgIH1cbiAgICBsZXQgdHlwZSA9IHVuYnVuZGxlKGxheWVyLnR5cGUpO1xuICAgIGNvbnN0IHJlZiA9IHVuYnVuZGxlKGxheWVyLnJlZik7XG5cbiAgICBpZiAobGF5ZXIuaWQpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHVuYnVuZGxlKGxheWVyLmlkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmFycmF5SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJMYXllciA9IHN0eWxlLmxheWVyc1tpXTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShvdGhlckxheWVyLmlkKSA9PT0gbGF5ZXJJZCkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5pZCwgYGR1cGxpY2F0ZSBsYXllciBpZCBcIiR7bGF5ZXIuaWR9XCIsIHByZXZpb3VzbHkgdXNlZCBhdCBsaW5lICR7b3RoZXJMYXllci5pZC5fX2xpbmVfX31gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3JlZicgaW4gbGF5ZXIpIHtcbiAgICAgICAgWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnZmlsdGVyJywgJ2xheW91dCddLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICAgIGlmIChwIGluIGxheWVyKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyW3BdLCBgXCIke3B9XCIgaXMgcHJvaGliaXRlZCBmb3IgcmVmIGxheWVyc2ApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHBhcmVudDtcblxuICAgICAgICBzdHlsZS5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShsYXllci5pZCkgPT09IHJlZikgcGFyZW50ID0gbGF5ZXI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIucmVmLCBgcmVmIGxheWVyIFwiJHtyZWZ9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5yZWYpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5yZWYsICdyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllcicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSB1bmJ1bmRsZShwYXJlbnQudHlwZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdiYWNrZ3JvdW5kJykge1xuICAgICAgICBpZiAoIWxheWVyLnNvdXJjZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc3R5bGUuc291cmNlcyAmJiBzdHlsZS5zb3VyY2VzW2xheWVyLnNvdXJjZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlICYmIHVuYnVuZGxlKHNvdXJjZS50eXBlKTtcbiAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYHNvdXJjZSBcIiR7bGF5ZXIuc291cmNlfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgdHlwZSA9PT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIHJlcXVpcmVzIGEgcmFzdGVyIHNvdXJjZWApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3Jhc3RlcicgJiYgdHlwZSAhPT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIHJlcXVpcmVzIGEgdmVjdG9yIHNvdXJjZWApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgIWxheWVyWydzb3VyY2UtbGF5ZXInXSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgYGxheWVyIFwiJHtsYXllci5pZH1cIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAncmFzdGVyLWRlbScgJiYgdHlwZSAhPT0gJ2hpbGxzaGFkZScpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCAncmFzdGVyLWRlbSBzb3VyY2UgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGxheWVyIHR5cGUgXFwnaGlsbHNoYWRlXFwnLicpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmUnICYmIGxheWVyLnBhaW50ICYmIGxheWVyLnBhaW50WydsaW5lLWdyYWRpZW50J10gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZVR5cGUgIT09ICdnZW9qc29uJyB8fCAhc291cmNlLmxpbmVNZXRyaWNzKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgYGxheWVyIFwiJHtsYXllci5pZH1cIiBzcGVjaWZpZXMgYSBsaW5lLWdyYWRpZW50LCB3aGljaCByZXF1aXJlcyBhIEdlb0pTT04gc291cmNlIHdpdGggXFxgbGluZU1ldHJpY3NcXGAgZW5hYmxlZC5gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogbGF5ZXIsXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICcqJygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBlbmZvcmNlIHRoZSBzcGVjJ3MgYFwicmVxdWlyZXNcIjogdHJ1ZWAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCByZWZzO1xuICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZXF1aXJlbWVudCBpcyB2YWxpZGF0ZWQgYWJvdmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTc3Mi5cbiAgICAgICAgICAgIHR5cGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3BlYyh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RLZXk6ICd0eXBlJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbHRlcjogdmFsaWRhdGVGaWx0ZXIsXG4gICAgICAgICAgICBsYXlvdXQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFpbnQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBhaW50UHJvcGVydHkoZXh0ZW5kKHtsYXllclR5cGU6IHR5cGV9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IHt1bmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0nO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24nO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xuXG5jb25zdCBvYmplY3RFbGVtZW50VmFsaWRhdG9ycyA9IHtcbiAgICBwcm9tb3RlSWQ6IHZhbGlkYXRlUHJvbW90ZUlkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVNvdXJjZShvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcblxuICAgIGlmICghdmFsdWUudHlwZSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1widHlwZVwiIGlzIHJlcXVpcmVkJyldO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB1bmJ1bmRsZSh2YWx1ZS50eXBlKTtcbiAgICBsZXQgZXJyb3JzO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAndmVjdG9yJzpcbiAgICBjYXNlICdyYXN0ZXInOlxuICAgIGNhc2UgJ3Jhc3Rlci1kZW0nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjW2Bzb3VyY2VfJHt0eXBlLnJlcGxhY2UoJy0nLCAnXycpfWBdLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9nZW9qc29uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlLmNsdXN0ZXIpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZS5jbHVzdGVyUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcl0gPSB2YWx1ZS5jbHVzdGVyUHJvcGVydGllc1twcm9wXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VFeHByID0gdHlwZW9mIG9wZXJhdG9yID09PSAnc3RyaW5nJyA/IFtvcGVyYXRvciwgWydhY2N1bXVsYXRlZCddLCBbJ2dldCcsIHByb3BdXSA6IG9wZXJhdG9yO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9LiR7cHJvcH0ubWFwYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hcEV4cHIsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAnY2x1c3Rlci1tYXAnXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS4ke3Byb3B9LnJlZHVjZWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZWR1Y2VFeHByLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2NsdXN0ZXItcmVkdWNlJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5zb3VyY2VfdmlkZW8sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcblxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2ltYWdlLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG5cbiAgICBjYXNlICdjYW52YXMnOlxuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBudWxsLCBgUGxlYXNlIHVzZSBydW50aW1lIEFQSXMgdG8gYWRkIGNhbnZhcyBzb3VyY2VzLCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgdGhlbSBpbiBzdHlsZXNoZWV0cy5gLCAnc291cmNlLmNhbnZhcycpXTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUVudW0oe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9LnR5cGVgLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHt2YWx1ZXM6IFsndmVjdG9yJywgJ3Jhc3RlcicsICdyYXN0ZXItZGVtJywgJ2dlb2pzb24nLCAndmlkZW8nLCAnaW1hZ2UnXX0sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvbW90ZUlkKHtrZXksIHZhbHVlfSkge1xuICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHtrZXksIHZhbHVlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmcoe2tleTogYCR7a2V5fS4ke3Byb3B9YCwgdmFsdWU6IHZhbHVlW3Byb3BdfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZSc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9ucykge1xuICAgIGNvbnN0IGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBsaWdodFNwZWMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdFR5cGUgPSBnZXRUeXBlKGxpZ2h0KTtcbiAgICBpZiAobGlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2xpZ2h0JywgbGlnaHQsIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWdodFNwZWNba2V5XSkge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsaWdodFtrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogbGlnaHRTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGlnaHRba2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uJztcbmltcG9ydCB2YWxpZGF0ZVN0cmluZyBmcm9tICcuL3ZhbGlkYXRlX3N0cmluZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0dGVkKG9wdGlvbnM6IGFueSkge1xuICAgIGlmICh2YWxpZGF0ZVN0cmluZyhvcHRpb25zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZUV4cHJlc3Npb24ob3B0aW9ucyk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24nO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVJbWFnZShvcHRpb25zOiBhbnkpIHtcbiAgICBpZiAodmFsaWRhdGVTdHJpbmcob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xufVxuIiwiXHJcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUnO1xyXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmdPYmplY3Qob3B0aW9ucykge1xyXG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xyXG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XHJcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XHJcblxyXG4gICAgaWYgKHR5cGUgPT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSA9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHQgPSBnZXRUeXBlKHZhbHVlW2tleV0pO1xyXG4gICAgICAgICAgICBpZiAodCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZVtrZXldLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R9IGZvdW5kYCkpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZXJyb3JzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XHJcbn1cclxuIiwiXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCc7XG5pbXBvcnQge2lzRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbic7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gJy4uL2Z1bmN0aW9uJztcblxuaW1wb3J0IHZhbGlkYXRlRnVuY3Rpb24gZnJvbSAnLi92YWxpZGF0ZV9mdW5jdGlvbic7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbic7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QnO1xuaW1wb3J0IHZhbGlkYXRlQXJyYXkgZnJvbSAnLi92YWxpZGF0ZV9hcnJheSc7XG5pbXBvcnQgdmFsaWRhdGVCb29sZWFuIGZyb20gJy4vdmFsaWRhdGVfYm9vbGVhbic7XG5pbXBvcnQgdmFsaWRhdGVOdW1iZXIgZnJvbSAnLi92YWxpZGF0ZV9udW1iZXInO1xuaW1wb3J0IHZhbGlkYXRlQ29sb3IgZnJvbSAnLi92YWxpZGF0ZV9jb2xvcic7XG5pbXBvcnQgdmFsaWRhdGVDb25zdGFudHMgZnJvbSAnLi92YWxpZGF0ZV9jb25zdGFudHMnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0nO1xuaW1wb3J0IHZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGVfZmlsdGVyJztcbmltcG9ydCB2YWxpZGF0ZUxheWVyIGZyb20gJy4vdmFsaWRhdGVfbGF5ZXInO1xuaW1wb3J0IHZhbGlkYXRlU291cmNlIGZyb20gJy4vdmFsaWRhdGVfc291cmNlJztcbmltcG9ydCB2YWxpZGF0ZUxpZ2h0IGZyb20gJy4vdmFsaWRhdGVfbGlnaHQnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nJztcbmltcG9ydCB2YWxpZGF0ZUZvcm1hdHRlZCBmcm9tICcuL3ZhbGlkYXRlX2Zvcm1hdHRlZCc7XG5pbXBvcnQgdmFsaWRhdGVJbWFnZSBmcm9tICcuL3ZhbGlkYXRlX2ltYWdlJztcbmltcG9ydCB2YWxpZGF0ZVN0cmluZ09iamVjdCBmcm9tICcuL3ZhbGlkYXRlX3N0cmluZ29iamVjdCc7XG5cbmNvbnN0IFZBTElEQVRPUlMgPSB7XG4gICAgJyonKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICAnYXJyYXknOiB2YWxpZGF0ZUFycmF5LFxuICAgICdib29sZWFuJzogdmFsaWRhdGVCb29sZWFuLFxuICAgICdudW1iZXInOiB2YWxpZGF0ZU51bWJlcixcbiAgICAnY29sb3InOiB2YWxpZGF0ZUNvbG9yLFxuICAgICdjb25zdGFudHMnOiB2YWxpZGF0ZUNvbnN0YW50cyxcbiAgICAnZW51bSc6IHZhbGlkYXRlRW51bSxcbiAgICAnZmlsdGVyJzogdmFsaWRhdGVGaWx0ZXIsXG4gICAgJ2Z1bmN0aW9uJzogdmFsaWRhdGVGdW5jdGlvbixcbiAgICAnbGF5ZXInOiB2YWxpZGF0ZUxheWVyLFxuICAgICdvYmplY3QnOiB2YWxpZGF0ZU9iamVjdCxcbiAgICAnc291cmNlJzogdmFsaWRhdGVTb3VyY2UsXG4gICAgJ2xpZ2h0JzogdmFsaWRhdGVMaWdodCxcbiAgICAnc3RyaW5nJzogdmFsaWRhdGVTdHJpbmcsXG4gICAgJ2Zvcm1hdHRlZCc6IHZhbGlkYXRlRm9ybWF0dGVkLFxuICAgICdyZXNvbHZlZEltYWdlJzogdmFsaWRhdGVJbWFnZSxcbiAgICAnc3RyaW5nb2JqZWN0Jzp2YWxpZGF0ZVN0cmluZ09iamVjdFxufTtcblxuLy8gTWFpbiByZWN1cnNpdmUgdmFsaWRhdGlvbiBmdW5jdGlvbi4gVHJhY2tzOlxuLy9cbi8vIC0ga2V5OiBzdHJpbmcgcmVwcmVzZW50aW5nIGxvY2F0aW9uIG9mIHZhbGlkYXRpb24gaW4gc3R5bGUgdHJlZS4gVXNlZCBvbmx5XG4vLyAgIGZvciBtb3JlIGluZm9ybWF0aXZlIGVycm9yIHJlcG9ydGluZy5cbi8vIC0gdmFsdWU6IGN1cnJlbnQgdmFsdWUgZnJvbSBzdHlsZSBiZWluZyBldmFsdWF0ZWQuIE1heSBiZSBhbnl0aGluZyBmcm9tIGFcbi8vICAgaGlnaCBsZXZlbCBvYmplY3QgdGhhdCBuZWVkcyB0byBiZSBkZXNjZW5kZWQgaW50byBkZWVwZXIgb3IgYSBzaW1wbGVcbi8vICAgc2NhbGFyIHZhbHVlLlxuLy8gLSB2YWx1ZVNwZWM6IGN1cnJlbnQgc3BlYyBiZWluZyBldmFsdWF0ZWQuIFRyYWNrcyB2YWx1ZS5cbi8vIC0gc3R5bGVTcGVjOiBjdXJyZW50IGZ1bGwgc3BlYyBiZWluZyBldmFsdWF0ZWQuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG5cbiAgICBpZiAodmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgaXNGdW5jdGlvbih1bmJ1bmRsZSh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUZ1bmN0aW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMuZXhwcmVzc2lvbiAmJiBpc0V4cHJlc3Npb24oZGVlcFVuYnVuZGxlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zKTtcblxuICAgIH0gZWxzZSBpZiAodmFsdWVTcGVjLnR5cGUgJiYgVkFMSURBVE9SU1t2YWx1ZVNwZWMudHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIFZBTElEQVRPUlNbdmFsdWVTcGVjLnR5cGVdKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZU9iamVjdChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIHZhbHVlU3BlYzogdmFsdWVTcGVjLnR5cGUgPyBzdHlsZVNwZWNbdmFsdWVTcGVjLnR5cGVdIDogdmFsdWVTcGVjXG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcbmltcG9ydCB2YWxpZGF0ZVN0cmluZyBmcm9tICcuL3ZhbGlkYXRlX3N0cmluZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZVN0cmluZyhvcHRpb25zKTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkgcmV0dXJuIGVycm9ycztcblxuICAgIGlmICh2YWx1ZS5pbmRleE9mKCd7Zm9udHN0YWNrfScpID09PSAtMSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntmb250c3RhY2t9XCIgdG9rZW4nKSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ3tyYW5nZX0nKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJnbHlwaHNcIiB1cmwgbXVzdCBpbmNsdWRlIGEgXCJ7cmFuZ2V9XCIgdG9rZW4nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IHZhbGlkYXRlQ29uc3RhbnRzIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfY29uc3RhbnRzJztcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlJztcbmltcG9ydCBsYXRlc3RTdHlsZVNwZWMgZnJvbSAnLi9yZWZlcmVuY2UvbGF0ZXN0JztcbmltcG9ydCB2YWxpZGF0ZUdseXBoc1VSTCBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2dseXBoc191cmwnO1xuXG5pbXBvcnQgdmFsaWRhdGVTb3VyY2UgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9zb3VyY2UnO1xuaW1wb3J0IHZhbGlkYXRlTGlnaHQgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9saWdodCc7XG5pbXBvcnQgdmFsaWRhdGVMYXllciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheWVyJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlcic7XG5pbXBvcnQgdmFsaWRhdGVQYWludFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHknO1xuaW1wb3J0IHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHknO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgTWFwYm94IEdMIHN0eWxlIGFnYWluc3QgdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uIFRoaXMgZW50cnlwb2ludCxcbiAqIGBtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluYCwgaXMgZGVzaWduZWQgdG8gcHJvZHVjZSBhc1xuICogc21hbGwgYSBicm93c2VyaWZ5IGJ1bmRsZSBhcyBwb3NzaWJsZSBieSBvbWl0dGluZyB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgbGVnYWN5IHN0eWxlIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgVGhlIHN0eWxlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBsYXRlc3Qgc3R5bGUgc3BlYyBpcyB1c2VkLlxuICogQHJldHVybnMge0FycmF5PFZhbGlkYXRpb25FcnJvcj59XG4gKiBAZXhhbXBsZVxuICogICB2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluJyk7XG4gKiAgIHZhciBlcnJvcnMgPSB2YWxpZGF0ZShzdHlsZSk7XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3R5bGVNaW4oc3R5bGUsIHN0eWxlU3BlYyA9IGxhdGVzdFN0eWxlU3BlYykge1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIHZhbHVlOiBzdHlsZSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuJHJvb3QsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAvLyBnbHlwaHM6IHZhbGlkYXRlR2x5cGhzVVJMLFxuICAgICAgICAgICAgJyonKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIGlmIChzdHlsZS5jb25zdGFudHMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUNvbnN0YW50cyh7XG4gICAgICAgICAgICBrZXk6ICdjb25zdGFudHMnLFxuICAgICAgICAgICAgdmFsdWU6IHN0eWxlLmNvbnN0YW50cyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydEVycm9ycyhlcnJvcnMpO1xufVxuXG52YWxpZGF0ZVN0eWxlTWluLnNvdXJjZSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZVNvdXJjZSk7XG52YWxpZGF0ZVN0eWxlTWluLmxpZ2h0ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGlnaHQpO1xudmFsaWRhdGVTdHlsZU1pbi5sYXllciA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUxheWVyKTtcbnZhbGlkYXRlU3R5bGVNaW4uZmlsdGVyID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlRmlsdGVyKTtcbnZhbGlkYXRlU3R5bGVNaW4ucGFpbnRQcm9wZXJ0eSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZVBhaW50UHJvcGVydHkpO1xudmFsaWRhdGVTdHlsZU1pbi5sYXlvdXRQcm9wZXJ0eSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUxheW91dFByb3BlcnR5KTtcblxuZnVuY3Rpb24gc29ydEVycm9ycyhlcnJvcnMpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGVycm9ycykuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gYS5saW5lIC0gYi5saW5lO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB3cmFwQ2xlYW5FcnJvcnMoaW5uZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gc29ydEVycm9ycyhpbm5lci5hcHBseSh0aGlzLCBhcmdzKSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGVTdHlsZU1pbjtcbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGVTdHlsZU1pbiBmcm9tICcuLi9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pbic7XG5pbXBvcnQge0Vycm9yRXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCB0eXBlIHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG50eXBlIFZhbGlkYXRpb25FcnJvciA9IHtcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgbGluZTogbnVtYmVyLFxuICAgIGlkZW50aWZpZXI/OiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvciA9IChPYmplY3QpID0+ICRSZWFkT25seUFycmF5PFZhbGlkYXRpb25FcnJvcj47XG5cbnR5cGUgVmFsaWRhdGVTdHlsZSA9IHtcbiAgICAoT2JqZWN0LCA/T2JqZWN0KTogJFJlYWRPbmx5QXJyYXk8VmFsaWRhdGlvbkVycm9yPixcbiAgICBzb3VyY2U6IFZhbGlkYXRvcixcbiAgICBsYXllcjogVmFsaWRhdG9yLFxuICAgIGxpZ2h0OiBWYWxpZGF0b3IsXG4gICAgZmlsdGVyOiBWYWxpZGF0b3IsXG4gICAgcGFpbnRQcm9wZXJ0eTogVmFsaWRhdG9yLFxuICAgIGxheW91dFByb3BlcnR5OiBWYWxpZGF0b3Jcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN0eWxlID0gKHZhbGlkYXRlU3R5bGVNaW46IFZhbGlkYXRlU3R5bGUpO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTb3VyY2UgPSB2YWxpZGF0ZVN0eWxlLnNvdXJjZTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpZ2h0ID0gdmFsaWRhdGVTdHlsZS5saWdodDtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUZpbHRlciA9IHZhbGlkYXRlU3R5bGUuZmlsdGVyO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSA9IHZhbGlkYXRlU3R5bGUucGFpbnRQcm9wZXJ0eTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxheW91dFByb3BlcnR5ID0gdmFsaWRhdGVTdHlsZS5sYXlvdXRQcm9wZXJ0eTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVtaXRWYWxpZGF0aW9uRXJyb3JzKGVtaXR0ZXI6IEV2ZW50ZWQsIGVycm9yczogPyRSZWFkT25seUFycmF5PHttZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI/OiBzdHJpbmd9Pik6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSkpKTtcbiAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc0Vycm9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmNsYXNzIFpvb21IaXN0b3J5IHtcbiAgICBsYXN0Wm9vbTogbnVtYmVyO1xuICAgIGxhc3RGbG9vclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb21UaW1lOiBudW1iZXI7XG4gICAgZmlyc3Q6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maXJzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlKHo6IG51bWJlciwgbm93OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmxvb3JaID0gTWF0aC5mbG9vcih6KTtcblxuICAgICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5sYXN0Wm9vbSA9IHo7XG4gICAgICAgICAgICB0aGlzLmxhc3RGbG9vclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPiBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaICsgMTtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IG5vdztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPCBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gbm93O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHogIT09IHRoaXMubGFzdFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFpvb20gPSB6O1xuICAgICAgICAgICAgdGhpcy5sYXN0Rmxvb3Jab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBab29tSGlzdG9yeTtcbiIsIi8vIEBmbG93XG5cbi8vIFRoZSBmb2xsb3dpbmcgdGFibGUgY29tZXMgZnJvbSA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTIuMC4wL3VjZC9CbG9ja3MudHh0Pi5cbi8vIEtlZXAgaXQgc3luY2hyb25pemVkIHdpdGggPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0Jsb2Nrcy50eHQ+LlxuXG50eXBlIFVuaWNvZGVCbG9ja0xvb2t1cCA9IHtba2V5OiBzdHJpbmddOiAoY2hhcjogbnVtYmVyKSA9PiBib29sZWFufTtcblxuY29uc3QgdW5pY29kZUJsb2NrTG9va3VwOiBVbmljb2RlQmxvY2tMb29rdXAgPSB7XG4gICAgLy8gJ0Jhc2ljIExhdGluJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMDAwICYmIGNoYXIgPD0gMHgwMDdGLFxuICAgICdMYXRpbi0xIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDAwODAgJiYgY2hhciA8PSAweDAwRkYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDAxMDAgJiYgY2hhciA8PSAweDAxN0YsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDAxODAgJiYgY2hhciA8PSAweDAyNEYsXG4gICAgLy8gJ0lQQSBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMjUwICYmIGNoYXIgPD0gMHgwMkFGLFxuICAgIC8vICdTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDAyQjAgJiYgY2hhciA8PSAweDAyRkYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDMwMCAmJiBjaGFyIDw9IDB4MDM2RixcbiAgICAvLyAnR3JlZWsgYW5kIENvcHRpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDM3MCAmJiBjaGFyIDw9IDB4MDNGRixcbiAgICAvLyAnQ3lyaWxsaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA0MDAgJiYgY2hhciA8PSAweDA0RkYsXG4gICAgLy8gJ0N5cmlsbGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA1MDAgJiYgY2hhciA8PSAweDA1MkYsXG4gICAgLy8gJ0FybWVuaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNTMwICYmIGNoYXIgPD0gMHgwNThGLFxuICAgIC8vJ0hlYnJldyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDU5MCAmJiBjaGFyIDw9IDB4MDVGRixcbiAgICAnQXJhYmljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNjAwICYmIGNoYXIgPD0gMHgwNkZGLFxuICAgIC8vJ1N5cmlhYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDcwMCAmJiBjaGFyIDw9IDB4MDc0RixcbiAgICAnQXJhYmljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3NTAgJiYgY2hhciA8PSAweDA3N0YsXG4gICAgLy8gJ1RoYWFuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDc4MCAmJiBjaGFyIDw9IDB4MDdCRixcbiAgICAvLyAnTktvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwN0MwICYmIGNoYXIgPD0gMHgwN0ZGLFxuICAgIC8vICdTYW1hcml0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDA4MDAgJiYgY2hhciA8PSAweDA4M0YsXG4gICAgLy8gJ01hbmRhaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA4NDAgJiYgY2hhciA8PSAweDA4NUYsXG4gICAgLy8gJ1N5cmlhYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODYwICYmIGNoYXIgPD0gMHgwODZGLFxuICAgICdBcmFiaWMgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDhBMCAmJiBjaGFyIDw9IDB4MDhGRixcbiAgICAvLyAnRGV2YW5hZ2FyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDkwMCAmJiBjaGFyIDw9IDB4MDk3RixcbiAgICAvLyAnQmVuZ2FsaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDk4MCAmJiBjaGFyIDw9IDB4MDlGRixcbiAgICAvLyAnR3VybXVraGknOiAoY2hhcikgPT4gY2hhciA+PSAweDBBMDAgJiYgY2hhciA8PSAweDBBN0YsXG4gICAgLy8gJ0d1amFyYXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwQTgwICYmIGNoYXIgPD0gMHgwQUZGLFxuICAgIC8vICdPcml5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEIwMCAmJiBjaGFyIDw9IDB4MEI3RixcbiAgICAvLyAnVGFtaWwnOiAoY2hhcikgPT4gY2hhciA+PSAweDBCODAgJiYgY2hhciA8PSAweDBCRkYsXG4gICAgLy8gJ1RlbHVndSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEMwMCAmJiBjaGFyIDw9IDB4MEM3RixcbiAgICAvLyAnS2FubmFkYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEM4MCAmJiBjaGFyIDw9IDB4MENGRixcbiAgICAvLyAnTWFsYXlhbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDAwICYmIGNoYXIgPD0gMHgwRDdGLFxuICAgIC8vICdTaW5oYWxhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDgwICYmIGNoYXIgPD0gMHgwREZGLFxuICAgIC8vICdUaGFpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRTAwICYmIGNoYXIgPD0gMHgwRTdGLFxuICAgIC8vICdMYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDBFODAgJiYgY2hhciA8PSAweDBFRkYsXG4gICAgLy8gJ1RpYmV0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDBGRkYsXG4gICAgLy8gJ015YW5tYXInOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMDAgJiYgY2hhciA8PSAweDEwOUYsXG4gICAgLy8gJ0dlb3JnaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwICYmIGNoYXIgPD0gMHgxMEZGLFxuICAgICdIYW5ndWwgSmFtbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwMCAmJiBjaGFyIDw9IDB4MTFGRixcbiAgICAvLyAnRXRoaW9waWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEyMDAgJiYgY2hhciA8PSAweDEzN0YsXG4gICAgLy8gJ0V0aGlvcGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEzODAgJiYgY2hhciA8PSAweDEzOUYsXG4gICAgLy8gJ0NoZXJva2VlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxM0EwICYmIGNoYXIgPD0gMHgxM0ZGLFxuICAgICdVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNDAwICYmIGNoYXIgPD0gMHgxNjdGLFxuICAgIC8vICdPZ2hhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTY4MCAmJiBjaGFyIDw9IDB4MTY5RixcbiAgICAvLyAnUnVuaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QTAgJiYgY2hhciA8PSAweDE2RkYsXG4gICAgLy8gJ1RhZ2Fsb2cnOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MDAgJiYgY2hhciA8PSAweDE3MUYsXG4gICAgLy8gJ0hhbnVub28nOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MjAgJiYgY2hhciA8PSAweDE3M0YsXG4gICAgLy8gJ0J1aGlkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzQwICYmIGNoYXIgPD0gMHgxNzVGLFxuICAgIC8vICdUYWdiYW53YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTc2MCAmJiBjaGFyIDw9IDB4MTc3RixcbiAgICAnS2htZXInOiAoY2hhcikgPT4gY2hhciA+PSAweDE3ODAgJiYgY2hhciA8PSAweDE3RkYsXG4gICAgLy8gJ01vbmdvbGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTgwMCAmJiBjaGFyIDw9IDB4MThBRixcbiAgICAnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MThCMCAmJiBjaGFyIDw9IDB4MThGRixcbiAgICAvLyAnTGltYnUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5MDAgJiYgY2hhciA8PSAweDE5NEYsXG4gICAgLy8gJ1RhaSBMZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTk1MCAmJiBjaGFyIDw9IDB4MTk3RixcbiAgICAvLyAnTmV3IFRhaSBMdWUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5ODAgJiYgY2hhciA8PSAweDE5REYsXG4gICAgLy8gJ0tobWVyIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5RTAgJiYgY2hhciA8PSAweDE5RkYsXG4gICAgLy8gJ0J1Z2luZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQTAwICYmIGNoYXIgPD0gMHgxQTFGLFxuICAgIC8vICdUYWkgVGhhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUEyMCAmJiBjaGFyIDw9IDB4MUFBRixcbiAgICAvLyAnQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQUIwICYmIGNoYXIgPD0gMHgxQUZGLFxuICAgIC8vICdCYWxpbmVzZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMCAmJiBjaGFyIDw9IDB4MUI3RixcbiAgICAvLyAnU3VuZGFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjgwICYmIGNoYXIgPD0gMHgxQkJGLFxuICAgIC8vICdCYXRhayc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDMCAmJiBjaGFyIDw9IDB4MUJGRixcbiAgICAvLyAnTGVwY2hhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQzAwICYmIGNoYXIgPD0gMHgxQzRGLFxuICAgIC8vICdPbCBDaGlraSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM1MCAmJiBjaGFyIDw9IDB4MUM3RixcbiAgICAvLyAnQ3lyaWxsaWMgRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM4MCAmJiBjaGFyIDw9IDB4MUM4RixcbiAgICAvLyAnR2VvcmdpYW4gRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFDOTAgJiYgY2hhciA8PSAweDFDQkYsXG4gICAgLy8gJ1N1bmRhbmVzZSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQ0MwICYmIGNoYXIgPD0gMHgxQ0NGLFxuICAgIC8vICdWZWRpYyBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQ0QwICYmIGNoYXIgPD0gMHgxQ0ZGLFxuICAgIC8vICdQaG9uZXRpYyBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDAwICYmIGNoYXIgPD0gMHgxRDdGLFxuICAgIC8vICdQaG9uZXRpYyBFeHRlbnNpb25zIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEODAgJiYgY2hhciA8PSAweDFEQkYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxREMwICYmIGNoYXIgPD0gMHgxREZGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTAwICYmIGNoYXIgPD0gMHgxRUZGLFxuICAgIC8vICdHcmVlayBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYwMCAmJiBjaGFyIDw9IDB4MUZGRixcbiAgICAnR2VuZXJhbCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MjAwMCAmJiBjaGFyIDw9IDB4MjA2RixcbiAgICAvLyAnU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMDcwICYmIGNoYXIgPD0gMHgyMDlGLFxuICAgIC8vICdDdXJyZW5jeSBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMEEwICYmIGNoYXIgPD0gMHgyMENGLFxuICAgIC8vICdDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgZm9yIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIwRDAgJiYgY2hhciA8PSAweDIwRkYsXG4gICAgJ0xldHRlcmxpa2UgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjEwMCAmJiBjaGFyIDw9IDB4MjE0RixcbiAgICAnTnVtYmVyIEZvcm1zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMTUwICYmIGNoYXIgPD0gMHgyMThGLFxuICAgIC8vICdBcnJvd3MnOiAoY2hhcikgPT4gY2hhciA+PSAweDIxOTAgJiYgY2hhciA8PSAweDIxRkYsXG4gICAgLy8gJ01hdGhlbWF0aWNhbCBPcGVyYXRvcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIyMDAgJiYgY2hhciA8PSAweDIyRkYsXG4gICAgJ01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMzAwICYmIGNoYXIgPD0gMHgyM0ZGLFxuICAgICdDb250cm9sIFBpY3R1cmVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNDAwICYmIGNoYXIgPD0gMHgyNDNGLFxuICAgICdPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MjQ0MCAmJiBjaGFyIDw9IDB4MjQ1RixcbiAgICAnRW5jbG9zZWQgQWxwaGFudW1lcmljcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjQ2MCAmJiBjaGFyIDw9IDB4MjRGRixcbiAgICAvLyAnQm94IERyYXdpbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDI1MDAgJiYgY2hhciA8PSAweDI1N0YsXG4gICAgLy8gJ0Jsb2NrIEVsZW1lbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNTgwICYmIGNoYXIgPD0gMHgyNTlGLFxuICAgICdHZW9tZXRyaWMgU2hhcGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNUEwICYmIGNoYXIgPD0gMHgyNUZGLFxuICAgICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDI2MDAgJiYgY2hhciA8PSAweDI2RkYsXG4gICAgLy8gJ0RpbmdiYXRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNzAwICYmIGNoYXIgPD0gMHgyN0JGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDI3QzAgJiYgY2hhciA8PSAweDI3RUYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBBcnJvd3MtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MjdGMCAmJiBjaGFyIDw9IDB4MjdGRixcbiAgICAvLyAnQnJhaWxsZSBQYXR0ZXJucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjgwMCAmJiBjaGFyIDw9IDB4MjhGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIEFycm93cy1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyOTAwICYmIGNoYXIgPD0gMHgyOTdGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDI5ODAgJiYgY2hhciA8PSAweDI5RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQTAwICYmIGNoYXIgPD0gMHgyQUZGLFxuICAgICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkIwMCAmJiBjaGFyIDw9IDB4MkJGRixcbiAgICAvLyAnR2xhZ29saXRpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkMwMCAmJiBjaGFyIDw9IDB4MkM1RixcbiAgICAvLyAnTGF0aW4gRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkM2MCAmJiBjaGFyIDw9IDB4MkM3RixcbiAgICAvLyAnQ29wdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQzgwICYmIGNoYXIgPD0gMHgyQ0ZGLFxuICAgIC8vICdHZW9yZ2lhbiBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRDAwICYmIGNoYXIgPD0gMHgyRDJGLFxuICAgIC8vICdUaWZpbmFnaCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkQzMCAmJiBjaGFyIDw9IDB4MkQ3RixcbiAgICAvLyAnRXRoaW9waWMgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJEODAgJiYgY2hhciA8PSAweDJEREYsXG4gICAgLy8gJ0N5cmlsbGljIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDJERTAgJiYgY2hhciA8PSAweDJERkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBQdW5jdHVhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MkUwMCAmJiBjaGFyIDw9IDB4MkU3RixcbiAgICAnQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJFODAgJiYgY2hhciA8PSAweDJFRkYsXG4gICAgJ0thbmd4aSBSYWRpY2Fscyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkYwMCAmJiBjaGFyIDw9IDB4MkZERixcbiAgICAnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkZGMCAmJiBjaGFyIDw9IDB4MkZGRixcbiAgICAnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMDAwICYmIGNoYXIgPD0gMHgzMDNGLFxuICAgICdIaXJhZ2FuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MzA0MCAmJiBjaGFyIDw9IDB4MzA5RixcbiAgICAnS2F0YWthbmEnOiAoY2hhcikgPT4gY2hhciA+PSAweDMwQTAgJiYgY2hhciA8PSAweDMwRkYsXG4gICAgJ0JvcG9tb2ZvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMTAwICYmIGNoYXIgPD0gMHgzMTJGLFxuICAgICdIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMTMwICYmIGNoYXIgPD0gMHgzMThGLFxuICAgICdLYW5idW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDMxOTAgJiYgY2hhciA8PSAweDMxOUYsXG4gICAgJ0JvcG9tb2ZvIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMUEwICYmIGNoYXIgPD0gMHgzMUJGLFxuICAgICdDSksgU3Ryb2tlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzFDMCAmJiBjaGFyIDw9IDB4MzFFRixcbiAgICAnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzFGMCAmJiBjaGFyIDw9IDB4MzFGRixcbiAgICAnRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MzIwMCAmJiBjaGFyIDw9IDB4MzJGRixcbiAgICAnQ0pLIENvbXBhdGliaWxpdHknOiAoY2hhcikgPT4gY2hhciA+PSAweDMzMDAgJiYgY2hhciA8PSAweDMzRkYsXG4gICAgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEnOiAoY2hhcikgPT4gY2hhciA+PSAweDM0MDAgJiYgY2hhciA8PSAweDREQkYsXG4gICAgJ1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHg0REMwICYmIGNoYXIgPD0gMHg0REZGLFxuICAgICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHg0RTAwICYmIGNoYXIgPD0gMHg5RkZGLFxuICAgICdZaSBTeWxsYWJsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEEwMDAgJiYgY2hhciA8PSAweEE0OEYsXG4gICAgJ1lpIFJhZGljYWxzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNDkwICYmIGNoYXIgPD0gMHhBNENGLFxuICAgIC8vICdMaXN1JzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNEQwICYmIGNoYXIgPD0gMHhBNEZGLFxuICAgIC8vICdWYWknOiAoY2hhcikgPT4gY2hhciA+PSAweEE1MDAgJiYgY2hhciA8PSAweEE2M0YsXG4gICAgLy8gJ0N5cmlsbGljIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEE2NDAgJiYgY2hhciA8PSAweEE2OUYsXG4gICAgLy8gJ0JhbXVtJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBNkEwICYmIGNoYXIgPD0gMHhBNkZGLFxuICAgIC8vICdNb2RpZmllciBUb25lIExldHRlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweEE3MDAgJiYgY2hhciA8PSAweEE3MUYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUQnOiAoY2hhcikgPT4gY2hhciA+PSAweEE3MjAgJiYgY2hhciA8PSAweEE3RkYsXG4gICAgLy8gJ1N5bG90aSBOYWdyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4QTgwMCAmJiBjaGFyIDw9IDB4QTgyRixcbiAgICAvLyAnQ29tbW9uIEluZGljIE51bWJlciBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4QTgzMCAmJiBjaGFyIDw9IDB4QTgzRixcbiAgICAvLyAnUGhhZ3MtcGEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4NDAgJiYgY2hhciA8PSAweEE4N0YsXG4gICAgLy8gJ1NhdXJhc2h0cmEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4ODAgJiYgY2hhciA8PSAweEE4REYsXG4gICAgLy8gJ0RldmFuYWdhcmkgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweEE4RTAgJiYgY2hhciA8PSAweEE4RkYsXG4gICAgLy8gJ0theWFoIExpJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBOTAwICYmIGNoYXIgPD0gMHhBOTJGLFxuICAgIC8vICdSZWphbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweEE5MzAgJiYgY2hhciA8PSAweEE5NUYsXG4gICAgJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweEE5NjAgJiYgY2hhciA8PSAweEE5N0YsXG4gICAgLy8gJ0phdmFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBOTgwICYmIGNoYXIgPD0gMHhBOURGLFxuICAgIC8vICdNeWFubWFyIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEE5RTAgJiYgY2hhciA8PSAweEE5RkYsXG4gICAgLy8gJ0NoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweEFBMDAgJiYgY2hhciA8PSAweEFBNUYsXG4gICAgLy8gJ015YW5tYXIgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4QUE2MCAmJiBjaGFyIDw9IDB4QUE3RixcbiAgICAvLyAnVGFpIFZpZXQnOiAoY2hhcikgPT4gY2hhciA+PSAweEFBODAgJiYgY2hhciA8PSAweEFBREYsXG4gICAgLy8gJ01lZXRlaSBNYXllayBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQUUwICYmIGNoYXIgPD0gMHhBQUZGLFxuICAgIC8vICdFdGhpb3BpYyBFeHRlbmRlZC1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjAwICYmIGNoYXIgPD0gMHhBQjJGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZC1FJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjMwICYmIGNoYXIgPD0gMHhBQjZGLFxuICAgIC8vICdDaGVyb2tlZSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQjcwICYmIGNoYXIgPD0gMHhBQkJGLFxuICAgIC8vICdNZWV0ZWkgTWF5ZWsnOiAoY2hhcikgPT4gY2hhciA+PSAweEFCQzAgJiYgY2hhciA8PSAweEFCRkYsXG4gICAgJ0hhbmd1bCBTeWxsYWJsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEFDMDAgJiYgY2hhciA8PSAweEQ3QUYsXG4gICAgJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEQ3QjAgJiYgY2hhciA8PSAweEQ3RkYsXG4gICAgLy8gJ0hpZ2ggU3Vycm9nYXRlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RDgwMCAmJiBjaGFyIDw9IDB4REI3RixcbiAgICAvLyAnSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhEQjgwICYmIGNoYXIgPD0gMHhEQkZGLFxuICAgIC8vICdMb3cgU3Vycm9nYXRlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4REMwMCAmJiBjaGFyIDw9IDB4REZGRixcbiAgICAnUHJpdmF0ZSBVc2UgQXJlYSc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAwMCAmJiBjaGFyIDw9IDB4RjhGRixcbiAgICAnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4RjkwMCAmJiBjaGFyIDw9IDB4RkFGRixcbiAgICAvLyAnQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEZCMDAgJiYgY2hhciA8PSAweEZCNEYsXG4gICAgJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RkI1MCAmJiBjaGFyIDw9IDB4RkRGRixcbiAgICAvLyAnVmFyaWF0aW9uIFNlbGVjdG9ycyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkUwMCAmJiBjaGFyIDw9IDB4RkUwRixcbiAgICAnVmVydGljYWwgRm9ybXMnOiAoY2hhcikgPT4gY2hhciA+PSAweEZFMTAgJiYgY2hhciA8PSAweEZFMUYsXG4gICAgLy8gJ0NvbWJpbmluZyBIYWxmIE1hcmtzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTIwICYmIGNoYXIgPD0gMHhGRTJGLFxuICAgICdDSksgQ29tcGF0aWJpbGl0eSBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkUzMCAmJiBjaGFyIDw9IDB4RkU0RixcbiAgICAnU21hbGwgRm9ybSBWYXJpYW50cyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkU1MCAmJiBjaGFyIDw9IDB4RkU2RixcbiAgICAnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTcwICYmIGNoYXIgPD0gMHhGRUZGLFxuICAgICdIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkYwMCAmJiBjaGFyIDw9IDB4RkZFRlxuICAgIC8vICdTcGVjaWFscyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkZGMCAmJiBjaGFyIDw9IDB4RkZGRixcbiAgICAvLyAnTGluZWFyIEIgU3lsbGFiYXJ5JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDAwMCAmJiBjaGFyIDw9IDB4MTAwN0YsXG4gICAgLy8gJ0xpbmVhciBCIElkZW9ncmFtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwODAgJiYgY2hhciA8PSAweDEwMEZGLFxuICAgIC8vICdBZWdlYW4gTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAxMDAgJiYgY2hhciA8PSAweDEwMTNGLFxuICAgIC8vICdBbmNpZW50IEdyZWVrIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMTQwICYmIGNoYXIgPD0gMHgxMDE4RixcbiAgICAvLyAnQW5jaWVudCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDE5MCAmJiBjaGFyIDw9IDB4MTAxQ0YsXG4gICAgLy8gJ1BoYWlzdG9zIERpc2MnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMUQwICYmIGNoYXIgPD0gMHgxMDFGRixcbiAgICAvLyAnTHljaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDI4MCAmJiBjaGFyIDw9IDB4MTAyOUYsXG4gICAgLy8gJ0Nhcmlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAyQTAgJiYgY2hhciA8PSAweDEwMkRGLFxuICAgIC8vICdDb3B0aWMgRXBhY3QgTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAyRTAgJiYgY2hhciA8PSAweDEwMkZGLFxuICAgIC8vICdPbGQgSXRhbGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDMwMCAmJiBjaGFyIDw9IDB4MTAzMkYsXG4gICAgLy8gJ0dvdGhpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAzMzAgJiYgY2hhciA8PSAweDEwMzRGLFxuICAgIC8vICdPbGQgUGVybWljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDM1MCAmJiBjaGFyIDw9IDB4MTAzN0YsXG4gICAgLy8gJ1VnYXJpdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDM4MCAmJiBjaGFyIDw9IDB4MTAzOUYsXG4gICAgLy8gJ09sZCBQZXJzaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDNBMCAmJiBjaGFyIDw9IDB4MTAzREYsXG4gICAgLy8gJ0Rlc2VyZXQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNDAwICYmIGNoYXIgPD0gMHgxMDQ0RixcbiAgICAvLyAnU2hhdmlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA0NTAgJiYgY2hhciA8PSAweDEwNDdGLFxuICAgIC8vICdPc21hbnlhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDQ4MCAmJiBjaGFyIDw9IDB4MTA0QUYsXG4gICAgLy8gJ09zYWdlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDRCMCAmJiBjaGFyIDw9IDB4MTA0RkYsXG4gICAgLy8gJ0VsYmFzYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNTAwICYmIGNoYXIgPD0gMHgxMDUyRixcbiAgICAvLyAnQ2F1Y2FzaWFuIEFsYmFuaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDUzMCAmJiBjaGFyIDw9IDB4MTA1NkYsXG4gICAgLy8gJ0xpbmVhciBBJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDYwMCAmJiBjaGFyIDw9IDB4MTA3N0YsXG4gICAgLy8gJ0N5cHJpb3QgU3lsbGFiYXJ5JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDgwMCAmJiBjaGFyIDw9IDB4MTA4M0YsXG4gICAgLy8gJ0ltcGVyaWFsIEFyYW1haWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwODQwICYmIGNoYXIgPD0gMHgxMDg1RixcbiAgICAvLyAnUGFsbXlyZW5lJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDg2MCAmJiBjaGFyIDw9IDB4MTA4N0YsXG4gICAgLy8gJ05hYmF0YWVhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA4ODAgJiYgY2hhciA8PSAweDEwOEFGLFxuICAgIC8vICdIYXRyYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOEUwICYmIGNoYXIgPD0gMHgxMDhGRixcbiAgICAvLyAnUGhvZW5pY2lhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5MDAgJiYgY2hhciA8PSAweDEwOTFGLFxuICAgIC8vICdMeWRpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOTIwICYmIGNoYXIgPD0gMHgxMDkzRixcbiAgICAvLyAnTWVyb2l0aWMgSGllcm9nbHlwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwOTgwICYmIGNoYXIgPD0gMHgxMDk5RixcbiAgICAvLyAnTWVyb2l0aWMgQ3Vyc2l2ZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5QTAgJiYgY2hhciA8PSAweDEwOUZGLFxuICAgIC8vICdLaGFyb3NodGhpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwMCAmJiBjaGFyIDw9IDB4MTBBNUYsXG4gICAgLy8gJ09sZCBTb3V0aCBBcmFiaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEE2MCAmJiBjaGFyIDw9IDB4MTBBN0YsXG4gICAgLy8gJ09sZCBOb3J0aCBBcmFiaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEE4MCAmJiBjaGFyIDw9IDB4MTBBOUYsXG4gICAgLy8gJ01hbmljaGFlYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQUMwICYmIGNoYXIgPD0gMHgxMEFGRixcbiAgICAvLyAnQXZlc3Rhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBCMDAgJiYgY2hhciA8PSAweDEwQjNGLFxuICAgIC8vICdJbnNjcmlwdGlvbmFsIFBhcnRoaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEI0MCAmJiBjaGFyIDw9IDB4MTBCNUYsXG4gICAgLy8gJ0luc2NyaXB0aW9uYWwgUGFobGF2aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBCNjAgJiYgY2hhciA8PSAweDEwQjdGLFxuICAgIC8vICdQc2FsdGVyIFBhaGxhdmknOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQjgwICYmIGNoYXIgPD0gMHgxMEJBRixcbiAgICAvLyAnT2xkIFR1cmtpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBDMDAgJiYgY2hhciA8PSAweDEwQzRGLFxuICAgIC8vICdPbGQgSHVuZ2FyaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEM4MCAmJiBjaGFyIDw9IDB4MTBDRkYsXG4gICAgLy8gJ0hhbmlmaSBSb2hpbmd5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBEMDAgJiYgY2hhciA8PSAweDEwRDNGLFxuICAgIC8vICdSdW1pIE51bWVyYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBFNjAgJiYgY2hhciA8PSAweDEwRTdGLFxuICAgIC8vICdPbGQgU29nZGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBGMDAgJiYgY2hhciA8PSAweDEwRjJGLFxuICAgIC8vICdTb2dkaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEYzMCAmJiBjaGFyIDw9IDB4MTBGNkYsXG4gICAgLy8gJ0VseW1haWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwRkUwICYmIGNoYXIgPD0gMHgxMEZGRixcbiAgICAvLyAnQnJhaG1pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTAwMCAmJiBjaGFyIDw9IDB4MTEwN0YsXG4gICAgLy8gJ0thaXRoaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwODAgJiYgY2hhciA8PSAweDExMENGLFxuICAgIC8vICdTb3JhIFNvbXBlbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMEQwICYmIGNoYXIgPD0gMHgxMTBGRixcbiAgICAvLyAnQ2hha21hJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTEwMCAmJiBjaGFyIDw9IDB4MTExNEYsXG4gICAgLy8gJ01haGFqYW5pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTE1MCAmJiBjaGFyIDw9IDB4MTExN0YsXG4gICAgLy8gJ1NoYXJhZGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMTgwICYmIGNoYXIgPD0gMHgxMTFERixcbiAgICAvLyAnU2luaGFsYSBBcmNoYWljIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMUUwICYmIGNoYXIgPD0gMHgxMTFGRixcbiAgICAvLyAnS2hvamtpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTIwMCAmJiBjaGFyIDw9IDB4MTEyNEYsXG4gICAgLy8gJ011bHRhbmknOiAoY2hhcikgPT4gY2hhciA+PSAweDExMjgwICYmIGNoYXIgPD0gMHgxMTJBRixcbiAgICAvLyAnS2h1ZGF3YWRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTJCMCAmJiBjaGFyIDw9IDB4MTEyRkYsXG4gICAgLy8gJ0dyYW50aGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMzAwICYmIGNoYXIgPD0gMHgxMTM3RixcbiAgICAvLyAnTmV3YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE0MDAgJiYgY2hhciA8PSAweDExNDdGLFxuICAgIC8vICdUaXJodXRhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTQ4MCAmJiBjaGFyIDw9IDB4MTE0REYsXG4gICAgLy8gJ1NpZGRoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDExNTgwICYmIGNoYXIgPD0gMHgxMTVGRixcbiAgICAvLyAnTW9kaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2MDAgJiYgY2hhciA8PSAweDExNjVGLFxuICAgIC8vICdNb25nb2xpYW4gU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2NjAgJiYgY2hhciA8PSAweDExNjdGLFxuICAgIC8vICdUYWtyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2ODAgJiYgY2hhciA8PSAweDExNkNGLFxuICAgIC8vICdBaG9tJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTcwMCAmJiBjaGFyIDw9IDB4MTE3M0YsXG4gICAgLy8gJ0RvZ3JhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTgwMCAmJiBjaGFyIDw9IDB4MTE4NEYsXG4gICAgLy8gJ1dhcmFuZyBDaXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMThBMCAmJiBjaGFyIDw9IDB4MTE4RkYsXG4gICAgLy8gJ05hbmRpbmFnYXJpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTlBMCAmJiBjaGFyIDw9IDB4MTE5RkYsXG4gICAgLy8gJ1phbmFiYXphciBTcXVhcmUnOiAoY2hhcikgPT4gY2hhciA+PSAweDExQTAwICYmIGNoYXIgPD0gMHgxMUE0RixcbiAgICAvLyAnU295b21ibyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFBNTAgJiYgY2hhciA8PSAweDExQUFGLFxuICAgIC8vICdQYXUgQ2luIEhhdSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFBQzAgJiYgY2hhciA8PSAweDExQUZGLFxuICAgIC8vICdCaGFpa3N1a2knOiAoY2hhcikgPT4gY2hhciA+PSAweDExQzAwICYmIGNoYXIgPD0gMHgxMUM2RixcbiAgICAvLyAnTWFyY2hlbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTFDNzAgJiYgY2hhciA8PSAweDExQ0JGLFxuICAgIC8vICdNYXNhcmFtIEdvbmRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUQwMCAmJiBjaGFyIDw9IDB4MTFENUYsXG4gICAgLy8gJ0d1bmphbGEgR29uZGknOiAoY2hhcikgPT4gY2hhciA+PSAweDExRDYwICYmIGNoYXIgPD0gMHgxMURBRixcbiAgICAvLyAnTWFrYXNhcic6IChjaGFyKSA9PiBjaGFyID49IDB4MTFFRTAgJiYgY2hhciA8PSAweDExRUZGLFxuICAgIC8vICdUYW1pbCBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUZDMCAmJiBjaGFyIDw9IDB4MTFGRkYsXG4gICAgLy8gJ0N1bmVpZm9ybSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTIwMDAgJiYgY2hhciA8PSAweDEyM0ZGLFxuICAgIC8vICdDdW5laWZvcm0gTnVtYmVycyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDEyNDAwICYmIGNoYXIgPD0gMHgxMjQ3RixcbiAgICAvLyAnRWFybHkgRHluYXN0aWMgQ3VuZWlmb3JtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMjQ4MCAmJiBjaGFyIDw9IDB4MTI1NEYsXG4gICAgLy8gJ0VneXB0aWFuIEhpZXJvZ2x5cGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzAwMCAmJiBjaGFyIDw9IDB4MTM0MkYsXG4gICAgLy8gJ0VneXB0aWFuIEhpZXJvZ2x5cGggRm9ybWF0IENvbnRyb2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzQzMCAmJiBjaGFyIDw9IDB4MTM0M0YsXG4gICAgLy8gJ0FuYXRvbGlhbiBIaWVyb2dseXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTQ0MDAgJiYgY2hhciA8PSAweDE0NjdGLFxuICAgIC8vICdCYW11bSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNjgwMCAmJiBjaGFyIDw9IDB4MTZBM0YsXG4gICAgLy8gJ01ybyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTZBNDAgJiYgY2hhciA8PSAweDE2QTZGLFxuICAgIC8vICdCYXNzYSBWYWgnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QUQwICYmIGNoYXIgPD0gMHgxNkFGRixcbiAgICAvLyAnUGFoYXdoIEhtb25nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkIwMCAmJiBjaGFyIDw9IDB4MTZCOEYsXG4gICAgLy8gJ01lZGVmYWlkcmluJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkU0MCAmJiBjaGFyIDw9IDB4MTZFOUYsXG4gICAgLy8gJ01pYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RjAwICYmIGNoYXIgPD0gMHgxNkY5RixcbiAgICAvLyAnSWRlb2dyYXBoaWMgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RkUwICYmIGNoYXIgPD0gMHgxNkZGRixcbiAgICAvLyAnVGFuZ3V0JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzAwMCAmJiBjaGFyIDw9IDB4MTg3RkYsXG4gICAgLy8gJ1Rhbmd1dCBDb21wb25lbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxODgwMCAmJiBjaGFyIDw9IDB4MThBRkYsXG4gICAgLy8gJ0thbmEgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMDAgJiYgY2hhciA8PSAweDFCMEZGLFxuICAgIC8vICdLYW5hIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTAwICYmIGNoYXIgPD0gMHgxQjEyRixcbiAgICAvLyAnU21hbGwgS2FuYSBFeHRlbnNpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTMwICYmIGNoYXIgPD0gMHgxQjE2RixcbiAgICAvLyAnTnVzaHUnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTcwICYmIGNoYXIgPD0gMHgxQjJGRixcbiAgICAvLyAnRHVwbG95YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDFCQzAwICYmIGNoYXIgPD0gMHgxQkM5RixcbiAgICAvLyAnU2hvcnRoYW5kIEZvcm1hdCBDb250cm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDQTAgJiYgY2hhciA8PSAweDFCQ0FGLFxuICAgIC8vICdCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDAwMCAmJiBjaGFyIDw9IDB4MUQwRkYsXG4gICAgLy8gJ011c2ljYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQxMDAgJiYgY2hhciA8PSAweDFEMUZGLFxuICAgIC8vICdBbmNpZW50IEdyZWVrIE11c2ljYWwgTm90YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMjAwICYmIGNoYXIgPD0gMHgxRDI0RixcbiAgICAvLyAnTWF5YW4gTnVtZXJhbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMkUwICYmIGNoYXIgPD0gMHgxRDJGRixcbiAgICAvLyAnVGFpIFh1YW4gSmluZyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDMwMCAmJiBjaGFyIDw9IDB4MUQzNUYsXG4gICAgLy8gJ0NvdW50aW5nIFJvZCBOdW1lcmFscyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQzNjAgJiYgY2hhciA8PSAweDFEMzdGLFxuICAgIC8vICdNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFENDAwICYmIGNoYXIgPD0gMHgxRDdGRixcbiAgICAvLyAnU3V0dG9uIFNpZ25Xcml0aW5nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDgwMCAmJiBjaGFyIDw9IDB4MURBQUYsXG4gICAgLy8gJ0dsYWdvbGl0aWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUUwMDAgJiYgY2hhciA8PSAweDFFMDJGLFxuICAgIC8vICdOeWlha2VuZyBQdWFjaHVlIEhtb25nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTEwMCAmJiBjaGFyIDw9IDB4MUUxNEYsXG4gICAgLy8gJ1dhbmNobyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUUyQzAgJiYgY2hhciA8PSAweDFFMkZGLFxuICAgIC8vICdNZW5kZSBLaWtha3VpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTgwMCAmJiBjaGFyIDw9IDB4MUU4REYsXG4gICAgLy8gJ0FkbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTkwMCAmJiBjaGFyIDw9IDB4MUU5NUYsXG4gICAgLy8gJ0luZGljIFNpeWFxIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFFQzcwICYmIGNoYXIgPD0gMHgxRUNCRixcbiAgICAvLyAnT3R0b21hbiBTaXlhcSBOdW1iZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRUQwMCAmJiBjaGFyIDw9IDB4MUVENEYsXG4gICAgLy8gJ0FyYWJpYyBNYXRoZW1hdGljYWwgQWxwaGFiZXRpYyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRUUwMCAmJiBjaGFyIDw9IDB4MUVFRkYsXG4gICAgLy8gJ01haGpvbmcgVGlsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMDAwICYmIGNoYXIgPD0gMHgxRjAyRixcbiAgICAvLyAnRG9taW5vIFRpbGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjAzMCAmJiBjaGFyIDw9IDB4MUYwOUYsXG4gICAgLy8gJ1BsYXlpbmcgQ2FyZHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMEEwICYmIGNoYXIgPD0gMHgxRjBGRixcbiAgICAvLyAnRW5jbG9zZWQgQWxwaGFudW1lcmljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMTAwICYmIGNoYXIgPD0gMHgxRjFGRixcbiAgICAvLyAnRW5jbG9zZWQgSWRlb2dyYXBoaWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYyMDAgJiYgY2hhciA8PSAweDFGMkZGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjMwMCAmJiBjaGFyIDw9IDB4MUY1RkYsXG4gICAgLy8gJ0Vtb3RpY29ucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY2MDAgJiYgY2hhciA8PSAweDFGNjRGLFxuICAgIC8vICdPcm5hbWVudGFsIERpbmdiYXRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjY1MCAmJiBjaGFyIDw9IDB4MUY2N0YsXG4gICAgLy8gJ1RyYW5zcG9ydCBhbmQgTWFwIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNjgwICYmIGNoYXIgPD0gMHgxRjZGRixcbiAgICAvLyAnQWxjaGVtaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjcwMCAmJiBjaGFyIDw9IDB4MUY3N0YsXG4gICAgLy8gJ0dlb21ldHJpYyBTaGFwZXMgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNzgwICYmIGNoYXIgPD0gMHgxRjdGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIEFycm93cy1DJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjgwMCAmJiBjaGFyIDw9IDB4MUY4RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBTeW1ib2xzIGFuZCBQaWN0b2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY5MDAgJiYgY2hhciA8PSAweDFGOUZGLFxuICAgIC8vICdDaGVzcyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRkEwMCAmJiBjaGFyIDw9IDB4MUZBNkYsXG4gICAgLy8gJ1N5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGQTcwICYmIGNoYXIgPD0gMHgxRkFGRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQic6IChjaGFyKSA9PiBjaGFyID49IDB4MjAwMDAgJiYgY2hhciA8PSAweDJBNkRGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBDJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQTcwMCAmJiBjaGFyIDw9IDB4MkI3M0YsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJCNzQwICYmIGNoYXIgPD0gMHgyQjgxRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gRSc6IChjaGFyKSA9PiBjaGFyID49IDB4MkI4MjAgJiYgY2hhciA8PSAweDJDRUFGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBGJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQ0VCMCAmJiBjaGFyIDw9IDB4MkVCRUYsXG4gICAgLy8gJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkY4MDAgJiYgY2hhciA8PSAweDJGQTFGLFxuICAgIC8vICdUYWdzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhFMDAwMCAmJiBjaGFyIDw9IDB4RTAwN0YsXG4gICAgLy8gJ1ZhcmlhdGlvbiBTZWxlY3RvcnMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAxMDAgJiYgY2hhciA8PSAweEUwMUVGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RjAwMDAgJiYgY2hhciA8PSAweEZGRkZGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwMDAwICYmIGNoYXIgPD0gMHgxMEZGRkYsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bmljb2RlQmxvY2tMb29rdXA7XG4iLCIvLyBAZmxvd1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5cbmltcG9ydCBpc0NoYXIgZnJvbSAnLi9pc19jaGFyX2luX3VuaWNvZGVfYmxvY2snO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjaGFyczogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmICghY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhci5jaGFyQ29kZUF0KDApKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUoY2hhcnM6IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgICBpZiAoY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIuY2hhckNvZGVBdCgwKSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd3NMZXR0ZXJTcGFjaW5nKGNoYXJzOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFyQWxsb3dzTGV0dGVyU3BhY2luZyhjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0xldHRlclNwYWNpbmcoY2hhcjogbnVtYmVyKSB7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljJ10oY2hhcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIEV4dGVuZGVkLUEnXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcikpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhcjogbnVtYmVyKSB7XG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIGlkZW9ncmFwaGljIHJhbmdlcy5cbiAgICBpZiAoY2hhciA8IDB4MkU4MCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8gRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgbG9naWMgY29tZXMgZnJvbVxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEyLjAuMC91Y2QvVmVydGljYWxPcmllbnRhdGlvbi50eHQ+LlxuLy8gS2VlcCBpdCBzeW5jaHJvbml6ZWQgd2l0aFxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL1ZlcnRpY2FsT3JpZW50YXRpb24udHh0Pi5cbi8vIFRoZSBkYXRhIGZpbGUgZGVub3RlcyB3aXRoIOKAnFXigJ0gb3Ig4oCcVHXigJ0gYW55IGNvZGVwb2ludCB0aGF0IG1heSBiZSBkcmF3blxuLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB0ZXh0IGJ1dCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVwcmlnaHQgYW5kXG4vLyDigJxuZXV0cmFs4oCdIGNoYXJhY3RlcnMuXG5cbi8vIEJsb2NrcyBpbiB0aGUgVW5pY29kZSBzdXBwbGVtZW50YXJ5IHBsYW5lcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGlzIG1vZHVsZSBkdWVcbi8vIHRvIDxodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC9pc3N1ZXMvMjk+LlxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiB1cHJpZ2h0IG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyB1cHJpZ2h0IG9yaWVudGF0aW9uIGlmIGl0IGlzIGRyYXduIHVwcmlnaHQgKHVucm90YXRlZClcbiAqIHdoZXRoZXIgdGhlIGxpbmUgaXMgb3JpZW50ZWQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHksIGV2ZW4gaWYgYm90aFxuICogYWRqYWNlbnQgY2hhcmFjdGVycyBjYW4gYmUgcm90YXRlZC4gRm9yIGV4YW1wbGUsIGEgQ2hpbmVzZSBjaGFyYWN0ZXIgaXNcbiAqIGFsd2F5cyBkcmF3biB1cHJpZ2h0LiBBbiB1cHJpZ2h0bHkgb3JpZW50ZWQgY2hhcmFjdGVyIGNhdXNlcyBhbiBhZGphY2VudFxuICog4oCcbmV1dHJhbOKAnSBjaGFyYWN0ZXIgdG8gYmUgZHJhd24gdXByaWdodCBhcyB3ZWxsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpIHtcbiAgICBpZiAoY2hhciA9PT0gMHgwMkVBIC8qIG1vZGlmaWVyIGxldHRlciB5aW4gZGVwYXJ0aW5nIHRvbmUgbWFyayAqLyB8fFxuICAgICAgICBjaGFyID09PSAweDAyRUIgLyogbW9kaWZpZXIgbGV0dGVyIHlhbmcgZGVwYXJ0aW5nIHRvbmUgbWFyayAqLykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZWFybHkgZm9yIGNoYXJhY3RlcnMgb3V0c2lkZSBhbGwgcmFuZ2VzIHdob3NlIGNoYXJhY3RlcnMgcmVtYWluXG4gICAgLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB3cml0aW5nIG1vZGUuXG4gICAgaWYgKGNoYXIgPCAweDExMDApIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTQ5IC8qIGRhc2hlZCBvdmVybGluZSAqLyAmJiBjaGFyIDw9IDB4RkU0RikgLyogd2F2eSBsb3cgbGluZSAqLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHknXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN0cm9rZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHgzMDA4IC8qIGxlZnQgYW5nbGUgYnJhY2tldCAqLyAmJiBjaGFyIDw9IDB4MzAxMSkgLyogcmlnaHQgYmxhY2sgbGVudGljdWxhciBicmFja2V0ICovKSAmJlxuICAgICAgICAgICAgISgoY2hhciA+PSAweDMwMTQgLyogbGVmdCB0b3J0b2lzZSBzaGVsbCBicmFja2V0ICovICYmIGNoYXIgPD0gMHgzMDFGKSAvKiBsb3cgZG91YmxlIHByaW1lIHF1b3RhdGlvbiBtYXJrICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHgzMDMwIC8qIHdhdnkgZGFzaCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgSmFtbyBFeHRlbmRlZC1BJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUInXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIEphbW8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIaXJhZ2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thbmJ1biddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyICE9PSAweDMwRkMgLyoga2F0YWthbmEtaGlyYWdhbmEgcHJvbG9uZ2VkIHNvdW5kIG1hcmsgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgIT09IDB4RkYwOCAvKiBmdWxsd2lkdGggbGVmdCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjA5IC8qIGZ1bGx3aWR0aCByaWdodCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjBEIC8qIGZ1bGx3aWR0aCBoeXBoZW4tbWludXMgKi8gJiZcbiAgICAgICAgICAgICEoKGNoYXIgPj0gMHhGRjFBIC8qIGZ1bGx3aWR0aCBjb2xvbiAqLyAmJiBjaGFyIDw9IDB4RkYxRSkgLyogZnVsbHdpZHRoIGdyZWF0ZXItdGhhbiBzaWduICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjNCIC8qIGZ1bGx3aWR0aCBsZWZ0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0QgLyogZnVsbHdpZHRoIHJpZ2h0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0YgLyogZnVsbHdpZHRoIGxvdyBsaW5lICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRjVCIC8qIGZ1bGx3aWR0aCBsZWZ0IGN1cmx5IGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweEZGREYpICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGRTMgLyogZnVsbHdpZHRoIG1hY3JvbiAqLyAmJlxuICAgICAgICAgICAgIShjaGFyID49IDB4RkZFOCAvKiBoYWxmd2lkdGggZm9ybXMgbGlnaHQgdmVydGljYWwgKi8gJiYgY2hhciA8PSAweEZGRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydTbWFsbCBGb3JtIFZhcmlhbnRzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTU4IC8qIHNtYWxsIGVtIGRhc2ggKi8gJiYgY2hhciA8PSAweEZFNUUpIC8qIHNtYWxsIHJpZ2h0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8pICYmXG4gICAgICAgICAgICAhKChjaGFyID49IDB4RkU2MyAvKiBzbWFsbCBoeXBoZW4tbWludXMgKi8gJiYgY2hhciA8PSAweEZFNjYpIC8qIHNtYWxsIGVxdWFscyBzaWduICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1ZlcnRpY2FsIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogbmV1dHJhbCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgbmV1dHJhbCBvcmllbnRhdGlvbiBpZiBpdCBtYXkgYmUgZHJhd24gcm90YXRlZCBvciB1bnJvdGF0ZWRcbiAqIHdoZW4gdGhlIGxpbmUgaXMgb3JpZW50ZWQgdmVydGljYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBvcmllbnRhdGlvbiBvZiB0aGVcbiAqIGFkamFjZW50IGNoYXJhY3RlcnMuIEZvciBleGFtcGxlLCBhbG9uZyBhIHZlcnRpY2xseSBvcmllbnRlZCBsaW5lLCB0aGUgdnVsZ2FyXG4gKiBmcmFjdGlvbiDCvSBpcyBkcmF3biB1cHJpZ2h0IGFtb25nIENoaW5lc2UgY2hhcmFjdGVycyBidXQgcm90YXRlZCBhbW9uZyBMYXRpblxuICogbGV0dGVycy4gQSBuZXV0cmFsbHkgb3JpZW50ZWQgY2hhcmFjdGVyIGRvZXMgbm90IGluZmx1ZW5jZSB3aGV0aGVyIGFuXG4gKiBhZGphY2VudCBjaGFyYWN0ZXIgaXMgZHJhd24gdXByaWdodCBvciByb3RhdGVkLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpIHtcbiAgICBpZiAoaXNDaGFyWydMYXRpbi0xIFN1cHBsZW1lbnQnXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gMHgwMEE3IC8qIHNlY3Rpb24gc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEE5IC8qIGNvcHlyaWdodCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQUUgLyogcmVnaXN0ZXJlZCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQjEgLyogcGx1cy1taW51cyBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkMgLyogdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkQgLyogdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkUgLyogdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwRDcgLyogbXVsdGlwbGljYXRpb24gc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEY3IC8qIGRpdmlzaW9uIHNpZ24gKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0dlbmVyYWwgUHVuY3R1YXRpb24nXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gMHgyMDE2IC8qIGRvdWJsZSB2ZXJ0aWNhbCBsaW5lICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMjAgLyogZGFnZ2VyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMjEgLyogZG91YmxlIGRhZ2dlciAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDMwIC8qIHBlciBtaWxsZSBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMzEgLyogcGVyIHRlbiB0aG91c2FuZCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwM0IgLyogcmVmZXJlbmNlIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzQyAvKiBkb3VibGUgZXhjbGFtYXRpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQyIC8qIGFzdGVyaXNtICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDcgLyogZG91YmxlIHF1ZXN0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0OCAvKiBxdWVzdGlvbiBleGNsYW1hdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDkgLyogZXhjbGFtYXRpb24gcXVlc3Rpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDUxIC8qIHR3byBhc3Rlcmlza3MgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydMZXR0ZXJsaWtlIFN5bWJvbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTnVtYmVyIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKChjaGFyID49IDB4MjMwMCAvKiBkaWFtZXRlciBzaWduICovICYmIGNoYXIgPD0gMHgyMzA3IC8qIHdhdnkgbGluZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjMwQyAvKiBib3R0b20gcmlnaHQgY3JvcCAqLyAmJiBjaGFyIDw9IDB4MjMxRiAvKiBib3R0b20gcmlnaHQgY29ybmVyICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzI0IC8qIHVwIGFycm93aGVhZCBiZXR3ZWVuIHR3byBob3Jpem9udGFsIGJhcnMgKi8gJiYgY2hhciA8PSAweDIzMjggLyoga2V5Ym9hcmQgKi8pIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIzMkIgLyogZXJhc2UgdG8gdGhlIGxlZnQgKi8gfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjM3RCAvKiBzaG91bGRlcmVkIG9wZW4gYm94ICovICYmIGNoYXIgPD0gMHgyMzlBIC8qIGNsZWFyIHNjcmVlbiBzeW1ib2wgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzQkUgLyogZGVudGlzdHJ5IHN5bWJvbCBsaWdodCB2ZXJ0aWNhbCBhbmQgdG9wIHJpZ2h0ICovICYmIGNoYXIgPD0gMHgyM0NEIC8qIHNxdWFyZSBmb290ICovKSB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyM0NGIC8qIGVqZWN0IHN5bWJvbCAqLyB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyM0QxIC8qIG1ldHJpY2FsIGJyZXZlICovICYmIGNoYXIgPD0gMHgyM0RCIC8qIGZ1c2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzRTIgLyogd2hpdGUgdHJhcGV6aXVtICovICYmIGNoYXIgPD0gMHgyM0ZGKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ29udHJvbCBQaWN0dXJlcyddKGNoYXIpICYmIGNoYXIgIT09IDB4MjQyMyAvKiBvcGVuIGJveCAqLykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnRW5jbG9zZWQgQWxwaGFudW1lcmljcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydHZW9tZXRyaWMgU2hhcGVzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ01pc2NlbGxhbmVvdXMgU3ltYm9scyddKGNoYXIpKSB7XG4gICAgICAgIGlmICghKChjaGFyID49IDB4MjYxQSAvKiBibGFjayBsZWZ0IHBvaW50aW5nIGluZGV4ICovICYmIGNoYXIgPD0gMHgyNjFGKSAvKiB3aGl0ZSBkb3duIHBvaW50aW5nIGluZGV4ICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3MnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyQjEyIC8qIHNxdWFyZSB3aXRoIHRvcCBoYWxmIGJsYWNrICovICYmIGNoYXIgPD0gMHgyQjJGIC8qIHdoaXRlIHZlcnRpY2FsIGVsbGlwc2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDJCNTAgLyogd2hpdGUgbWVkaXVtIHN0YXIgKi8gJiYgY2hhciA8PSAweDJCNTkgLyogaGVhdnkgY2lyY2xlZCBzYWx0aXJlICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyQkI4IC8qIHVwd2FyZHMgd2hpdGUgYXJyb3cgZnJvbSBiYXIgd2l0aCBob3Jpem9udGFsIGJhciAqLyAmJiBjaGFyIDw9IDB4MkJFQikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydQcml2YXRlIFVzZSBBcmVhJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoY2hhciA9PT0gMHgyMjFFIC8qIGluZmluaXR5ICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4MjIzNCAvKiB0aGVyZWZvcmUgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgyMjM1IC8qIGJlY2F1c2UgKi8gfHxcbiAgICAgICAgKGNoYXIgPj0gMHgyNzAwIC8qIGJsYWNrIHNhZmV0eSBzY2lzc29ycyAqLyAmJiBjaGFyIDw9IDB4Mjc2NyAvKiByb3RhdGVkIGZsb3JhbCBoZWFydCBidWxsZXQgKi8pIHx8XG4gICAgICAgIChjaGFyID49IDB4Mjc3NiAvKiBkaW5nYmF0IG5lZ2F0aXZlIGNpcmNsZWQgZGlnaXQgb25lICovICYmIGNoYXIgPD0gMHgyNzkzIC8qIGRpbmdiYXQgbmVnYXRpdmUgY2lyY2xlZCBzYW5zLXNlcmlmIG51bWJlciB0ZW4gKi8pIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGQyAvKiBvYmplY3QgcmVwbGFjZW1lbnQgY2hhcmFjdGVyICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGRCAvKiByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiByb3RhdGVkIG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyByb3RhdGVkIG9yaWVudGF0aW9uIGlmIGl0IGlzIGRyYXduIHJvdGF0ZWQgd2hlbiB0aGUgbGluZSBpc1xuICogb3JpZW50ZWQgdmVydGljYWxseSwgZXZlbiBpZiBib3RoIGFkamFjZW50IGNoYXJhY3RlcnMgYXJlIHVwcmlnaHQuIEZvclxuICogZXhhbXBsZSwgYSBMYXRpbiBsZXR0ZXIgaXMgZHJhd24gcm90YXRlZCBhbG9uZyBhIHZlcnRpY2FsIGxpbmUuIEEgcm90YXRlZFxuICogY2hhcmFjdGVyIGNhdXNlcyBhbiBhZGphY2VudCDigJxuZXV0cmFs4oCdIGNoYXJhY3RlciB0byBiZSBkcmF3biByb3RhdGVkIGFzIHdlbGwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXI6IG51bWJlcikge1xuICAgIHJldHVybiAhKGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyKSB8fFxuICAgICAgICAgICAgIGNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbihjaGFyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFySW5Db21wbGV4U2hhcGluZ1NjcmlwdChjaGFyOiBudW1iZXIpIHtcbiAgICByZXR1cm4gaXNDaGFyWydBcmFiaWMnXShjaGFyKSB8fFxuICAgICAgICAgICBpc0NoYXJbJ0FyYWJpYyBTdXBwbGVtZW50J10oY2hhcikgfHxcbiAgICAgICAgICAgaXNDaGFyWydBcmFiaWMgRXh0ZW5kZWQtQSddKGNoYXIpIHx8XG4gICAgICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BJ10oY2hhcikgfHxcbiAgICAgICAgICAgaXNDaGFyWydBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUInXShjaGFyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJJblJUTFNjcmlwdChjaGFyOiBudW1iZXIpIHtcbiAgICAvLyBNYWluIGJsb2NrcyBmb3IgSGVicmV3LCBBcmFiaWMsIFRoYWFuYSBhbmQgb3RoZXIgUlRMIHNjcmlwdHNcbiAgICByZXR1cm4gKGNoYXIgPj0gMHgwNTkwICYmIGNoYXIgPD0gMHgwOEZGKSB8fFxuICAgICAgICBpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSddKGNoYXIpIHx8XG4gICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhcjogbnVtYmVyLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pIHtcbiAgICAvLyBUaGlzIGlzIGEgcm91Z2ggaGV1cmlzdGljOiB3aGV0aGVyIHdlIFwiY2FuIHJlbmRlclwiIGEgc2NyaXB0XG4gICAgLy8gYWN0dWFsbHkgZGVwZW5kcyBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgZm9udCBiZWluZyB1c2VkXG4gICAgLy8gYW5kIHdoZXRoZXIgZGlmZmVyZW5jZXMgZnJvbSB0aGUgaWRlYWwgcmVuZGVyaW5nIGFyZSBjb25zaWRlcmVkXG4gICAgLy8gc2VtYW50aWNhbGx5IHNpZ25pZmljYW50LlxuXG4gICAgLy8gRXZlbiBpbiBMYXRpbiBzY3JpcHQsIHdlIFwiY2FuJ3QgcmVuZGVyXCIgY29tYmluYXRpb25zIHN1Y2ggYXMgdGhlIGZpXG4gICAgLy8gbGlnYXR1cmUsIGJ1dCB3ZSBkb24ndCBjb25zaWRlciB0aGF0IHNlbWFudGljYWxseSBzaWduaWZpY2FudC5cbiAgICBpZiAoIWNhblJlbmRlclJUTCAmJiBjaGFySW5SVExTY3JpcHQoY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKGNoYXIgPj0gMHgwOTAwICYmIGNoYXIgPD0gMHgwREZGKSB8fFxuICAgICAgICAvLyBNYWluIGJsb2NrcyBmb3IgSW5kaWMgc2NyaXB0cyBhbmQgU2luaGFsYVxuICAgICAgICAoY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDEwOUYpIHx8XG4gICAgICAgIC8vIE1haW4gYmxvY2tzIGZvciBUaWJldGFuIGFuZCBNeWFubWFyXG4gICAgICAgIGlzQ2hhclsnS2htZXInXShjaGFyKSkge1xuICAgICAgICAvLyBUaGVzZSBibG9ja3MgY292ZXIgY29tbW9uIHNjcmlwdHMgdGhhdCByZXF1aXJlXG4gICAgICAgIC8vIGNvbXBsZXggdGV4dCBzaGFwaW5nLCBiYXNlZCBvbiB1bmljb2RlIHNjcmlwdCBtZXRhZGF0YTpcbiAgICAgICAgLy8gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcy9jbGRyL3RydW5rL2NvbW1vbi9wcm9wZXJ0aWVzL3NjcmlwdE1ldGFkYXRhLnR4dFxuICAgICAgICAvLyB3aGVyZSBcIldlYiBSYW5rIDw9IDMyXCIgXCJTaGFwaW5nIFJlcXVpcmVkID0gWUVTXCJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0NvbnRhaW5zUlRMVGV4dChjaGFyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmIChjaGFySW5SVExTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdChjaGFyczogc3RyaW5nLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApLCBjYW5SZW5kZXJSVEwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHtnZXRBcnJheUJ1ZmZlcn0gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge2lzV29ya2VyfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5jb25zdCBzdGF0dXMgPSB7XG4gICAgdW5hdmFpbGFibGU6ICd1bmF2YWlsYWJsZScsIC8vIE5vdCBsb2FkZWRcbiAgICBkZWZlcnJlZDogJ2RlZmVycmVkJywgLy8gVGhlIHBsdWdpbiBVUkwgaGFzIGJlZW4gc3BlY2lmaWVkLCBidXQgbG9hZGluZyBoYXMgYmVlbiBkZWZlcnJlZFxuICAgIGxvYWRpbmc6ICdsb2FkaW5nJywgLy8gcmVxdWVzdCBpbi1mbGlnaHRcbiAgICBsb2FkZWQ6ICdsb2FkZWQnLFxuICAgIGVycm9yOiAnZXJyb3InXG59O1xuXG5leHBvcnQgdHlwZSBQbHVnaW5TdGF0ZSA9IHtcbiAgICBwbHVnaW5TdGF0dXM6ICRWYWx1ZXM8dHlwZW9mIHN0YXR1cz47XG4gICAgcGx1Z2luVVJMOiA/c3RyaW5nXG59O1xuXG50eXBlIEVycm9yQ2FsbGJhY2sgPSAoZXJyb3I6ID9FcnJvcikgPT4gdm9pZDtcbnR5cGUgUGx1Z2luU3RhdGVTeW5jQ2FsbGJhY2sgPSAoc3RhdGU6IFBsdWdpblN0YXRlKSA9PiB2b2lkO1xubGV0IF9jb21wbGV0aW9uQ2FsbGJhY2sgPSBudWxsO1xuXG4vL1ZhcmlhYmxlcyBkZWZpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGx1Z2luXG5sZXQgcGx1Z2luU3RhdHVzID0gc3RhdHVzLnVuYXZhaWxhYmxlO1xubGV0IHBsdWdpblVSTCA9IG51bGw7XG5cbmV4cG9ydCBjb25zdCB0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50ID0gZnVuY3Rpb24oZXJyb3I6ID9FcnJvcikge1xuICAgIC8vIE5ldHdvcmtFcnJvcidzIGFyZSBub3QgY29ycmVjdGx5IHJlZmxlY3RlZCBieSB0aGUgcGx1Z2luIHN0YXR1cyB3aGljaCBwcmV2ZW50cyByZWxvYWRpbmcgcGx1Z2luXG4gICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgJiYgZXJyb3IuaW5kZXhPZignTmV0d29ya0Vycm9yJykgPiAtMSkge1xuICAgICAgICBwbHVnaW5TdGF0dXMgPSBzdGF0dXMuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF9jb21wbGV0aW9uQ2FsbGJhY2spIHtcbiAgICAgICAgX2NvbXBsZXRpb25DYWxsYmFjayhlcnJvcik7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gc2VuZFBsdWdpblN0YXRlVG9Xb3JrZXIoKSB7XG4gICAgZXZlbnRlZC5maXJlKG5ldyBFdmVudCgncGx1Z2luU3RhdGVDaGFuZ2UnLCB7cGx1Z2luU3RhdHVzLCBwbHVnaW5VUkx9KSk7XG59XG5cbmV4cG9ydCBjb25zdCBldmVudGVkID0gbmV3IEV2ZW50ZWQoKTtcblxuZXhwb3J0IGNvbnN0IGdldFJUTFRleHRQbHVnaW5TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHBsdWdpblN0YXR1cztcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlID0gZnVuY3Rpb24oY2FsbGJhY2s6IFBsdWdpblN0YXRlU3luY0NhbGxiYWNrKSB7XG4gICAgLy8gRG8gYW4gaW5pdGlhbCBzeW5jIG9mIHRoZSBzdGF0ZVxuICAgIGNhbGxiYWNrKHtwbHVnaW5TdGF0dXMsIHBsdWdpblVSTH0pO1xuICAgIC8vIExpc3RlbiBmb3IgYWxsIGZ1dHVyZSBzdGF0ZSBjaGFuZ2VzXG4gICAgZXZlbnRlZC5vbigncGx1Z2luU3RhdGVDaGFuZ2UnLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHBsdWdpblN0YXR1cyA9IHN0YXR1cy51bmF2YWlsYWJsZTtcbiAgICBwbHVnaW5VUkwgPSBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFJUTFRleHRQbHVnaW4gPSBmdW5jdGlvbih1cmw6IHN0cmluZywgY2FsbGJhY2s6ID9FcnJvckNhbGxiYWNrLCBkZWZlcnJlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHBsdWdpblN0YXR1cyA9PT0gc3RhdHVzLmRlZmVycmVkIHx8IHBsdWdpblN0YXR1cyA9PT0gc3RhdHVzLmxvYWRpbmcgfHwgcGx1Z2luU3RhdHVzID09PSBzdGF0dXMubG9hZGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2V0UlRMVGV4dFBsdWdpbiBjYW5ub3QgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLicpO1xuICAgIH1cbiAgICBwbHVnaW5VUkwgPSBicm93c2VyLnJlc29sdmVVUkwodXJsKTtcbiAgICBwbHVnaW5TdGF0dXMgPSBzdGF0dXMuZGVmZXJyZWQ7XG4gICAgX2NvbXBsZXRpb25DYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHNlbmRQbHVnaW5TdGF0ZVRvV29ya2VyKCk7XG5cbiAgICAvL1N0YXJ0IGRvd25sb2FkaW5nIHRoZSBwbHVnaW4gaW1tZWRpYXRlbHkgaWYgbm90IGludGVuZGluZyB0byBsYXp5LWxvYWRcbiAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICAgIGRvd25sb2FkUlRMVGV4dFBsdWdpbigpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZFJUTFRleHRQbHVnaW4gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAocGx1Z2luU3RhdHVzICE9PSBzdGF0dXMuZGVmZXJyZWQgfHwgIXBsdWdpblVSTCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3J0bC10ZXh0LXBsdWdpbiBjYW5ub3QgYmUgZG93bmxvYWRlZCB1bmxlc3MgYSBwbHVnaW5VUkwgaXMgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIHBsdWdpblN0YXR1cyA9IHN0YXR1cy5sb2FkaW5nO1xuICAgIHNlbmRQbHVnaW5TdGF0ZVRvV29ya2VyKCk7XG4gICAgaWYgKHBsdWdpblVSTCkge1xuICAgICAgICBnZXRBcnJheUJ1ZmZlcih7dXJsOiBwbHVnaW5VUkx9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnQoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5TdGF0dXMgPSBzdGF0dXMubG9hZGVkO1xuICAgICAgICAgICAgICAgIHNlbmRQbHVnaW5TdGF0ZVRvV29ya2VyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwbHVnaW46IHtcbiAgICBhcHBseUFyYWJpY1NoYXBpbmc6ID9GdW5jdGlvbixcbiAgICBwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ6ID8oc3RyaW5nLCBBcnJheTxudW1iZXI+KSA9PiBBcnJheTxzdHJpbmc+LFxuICAgIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dDogPyhzdHJpbmcsIEFycmF5PG51bWJlcj4sIEFycmF5PG51bWJlcj4pID0+IEFycmF5PFtzdHJpbmcsIEFycmF5PG51bWJlcj5dPixcbiAgICBpc0xvYWRlZDogKCkgPT4gYm9vbGVhbixcbiAgICBpc0xvYWRpbmc6ICgpID0+IGJvb2xlYW4sXG4gICAgc2V0U3RhdGU6IChzdGF0ZTogUGx1Z2luU3RhdGUpID0+IHZvaWQsXG4gICAgaXNQYXJzZWQ6ICgpID0+IGJvb2xlYW4sXG4gICAgZ2V0UGx1Z2luVVJMOiAoKSA9PiA/c3RyaW5nXG59ID0ge1xuICAgIGFwcGx5QXJhYmljU2hhcGluZzogbnVsbCxcbiAgICBwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ6IG51bGwsXG4gICAgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0OiBudWxsLFxuICAgIGlzTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gcGx1Z2luU3RhdHVzID09PSBzdGF0dXMubG9hZGVkIHx8IC8vIE1haW4gVGhyZWFkOiBsb2FkZWQgaWYgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgICBwbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nICE9IG51bGw7IC8vIFdlYi13b3JrZXI6IGxvYWRlZCBpZiB0aGUgcGx1Z2luIGZ1bmN0aW9ucyBoYXZlIGJlZW4gY29tcGlsZWRcbiAgICB9LFxuICAgIGlzTG9hZGluZygpIHsgLy8gTWFpbiBUaHJlYWQgT25seTogcXVlcnkgdGhlIGxvYWRpbmcgc3RhdHVzLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSBpbiB0aGUgd29ya2VyIGNvbnRleHQuXG4gICAgICAgIHJldHVybiBwbHVnaW5TdGF0dXMgPT09IHN0YXR1cy5sb2FkaW5nO1xuICAgIH0sXG4gICAgc2V0U3RhdGUoc3RhdGU6IFBsdWdpblN0YXRlKSB7IC8vIFdvcmtlciB0aHJlYWQgb25seTogdGhpcyB0ZWxscyB0aGUgd29ya2VyIHRocmVhZHMgdGhhdCB0aGUgcGx1Z2luIGlzIGF2YWlsYWJsZSBvbiB0aGUgTWFpbiB0aHJlYWRcbiAgICAgICAgYXNzZXJ0KGlzV29ya2VyKCksICdDYW5ub3Qgc2V0IHRoZSBzdGF0ZSBvZiB0aGUgcnRsLXRleHQtcGx1Z2luIHdoZW4gbm90IGluIHRoZSB3ZWItd29ya2VyIGNvbnRleHQnKTtcblxuICAgICAgICBwbHVnaW5TdGF0dXMgPSBzdGF0ZS5wbHVnaW5TdGF0dXM7XG4gICAgICAgIHBsdWdpblVSTCA9IHN0YXRlLnBsdWdpblVSTDtcbiAgICB9LFxuICAgIGlzUGFyc2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICBhc3NlcnQoaXNXb3JrZXIoKSwgJ3J0bC10ZXh0LXBsdWdpbiBpcyBvbmx5IHBhcnNlZCBvbiB0aGUgd29ya2VyLXRocmVhZHMnKTtcblxuICAgICAgICByZXR1cm4gcGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyAhPSBudWxsICYmXG4gICAgICAgICAgICBwbHVnaW4ucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0ICE9IG51bGwgJiZcbiAgICAgICAgICAgIHBsdWdpbi5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQgIT0gbnVsbDtcbiAgICB9LFxuICAgIGdldFBsdWdpblVSTCgpOiA/c3RyaW5nIHtcbiAgICAgICAgYXNzZXJ0KGlzV29ya2VyKCksICdydGwtdGV4dC1wbHVnaW4gdXJsIGNhbiBvbmx5IGJlIHF1ZXJpZWQgZnJvbSB0aGUgd29ya2VyIHRocmVhZHMnKTtcbiAgICAgICAgcmV0dXJuIHBsdWdpblVSTDtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgbGF6eUxvYWRSVExUZXh0UGx1Z2luID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCFwbHVnaW4uaXNMb2FkaW5nKCkgJiZcbiAgICAgICAgIXBsdWdpbi5pc0xvYWRlZCgpICYmXG4gICAgICAgIGdldFJUTFRleHRQbHVnaW5TdGF0dXMoKSA9PT0gJ2RlZmVycmVkJ1xuICAgICkge1xuICAgICAgICBkb3dubG9hZFJUTFRleHRQbHVnaW4oKTtcbiAgICB9XG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFpvb21IaXN0b3J5IGZyb20gJy4vem9vbV9oaXN0b3J5JztcbmltcG9ydCB7aXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdH0gZnJvbSAnLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uJztcbmltcG9ydCB7cGx1Z2luIGFzIHJ0bFRleHRQbHVnaW59IGZyb20gJy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4nO1xuXG5pbXBvcnQgdHlwZSB7VHJhbnNpdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBDcm9zc2ZhZGVQYXJhbWV0ZXJzID0ge1xuICAgIGZyb21TY2FsZTogbnVtYmVyLFxuICAgIHRvU2NhbGU6IG51bWJlcixcbiAgICB0OiBudW1iZXJcbn07XG5cbmNsYXNzIEV2YWx1YXRpb25QYXJhbWV0ZXJzIHtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgbm93OiBudW1iZXI7XG4gICAgZmFkZUR1cmF0aW9uOiBudW1iZXI7XG4gICAgem9vbUhpc3Rvcnk6IFpvb21IaXN0b3J5O1xuICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uO1xuXG4gICAgLy8gXCJvcHRpb25zXCIgbWF5IGFsc28gYmUgYW5vdGhlciBFdmFsdWF0aW9uUGFyYW1ldGVycyB0byBjb3B5LCBzZWUgQ3Jvc3NGYWRlZFByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGVcbiAgICBjb25zdHJ1Y3Rvcih6b29tOiBudW1iZXIsIG9wdGlvbnM/OiAqKSB7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG5cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gb3B0aW9ucy5ub3c7XG4gICAgICAgICAgICB0aGlzLmZhZGVEdXJhdGlvbiA9IG9wdGlvbnMuZmFkZUR1cmF0aW9uO1xuICAgICAgICAgICAgdGhpcy56b29tSGlzdG9yeSA9IG9wdGlvbnMuem9vbUhpc3Rvcnk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBvcHRpb25zLnRyYW5zaXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vdyA9IDA7XG4gICAgICAgICAgICB0aGlzLmZhZGVEdXJhdGlvbiA9IDA7XG4gICAgICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gbmV3IFpvb21IaXN0b3J5KCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzU3VwcG9ydGVkU2NyaXB0KHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZ0luU3VwcG9ydGVkU2NyaXB0KHN0ciwgcnRsVGV4dFBsdWdpbi5pc0xvYWRlZCgpKTtcbiAgICB9XG5cbiAgICBjcm9zc0ZhZGluZ0ZhY3RvcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZmFkZUR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbigodGhpcy5ub3cgLSB0aGlzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbVRpbWUpIC8gdGhpcy5mYWRlRHVyYXRpb24sIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzIHtcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuem9vbTtcbiAgICAgICAgY29uc3QgZnJhY3Rpb24gPSB6IC0gTWF0aC5mbG9vcih6KTtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuY3Jvc3NGYWRpbmdGYWN0b3IoKTtcblxuICAgICAgICByZXR1cm4geiA+IHRoaXMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID9cbiAgICAgICAgICAgIHtmcm9tU2NhbGU6IDIsIHRvU2NhbGU6IDEsIHQ6IGZyYWN0aW9uICsgKDEgLSBmcmFjdGlvbikgKiB0fSA6XG4gICAgICAgICAgICB7ZnJvbVNjYWxlOiAwLjUsIHRvU2NhbGU6IDEsIHQ6IDEgLSAoMSAtIHQpICogZnJhY3Rpb259O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZhbHVhdGlvblBhcmFtZXRlcnM7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge2Nsb25lLCBleHRlbmQsIGVhc2VDdWJpY0luT3V0fSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCB7bm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcblxuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3N0eWxlLXNwZWMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uLFxuICAgIFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgRmVhdHVyZSxcbiAgICBGZWF0dXJlU3RhdGUsXG4gICAgU3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24sXG4gICAgU291cmNlRXhwcmVzc2lvbixcbiAgICBDb21wb3NpdGVFeHByZXNzaW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5cbnR5cGUgVGltZVBvaW50ID0gbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBDcm9zc0ZhZGVkPFQ+ID0ge1xuICAgIHRvOiBULFxuICAgIGZyb206IFRcbn07XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIG51bWJlciBvZiBjbGFzc2VzIHRoYXQgZGVmaW5lIHN0YXRlIGFuZCBiZWhhdmlvciBmb3IgcGFpbnQgYW5kIGxheW91dCBwcm9wZXJ0aWVzLCBtb3N0XG4gKiBpbXBvcnRhbnRseSB0aGVpciByZXNwZWN0aXZlIGV2YWx1YXRpb24gY2hhaW5zOlxuICpcbiAqICAgICAgIFRyYW5zaXRpb25hYmxlIHBhaW50IHByb3BlcnR5IHZhbHVlXG4gKiAgICAg4oaSIFRyYW5zaXRpb25pbmcgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDihpIgUG9zc2libHkgZXZhbHVhdGVkIHBhaW50IHByb3BlcnR5IHZhbHVlXG4gKiAgICAg4oaSIEZ1bGx5IGV2YWx1YXRlZCBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICpcbiAqICAgICAgIExheW91dCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBQb3NzaWJseSBldmFsdWF0ZWQgbGF5b3V0IHByb3BlcnR5IHZhbHVlXG4gKiAgICAg4oaSIEZ1bGx5IGV2YWx1YXRlZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVcbiAqXG4gKiBAbW9kdWxlXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgYFByb3BlcnR5YCBpbnRlcmZhY2U6XG4gKlxuICogICogSG9sZCBtZXRhZGF0YSBhYm91dCBhIHByb3BlcnR5IHRoYXQncyBpbmRlcGVuZGVudCBvZiBhbnkgc3BlY2lmaWMgdmFsdWU6IHN0dWZmIGxpa2UgdGhlIHR5cGUgb2YgdGhlIHZhbHVlLFxuICogICAgdGhlIGRlZmF1bHQgdmFsdWUsIGV0Yy4gVGhpcyBjb21lcyBmcm9tIHRoZSBzdHlsZSBzcGVjaWZpY2F0aW9uIEpTT04uXG4gKiAgKiBEZWZpbmUgYmVoYXZpb3IgdGhhdCBuZWVkcyB0byBiZSBwb2x5bW9ycGhpYyBhY3Jvc3MgZGlmZmVyZW50IHByb3BlcnRpZXM6IFwicG9zc2libHkgZXZhbHVhdGluZ1wiXG4gKiAgICBhbiBpbnB1dCB2YWx1ZSAoc2VlIGJlbG93KSwgYW5kIGludGVycG9sYXRpbmcgYmV0d2VlbiB0d28gcG9zc2libHktZXZhbHV0ZWQgdmFsdWVzLlxuICpcbiAqICBUaGUgdHlwZSBgVGAgaXMgdGhlIGZ1bGx5LWV2YWx1YXRlZCB2YWx1ZSB0eXBlIChlLmcuIGBudW1iZXJgLCBgc3RyaW5nYCwgYENvbG9yYCkuXG4gKiAgVGhlIHR5cGUgYFJgIGlzIHRoZSBpbnRlcm1lZGlhdGUgXCJwb3NzaWJseSBldmFsdWF0ZWRcIiB2YWx1ZSB0eXBlLiBTZWUgYmVsb3cuXG4gKlxuICogIFRoZXJlIGFyZSB0d28gbWFpbiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGludGVyZmFjZSAtLSBvbmUgZm9yIHByb3BlcnRpZXMgdGhhdCBhbGxvdyBkYXRhLWRyaXZlbiB2YWx1ZXMsXG4gKiAgYW5kIG9uZSBmb3IgcHJvcGVydGllcyB0aGF0IGRvbid0LiBUaGVyZSBhcmUgYSBmZXcgXCJzcGVjaWFsIGNhc2VcIiBpbXBsZW1lbnRhdGlvbnMgYXMgd2VsbDogb25lIGZvciBwcm9wZXJ0aWVzXG4gKiAgd2hpY2ggY3Jvc3MtZmFkZSBiZXR3ZWVuIHR3byB2YWx1ZXMgcmF0aGVyIHRoYW4gaW50ZXJwb2xhdGluZywgb25lIGZvciBgaGVhdG1hcC1jb2xvcmAgYW5kIGBsaW5lLWdyYWRpZW50YCxcbiAqICBhbmQgb25lIGZvciBgbGlnaHQtcG9zaXRpb25gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHk8VCwgUj4ge1xuICAgIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBSO1xuICAgIGludGVycG9sYXRlKGE6IFIsIGI6IFIsIHQ6IG51bWJlcik6IFI7XG59XG5cbi8qKlxuICogIGBQcm9wZXJ0eVZhbHVlYCByZXByZXNlbnRzIHRoZSB2YWx1ZSBwYXJ0IG9mIGEgcHJvcGVydHkga2V5LXZhbHVlIHVuaXQuIEl0J3MgdXNlZCB0byByZXByZXNlbnQgYm90aFxuICogIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVzLCBhbmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGVpciBwcm9wZXJ0eSBzdXBwb3J0cyBkYXRhLWRyaXZlblxuICogIGV4cHJlc3Npb25zLlxuICpcbiAqICBgUHJvcGVydHlWYWx1ZWAgc3RvcmVzIHRoZSByYXcgaW5wdXQgdmFsdWUgYXMgc2VlbiBpbiBhIHN0eWxlIG9yIGEgcnVudGltZSBzdHlsaW5nIEFQSSBjYWxsLCBpLmUuIG9uZSBvZiB0aGVcbiAqICBmb2xsb3dpbmc6XG4gKlxuICogICAgKiBBIGNvbnN0YW50IHZhbHVlIG9mIHRoZSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHlcbiAqICAgICogQSBmdW5jdGlvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZSAoYnV0IGZ1bmN0aW9ucyBhcmUgcXVhc2ktZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBleHByZXNzaW9ucylcbiAqICAgICogQW4gZXhwcmVzc2lvbiB3aGljaCBwcm9kdWNlcyBhIHZhbHVlIG9mIHRoYXQgdHlwZVxuICogICAgKiBcInVuZGVmaW5lZFwiL1wibm90IHByZXNlbnRcIiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydHkgaXMgYXNzdW1lZCB0byB0YWtlIG9uIGl0cyBkZWZhdWx0IHZhbHVlLlxuICpcbiAqICBJbiBhZGRpdGlvbiB0byBzdG9yaW5nIHRoZSBvcmlnaW5hbCBpbnB1dCB2YWx1ZSwgYFByb3BlcnR5VmFsdWVgIGFsc28gc3RvcmVzIGEgbm9ybWFsaXplZCByZXByZXNlbnRhdGlvbixcbiAqICBlZmZlY3RpdmVseSB0cmVhdGluZyBmdW5jdGlvbnMgYXMgaWYgdGhleSBhcmUgZXhwcmVzc2lvbnMsIGFuZCBjb25zdGFudCBvciBkZWZhdWx0IHZhbHVlcyBhcyBpZiB0aGV5IGFyZVxuICogIChjb25zdGFudCkgZXhwcmVzc2lvbnMuXG4gKlxuICogIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVZhbHVlPFQsIFI+IHtcbiAgICBwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj47XG4gICAgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZDtcbiAgICBleHByZXNzaW9uOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPiwgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gbm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLmRlZmF1bHQgOiB2YWx1ZSwgcHJvcGVydHkuc3BlY2lmaWNhdGlvbik7XG4gICAgfVxuXG4gICAgaXNEYXRhRHJpdmVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uLmtpbmQgPT09ICdzb3VyY2UnIHx8IHRoaXMuZXhwcmVzc2lvbi5raW5kID09PSAnY29tcG9zaXRlJztcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBSIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkucG9zc2libHlFdmFsdWF0ZSh0aGlzLCBwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFRyYW5zaXRpb25hYmxlIC0tLS0tLS1cblxuZXhwb3J0IHR5cGUgVHJhbnNpdGlvblBhcmFtZXRlcnMgPSB7XG4gICAgbm93OiBUaW1lUG9pbnQsXG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvblNwZWNpZmljYXRpb25cbn07XG5cbi8qKlxuICogUGFpbnQgcHJvcGVydGllcyBhcmUgX3RyYW5zaXRpb25hYmxlXzogdGhleSBjYW4gY2hhbmdlIGluIGEgZmx1aWQgbWFubmVyLCBpbnRlcnBvbGF0aW5nIG9yIGNyb3NzLWZhZGluZyBiZXR3ZWVuXG4gKiBvbGQgYW5kIG5ldyB2YWx1ZS4gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBhbmQgdGhlIGRlbGF5IGJlZm9yZSBpdCBiZWdpbnMsIGlzIGNvbmZpZ3VyYWJsZS5cbiAqXG4gKiBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlYCBpcyBhIGNvbXBvc2l0aW9uYWwgY2xhc3MgdGhhdCBzdG9yZXMgYm90aCB0aGUgcHJvcGVydHkgdmFsdWUgYW5kIHRoYXQgdHJhbnNpdGlvblxuICogY29uZmlndXJhdGlvbi5cbiAqXG4gKiBBIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVgIGNhbiBjYWxjdWxhdGUgdGhlIG5leHQgc3RlcCBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBmb3IgcGFpbnQgcHJvcGVydHkgdmFsdWVzOlxuICogYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgIHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPjtcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPjtcbiAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj4pIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3IFByb3BlcnR5VmFsdWUocHJvcGVydHksIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvbmVkKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICBwcmlvcjogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4pOiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWUodGhpcy5wcm9wZXJ0eSwgdGhpcy52YWx1ZSwgcHJpb3IsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICAgIGV4dGVuZCh7fSwgcGFyYW1ldGVycy50cmFuc2l0aW9uLCB0aGlzLnRyYW5zaXRpb24pLCBwYXJhbWV0ZXJzLm5vdyk7XG4gICAgfVxuXG4gICAgdW50cmFuc2l0aW9uZWQoKTogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUsIG51bGwsIHt9LCAwKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlPFQsIFI+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogYFRyYW5zaXRpb25hYmxlYCBzdG9yZXMgYSBtYXAgb2YgYWxsIChwcm9wZXJ0eSBuYW1lLCBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlYCkgcGFpcnMgZm9yIHBhaW50IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYHMgZm9yIGFsbCBvZiB0aGVtIGF0IG9uY2UsIHByb2R1Y2luZyBhXG4gKiBgVHJhbnNpdGlvbmluZ2AgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2l0aW9uYWJsZTxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4pIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IChPYmplY3QuY3JlYXRlKHByb3BlcnRpZXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZywgVD4obmFtZTogUyk6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUudmFsdWUpO1xuICAgIH1cblxuICAgIHNldFZhbHVlPFM6IHN0cmluZywgVD4obmFtZTogUywgdmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCkge1xuICAgICAgICBpZiAoIXRoaXMuX3ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdID0gbmV3IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZSh0aGlzLl92YWx1ZXNbbmFtZV0ucHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBub3QgX3JlbW92ZV8gYW4gb3duIHByb3BlcnR5IGluIHRoZSBjYXNlIHdoZXJlIGEgdmFsdWUgaXMgYmVpbmcgcmVzZXRcbiAgICAgICAgLy8gdG8gdGhlIGRlZmF1bHQ6IHRoZSB0cmFuc2l0aW9uIG1pZ2h0IHN0aWxsIGJlIG5vbi1kZWZhdWx0LlxuICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUgPSBuZXcgUHJvcGVydHlWYWx1ZSh0aGlzLl92YWx1ZXNbbmFtZV0ucHJvcGVydHksIHZhbHVlID09PSBudWxsID8gdW5kZWZpbmVkIDogY2xvbmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc2l0aW9uPFM6IHN0cmluZz4obmFtZTogUyk6IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uIHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udHJhbnNpdGlvbik7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNpdGlvbjxTOiBzdHJpbmc+KG5hbWU6IFMsIHZhbHVlOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl92YWx1ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0udHJhbnNpdGlvbiA9IGNsb25lKHZhbHVlKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRoaXMuZ2V0VHJhbnNpdGlvbihwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2Ake3Byb3BlcnR5fS10cmFuc2l0aW9uYF0gPSB0cmFuc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvbmVkKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzLCBwcmlvcjogVHJhbnNpdGlvbmluZzxQcm9wcz4pOiBUcmFuc2l0aW9uaW5nPFByb3BzPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUcmFuc2l0aW9uaW5nKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS50cmFuc2l0aW9uZWQocGFyYW1ldGVycywgcHJpb3IuX3ZhbHVlc1twcm9wZXJ0eV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdW50cmFuc2l0aW9uZWQoKTogVHJhbnNpdGlvbmluZzxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVHJhbnNpdGlvbmluZyh0aGlzLl9wcm9wZXJ0aWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5fdmFsdWVzW3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc1twcm9wZXJ0eV0udW50cmFuc2l0aW9uZWQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLSBUcmFuc2l0aW9uaW5nIC0tLS0tLS1cblxuLyoqXG4gKiBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgIGltcGxlbWVudHMgdGhlIGZpcnN0IG9mIHR3byBpbnRlcm1lZGlhdGUgc3RlcHMgaW4gdGhlIGV2YWx1YXRpb24gY2hhaW4gb2YgYSBwYWludFxuICogcHJvcGVydHkgdmFsdWUuIEluIHRoaXMgc3RlcCwgdHJhbnNpdGlvbnMgYmV0d2VlbiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGhhbmRsZWQ6IGFzIGxvbmcgYXMgdGhlIHRyYW5zaXRpb24gaXMgaW5cbiAqIHByb2dyZXNzLCBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgIG1haW50YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgcHJpb3IgdmFsdWUsIGFuZCBpbnRlcnBvbGF0ZXMgYmV0d2VlbiBpdCBhbmRcbiAqIHRoZSBuZXcgdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGNvbmZpZ3VyZWQgdHJhbnNpdGlvbiBkdXJhdGlvbiBhbmQgZGVsYXkuIFRoZSBwcm9kdWN0IGlzIHRoZSBuZXh0XG4gKiBzdGVwIGluIHRoZSBldmFsdWF0aW9uIGNoYWluOiB0aGUgXCJwb3NzaWJseSBldmFsdWF0ZWRcIiByZXN1bHQgdHlwZSBgUmAuIFNlZSBiZWxvdyBmb3IgbW9yZSBvbiB0aGlzIGNvbmNlcHQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgIHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPjtcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPjtcbiAgICBwcmlvcjogP1RyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+O1xuICAgIGJlZ2luOiBUaW1lUG9pbnQ7XG4gICAgZW5kOiBUaW1lUG9pbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj4sXG4gICAgICAgICAgICAgICAgdmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4sXG4gICAgICAgICAgICAgICAgcHJpb3I6ID9UcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPixcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICBub3c6IFRpbWVQb2ludCkge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5iZWdpbiA9IG5vdyArIHRyYW5zaXRpb24uZGVsYXkgfHwgMDtcbiAgICAgICAgdGhpcy5lbmQgPSB0aGlzLmJlZ2luICsgdHJhbnNpdGlvbi5kdXJhdGlvbiB8fCAwO1xuICAgICAgICBpZiAocHJvcGVydHkuc3BlY2lmaWNhdGlvbi50cmFuc2l0aW9uICYmICh0cmFuc2l0aW9uLmRlbGF5IHx8IHRyYW5zaXRpb24uZHVyYXRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLnByaW9yID0gcHJpb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KTogUiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IHBhcmFtZXRlcnMubm93IHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSB0aGlzLnZhbHVlLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICBjb25zdCBwcmlvciA9IHRoaXMucHJpb3I7XG4gICAgICAgIGlmICghcHJpb3IpIHtcbiAgICAgICAgICAgIC8vIE5vIHByaW9yIHZhbHVlLlxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAobm93ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBwcmlvciB2YWx1ZSBpcyBub3cgY29tcGxldGUuXG4gICAgICAgICAgICB0aGlzLnByaW9yID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUuaXNEYXRhRHJpdmVuKCkpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zaXRpb25zIHRvIGRhdGEtZHJpdmVuIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAgICAvLyBXZSBzbmFwIGltbWVkaWF0ZWx5IHRvIHRoZSBkYXRhLWRyaXZlbiB2YWx1ZSBzbyB0aGF0LCB3aGVuIHdlIHBlcmZvcm0gbGF5b3V0LFxuICAgICAgICAgICAgLy8gd2Ugc2VlIHRoZSBkYXRhLWRyaXZlbiBmdW5jdGlvbiBhbmQgY2FuIHVzZSBpdCB0byBwb3B1bGF0ZSB2ZXJ0ZXggYnVmZmVycy5cbiAgICAgICAgICAgIHRoaXMucHJpb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAobm93IDwgdGhpcy5iZWdpbikge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBoYXNuJ3Qgc3RhcnRlZCB5ZXQuXG4gICAgICAgICAgICByZXR1cm4gcHJpb3IucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHJlY3Vyc2l2ZWx5LWNhbGN1bGF0ZWQgcHJpb3IgdmFsdWUgYW5kIGZpbmFsLlxuICAgICAgICAgICAgY29uc3QgdCA9IChub3cgLSB0aGlzLmJlZ2luKSAvICh0aGlzLmVuZCAtIHRoaXMuYmVnaW4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkuaW50ZXJwb2xhdGUocHJpb3IucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyksIGZpbmFsVmFsdWUsIGVhc2VDdWJpY0luT3V0KHQpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnR5cGUgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzPFByb3BzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxQcm9wcywgPFQsIFI+KHA6IFByb3BlcnR5PFQsIFI+KSA9PiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogYFRyYW5zaXRpb25pbmdgIHN0b3JlcyBhIG1hcCBvZiBhbGwgKHByb3BlcnR5IG5hbWUsIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWApIHBhaXJzIGZvciBwYWludCBwcm9wZXJ0aWVzIG9mIGFcbiAqIGdpdmVuIGxheWVyIHR5cGUuIEl0IGNhbiBjYWxjdWxhdGUgdGhlIHBvc3NpYmx5LWV2YWx1YXRlZCB2YWx1ZXMgZm9yIGFsbCBvZiB0aGVtIGF0IG9uY2UsIHByb2R1Y2luZyBhXG4gKiBgUG9zc2libHlFdmFsdWF0ZWRgIGluc3RhbmNlIGZvciB0aGUgc2FtZSBzZXQgb2YgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbmluZzxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUG9zc2libHlFdmFsdWF0ZWQodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wcmlvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gTGF5b3V0IC0tLS0tLS1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUHJvcGVydHlWYWx1ZTxULCBSPmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQcm9wZXJ0eVZhbHVlczxQcm9wczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8UHJvcHMsIDxULCBSPihwOiBQcm9wZXJ0eTxULCBSPikgPT4gUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogQmVjYXVzZSBsYXlvdXQgcHJvcGVydGllcyBhcmUgbm90IHRyYW5zaXRpb25hYmxlLCB0aGV5IGhhdmUgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIGFuZCBldmFsdWF0aW9uIGNoYWluIHRoYW5cbiAqIHBhaW50IHByb3BlcnRpZXM6IGBQcm9wZXJ0eVZhbHVlYHMgYXJlIHBvc3NpYmx5IGV2YWx1YXRlZCwgcHJvZHVjaW5nIHBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZXMsIHdoaWNoIGFyZSB0aGVuXG4gKiBmdWxseSBldmFsdWF0ZWQuXG4gKlxuICogYExheW91dGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXQ8UHJvcHM6IE9iamVjdD4ge1xuICAgIF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPjtcbiAgICBfdmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZz4obmFtZTogUykge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZTxTOiBzdHJpbmc+KG5hbWU6IFMsIHZhbHVlOiAqKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSwgdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjbG9uZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUG9zc2libHlFdmFsdWF0ZWQodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFBvc3NpYmx5RXZhbHVhdGVkIC0tLS0tLS1cblxuLyoqXG4gKiBcIlBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZVwiIGlzIGFuIGludGVybWVkaWF0ZSBzdGFnZSBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBmb3IgYm90aCBwYWludCBhbmQgbGF5b3V0IHByb3BlcnR5XG4gKiB2YWx1ZXMuIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3RhZ2UgaXMgdG8gb3B0aW1pemUgYXdheSB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9ucyBmb3IgZGF0YS1kcml2ZW4gcHJvcGVydGllcy4gQ29kZVxuICogd2hpY2ggdXNlcyBkYXRhLWRyaXZlbiBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBhc3N1bWUgdGhhdCB0aGUgdmFsdWUgaXMgZGVwZW5kZW50IG9uIGZlYXR1cmUgZGF0YSwgYW5kIHJlcXVlc3QgdGhhdCBpdFxuICogYmUgZXZhbHVhdGVkIGZvciBlYWNoIGZlYXR1cmUuIEJ1dCB3aGVuIHRoYXQgcHJvcGVydHkgdmFsdWUgaXMgaW4gZmFjdCBhIGNvbnN0YW50IG9yIGNhbWVyYSBmdW5jdGlvbiwgdGhlIGNhbGN1bGF0aW9uXG4gKiB3aWxsIG5vdCBhY3R1YWxseSBkZXBlbmQgb24gdGhlIGZlYXR1cmUsIGFuZCB3ZSBjYW4gYmVuZWZpdCBmcm9tIHJldHVybmluZyB0aGUgcHJpb3IgcmVzdWx0IG9mIGhhdmluZyBkb25lIHRoZVxuICogZXZhbHVhdGlvbiBvbmNlLCBhaGVhZCBvZiB0aW1lLCBpbiBhbiBpbnRlcm1lZGlhdGUgc3RlcCB3aG9zZSBpbnB1dHMgYXJlIGp1c3QgdGhlIHZhbHVlIGFuZCBcImdsb2JhbFwiIHBhcmFtZXRlcnNcbiAqIHN1Y2ggYXMgY3VycmVudCB6b29tIGxldmVsLlxuICpcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCByZXByZXNlbnRzIHRoZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyBvZiB0aGlzIHN0ZXA6IGlmIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvclxuICogY2FtZXJhIGV4cHJlc3Npb24sIHRoZW4gdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IGlzIGEgY29uc3RhbnQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGlucHV0IHZhbHVlIHdhcyBlaXRoZXJcbiAqIGEgc291cmNlIG9yIGNvbXBvc2l0ZSBleHByZXNzaW9uLCBhbmQgd2UgbXVzdCBkZWZlciBmaW5hbCBldmFsdWF0aW9uIHVudGlsIHN1cHBsaWVkIGEgZmVhdHVyZS4gV2Ugc2VwYXJhdGVcbiAqIHRoZSBzb3VyY2UgYW5kIGNvbXBvc2l0ZSBjYXNlcyBiZWNhdXNlIHRoZXkgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgd2hlbiBnZW5lcmF0aW5nIEdMIGF0dHJpYnV0ZXMsIGJ1ZmZlcnMsIGFuZFxuICogdW5pZm9ybXMuXG4gKlxuICogTm90ZSB0aGF0IGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCAoYW5kIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLCBiZWxvdykgYXJlIF9ub3RfIHVzZWQgZm9yIHByb3BlcnRpZXMgdGhhdFxuICogZG8gbm90IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcy4gRm9yIHN1Y2ggcHJvcGVydGllcywgd2Uga25vdyB0aGF0IHRoZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHJlc3VsdCBpcyBhbHdheXMgYSBjb25zdGFudFxuICogc2NhbGFyIHZhbHVlLiBTZWUgYmVsb3cuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+ID1cbiAgICB8IHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogVH1cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbi8qKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAgaXMgdXNlZCBmb3IgZGF0YS1kcml2ZW4gcGFpbnQgYW5kIGxheW91dCBwcm9wZXJ0eSB2YWx1ZXMuIEl0IGhvbGRzIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCBhbmQgdGhlIGBHbG9iYWxQcm9wZXJ0aWVzYCB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSBpdC4gWW91J3JlIG5vdCBhbGxvd2VkIHRvIHN1cHBseVxuICogYSBkaWZmZXJlbnQgc2V0IG9mIGBHbG9iYWxQcm9wZXJ0aWVzYCB3aGVuIHBlcmZvcm1pbmcgdGhlIGZpbmFsIGV2YWx1YXRpb24gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGlnbm9yZWQgaW4gdGhlXG4gKiBjYXNlIHdoZXJlIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvciBjYW1lcmEgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgcHJvcGVydHk6IERhdGFEcml2ZW5Qcm9wZXJ0eTxUPjtcbiAgICB2YWx1ZTogUG9zc2libHlFdmFsdWF0ZWRWYWx1ZTxUPjtcbiAgICBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycztcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBEYXRhRHJpdmVuUHJvcGVydHk8VD4sIHZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICB9XG5cbiAgICBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnO1xuICAgIH1cblxuICAgIGNvbnN0YW50T3IodmFsdWU6IFQpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LmV2YWx1YXRlKHRoaXMudmFsdWUsIHRoaXMucGFyYW1ldGVycywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMsIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUmAuXG4gKlxuICogRm9yIHByb3BlcnRpZXMgdGhhdCBkb24ndCBhbGxvdyBkYXRhLWRyaXZlbiB2YWx1ZXMsIGBSYCBpcyBhIHNjYWxhciB0eXBlIHN1Y2ggYXMgYG51bWJlcmAsIGBzdHJpbmdgLCBvciBgQ29sb3JgLlxuICogRm9yIGRhdGEtZHJpdmVuIHByb3BlcnRpZXMsIGl0IGlzIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLiBDcml0aWNhbGx5LCB0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgc2V0IHVwXG4gKiBpbiBhIHdheSB0aGF0IGFsbG93cyBmbG93IHRvIGtub3cgd2hpY2ggb2YgdGhlc2UgdHdvIGNhc2VzIGFwcGxpZXMgZm9yIGFueSBnaXZlbiBwcm9wZXJ0eSBuYW1lLCBhbmQgaWYgeW91IGF0dGVtcHRcbiAqIHRvIHVzZSBhIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgIGFzIGlmIGl0IHdhcyBhIHNjYWxhciwgb3IgdmljZSB2ZXJzYSwgeW91IHdpbGwgZ2V0IGEgdHlwZSBlcnJvci4gKEhvd2V2ZXIsXG4gKiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjYXNlIGluIHdoaWNoIGZsb3cgZmFpbHMgdG8gcHJvZHVjZSBhIHR5cGUgZXJyb3IgdGhhdCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mOiBpbiBhIGNvbnRleHQgc3VjaFxuICogYXMgYGxheWVyLnBhaW50LmdldCgnZm9vLW9wYWNpdHknKSA9PT0gMGAsIGlmIGBmb28tb3BhY2l0eWAgaXMgZGF0YS1kcml2ZW4sIHRoYW4gdGhlIGxlZnQtaGFuZCBzaWRlIGlzIG9mIHR5cGVcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPmAsIGJ1dCBmbG93IHdpbGwgbm90IGNvbXBsYWluIGFib3V0IGNvbXBhcmluZyB0aGlzIHRvIGEgbnVtYmVyIHVzaW5nIGA9PT1gLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMzU5LilcbiAqXG4gKiBUaGVyZSdzIGFsc28gYSB0aGlyZCwgc3BlY2lhbCBjYXNlIHBvc3NpYmxpdHkgZm9yIGBSYDogZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGl0J3MgYD9Dcm9zc0ZhZGVkPFQ+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFI+PlxuXG4vKipcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFJgKSBwYWlycyBmb3IgcGFpbnQgb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3NzaWJseUV2YWx1YXRlZDxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4pIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IChPYmplY3QuY3JlYXRlKHByb3BlcnRpZXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBnZXQ8Uzogc3RyaW5nPihuYW1lOiBTKTogJEVsZW1lbnRUeXBlPFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+LCBTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbbmFtZV07XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIHByb3BlcnRpZXMgdGhhdCBkbyBub3QgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoaXMgcmVzdHJpY3Rpb24gYWxsb3dzIHVzIHRvIGRlY2xhcmUgc3RhdGljYWxseSB0aGF0IHRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHlcbiAqIGlzIGluIGZhY3QgYWx3YXlzIHRoZSBzY2FsYXIgdHlwZSBgVGAsIGFuZCBjYW4gYmUgdXNlZCB3aXRob3V0IGZ1cnRoZXIgZXZhbHVhdGluZyB0aGUgdmFsdWUgb24gYSBwZXItZmVhdHVyZSBiYXNpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNvbnN0YW50UHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBUPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgVD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogVCB7XG4gICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICByZXR1cm4gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBULCBiOiBULCB0OiBudW1iZXIpOiBUIHtcbiAgICAgICAgY29uc3QgaW50ZXJwOiA/KGE6IFQsIGI6IFQsIHQ6IG51bWJlcikgPT4gVCA9IChpbnRlcnBvbGF0ZTogYW55KVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnAoYSwgYiwgdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBwcm9wZXJ0aWVzIHRoYXQgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHkgaXMgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPmA7IG9idGFpbmluZ1xuICogYSBzY2FsYXIgdmFsdWUgYFRgIHJlcXVpcmVzIGZ1cnRoZXIgZXZhbHVhdGlvbiBvbiBhIHBlci1mZWF0dXJlIGJhc2lzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhRHJpdmVuUHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcbiAgICBvdmVycmlkZXM6ID9PYmplY3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbiwgb3ZlcnJpZGVzPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIHRoaXMub3ZlcnJpZGVzID0gb3ZlcnJpZGVzO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+PiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgICAgIGlmICh2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjb25zdGFudCcgfHwgdmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMsIChudWxsOiBhbnkpLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB2YWx1ZS5leHByZXNzaW9uLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPixcbiAgICAgICAgICAgICAgICBiOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4sXG4gICAgICAgICAgICAgICAgdDogbnVtYmVyKTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+IHtcbiAgICAgICAgLy8gSWYgZWl0aGVyIHBvc3NpYmx5LWV2YWx1YXRlZCB2YWx1ZSBpcyBub24tY29uc3RhbnQsIGdpdmUgdXA6IHdlIGFyZW4ndCBhYmxlIHRvIGludGVycG9sYXRlIGRhdGEtZHJpdmVuIHZhbHVlcy5cbiAgICAgICAgaWYgKGEudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JyB8fCBiLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGhhY2sgc29sZWx5IGZvciBmaWxsLW91dGxpbmUtY29sb3IuIFRoZSB1bmRlZmluZWQgdmFsdWUgaXMgc3Vic2VxdWVudGx5IGhhbmRsZWQgaW5cbiAgICAgICAgLy8gRmlsbFN0eWxlTGF5ZXIjcmVjYWxjdWxhdGUsIHdoaWNoIHNldHMgZmlsbC1vdXRsaW5lLWNvbG9yIHRvIHRoZSBmaWxsLWNvbG9yIHZhbHVlIGlmIHRoZSBmb3JtZXJcbiAgICAgICAgLy8gaXMgYSBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUgY29udGFpbmluZyBhIGNvbnN0YW50IHVuZGVmaW5lZCB2YWx1ZS4gSW4gYWRkaXRpb24gdG8gdGhlXG4gICAgICAgIC8vIHJldHVybiB2YWx1ZSBoZXJlLCB0aGUgb3RoZXIgc291cmNlIG9mIGEgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlIGNvbnRhaW5pbmcgYSBjb25zdGFudFxuICAgICAgICAvLyB1bmRlZmluZWQgdmFsdWUgaXMgdGhlIFwiZGVmYXVsdCB2YWx1ZVwiIGZvciBmaWxsLW91dGxpbmUtY29sb3IgaGVsZCBpblxuICAgICAgICAvLyBgUHJvcGVydGllcyNkZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXNgLCB3aGljaCBzZXJ2ZXMgYXMgdGhlIHByb3RvdHlwZSBvZlxuICAgICAgICAvLyBgUG9zc2libHlFdmFsdWF0ZWQjX3ZhbHVlc2AuXG4gICAgICAgIGlmIChhLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQgfHwgYi52YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6ICh1bmRlZmluZWQ6IGFueSl9LCBhLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJwOiA/KGE6IFQsIGI6IFQsIHQ6IG51bWJlcikgPT4gVCA9IChpbnRlcnBvbGF0ZTogYW55KVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogaW50ZXJwKGEudmFsdWUudmFsdWUsIGIudmFsdWUudmFsdWUsIHQpfSwgYS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUodmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkVmFsdWU8VD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogVCB7XG4gICAgICAgIGlmICh2YWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZXZhbHVhdGUocGFyYW1ldGVycywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFByb3BlcnR5YCBmb3IgIGRhdGEgZHJpdmVuIGBsaW5lLXBhdHRlcm5gIHdoaWNoIGFyZSB0cmFuc2l0aW9uZWQgYnkgY3Jvc3MtZmFkaW5nXG4gKiByYXRoZXIgdGhhbiBpbnRlcnBvbGF0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGNsYXNzIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHk8VD4gZXh0ZW5kcyBEYXRhRHJpdmVuUHJvcGVydHk8P0Nyb3NzRmFkZWQ8VD4+IHtcblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4sIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IHVuZGVmaW5lZH0sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkVmFsdWUgPSB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMsIChudWxsOiBhbnkpLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgY29uc3QgaXNJbWFnZUV4cHJlc3Npb24gPSB2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnR5cGUgPT09ICdyZXNvbHZlZEltYWdlJztcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50VmFsdWUgPSBpc0ltYWdlRXhwcmVzc2lvbiAmJiB0eXBlb2YgZXZhbHVhdGVkVmFsdWUgIT09ICdzdHJpbmcnID8gZXZhbHVhdGVkVmFsdWUubmFtZSA6IGV2YWx1YXRlZFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnQgPSB0aGlzLl9jYWxjdWxhdGUoY29uc3RhbnRWYWx1ZSwgY29uc3RhbnRWYWx1ZSwgY29uc3RhbnRWYWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IGNvbnN0YW50fSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgY29uc3QgY2FtZXJhVmFsID0gdGhpcy5fY2FsY3VsYXRlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb20gLSAxLjB9KSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogcGFyYW1ldGVycy56b29tfSksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHBhcmFtZXRlcnMuem9vbSArIDEuMH0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogY2FtZXJhVmFsfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzb3VyY2Ugb3IgY29tcG9zaXRlIGV4cHJlc3Npb25cbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHZhbHVlLmV4cHJlc3Npb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUodmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkVmFsdWU8P0Nyb3NzRmFkZWQ8VD4+LCBnbG9iYWxzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6ID9Dcm9zc0ZhZGVkPFQ+IHtcbiAgICAgICAgaWYgKHZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgICBjb25zdCBjb25zdGFudCA9IHZhbHVlLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShjb25zdGFudCwgY29uc3RhbnQsIGNvbnN0YW50LCBnbG9iYWxzKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShcbiAgICAgICAgICAgICAgICB2YWx1ZS5ldmFsdWF0ZSh7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pIC0gMS4wfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5ldmFsdWF0ZSh7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5ldmFsdWF0ZSh7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pICsgMS4wfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgICAgICBnbG9iYWxzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGUobWluOiBULCBtaWQ6IFQsIG1heDogVCwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBDcm9zc0ZhZGVkPFQ+IHtcbiAgICAgICAgY29uc3QgeiA9IHBhcmFtZXRlcnMuem9vbTtcbiAgICAgICAgcmV0dXJuIHogPiBwYXJhbWV0ZXJzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbSA/IHtmcm9tOiBtaW4sIHRvOiBtaWR9IDoge2Zyb206IG1heCwgdG86IG1pZH07XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+Pik6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4ge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIGAqLXBhdHRlcm5gIGFuZCBgbGluZS1kYXNoYXJyYXlgLCB3aGljaCBhcmUgdHJhbnNpdGlvbmVkIGJ5IGNyb3NzLWZhZGluZ1xuICogcmF0aGVyIHRoYW4gaW50ZXJwb2xhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGYWRlZFByb3BlcnR5PFQ+IGltcGxlbWVudHMgUHJvcGVydHk8VCwgP0Nyb3NzRmFkZWQ8VD4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCA/Q3Jvc3NGYWRlZDxUPj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiA/Q3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIGlmICh2YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnQgPSB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMsIChudWxsOiBhbnkpLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShjb25zdGFudCwgY29uc3RhbnQsIGNvbnN0YW50LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSAtIDEuMCksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSArIDEuMCksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGUobWluOiBULCBtaWQ6IFQsIG1heDogVCwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiA/Q3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIGNvbnN0IHogPSBwYXJhbWV0ZXJzLnpvb207XG4gICAgICAgIHJldHVybiB6ID4gcGFyYW1ldGVycy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gPyB7ZnJvbTogbWluLCB0bzogbWlkfSA6IHtmcm9tOiBtYXgsIHRvOiBtaWR9O1xuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6ID9Dcm9zc0ZhZGVkPFQ+KTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFByb3BlcnR5YCBmb3IgYGhlYXRtYXAtY29sb3JgIGFuZCBgbGluZS1ncmFkaWVudGAuIEludGVycG9sYXRpb24gaXMgYSBuby1vcCwgYW5kXG4gKiBldmFsdWF0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlIGluIG9yZGVyIHRvIGluZGljYXRlIGl0cyBwcmVzZW5jZSwgYnV0IHRoZSByZWFsXG4gKiBldmFsdWF0aW9uIGhhcHBlbnMgaW4gU3R5bGVMYXllciBjbGFzc2VzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGNsYXNzIENvbG9yUmFtcFByb3BlcnR5IGltcGxlbWVudHMgUHJvcGVydHk8Q29sb3IsIGJvb2xlYW4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxDb2xvciwgYm9vbGVhbj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzLCAobnVsbDogYW55KSwge30sIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbi8qKlxuICogYFByb3BlcnRpZXNgIGhvbGRzIG9iamVjdHMgY29udGFpbmluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGxheW91dCBvciBwYWludCBwcm9wZXJ0eSBzZXQgb2YgYSBnaXZlblxuICogbGF5ZXIgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgaW1tdXRhYmxlLCBhbmQgdGhleSBhcmUgdXNlZCBhcyB0aGUgcHJvdG90eXBlcyBmb3IgdGhlIGBfdmFsdWVzYCBtZW1iZXJzIG9mXG4gKiBgVHJhbnNpdGlvbmFibGVgLCBgVHJhbnNpdGlvbmluZ2AsIGBMYXlvdXRgLCBhbmQgYFBvc3NpYmx5RXZhbHVhdGVkYC4gVGhpcyBhbGxvd3MgdGhlc2UgY2xhc3NlcyB0byBhdm9pZFxuICogZG9pbmcgd29yayBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSBwcm9wZXJ0eSBoYXMgbm8gZXhwbGljaXQgdmFsdWUgc2V0IGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCB0byB0YWtlXG4gKiBvbiB0aGUgZGVmYXVsdCB2YWx1ZTogdXNpbmcgYGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSlgLCB0aGV5IGNhbiBpdGVyYXRlIG92ZXJcbiAqIG9ubHkgdGhlIF9vd25fIHByb3BlcnRpZXMgb2YgYF92YWx1ZXNgLCBza2lwcGluZyByZXBlYXRlZCBjYWxjdWxhdGlvbiBvZiB0cmFuc2l0aW9ucyBhbmQgcG9zc2libGUvZmluYWxcbiAqIGV2YWx1YXRpb25zIGZvciBkZWZhdWx0cywgdGhlIHJlc3VsdCBvZiB3aGljaCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUHJvcGVydGllczxQcm9wczogT2JqZWN0PiB7XG4gICAgcHJvcGVydGllczogUHJvcHM7XG4gICAgZGVmYXVsdFByb3BlcnR5VmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM6IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuICAgIGRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXM6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVzPFByb3BzPjtcbiAgICBvdmVycmlkYWJsZVByb3BlcnRpZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wcykge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlcyA9ICh7fTogYW55KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlcyA9ICh7fTogYW55KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzID0gKHt9OiBhbnkpO1xuICAgICAgICB0aGlzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlcyA9ICh7fTogYW55KTtcbiAgICAgICAgdGhpcy5vdmVycmlkYWJsZVByb3BlcnRpZXMgPSAoW106IGFueSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcGVydGllc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAocHJvcC5zcGVjaWZpY2F0aW9uLm92ZXJyaWRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVycmlkYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0UHJvcGVydHlWYWx1ZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5VmFsdWVzW3Byb3BlcnR5XSA9XG4gICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWUocHJvcCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUgPSB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzW3Byb3BlcnR5XSA9XG4gICAgICAgICAgICAgICAgbmV3IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIGRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUudW50cmFuc2l0aW9uZWQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzW3Byb3BlcnR5XSA9XG4gICAgICAgICAgICAgICAgZGVmYXVsdFByb3BlcnR5VmFsdWUucG9zc2libHlFdmFsdWF0ZSgoe306IGFueSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5yZWdpc3RlcignRGF0YURyaXZlblByb3BlcnR5JywgRGF0YURyaXZlblByb3BlcnR5KTtcbnJlZ2lzdGVyKCdEYXRhQ29uc3RhbnRQcm9wZXJ0eScsIERhdGFDb25zdGFudFByb3BlcnR5KTtcbnJlZ2lzdGVyKCdDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5JywgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSk7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZFByb3BlcnR5JywgQ3Jvc3NGYWRlZFByb3BlcnR5KTtcbnJlZ2lzdGVyKCdDb2xvclJhbXBQcm9wZXJ0eScsIENvbG9yUmFtcFByb3BlcnR5KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZW5kc1dpdGgsIGZpbHRlck9iamVjdH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVN0eWxlLFxuICAgIHZhbGlkYXRlTGF5b3V0UHJvcGVydHksXG4gICAgdmFsaWRhdGVQYWludFByb3BlcnR5LFxuICAgIGVtaXRWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUnO1xuaW1wb3J0IHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHtMYXlvdXQsIFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQcm9wZXJ0aWVzLCBQb3NzaWJseUV2YWx1YXRlZCwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0J1Y2tldH0gZnJvbSAnLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZUZpbHRlcn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlcic7XG5pbXBvcnQgdHlwZSB7VHJhbnNpdGlvblBhcmFtZXRlcnMsIFByb3BlcnR5VmFsdWV9IGZyb20gJy4vcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycywge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHtcbiAgICBMYXllclNwZWNpZmljYXRpb24sXG4gICAgRmlsdGVyU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcbmltcG9ydCB0eXBlIHtDdXN0b21MYXllckludGVyZmFjZX0gZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSB7U3R5bGVTZXR0ZXJPcHRpb25zfSBmcm9tICcuL3N0eWxlJztcblxuY29uc3QgVFJBTlNJVElPTl9TVUZGSVggPSAnLXRyYW5zaXRpb24nO1xuXG5jbGFzcyBTdHlsZUxheWVyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtZXRhZGF0YTogbWl4ZWQ7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nO1xuICAgIHNvdXJjZUxheWVyOiA/c3RyaW5nO1xuICAgIG1pbnpvb206ID9udW1iZXI7XG4gICAgbWF4em9vbTogP251bWJlcjtcbiAgICBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24gfCB2b2lkO1xuICAgIHZpc2liaWxpdHk6ICd2aXNpYmxlJyB8ICdub25lJyB8IHZvaWQ7XG4gICAgX2Nyb3NzZmFkZVBhcmFtZXRlcnM6IENyb3NzZmFkZVBhcmFtZXRlcnM7XG5cbiAgICBfdW5ldmFsdWF0ZWRMYXlvdXQ6IExheW91dDxhbnk+O1xuICAgICtsYXlvdXQ6IG1peGVkO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPGFueT47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxhbnk+O1xuICAgICtwYWludDogbWl4ZWQ7XG5cbiAgICBfZmVhdHVyZUZpbHRlcjogRmVhdHVyZUZpbHRlcjtcblxuICAgICtxdWVyeVJhZGl1czogKGJ1Y2tldDogQnVja2V0KSA9PiBudW1iZXI7XG4gICAgK3F1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmU6IChxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5KSA9PiBib29sZWFuIHwgbnVtYmVyO1xuXG4gICAgK29uQWRkOiA/KG1hcDogTWFwKSA9PiB2b2lkO1xuICAgICtvblJlbW92ZTogPyhtYXA6IE1hcCkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24gfCBDdXN0b21MYXllckludGVyZmFjZSwgcHJvcGVydGllczogJFJlYWRPbmx5PHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPCo+LCBwYWludD86IFByb3BlcnRpZXM8Kj59Pikge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBsYXllci5pZDtcbiAgICAgICAgdGhpcy50eXBlID0gbGF5ZXIudHlwZTtcbiAgICAgICAgdGhpcy5fZmVhdHVyZUZpbHRlciA9IHtmaWx0ZXI6ICgpID0+IHRydWUsIG5lZWRHZW9tZXRyeTogZmFsc2V9O1xuXG4gICAgICAgIGlmIChsYXllci50eXBlID09PSAnY3VzdG9tJykgcmV0dXJuO1xuXG4gICAgICAgIGxheWVyID0gKChsYXllcjogYW55KTogTGF5ZXJTcGVjaWZpY2F0aW9uKTtcblxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbGF5ZXIubWV0YWRhdGE7XG4gICAgICAgIHRoaXMubWluem9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgICAgIHRoaXMubWF4em9vbSA9IGxheWVyLm1heHpvb207XG5cbiAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdiYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBsYXllci5zb3VyY2U7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxheWVyID0gbGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBsYXllci5maWx0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy5sYXlvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0ID0gbmV3IExheW91dChwcm9wZXJ0aWVzLmxheW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy5wYWludCkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludCA9IG5ldyBUcmFuc2l0aW9uYWJsZShwcm9wZXJ0aWVzLnBhaW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5wYWludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFpbnRQcm9wZXJ0eShwcm9wZXJ0eSwgbGF5ZXIucGFpbnRbcHJvcGVydHldLCB7dmFsaWRhdGU6IGZhbHNlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGxheWVyLmxheW91dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0UHJvcGVydHkocHJvcGVydHksIGxheWVyLmxheW91dFtwcm9wZXJ0eV0sIHt2YWxpZGF0ZTogZmFsc2V9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50ID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgICAgICAgLy8kRmxvd0ZpeE1lXG4gICAgICAgICAgICB0aGlzLnBhaW50ID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkKHByb3BlcnRpZXMucGFpbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnM7XG4gICAgfVxuXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAndmlzaWJpbGl0eScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2liaWxpdHk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuZ2V0VmFsdWUobmFtZSk7XG4gICAgfVxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGxheWVycy4ke3RoaXMuaWR9LmxheW91dC4ke25hbWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZUxheW91dFByb3BlcnR5LCBrZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lID09PSAndmlzaWJpbGl0eScpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGdldFBhaW50UHJvcGVydHkobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChlbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LmdldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRWYWx1ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFBhaW50UHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgbGF5ZXJzLiR7dGhpcy5pZH0ucGFpbnQuJHtuYW1lfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVQYWludFByb3BlcnR5LCBrZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2V0VHJhbnNpdGlvbihuYW1lLnNsaWNlKDAsIC1UUkFOU0lUSU9OX1NVRkZJWC5sZW5ndGgpLCAodmFsdWU6IGFueSkgfHwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25hYmxlID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW25hbWVdO1xuICAgICAgICAgICAgY29uc3QgaXNDcm9zc0ZhZGVkUHJvcGVydHkgPSB0cmFuc2l0aW9uYWJsZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uW1wicHJvcGVydHktdHlwZVwiXSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcbiAgICAgICAgICAgIGNvbnN0IHdhc0RhdGFEcml2ZW4gPSB0cmFuc2l0aW9uYWJsZS52YWx1ZS5pc0RhdGFEcml2ZW4oKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdHJhbnNpdGlvbmFibGUudmFsdWU7XG5cbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUobmFtZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzW25hbWVdLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgaXNEYXRhRHJpdmVuID0gbmV3VmFsdWUuaXNEYXRhRHJpdmVuKCk7XG5cbiAgICAgICAgICAgIC8vIGlmIGEgY3Jvc3MtZmFkZWQgdmFsdWUgaXMgY2hhbmdlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIG5ldyBpY29ucyBnZXQgYWRkZWQgdG8gZWFjaCB0aWxlJ3MgaWNvbkF0bGFzXG4gICAgICAgICAgICAvLyBzbyBhIGNhbGwgdG8gX3VwZGF0ZUxheWVyIGlzIG5lY2Vzc2FyeSwgYW5kIHdlIHJldHVybiB0cnVlIGZyb20gdGhpcyBmdW5jdGlvbiBzbyBpdCBnZXRzIGNhbGxlZCBpblxuICAgICAgICAgICAgLy8gU3R5bGUjc2V0UGFpbnRQcm9wZXJ0eVxuICAgICAgICAgICAgcmV0dXJuIGlzRGF0YURyaXZlbiB8fCB3YXNEYXRhRHJpdmVuIHx8IGlzQ3Jvc3NGYWRlZFByb3BlcnR5IHx8IHRoaXMuX2hhbmRsZU92ZXJyaWRhYmxlUGFpbnRQcm9wZXJ0eVVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKF86IHN0cmluZykge1xuICAgICAgICAvLyBOby1vcDsgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVyaXZlZCBjbGFzc2VzLlxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIF9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGU8VCwgUj4obmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPiwgbmV3VmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gTm8tb3A7IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzSGlkZGVuKHpvb206IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5taW56b29tICYmIHpvb20gPCB0aGlzLm1pbnpvb20pIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXh6b29tICYmIHpvb20gPj0gdGhpcy5tYXh6b29tKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eSA9PT0gJ25vbmUnO1xuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5oYXNUcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBpZiAocGFyYW1ldGVycy5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9jcm9zc2ZhZGVQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQpIHtcbiAgICAgICAgICAgICh0aGlzOiBhbnkpLmxheW91dCA9IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgdW5kZWZpbmVkLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgKHRoaXM6IGFueSkucGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCB1bmRlZmluZWQsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBvdXRwdXQ6IGFueSA9IHtcbiAgICAgICAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAgICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICdzb3VyY2UtbGF5ZXInOiB0aGlzLnNvdXJjZUxheWVyLFxuICAgICAgICAgICAgJ21ldGFkYXRhJzogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgICdtaW56b29tJzogdGhpcy5taW56b29tLFxuICAgICAgICAgICAgJ21heHpvb20nOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICAnZmlsdGVyJzogdGhpcy5maWx0ZXIsXG4gICAgICAgICAgICAnbGF5b3V0JzogdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQgJiYgdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2VyaWFsaXplKCksXG4gICAgICAgICAgICAncGFpbnQnOiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ICYmIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2VyaWFsaXplKClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICBvdXRwdXQubGF5b3V0ID0gb3V0cHV0LmxheW91dCB8fCB7fTtcbiAgICAgICAgICAgIG91dHB1dC5sYXlvdXQudmlzaWJpbGl0eSA9IHRoaXMudmlzaWJpbGl0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJPYmplY3Qob3V0cHV0LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhKGtleSA9PT0gJ2xheW91dCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpICYmXG4gICAgICAgICAgICAgICAgIShrZXkgPT09ICdwYWludCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvYmplY3RLZXk6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgaXMzRCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzVGlsZUNsaXBwZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVzaXplKCkge1xuICAgICAgICAvLyBub29wXG4gICAgfVxuXG4gICAgaXNTdGF0ZURlcGVuZGVudCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiAodGhpczogYW55KS5wYWludC5fdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzOiBhbnkpLnBhaW50LmdldChwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSkgfHwgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgodmFsdWUudmFsdWUua2luZCA9PT0gJ3NvdXJjZScgfHwgdmFsdWUudmFsdWUua2luZCA9PT0gJ2NvbXBvc2l0ZScpICYmXG4gICAgICAgICAgICAgICAgdmFsdWUudmFsdWUuaXNTdGF0ZURlcGVuZGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG4vLyBOb3RlOiBhbGwgXCJzaXplc1wiIGFyZSBtZWFzdXJlZCBpbiBieXRlc1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtUcmFuc2ZlcmFibGV9IGZyb20gJy4uL3R5cGVzL3RyYW5zZmVyYWJsZSc7XG5cbmNvbnN0IHZpZXdUeXBlcyA9IHtcbiAgICAnSW50OCc6IEludDhBcnJheSxcbiAgICAnVWludDgnOiBVaW50OEFycmF5LFxuICAgICdJbnQxNic6IEludDE2QXJyYXksXG4gICAgJ1VpbnQxNic6IFVpbnQxNkFycmF5LFxuICAgICdJbnQzMic6IEludDMyQXJyYXksXG4gICAgJ1VpbnQzMic6IFVpbnQzMkFycmF5LFxuICAgICdGbG9hdDMyJzogRmxvYXQzMkFycmF5XG59O1xuXG5leHBvcnQgdHlwZSBWaWV3VHlwZSA9ICRLZXlzPHR5cGVvZiB2aWV3VHlwZXM+O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdCB7XG4gICAgX3BvczE6IG51bWJlcjtcbiAgICBfcG9zMjogbnVtYmVyO1xuICAgIF9wb3M0OiBudW1iZXI7XG4gICAgX3Bvczg6IG51bWJlcjtcbiAgICArX3N0cnVjdEFycmF5OiBTdHJ1Y3RBcnJheTtcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGUgcHJvdG90eXBlIG9mIHN1YiBjbGFzc2VzLlxuICAgIHNpemU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RydWN0QXJyYXl9IHN0cnVjdEFycmF5IFRoZSBTdHJ1Y3RBcnJheSB0aGUgc3RydWN0IGlzIHN0b3JlZCBpblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHN0cnVjdCBpbiB0aGUgU3RydWN0QXJyYXkuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzdHJ1Y3RBcnJheTogU3RydWN0QXJyYXksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgKHRoaXM6IGFueSkuX3N0cnVjdEFycmF5ID0gc3RydWN0QXJyYXk7XG4gICAgICAgIHRoaXMuX3BvczEgPSBpbmRleCAqIHRoaXMuc2l6ZTtcbiAgICAgICAgdGhpcy5fcG9zMiA9IHRoaXMuX3BvczEgLyAyO1xuICAgICAgICB0aGlzLl9wb3M0ID0gdGhpcy5fcG9zMSAvIDQ7XG4gICAgICAgIHRoaXMuX3BvczggPSB0aGlzLl9wb3MxIC8gODtcbiAgICB9XG59XG5cbmNvbnN0IERFRkFVTFRfQ0FQQUNJVFkgPSAxMjg7XG5jb25zdCBSRVNJWkVfTVVMVElQTElFUiA9IDU7XG5cbmV4cG9ydCB0eXBlIFN0cnVjdEFycmF5TWVtYmVyID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlOiBWaWV3VHlwZSxcbiAgICBjb21wb25lbnRzOiBudW1iZXIsXG4gICAgb2Zmc2V0OiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIFN0cnVjdEFycmF5TGF5b3V0ID0ge1xuICAgIG1lbWJlcnM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgYWxpZ25tZW50OiA/bnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRTdHJ1Y3RBcnJheSA9IHtcbiAgICBsZW5ndGg6IG51bWJlcixcbiAgICBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJcbn07XG5cbi8qKlxuICogYFN0cnVjdEFycmF5YCBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBvdmVyIGBBcnJheUJ1ZmZlcmAgYW5kIGBUeXBlZEFycmF5YFxuICogbWFraW5nIGl0IGJlaGF2ZSBsaWtlIGFuIGFycmF5IG9mIHR5cGVkIHN0cnVjdHMuXG4gKlxuICogQ29uY2VwdHVhbGx5LCBhIFN0cnVjdEFycmF5IGlzIGNvbXByaXNlZCBvZiBlbGVtZW50cywgaS5lLiwgaW5zdGFuY2VzIG9mIGl0c1xuICogYXNzb2NpYXRlZCBzdHJ1Y3QgdHlwZS4gRWFjaCBwYXJ0aWN1bGFyIHN0cnVjdCB0eXBlLCB0b2dldGhlciB3aXRoIGFuXG4gKiBhbGlnbm1lbnQgc2l6ZSwgZGV0ZXJtaW5lcyB0aGUgbWVtb3J5IGxheW91dCBvZiBhIFN0cnVjdEFycmF5IHdob3NlIGVsZW1lbnRzXG4gKiBhcmUgb2YgdGhhdCB0eXBlLiAgVGh1cywgZm9yIGVhY2ggc3VjaCBsYXlvdXQgdGhhdCB3ZSBuZWVkLCB3ZSBoYXZlXG4gKiBhIGNvcnJzZXBvbmRpbmcgU3RydWN0QXJyYXlMYXlvdXQgY2xhc3MsIGluaGVyaXRpbmcgZnJvbSBTdHJ1Y3RBcnJheSBhbmRcbiAqIGltcGxlbWVudGluZyBgZW1wbGFjZUJhY2soKWAgYW5kIGBfcmVmcmVzaFZpZXdzKClgLlxuICpcbiAqIEluIHNvbWUgY2FzZXMsIHdoZXJlIHdlIG5lZWQgdG8gYWNjZXNzIHBhcnRpY3VsYXIgZWxlbWVudHMgb2YgYSBTdHJ1Y3RBcnJheSxcbiAqIHdlIGltcGxlbWVudCBhIG1vcmUgc3BlY2lmaWMgc3ViY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIG9uZSBvZiB0aGVcbiAqIFN0cnVjdEFycmF5TGF5b3V0cyBhbmQgYWRkcyBhIGBnZXQoaSk6IFRgIGFjY2Vzc29yIHRoYXQgcmV0dXJucyBhIHN0cnVjdHVyZWRcbiAqIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBwcm94aWVzIGludG8gdGhlIHVuZGVybHlpbmcgbWVtb3J5IHNwYWNlIGZvciB0aGVcbiAqIGktdGggZWxlbWVudC4gIFRoaXMgYWZmb3JkcyB0aGUgY29udmllbmNlIG9mIHdvcmtpbmcgd2l0aCAoc2VlbWluZ2x5KSBwbGFpblxuICogSmF2YXNjcmlwdCBvYmplY3RzIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgdGhlbVxuICogaW50byBBcnJheUJ1ZmZlcnMgZm9yIGVmZmljaWVudCB3ZWIgd29ya2VyIHRyYW5zZmVyLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5IHtcbiAgICBjYXBhY2l0eTogbnVtYmVyO1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIGlzVHJhbnNmZXJyZWQ6IGJvb2xlYW47XG4gICAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZSBwcm90b3R5cGUuXG4gICAgbWVtYmVyczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIGJ5dGVzUGVyRWxlbWVudDogbnVtYmVyO1xuICAgICtlbXBsYWNlQmFjazogRnVuY3Rpb247XG4gICAgK2VtcGxhY2U6IEZ1bmN0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNUcmFuc2ZlcnJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gLTE7XG4gICAgICAgIHRoaXMucmVzaXplKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBhIFN0cnVjdEFycmF5IGluc3RhbmNlLiAgU2VyaWFsaXplcyBib3RoIHRoZSByYXcgZGF0YSBhbmQgdGhlXG4gICAgICogbWV0YWRhdGEgbmVlZGVkIHRvIHJlY29uc3RydWN0IHRoZSBTdHJ1Y3RBcnJheSBiYXNlIGNsYXNzIGR1cmluZ1xuICAgICAqIGRlc2VyaWFsaXphdGlvbi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemUoYXJyYXk6IFN0cnVjdEFycmF5LCB0cmFuc2ZlcmFibGVzPzogQXJyYXk8VHJhbnNmZXJhYmxlPik6IFNlcmlhbGl6ZWRTdHJ1Y3RBcnJheSB7XG4gICAgICAgIGFzc2VydCghYXJyYXkuaXNUcmFuc2ZlcnJlZCk7XG5cbiAgICAgICAgYXJyYXkuX3RyaW0oKTtcblxuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgYXJyYXkuaXNUcmFuc2ZlcnJlZCA9IHRydWU7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goYXJyYXkuYXJyYXlCdWZmZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlbmd0aDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgYXJyYXlCdWZmZXI6IGFycmF5LmFycmF5QnVmZmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShpbnB1dDogU2VyaWFsaXplZFN0cnVjdEFycmF5KSB7XG4gICAgICAgIGNvbnN0IHN0cnVjdEFycmF5ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnByb3RvdHlwZSk7XG4gICAgICAgIHN0cnVjdEFycmF5LmFycmF5QnVmZmVyID0gaW5wdXQuYXJyYXlCdWZmZXI7XG4gICAgICAgIHN0cnVjdEFycmF5Lmxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgc3RydWN0QXJyYXkuY2FwYWNpdHkgPSBpbnB1dC5hcnJheUJ1ZmZlci5ieXRlTGVuZ3RoIC8gc3RydWN0QXJyYXkuYnl0ZXNQZXJFbGVtZW50O1xuICAgICAgICBzdHJ1Y3RBcnJheS5fcmVmcmVzaFZpZXdzKCk7XG4gICAgICAgIHJldHVybiBzdHJ1Y3RBcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGFycmF5IHRvIGRpc2NhcmQgdW51c2VkIGNhcGFjaXR5LlxuICAgICAqL1xuICAgIF90cmltKCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggIT09IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSB0aGlzLmFycmF5QnVmZmVyLnNsaWNlKDAsIHRoaXMubGVuZ3RoICogdGhpcy5ieXRlc1BlckVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFZpZXdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHRvIDAgd2l0aG91dCBkZS1hbGxvY2F0aW5nIGNhcGNhY2l0eS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgYXJyYXkuXG4gICAgICogSWYgYG5gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBsZW5ndGggdGhlbiBhZGRpdGlvbmFsIGVsZW1lbnRzIHdpdGggdW5kZWZpbmVkIHZhbHVlcyBhcmUgYWRkZWQuXG4gICAgICogSWYgYG5gIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZW5ndGggdGhlbiB0aGUgYXJyYXkgd2lsbCBiZSByZWR1Y2VkIHRvIHRoZSBmaXJzdCBgbmAgZWxlbWVudHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG5ldyBzaXplIG9mIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICByZXNpemUobjogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgdGhpcy5yZXNlcnZlKG4pO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgYSBwbGFubmVkIGluY3JlYXNlIGluIHNpemUsIHNvIHRoYXQgYW55IG5lY2Vzc2FyeSBhbGxvY2F0aW9uIG1heVxuICAgICAqIGJlIGRvbmUgb25jZSwgYWhlYWQgb2YgdGltZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgYXJyYXkuXG4gICAgICovXG4gICAgcmVzZXJ2ZShuOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKG4gPiB0aGlzLmNhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmNhcGFjaXR5ID0gTWF0aC5tYXgobiwgTWF0aC5mbG9vcih0aGlzLmNhcGFjaXR5ICogUkVTSVpFX01VTFRJUExJRVIpLCBERUZBVUxUX0NBUEFDSVRZKTtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5jYXBhY2l0eSAqIHRoaXMuYnl0ZXNQZXJFbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3Qgb2xkVWludDhBcnJheSA9IHRoaXMudWludDg7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoVmlld3MoKTtcbiAgICAgICAgICAgIGlmIChvbGRVaW50OEFycmF5KSB0aGlzLnVpbnQ4LnNldChvbGRVaW50OEFycmF5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBUeXBlZEFycmF5IHZpZXdzIGZvciB0aGUgY3VycmVudCBBcnJheUJ1ZmZlci5cbiAgICAgKi9cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ19yZWZyZXNoVmlld3MoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggY29uY3JldGUgU3RydWN0QXJyYXkgbGF5b3V0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBtZW1iZXIgZmllbGRzLCBjcmVhdGUgYSBmdWxsIFN0cnVjdEFycmF5TGF5b3V0LCBpblxuICogcGFydGljdWxhciBjYWxjdWxhdGluZyB0aGUgY29ycmVjdCBieXRlIG9mZnNldCBmb3IgZWFjaCBmaWVsZC4gIFRoaXMgZGF0YVxuICogaXMgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGdlbmVyYXRlIFN0cnVjdEFycmF5TGF5b3V0XyojZW1wbGFjZUJhY2soKSBhbmRcbiAqIG90aGVyIGFjY2Vzc29ycywgYW5kIGF0IHJ1bnRpbWUgZm9yIGJpbmRpbmcgdmVydGV4IGJ1ZmZlciBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dChcbiAgICBtZW1iZXJzOiBBcnJheTx7IG5hbWU6IHN0cmluZywgdHlwZTogVmlld1R5cGUsICtjb21wb25lbnRzPzogbnVtYmVyLCB9PixcbiAgICBhbGlnbm1lbnQ6IG51bWJlciA9IDFcbik6IFN0cnVjdEFycmF5TGF5b3V0IHtcblxuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGxldCBtYXhTaXplID0gMDtcbiAgICBjb25zdCBsYXlvdXRNZW1iZXJzID0gbWVtYmVycy5tYXAoKG1lbWJlcikgPT4ge1xuICAgICAgICBhc3NlcnQobWVtYmVyLm5hbWUubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdHlwZVNpemUgPSBzaXplT2YobWVtYmVyLnR5cGUpO1xuICAgICAgICBjb25zdCBtZW1iZXJPZmZzZXQgPSBvZmZzZXQgPSBhbGlnbihvZmZzZXQsIE1hdGgubWF4KGFsaWdubWVudCwgdHlwZVNpemUpKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG1lbWJlci5jb21wb25lbnRzIHx8IDE7XG5cbiAgICAgICAgbWF4U2l6ZSA9IE1hdGgubWF4KG1heFNpemUsIHR5cGVTaXplKTtcbiAgICAgICAgb2Zmc2V0ICs9IHR5cGVTaXplICogY29tcG9uZW50cztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogbWVtYmVyLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBtZW1iZXIudHlwZSxcbiAgICAgICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgICAgICBvZmZzZXQ6IG1lbWJlck9mZnNldCxcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpemUgPSBhbGlnbihvZmZzZXQsIE1hdGgubWF4KG1heFNpemUsIGFsaWdubWVudCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWVtYmVyczogbGF5b3V0TWVtYmVycyxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgYWxpZ25tZW50XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gc2l6ZU9mKHR5cGU6IFZpZXdUeXBlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdmlld1R5cGVzW3R5cGVdLkJZVEVTX1BFUl9FTEVNRU5UO1xufVxuXG5mdW5jdGlvbiBhbGlnbihvZmZzZXQ6IG51bWJlciwgc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKG9mZnNldCAvIHNpemUpICogc2l6ZTtcbn1cblxuZXhwb3J0IHtTdHJ1Y3RBcnJheSwgU3RydWN0LCB2aWV3VHlwZXMsIGNyZWF0ZUxheW91dH07XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0cnVjdC1hcnJheXMuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7U3RydWN0LCBTdHJ1Y3RBcnJheX0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0Mmk0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJpNCcsIFN0cnVjdEFycmF5TGF5b3V0Mmk0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls0XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NGk4IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2Myk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0aTgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ0aTgnLCBTdHJ1Y3RBcnJheUxheW91dDRpOCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogSW50MTZbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA0XSA9IHY0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNGkxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTRpMTInLCBTdHJ1Y3RBcnJheUxheW91dDJpNGkxMik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogVWludDhbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNHViOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNDtcbiAgICAgICAgY29uc3QgbzEgPSBpICogODtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNF0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDVdID0gdjM7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA2XSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgN10gPSB2NTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNHViOC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gODtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJpNHViOCcsIFN0cnVjdEFycmF5TGF5b3V0Mmk0dWI4KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQyZjggZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MmY4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MmY4JywgU3RydWN0QXJyYXlMYXlvdXQyZjgpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQxNlsxMF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDEwdWkyMCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAxMDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOF0gPSB2ODtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA5XSA9IHY5O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MTB1aTIwLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyMDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDEwdWkyMCcsIFN0cnVjdEFycmF5TGF5b3V0MTB1aTIwKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls0XVxuICogWzhdOiBVaW50MTZbNF1cbiAqIFsxNl06IEludDE2WzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpMjQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDEyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA0XSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNl0gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA3XSA9IHY3O1xuICAgICAgICB0aGlzLmludDE2W28yICsgOF0gPSB2ODtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDldID0gdjk7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMF0gPSB2MTA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMV0gPSB2MTE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpMjQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDI0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTI0JywgU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpMjQpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNmMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2Mik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMztcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2MjtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDNmMTIucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDEyO1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0M2YxMicsIFN0cnVjdEFycmF5TGF5b3V0M2YxMik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDMyWzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWw0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjApO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1bDQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxdWw0JywgU3RydWN0QXJyYXlMYXlvdXQxdWw0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls2XVxuICogWzEyXTogVWludDMyWzFdXG4gKiBbMTZdOiBVaW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDZpMXVsMnVpMjAgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDEwO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiA1O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA1XSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDNdID0gdjY7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOF0gPSB2NztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA5XSA9IHY4O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0NmkxdWwydWkyMC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjA7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTIwJywgU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTIwKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICogWzRdOiBJbnQxNlsyXVxuICogWzhdOiBJbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDY7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNF0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMicsIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMl1cbiAqIFs4XTogRmxvYXQzMlsxXVxuICogWzEyXTogSW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiA0O1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA4O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNl0gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDddID0gdjQ7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNicsIFN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQ4WzJdXG4gKiBbNF06IEZsb2F0MzJbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8xID0gaSAqIDEyO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAzO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjM7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTInLCBTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQxNlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M3VpNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzdWk2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA2O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0M3VpNicsIFN0cnVjdEFycmF5TGF5b3V0M3VpNik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqIFs0XTogVWludDE2WzJdXG4gKiBbOF06IFVpbnQzMlszXVxuICogWzIwXTogVWludDE2WzNdXG4gKiBbMjhdOiBGbG9hdDMyWzJdXG4gKiBbMzZdOiBVaW50OFszXVxuICogWzQwXTogVWludDMyWzFdXG4gKiBbNDRdOiBJbnQxNlsxXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjN1YjF1bDFpNDggZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyLCB2MTI6IG51bWJlciwgdjEzOiBudW1iZXIsIHYxNDogbnVtYmVyLCB2MTU6IG51bWJlciwgdjE2OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIsIHYxMzogbnVtYmVyLCB2MTQ6IG51bWJlciwgdjE1OiBudW1iZXIsIHYxNjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDI0O1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAxMjtcbiAgICAgICAgY29uc3QgbzEgPSBpICogNDg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMl0gPSB2NDtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAzXSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDRdID0gdjY7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTBdID0gdjc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTFdID0gdjg7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTJdID0gdjk7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDddID0gdjEwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyA4XSA9IHYxMTtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDM2XSA9IHYxMjtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDM3XSA9IHYxMztcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDM4XSA9IHYxNDtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAxMF0gPSB2MTU7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyMl0gPSB2MTY7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmM3ViMXVsMWk0OC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTJ1aTN1bDN1aTJmM3ViMXVsMWk0OCcsIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjN1YjF1bDFpNDgpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzhdXG4gKiBbMTZdOiBVaW50MTZbMTVdXG4gKiBbNDhdOiBVaW50MzJbMV1cbiAqIFs1Ml06IEZsb2F0MzJbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDhpMTV1aTF1bDRmNjggZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyLCB2MTI6IG51bWJlciwgdjEzOiBudW1iZXIsIHYxNDogbnVtYmVyLCB2MTU6IG51bWJlciwgdjE2OiBudW1iZXIsIHYxNzogbnVtYmVyLCB2MTg6IG51bWJlciwgdjE5OiBudW1iZXIsIHYyMDogbnVtYmVyLCB2MjE6IG51bWJlciwgdjIyOiBudW1iZXIsIHYyMzogbnVtYmVyLCB2MjQ6IG51bWJlciwgdjI1OiBudW1iZXIsIHYyNjogbnVtYmVyLCB2Mjc6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNyk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIsIHYxMzogbnVtYmVyLCB2MTQ6IG51bWJlciwgdjE1OiBudW1iZXIsIHYxNjogbnVtYmVyLCB2MTc6IG51bWJlciwgdjE4OiBudW1iZXIsIHYxOTogbnVtYmVyLCB2MjA6IG51bWJlciwgdjIxOiBudW1iZXIsIHYyMjogbnVtYmVyLCB2MjM6IG51bWJlciwgdjI0OiBudW1iZXIsIHYyNTogbnVtYmVyLCB2MjY6IG51bWJlciwgdjI3OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMzQ7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE3O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA1XSA9IHY1O1xuICAgICAgICB0aGlzLmludDE2W28yICsgNl0gPSB2NjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOF0gPSB2ODtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA5XSA9IHY5O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDEwXSA9IHYxMDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxMV0gPSB2MTE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTJdID0gdjEyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDEzXSA9IHYxMztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxNF0gPSB2MTQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTVdID0gdjE1O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE2XSA9IHYxNjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxN10gPSB2MTc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMThdID0gdjE4O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE5XSA9IHYxOTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyMF0gPSB2MjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMjFdID0gdjIxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDIyXSA9IHYyMjtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAxMl0gPSB2MjM7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDEzXSA9IHYyNDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMTRdID0gdjI1O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxNV0gPSB2MjY7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDE2XSA9IHYyNztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDhpMTV1aTF1bDRmNjgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDY4O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0OGkxNXVpMXVsNGY2OCcsIFN0cnVjdEFycmF5TGF5b3V0OGkxNXVpMXVsNGY2OCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogRmxvYXQzMlsxXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MWY0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MWY0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MWY0JywgU3RydWN0QXJyYXlMYXlvdXQxZjQpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzNdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQzaTYgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzaTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQzaTYnLCBTdHJ1Y3RBcnJheUxheW91dDNpNik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDMyWzFdXG4gKiBbNF06IFVpbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDI7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDQ7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDNdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCcsIFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQydWk0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJ1aTQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQydWk0JywgU3RydWN0QXJyYXlMYXlvdXQydWk0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MTZbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDF1aTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MXVpMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDF1aTInLCBTdHJ1Y3RBcnJheUxheW91dDF1aTIpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDRmMTYgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDQ7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjM7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0ZjE2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDRmMTYnLCBTdHJ1Y3RBcnJheUxheW91dDRmMTYpO1xuXG5jbGFzcyBDb2xsaXNpb25Cb3hTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogQ29sbGlzaW9uQm94QXJyYXk7XG4gICAgYW5jaG9yUG9pbnRYOiBudW1iZXI7XG4gICAgYW5jaG9yUG9pbnRZOiBudW1iZXI7XG4gICAgeDE6IG51bWJlcjtcbiAgICB5MTogbnVtYmVyO1xuICAgIHgyOiBudW1iZXI7XG4gICAgeTI6IG51bWJlcjtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICBhbmNob3JQb2ludDogUG9pbnQ7XG4gICAgZ2V0IGFuY2hvclBvaW50WCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTsgfVxuICAgIGdldCBhbmNob3JQb2ludFkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07IH1cbiAgICBnZXQgeDEoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBnZXQgeTEoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgM107IH1cbiAgICBnZXQgeDIoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF07IH1cbiAgICBnZXQgeTIoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNV07IH1cbiAgICBnZXQgZmVhdHVyZUluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXTsgfVxuICAgIGdldCBzb3VyY2VMYXllckluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA4XTsgfVxuICAgIGdldCBidWNrZXRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOV07IH1cbiAgICBnZXQgYW5jaG9yUG9pbnQoKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy5hbmNob3JQb2ludFgsIHRoaXMuYW5jaG9yUG9pbnRZKTsgfVxufVxuXG5Db2xsaXNpb25Cb3hTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSAyMDtcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uQm94ID0gQ29sbGlzaW9uQm94U3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsaXNpb25Cb3hBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0NmkxdWwydWkyMCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBDb2xsaXNpb25Cb3hTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBDb2xsaXNpb25Cb3hTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgQ29sbGlzaW9uQm94U3RydWN0KHRoaXMsIGluZGV4KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdDb2xsaXNpb25Cb3hBcnJheScsIENvbGxpc2lvbkJveEFycmF5KTtcblxuY2xhc3MgUGxhY2VkU3ltYm9sU3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IFBsYWNlZFN5bWJvbEFycmF5O1xuICAgIGFuY2hvclg6IG51bWJlcjtcbiAgICBhbmNob3JZOiBudW1iZXI7XG4gICAgZ2x5cGhTdGFydEluZGV4OiBudW1iZXI7XG4gICAgbnVtR2x5cGhzOiBudW1iZXI7XG4gICAgdmVydGV4U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGxpbmVTdGFydEluZGV4OiBudW1iZXI7XG4gICAgbGluZUxlbmd0aDogbnVtYmVyO1xuICAgIHNlZ21lbnQ6IG51bWJlcjtcbiAgICBsb3dlclNpemU6IG51bWJlcjtcbiAgICB1cHBlclNpemU6IG51bWJlcjtcbiAgICBsaW5lT2Zmc2V0WDogbnVtYmVyO1xuICAgIGxpbmVPZmZzZXRZOiBudW1iZXI7XG4gICAgd3JpdGluZ01vZGU6IG51bWJlcjtcbiAgICBwbGFjZWRPcmllbnRhdGlvbjogbnVtYmVyO1xuICAgIGhpZGRlbjogbnVtYmVyO1xuICAgIGNyb3NzVGlsZUlEOiBudW1iZXI7XG4gICAgYXNzb2NpYXRlZEljb25JbmRleDogbnVtYmVyO1xuICAgIGdldCBhbmNob3JYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgZ2V0IGFuY2hvclkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07IH1cbiAgICBnZXQgZ2x5cGhTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIGdldCBudW1HbHlwaHMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgZ2V0IHZlcnRleFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDJdOyB9XG4gICAgZ2V0IGxpbmVTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAzXTsgfVxuICAgIGdldCBsaW5lTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyA0XTsgfVxuICAgIGdldCBzZWdtZW50KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMF07IH1cbiAgICBnZXQgbG93ZXJTaXplKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMV07IH1cbiAgICBnZXQgdXBwZXJTaXplKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxMl07IH1cbiAgICBnZXQgbGluZU9mZnNldFgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA3XTsgfVxuICAgIGdldCBsaW5lT2Zmc2V0WSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDhdOyB9XG4gICAgZ2V0IHdyaXRpbmdNb2RlKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDM2XTsgfVxuICAgIGdldCBwbGFjZWRPcmllbnRhdGlvbigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN107IH1cbiAgICBzZXQgcGxhY2VkT3JpZW50YXRpb24oeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzN10gPSB4OyB9XG4gICAgZ2V0IGhpZGRlbigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyAzOF07IH1cbiAgICBzZXQgaGlkZGVuKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgMzhdID0geDsgfVxuICAgIGdldCBjcm9zc1RpbGVJRCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMTBdOyB9XG4gICAgc2V0IGNyb3NzVGlsZUlEKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDEwXSA9IHg7IH1cbiAgICBnZXQgYXNzb2NpYXRlZEljb25JbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyMl07IH1cbn1cblxuUGxhY2VkU3ltYm9sU3RydWN0LnByb3RvdHlwZS5zaXplID0gNDg7XG5cbmV4cG9ydCB0eXBlIFBsYWNlZFN5bWJvbCA9IFBsYWNlZFN5bWJvbFN0cnVjdDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUGxhY2VkU3ltYm9sQXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDJpMnVpM3VsM3VpMmYzdWIxdWwxaTQ4IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFBsYWNlZFN5bWJvbFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IFBsYWNlZFN5bWJvbFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWRTeW1ib2xTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1BsYWNlZFN5bWJvbEFycmF5JywgUGxhY2VkU3ltYm9sQXJyYXkpO1xuXG5jbGFzcyBTeW1ib2xJbnN0YW5jZVN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBTeW1ib2xJbnN0YW5jZUFycmF5O1xuICAgIGFuY2hvclg6IG51bWJlcjtcbiAgICBhbmNob3JZOiBudW1iZXI7XG4gICAgcmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXg6IG51bWJlcjtcbiAgICBjZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXg6IG51bWJlcjtcbiAgICBsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAgdmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXg6IG51bWJlcjtcbiAgICBwbGFjZWRJY29uU3ltYm9sSW5kZXg6IG51bWJlcjtcbiAgICB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleDogbnVtYmVyO1xuICAgIGtleTogbnVtYmVyO1xuICAgIHRleHRCb3hTdGFydEluZGV4OiBudW1iZXI7XG4gICAgdGV4dEJveEVuZEluZGV4OiBudW1iZXI7XG4gICAgdmVydGljYWxUZXh0Qm94U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIHZlcnRpY2FsVGV4dEJveEVuZEluZGV4OiBudW1iZXI7XG4gICAgaWNvbkJveFN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICBpY29uQm94RW5kSW5kZXg6IG51bWJlcjtcbiAgICB2ZXJ0aWNhbEljb25Cb3hTdGFydEluZGV4OiBudW1iZXI7XG4gICAgdmVydGljYWxJY29uQm94RW5kSW5kZXg6IG51bWJlcjtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlczogbnVtYmVyO1xuICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlczogbnVtYmVyO1xuICAgIG51bUljb25WZXJ0aWNlczogbnVtYmVyO1xuICAgIG51bVZlcnRpY2FsSWNvblZlcnRpY2VzOiBudW1iZXI7XG4gICAgdXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXM6IG51bWJlcjtcbiAgICBjcm9zc1RpbGVJRDogbnVtYmVyO1xuICAgIHRleHRCb3hTY2FsZTogbnVtYmVyO1xuICAgIHRleHRPZmZzZXQwOiBudW1iZXI7XG4gICAgdGV4dE9mZnNldDE6IG51bWJlcjtcbiAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcjogbnVtYmVyO1xuICAgIGdldCBhbmNob3JYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgZ2V0IGFuY2hvclkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07IH1cbiAgICBnZXQgcmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBnZXQgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgZ2V0IGxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF07IH1cbiAgICBnZXQgdmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNV07IH1cbiAgICBnZXQgcGxhY2VkSWNvblN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDZdOyB9XG4gICAgZ2V0IHZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDddOyB9XG4gICAgZ2V0IGtleSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF07IH1cbiAgICBnZXQgdGV4dEJveFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldOyB9XG4gICAgZ2V0IHRleHRCb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTBdOyB9XG4gICAgZ2V0IHZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDExXTsgfVxuICAgIGdldCB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTJdOyB9XG4gICAgZ2V0IGljb25Cb3hTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxM107IH1cbiAgICBnZXQgaWNvbkJveEVuZEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNF07IH1cbiAgICBnZXQgdmVydGljYWxJY29uQm94U3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTVdOyB9XG4gICAgZ2V0IHZlcnRpY2FsSWNvbkJveEVuZEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNl07IH1cbiAgICBnZXQgZmVhdHVyZUluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxN107IH1cbiAgICBnZXQgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE4XTsgfVxuICAgIGdldCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE5XTsgfVxuICAgIGdldCBudW1JY29uVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDIwXTsgfVxuICAgIGdldCBudW1WZXJ0aWNhbEljb25WZXJ0aWNlcygpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjFdOyB9XG4gICAgZ2V0IHVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyMl07IH1cbiAgICBnZXQgY3Jvc3NUaWxlSUQoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDEyXTsgfVxuICAgIHNldCBjcm9zc1RpbGVJRCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxMl0gPSB4OyB9XG4gICAgZ2V0IHRleHRCb3hTY2FsZSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDEzXTsgfVxuICAgIGdldCB0ZXh0T2Zmc2V0MCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE0XTsgfVxuICAgIGdldCB0ZXh0T2Zmc2V0MSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE1XTsgfVxuICAgIGdldCBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE2XTsgfVxufVxuXG5TeW1ib2xJbnN0YW5jZVN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDY4O1xuXG5leHBvcnQgdHlwZSBTeW1ib2xJbnN0YW5jZSA9IFN5bWJvbEluc3RhbmNlU3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBTeW1ib2xJbnN0YW5jZUFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQ4aTE1dWkxdWw0ZjY4IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFN5bWJvbEluc3RhbmNlU3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogU3ltYm9sSW5zdGFuY2VTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgU3ltYm9sSW5zdGFuY2VTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbEluc3RhbmNlQXJyYXknLCBTeW1ib2xJbnN0YW5jZUFycmF5KTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgR2x5cGhPZmZzZXRBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0MWY0IHtcbiAgICBnZXRvZmZzZXRYKGluZGV4OiBudW1iZXIpIHsgcmV0dXJuIHRoaXMuZmxvYXQzMltpbmRleCAqIDEgKyAwXTsgfVxufVxuXG5yZWdpc3RlcignR2x5cGhPZmZzZXRBcnJheScsIEdseXBoT2Zmc2V0QXJyYXkpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBTeW1ib2xMaW5lVmVydGV4QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDNpNiB7XG4gICAgZ2V0eChpbmRleDogbnVtYmVyKSB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDBdOyB9XG4gICAgZ2V0eShpbmRleDogbnVtYmVyKSB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDFdOyB9XG4gICAgZ2V0dGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoaW5kZXg6IG51bWJlcikgeyByZXR1cm4gdGhpcy5pbnQxNltpbmRleCAqIDMgKyAyXTsgfVxufVxuXG5yZWdpc3RlcignU3ltYm9sTGluZVZlcnRleEFycmF5JywgU3ltYm9sTGluZVZlcnRleEFycmF5KTtcblxuY2xhc3MgRmVhdHVyZUluZGV4U3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IEZlYXR1cmVJbmRleEFycmF5O1xuICAgIGZlYXR1cmVJbmRleDogbnVtYmVyO1xuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcjtcbiAgICBidWNrZXRJbmRleDogbnVtYmVyO1xuICAgIGdldCBmZWF0dXJlSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDBdOyB9XG4gICAgZ2V0IHNvdXJjZUxheWVySW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgZ2V0IGJ1Y2tldEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxufVxuXG5GZWF0dXJlSW5kZXhTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA4O1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlSW5kZXggPSBGZWF0dXJlSW5kZXhTdHJ1Y3Q7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEZlYXR1cmVJbmRleEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQxdWwydWk4IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIEZlYXR1cmVJbmRleFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IEZlYXR1cmVJbmRleFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlSW5kZXhTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0ZlYXR1cmVJbmRleEFycmF5JywgRmVhdHVyZUluZGV4QXJyYXkpO1xuXG5leHBvcnQge1xuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0aTEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0dWI4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmY4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MTB1aTIwLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTI0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2YxMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDF1bDQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ2aTF1bDJ1aTIwLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkyaTJpMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzdWk2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmkydWkzdWwzdWkyZjN1YjF1bDFpNDgsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ4aTE1dWkxdWw0ZjY4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MWY0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2k2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVsMnVpOCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1aTQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWkyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGYxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBQb3NBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRpOCBhcyBSYXN0ZXJCb3VuZHNBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBDaXJjbGVMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBGaWxsTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTRpMTIgYXMgRmlsbEV4dHJ1c2lvbkxheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0IGFzIEhlYXRtYXBMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNHViOCBhcyBMaW5lTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyZjggYXMgTGluZUV4dExheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MTB1aTIwIGFzIFBhdHRlcm5MYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRpNHVpNGkyNCBhcyBTeW1ib2xMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDNmMTIgYXMgU3ltYm9sRHluYW1pY0xheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVsNCBhcyBTeW1ib2xPcGFjaXR5QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTJpMmkxMiBhcyBDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2IGFzIENvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMiBhcyBDb2xsaXNpb25WZXJ0ZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDN1aTYgYXMgUXVhZFRyaWFuZ2xlQXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzdWk2IGFzIFRyaWFuZ2xlSW5kZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1aTQgYXMgTGluZUluZGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWkyIGFzIExpbmVTdHJpcEluZGV4QXJyYXlcbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuY29uc3QgbGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgZGVmYXVsdCBsYXlvdXQ7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsYXlvdXQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3dhcm5PbmNlfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuXG5pbXBvcnQgdHlwZSBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuLi9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdCc7XG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXl9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuZXhwb3J0IHR5cGUgU2VnbWVudCA9IHtcbiAgICBzb3J0S2V5OiBudW1iZXIgfCB2b2lkLFxuICAgIHZlcnRleE9mZnNldDogbnVtYmVyLFxuICAgIHByaW1pdGl2ZU9mZnNldDogbnVtYmVyLFxuICAgIHZlcnRleExlbmd0aDogbnVtYmVyLFxuICAgIHByaW1pdGl2ZUxlbmd0aDogbnVtYmVyLFxuICAgIHZhb3M6IHtbXzogc3RyaW5nXTogVmVydGV4QXJyYXlPYmplY3R9XG59XG5cbmNsYXNzIFNlZ21lbnRWZWN0b3Ige1xuICAgIHN0YXRpYyBNQVhfVkVSVEVYX0FSUkFZX0xFTkdUSDogbnVtYmVyO1xuICAgIHNlZ21lbnRzOiBBcnJheTxTZWdtZW50PjtcblxuICAgIGNvbnN0cnVjdG9yKHNlZ21lbnRzPzogQXJyYXk8U2VnbWVudD4gPSBbXSkge1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7XG4gICAgfVxuXG4gICAgcHJlcGFyZVNlZ21lbnQobnVtVmVydGljZXM6IG51bWJlciwgbGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5LCBpbmRleEFycmF5OiBTdHJ1Y3RBcnJheSwgc29ydEtleT86IG51bWJlcik6IFNlZ21lbnQge1xuICAgICAgICBsZXQgc2VnbWVudDogU2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKG51bVZlcnRpY2VzID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkgd2Fybk9uY2UoYE1heCB2ZXJ0aWNlcyBwZXIgc2VnbWVudCBpcyAke1NlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEh9OiBidWNrZXQgcmVxdWVzdGVkICR7bnVtVmVydGljZXN9YCk7XG4gICAgICAgIGlmICghc2VnbWVudCB8fCBzZWdtZW50LnZlcnRleExlbmd0aCArIG51bVZlcnRpY2VzID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCB8fCBzZWdtZW50LnNvcnRLZXkgIT09IHNvcnRLZXkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQgPSAoe1xuICAgICAgICAgICAgICAgIHZlcnRleE9mZnNldDogbGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU9mZnNldDogaW5kZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdmVydGV4TGVuZ3RoOiAwLFxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZUxlbmd0aDogMFxuICAgICAgICAgICAgfTogYW55KTtcbiAgICAgICAgICAgIGlmIChzb3J0S2V5ICE9PSB1bmRlZmluZWQpIHNlZ21lbnQuc29ydEtleSA9IHNvcnRLZXk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgfVxuXG4gICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cztcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHNlZ21lbnQudmFvcykge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQudmFvc1trXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc2ltcGxlU2VnbWVudCh2ZXJ0ZXhPZmZzZXQ6IG51bWJlciwgcHJpbWl0aXZlT2Zmc2V0OiBudW1iZXIsIHZlcnRleExlbmd0aDogbnVtYmVyLCBwcmltaXRpdmVMZW5ndGg6IG51bWJlcik6IFNlZ21lbnRWZWN0b3Ige1xuICAgICAgICByZXR1cm4gbmV3IFNlZ21lbnRWZWN0b3IoW3tcbiAgICAgICAgICAgIHZlcnRleE9mZnNldCxcbiAgICAgICAgICAgIHByaW1pdGl2ZU9mZnNldCxcbiAgICAgICAgICAgIHZlcnRleExlbmd0aCxcbiAgICAgICAgICAgIHByaW1pdGl2ZUxlbmd0aCxcbiAgICAgICAgICAgIHZhb3M6IHt9LFxuICAgICAgICAgICAgc29ydEtleTogMFxuICAgICAgICB9XSk7XG4gICAgfVxufVxuXG4vKlxuICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIHZlcnRleCBhcnJheS4gVGhpcyBsaW1pdCBpcyBpbXBvc2VkIGJ5IFdlYkdMJ3MgMTYgYml0XG4gKiBhZGRyZXNzaW5nIG9mIHZlcnRleCBidWZmZXJzLlxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5TZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcblxucmVnaXN0ZXIoJ1NlZ21lbnRWZWN0b3InLCBTZWdtZW50VmVjdG9yKTtcbmV4cG9ydCBkZWZhdWx0IFNlZ21lbnRWZWN0b3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2NsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG4vKipcbiAqIFBhY2tzIHR3byBudW1iZXJzLCBpbnRlcnByZXRlZCBhcyA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VycywgaW50byBhIHNpbmdsZVxuICogZmxvYXQuICBVbnBhY2sgdGhlbSBpbiB0aGUgc2hhZGVyIHVzaW5nIHRoZSBgdW5wYWNrX2Zsb2F0KClgIGZ1bmN0aW9uLFxuICogZGVmaW5lZCBpbiBfcHJlbHVkZS52ZXJ0ZXguZ2xzbFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWNrVWludDhUb0Zsb2F0KGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgLy8gY29lcmNlIGEgYW5kIGIgdG8gOC1iaXQgaW50c1xuICAgIGEgPSBjbGFtcChNYXRoLmZsb29yKGEpLCAwLCAyNTUpO1xuICAgIGIgPSBjbGFtcChNYXRoLmZsb29yKGIpLCAwLCAyNTUpO1xuICAgIHJldHVybiAyNTYgKiBhICsgYjtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBwYXR0ZXJuQXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAgLy8gW3RsLngsIHRsLnksIGJyLngsIGJyLnldXG4gICAge25hbWU6ICdhX3BhdHRlcm5fZnJvbScsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGF0dGVybl90bycsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGl4ZWxfcmF0aW9fZnJvbScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGl4ZWxfcmF0aW9fdG8nLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnVWludDE2J30sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0dGVybkF0dHJpYnV0ZXM7XG4iLCIvKipcbiAqIEpTIEltcGxlbWVudGF0aW9uIG9mIE11cm11ckhhc2gzIChyMTM2KSAoYXMgb2YgTWF5IDIwLCAyMDExKVxuICogXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86Z2FyeS5jb3VydEBnbWFpbC5jb21cIj5HYXJ5IENvdXJ0PC9hPlxuICogQHNlZSBodHRwOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvbXVybXVyaGFzaC1qc1xuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmFhcHBsZWJ5QGdtYWlsLmNvbVwiPkF1c3RpbiBBcHBsZWJ5PC9hPlxuICogQHNlZSBodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL211cm11cmhhc2gvXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQVNDSUkgb25seVxuICogQHBhcmFtIHtudW1iZXJ9IHNlZWQgUG9zaXRpdmUgaW50ZWdlciBvbmx5XG4gKiBAcmV0dXJuIHtudW1iZXJ9IDMyLWJpdCBwb3NpdGl2ZSBpbnRlZ2VyIGhhc2ggXG4gKi9cblxuZnVuY3Rpb24gbXVybXVyaGFzaDNfMzJfZ2Moa2V5LCBzZWVkKSB7XG5cdHZhciByZW1haW5kZXIsIGJ5dGVzLCBoMSwgaDFiLCBjMSwgYzFiLCBjMiwgYzJiLCBrMSwgaTtcblx0XG5cdHJlbWFpbmRlciA9IGtleS5sZW5ndGggJiAzOyAvLyBrZXkubGVuZ3RoICUgNFxuXHRieXRlcyA9IGtleS5sZW5ndGggLSByZW1haW5kZXI7XG5cdGgxID0gc2VlZDtcblx0YzEgPSAweGNjOWUyZDUxO1xuXHRjMiA9IDB4MWI4NzM1OTM7XG5cdGkgPSAwO1xuXHRcblx0d2hpbGUgKGkgPCBieXRlcykge1xuXHQgIFx0azEgPSBcblx0ICBcdCAgKChrZXkuY2hhckNvZGVBdChpKSAmIDB4ZmYpKSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDgpIHxcblx0ICBcdCAgKChrZXkuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMTYpIHxcblx0ICBcdCAgKChrZXkuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMjQpO1xuXHRcdCsraTtcblx0XHRcblx0XHRrMSA9ICgoKChrMSAmIDB4ZmZmZikgKiBjMSkgKyAoKCgoazEgPj4+IDE2KSAqIGMxKSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXHRcdGsxID0gKGsxIDw8IDE1KSB8IChrMSA+Pj4gMTcpO1xuXHRcdGsxID0gKCgoKGsxICYgMHhmZmZmKSAqIGMyKSArICgoKChrMSA+Pj4gMTYpICogYzIpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cblx0XHRoMSBePSBrMTtcbiAgICAgICAgaDEgPSAoaDEgPDwgMTMpIHwgKGgxID4+PiAxOSk7XG5cdFx0aDFiID0gKCgoKGgxICYgMHhmZmZmKSAqIDUpICsgKCgoKGgxID4+PiAxNikgKiA1KSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXHRcdGgxID0gKCgoaDFiICYgMHhmZmZmKSArIDB4NmI2NCkgKyAoKCgoaDFiID4+PiAxNikgKyAweGU2NTQpICYgMHhmZmZmKSA8PCAxNikpO1xuXHR9XG5cdFxuXHRrMSA9IDA7XG5cdFxuXHRzd2l0Y2ggKHJlbWFpbmRlcikge1xuXHRcdGNhc2UgMzogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuXHRcdGNhc2UgMjogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4ZmYpIDw8IDg7XG5cdFx0Y2FzZSAxOiBrMSBePSAoa2V5LmNoYXJDb2RlQXQoaSkgJiAweGZmKTtcblx0XHRcblx0XHRrMSA9ICgoKGsxICYgMHhmZmZmKSAqIGMxKSArICgoKChrMSA+Pj4gMTYpICogYzEpICYgMHhmZmZmKSA8PCAxNikpICYgMHhmZmZmZmZmZjtcblx0XHRrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcblx0XHRrMSA9ICgoKGsxICYgMHhmZmZmKSAqIGMyKSArICgoKChrMSA+Pj4gMTYpICogYzIpICYgMHhmZmZmKSA8PCAxNikpICYgMHhmZmZmZmZmZjtcblx0XHRoMSBePSBrMTtcblx0fVxuXHRcblx0aDEgXj0ga2V5Lmxlbmd0aDtcblxuXHRoMSBePSBoMSA+Pj4gMTY7XG5cdGgxID0gKCgoaDEgJiAweGZmZmYpICogMHg4NWViY2E2YikgKyAoKCgoaDEgPj4+IDE2KSAqIDB4ODVlYmNhNmIpICYgMHhmZmZmKSA8PCAxNikpICYgMHhmZmZmZmZmZjtcblx0aDEgXj0gaDEgPj4+IDEzO1xuXHRoMSA9ICgoKChoMSAmIDB4ZmZmZikgKiAweGMyYjJhZTM1KSArICgoKChoMSA+Pj4gMTYpICogMHhjMmIyYWUzNSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0aDEgXj0gaDEgPj4+IDE2O1xuXG5cdHJldHVybiBoMSA+Pj4gMDtcbn1cblxuaWYodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBtb2R1bGUuZXhwb3J0cyA9IG11cm11cmhhc2gzXzMyX2djXG59IiwiLyoqXG4gKiBKUyBJbXBsZW1lbnRhdGlvbiBvZiBNdXJtdXJIYXNoMlxuICogXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86Z2FyeS5jb3VydEBnbWFpbC5jb21cIj5HYXJ5IENvdXJ0PC9hPlxuICogQHNlZSBodHRwOi8vZ2l0aHViLmNvbS9nYXJ5Y291cnQvbXVybXVyaGFzaC1qc1xuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmFhcHBsZWJ5QGdtYWlsLmNvbVwiPkF1c3RpbiBBcHBsZWJ5PC9hPlxuICogQHNlZSBodHRwOi8vc2l0ZXMuZ29vZ2xlLmNvbS9zaXRlL211cm11cmhhc2gvXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgQVNDSUkgb25seVxuICogQHBhcmFtIHtudW1iZXJ9IHNlZWQgUG9zaXRpdmUgaW50ZWdlciBvbmx5XG4gKiBAcmV0dXJuIHtudW1iZXJ9IDMyLWJpdCBwb3NpdGl2ZSBpbnRlZ2VyIGhhc2hcbiAqL1xuXG5mdW5jdGlvbiBtdXJtdXJoYXNoMl8zMl9nYyhzdHIsIHNlZWQpIHtcbiAgdmFyXG4gICAgbCA9IHN0ci5sZW5ndGgsXG4gICAgaCA9IHNlZWQgXiBsLFxuICAgIGkgPSAwLFxuICAgIGs7XG4gIFxuICB3aGlsZSAobCA+PSA0KSB7XG4gIFx0ayA9IFxuICBcdCAgKChzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmYpKSB8XG4gIFx0ICAoKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4KSB8XG4gIFx0ICAoKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAxNikgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMjQpO1xuICAgIFxuICAgIGsgPSAoKChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGsgPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICAgIGsgXj0gayA+Pj4gMjQ7XG4gICAgayA9ICgoKGsgJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoayA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSk7XG5cblx0aCA9ICgoKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoaCA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSkgXiBrO1xuXG4gICAgbCAtPSA0O1xuICAgICsraTtcbiAgfVxuICBcbiAgc3dpdGNoIChsKSB7XG4gIGNhc2UgMzogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSArIDIpICYgMHhmZikgPDwgMTY7XG4gIGNhc2UgMjogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSArIDEpICYgMHhmZikgPDwgODtcbiAgY2FzZSAxOiBoIF49IChzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmYpO1xuICAgICAgICAgIGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICB9XG5cbiAgaCBePSBoID4+PiAxMztcbiAgaCA9ICgoKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoaCA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSk7XG4gIGggXj0gaCA+Pj4gMTU7XG5cbiAgcmV0dXJuIGggPj4+IDA7XG59XG5cbmlmKHR5cGVvZiBtb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IG11cm11cmhhc2gyXzMyX2djXG59XG4iLCJ2YXIgbXVybXVyMyA9IHJlcXVpcmUoXCIuL211cm11cmhhc2gzX2djLmpzXCIpXG52YXIgbXVybXVyMiA9IHJlcXVpcmUoXCIuL211cm11cmhhc2gyX2djLmpzXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gbXVybXVyM1xubW9kdWxlLmV4cG9ydHMubXVybXVyMyA9IG11cm11cjNcbm1vZHVsZS5leHBvcnRzLm11cm11cjIgPSBtdXJtdXIyXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgbXVybXVyMyBmcm9tICdtdXJtdXJoYXNoLWpzJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbnR5cGUgU2VyaWFsaXplZEZlYXR1cmVQb3NpdGlvbk1hcCA9IHtcbiAgICBpZHM6IEZsb2F0NjRBcnJheTtcbiAgICBwb3NpdGlvbnM6IFVpbnQzMkFycmF5O1xufTtcblxudHlwZSBGZWF0dXJlUG9zaXRpb24gPSB7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBzdGFydDogbnVtYmVyO1xuICAgIGVuZDogbnVtYmVyO1xufTtcblxuLy8gQSB0cmFuc2ZlcmFibGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBtYXBzIGZlYXR1cmUgaWRzIHRvIHRoZWlyIGluZGljZXMgYW5kIGJ1ZmZlciBvZmZzZXRzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZWF0dXJlUG9zaXRpb25NYXAge1xuICAgIGlkczogQXJyYXk8bnVtYmVyPjtcbiAgICBwb3NpdGlvbnM6IEFycmF5PG51bWJlcj47XG4gICAgaW5kZXhlZDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlkcyA9IFtdO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmluZGV4ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhZGQoaWQ6IG1peGVkLCBpbmRleDogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmlkcy5wdXNoKGdldE51bWVyaWNJZChpZCkpO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucy5wdXNoKGluZGV4LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICBnZXRQb3NpdGlvbnMoaWQ6IG1peGVkKTogQXJyYXk8RmVhdHVyZVBvc2l0aW9uPiB7XG4gICAgICAgIGFzc2VydCh0aGlzLmluZGV4ZWQpO1xuXG4gICAgICAgIGNvbnN0IGludElkID0gZ2V0TnVtZXJpY0lkKGlkKTtcblxuICAgICAgICAvLyBiaW5hcnkgc2VhcmNoIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBpZCBpbiB0aGlzLmlkcztcbiAgICAgICAgLy8gcmVsaWVzIG9uIGlkcy9wb3NpdGlvbnMgYmVpbmcgc29ydGVkIGJ5IGlkLCB3aGljaCBoYXBwZW5zIGluIHNlcmlhbGl6YXRpb25cbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgaiA9IHRoaXMuaWRzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgY29uc3QgbSA9IChpICsgaikgPj4gMTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkc1ttXSA+PSBpbnRJZCkge1xuICAgICAgICAgICAgICAgIGogPSBtO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gbSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLmlkc1tpXSA9PT0gaW50SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wb3NpdGlvbnNbMyAqIGldO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBvc2l0aW9uc1szICogaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5wb3NpdGlvbnNbMyAqIGkgKyAyXTtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHtpbmRleCwgc3RhcnQsIGVuZH0pO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvbnM7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShtYXA6IEZlYXR1cmVQb3NpdGlvbk1hcCwgdHJhbnNmZXJhYmxlczogQXJyYXk8QXJyYXlCdWZmZXI+KTogU2VyaWFsaXplZEZlYXR1cmVQb3NpdGlvbk1hcCB7XG4gICAgICAgIGNvbnN0IGlkcyA9IG5ldyBGbG9hdDY0QXJyYXkobWFwLmlkcyk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBVaW50MzJBcnJheShtYXAucG9zaXRpb25zKTtcblxuICAgICAgICBzb3J0KGlkcywgcG9zaXRpb25zLCAwLCBpZHMubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChpZHMuYnVmZmVyLCBwb3NpdGlvbnMuYnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7aWRzLCBwb3NpdGlvbnN9O1xuICAgIH1cblxuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShvYmo6IFNlcmlhbGl6ZWRGZWF0dXJlUG9zaXRpb25NYXApOiBGZWF0dXJlUG9zaXRpb25NYXAge1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgRmVhdHVyZVBvc2l0aW9uTWFwKCk7XG4gICAgICAgIC8vIGFmdGVyIHRyYW5zZmVycmluZywgd2Ugb25seSB1c2UgdGhlc2UgYXJyYXlzIHN0YXRpY2FsbHkgKG5vIHB1c2hlcyksXG4gICAgICAgIC8vIHNvIFR5cGVkQXJyYXkgdnMgQXJyYXkgZGlzdGluY3Rpb24gdGhhdCBmbG93IHBvaW50cyBvdXQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgbWFwLmlkcyA9IChvYmouaWRzOiBhbnkpO1xuICAgICAgICBtYXAucG9zaXRpb25zID0gKG9iai5wb3NpdGlvbnM6IGFueSk7XG4gICAgICAgIG1hcC5pbmRleGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG59XG5cbmNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG5mdW5jdGlvbiBnZXROdW1lcmljSWQodmFsdWU6IG1peGVkKSB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSArdmFsdWU7XG4gICAgaWYgKCFpc05hTihudW1WYWx1ZSkgJiYgbnVtVmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gbnVtVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBtdXJtdXIzKFN0cmluZyh2YWx1ZSkpO1xufVxuXG4vLyBjdXN0b20gcXVpY2tzb3J0IHRoYXQgc29ydHMgaWRzLCBpbmRpY2VzIGFuZCBvZmZzZXRzIHRvZ2V0aGVyIChieSBpZHMpXG4vLyB1c2VzIEhvYXJlIHBhcnRpdGlvbmluZyAmIG1hbnVhbCB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIHRvIGF2b2lkIHdvcnN0IGNhc2Ugc2NlbmFyaW9zXG5mdW5jdGlvbiBzb3J0KGlkcywgcG9zaXRpb25zLCBsZWZ0LCByaWdodCkge1xuICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICAgICAgY29uc3QgcGl2b3QgPSBpZHNbKGxlZnQgKyByaWdodCkgPj4gMV07XG4gICAgICAgIGxldCBpID0gbGVmdCAtIDE7XG4gICAgICAgIGxldCBqID0gcmlnaHQgKyAxO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBkbyBpKys7IHdoaWxlIChpZHNbaV0gPCBwaXZvdCk7XG4gICAgICAgICAgICBkbyBqLS07IHdoaWxlIChpZHNbal0gPiBwaXZvdCk7XG4gICAgICAgICAgICBpZiAoaSA+PSBqKSBicmVhaztcbiAgICAgICAgICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICAgICAgICAgIHN3YXAocG9zaXRpb25zLCAzICogaSwgMyAqIGopO1xuICAgICAgICAgICAgc3dhcChwb3NpdGlvbnMsIDMgKiBpICsgMSwgMyAqIGogKyAxKTtcbiAgICAgICAgICAgIHN3YXAocG9zaXRpb25zLCAzICogaSArIDIsIDMgKiBqICsgMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiAtIGxlZnQgPCByaWdodCAtIGopIHtcbiAgICAgICAgICAgIHNvcnQoaWRzLCBwb3NpdGlvbnMsIGxlZnQsIGopO1xuICAgICAgICAgICAgbGVmdCA9IGogKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc29ydChpZHMsIHBvc2l0aW9ucywgaiArIDEsIHJpZ2h0KTtcbiAgICAgICAgICAgIHJpZ2h0ID0gajtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc3dhcChhcnIsIGksIGopIHtcbiAgICBjb25zdCB0bXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRtcDtcbn1cblxucmVnaXN0ZXIoJ0ZlYXR1cmVQb3NpdGlvbk1hcCcsIEZlYXR1cmVQb3NpdGlvbk1hcCk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuZXhwb3J0IHR5cGUgVW5pZm9ybVZhbHVlczxVczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8VXMsIDxWPih1OiBVbmlmb3JtPFY+KSA9PiBWPj47XG5leHBvcnQgdHlwZSBVbmlmb3JtTG9jYXRpb25zID0ge1tfOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG5cbmNsYXNzIFVuaWZvcm08VD4ge1xuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gICAgbG9jYXRpb246ID9XZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgICBjdXJyZW50OiBUO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgfVxuXG4gICAgK3NldDogKHY6IFQpID0+IHZvaWQ7XG59XG5cbmNsYXNzIFVuaWZvcm0xaSBleHRlbmRzIFVuaWZvcm08bnVtYmVyPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB9XG5cbiAgICBzZXQodjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaSh0aGlzLmxvY2F0aW9uLCB2KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTFmIGV4dGVuZHMgVW5pZm9ybTxudW1iZXI+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAwO1xuICAgIH1cblxuICAgIHNldCh2OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCAhPT0gdikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmKHRoaXMubG9jYXRpb24sIHYpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBVbmlmb3JtMmYgZXh0ZW5kcyBVbmlmb3JtPFtudW1iZXIsIG51bWJlcl0+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbMCwgMF07XG4gICAgfVxuXG4gICAgc2V0KHY6IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZbMF0gIT09IHRoaXMuY3VycmVudFswXSB8fCB2WzFdICE9PSB0aGlzLmN1cnJlbnRbMV0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZih0aGlzLmxvY2F0aW9uLCB2WzBdLCB2WzFdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTNmIGV4dGVuZHMgVW5pZm9ybTxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbMCwgMCwgMF07XG4gICAgfVxuXG4gICAgc2V0KHY6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICBpZiAodlswXSAhPT0gdGhpcy5jdXJyZW50WzBdIHx8IHZbMV0gIT09IHRoaXMuY3VycmVudFsxXSB8fCB2WzJdICE9PSB0aGlzLmN1cnJlbnRbMl0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZih0aGlzLmxvY2F0aW9uLCB2WzBdLCB2WzFdLCB2WzJdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTRmIGV4dGVuZHMgVW5pZm9ybTxbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFswLCAwLCAwLCAwXTtcbiAgICB9XG5cbiAgICBzZXQodjogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZbMF0gIT09IHRoaXMuY3VycmVudFswXSB8fCB2WzFdICE9PSB0aGlzLmN1cnJlbnRbMV0gfHxcbiAgICAgICAgICAgIHZbMl0gIT09IHRoaXMuY3VycmVudFsyXSB8fCB2WzNdICE9PSB0aGlzLmN1cnJlbnRbM10pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00Zih0aGlzLmxvY2F0aW9uLCB2WzBdLCB2WzFdLCB2WzJdLCB2WzNdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybUNvbG9yIGV4dGVuZHMgVW5pZm9ybTxDb2xvcj4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IENvbG9yLnRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgIHNldCh2OiBDb2xvcik6IHZvaWQge1xuICAgICAgICBpZiAodi5yICE9PSB0aGlzLmN1cnJlbnQuciB8fCB2LmcgIT09IHRoaXMuY3VycmVudC5nIHx8XG4gICAgICAgICAgICB2LmIgIT09IHRoaXMuY3VycmVudC5iIHx8IHYuYSAhPT0gdGhpcy5jdXJyZW50LmEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00Zih0aGlzLmxvY2F0aW9uLCB2LnIsIHYuZywgdi5iLCB2LmEpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBlbXB0eU1hdDQgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbmNsYXNzIFVuaWZvcm1NYXRyaXg0ZiBleHRlbmRzIFVuaWZvcm08RmxvYXQzMkFycmF5PiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gZW1wdHlNYXQ0O1xuICAgIH1cblxuICAgIHNldCh2OiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICAgICAgLy8gVGhlIHZhc3QgbWFqb3JpdHkgb2YgbWF0cml4IGNvbXBhcmlzb25zIHRoYXQgd2lsbCB0cmlwIHRoaXMgc2V0XG4gICAgICAgIC8vIGhhcHBlbiBhdCBpPTEyIG9yIGk9MCwgc28gd2UgY2hlY2sgdGhvc2UgZmlyc3QgdG8gYXZvaWQgbG90cyBvZlxuICAgICAgICAvLyB1bm5lY2Vzc2FyeSBpdGVyYXRpb246XG4gICAgICAgIGlmICh2WzEyXSAhPT0gdGhpcy5jdXJyZW50WzEyXSB8fCB2WzBdICE9PSB0aGlzLmN1cnJlbnRbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5sb2NhdGlvbiwgZmFsc2UsIHYpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZbaV0gIT09IHRoaXMuY3VycmVudFtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMubG9jYXRpb24sIGZhbHNlLCB2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHtcbiAgICBVbmlmb3JtLFxuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtNGYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufTtcblxuZXhwb3J0IHR5cGUgVW5pZm9ybUJpbmRpbmdzID0ge1tfOiBzdHJpbmddOiBVbmlmb3JtPGFueT59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtwYWNrVWludDhUb0Zsb2F0fSBmcm9tICcuLi9zaGFkZXJzL2VuY29kZV9hdHRyaWJ1dGUnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQge3N1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvcHJvcGVydGllcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuaW1wb3J0IHtQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWV9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtTdHJ1Y3RBcnJheUxheW91dDFmNCwgU3RydWN0QXJyYXlMYXlvdXQyZjgsIFN0cnVjdEFycmF5TGF5b3V0NGYxNiwgUGF0dGVybkxheW91dEFycmF5fSBmcm9tICcuL2FycmF5X3R5cGVzJztcbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgcGF0dGVybkF0dHJpYnV0ZXMgZnJvbSAnLi9idWNrZXQvcGF0dGVybl9hdHRyaWJ1dGVzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IEZlYXR1cmVQb3NpdGlvbk1hcCBmcm9tICcuL2ZlYXR1cmVfcG9zaXRpb25fbWFwJztcbmltcG9ydCB7XG4gICAgVW5pZm9ybSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm00ZixcbiAgICB0eXBlIFVuaWZvcm1Mb2NhdGlvbnNcbn0gZnJvbSAnLi4vcmVuZGVyL3VuaWZvcm1fYmluZGluZyc7XG5cbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZWRTdHlsZUxheWVyfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci90eXBlZF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheSwgU3RydWN0QXJyYXlNZW1iZXJ9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEZlYXR1cmUsXG4gICAgRmVhdHVyZVN0YXRlLFxuICAgIEdsb2JhbFByb3BlcnRpZXMsXG4gICAgU291cmNlRXhwcmVzc2lvbixcbiAgICBDb21wb3NpdGVFeHByZXNzaW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7UG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5leHBvcnQgdHlwZSBCaW5kZXJVbmlmb3JtID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgIGJpbmRpbmc6IFVuaWZvcm08YW55PlxufTtcblxuZnVuY3Rpb24gcGFja0NvbG9yKGNvbG9yOiBDb2xvcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiBbXG4gICAgICAgIHBhY2tVaW50OFRvRmxvYXQoMjU1ICogY29sb3IuciwgMjU1ICogY29sb3IuZyksXG4gICAgICAgIHBhY2tVaW50OFRvRmxvYXQoMjU1ICogY29sb3IuYiwgMjU1ICogY29sb3IuYSlcbiAgICBdO1xufVxuXG4vKipcbiAqICBgQmluZGVyYCBpcyB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIHRoZSBzdHJhdGVnaWVzIGZvciBjb25zdHJ1Y3RpbmcsXG4gKiAgdXBsb2FkaW5nLCBhbmQgYmluZGluZyBwYWludCBwcm9wZXJ0eSBkYXRhIGFzIEdMU0wgYXR0cmlidXRlcy4gTW9zdCBzdHlsZS1cbiAqICBzcGVjIHByb3BlcnRpZXMgaGF2ZSBhIDE6MSByZWxhdGlvbnNoaXAgdG8gc2hhZGVyIGF0dHJpYnV0ZS91bmlmb3JtcywgYnV0XG4gKiAgc29tZSByZXF1aXJlIG11bHRsaXBsZSB2YWx1ZXMgcGVyIGZlYXR1cmUgdG8gYmUgcGFzc2VkIHRvIHRoZSBHUFUsIGFuZCBpblxuICogIHRob3NlIGNhc2VzIHdlIGJpbmQgbXVsdGlwbGUgYXR0cmlidXRlcy91bmlmb3Jtcy5cbiAqXG4gKiAgSXQgaGFzIHRocmVlIGltcGxlbWVudGF0aW9ucywgb25lIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBzdHJhdGVnaWVzIHdlIHVzZTpcbiAqXG4gKiAgKiBGb3IgX2NvbnN0YW50XyBwcm9wZXJ0aWVzIC0tIHRob3NlIHdob3NlIHZhbHVlIGlzIGEgY29uc3RhbnQsIG9yIHRoZSBjb25zdGFudFxuICogICAgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBjYW1lcmEgZXhwcmVzc2lvbiBhdCBhIHBhcnRpY3VsYXIgY2FtZXJhIHBvc2l0aW9uIC0tIHdlXG4gKiAgICBkb24ndCBuZWVkIGEgdmVydGV4IGF0dHJpYnV0ZSBidWZmZXIsIGFuZCBpbnN0ZWFkIHVzZSBhIHVuaWZvcm0uXG4gKiAgKiBGb3IgZGF0YSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIGEgc2luZ2xlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAqICAgIHRoZSBldmFsdWF0ZWQgcmVzdWx0IG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBmZWF0dXJlLlxuICogICogRm9yIGNvbXBvc2l0ZSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIHR3byBhdHRyaWJ1dGVzOiBtaW4gYW5kXG4gKiAgICBtYXggdmFsdWVzIGNvdmVyaW5nIHRoZSByYW5nZSBvZiB6b29tcyBhdCB3aGljaCB3ZSBleHBlY3QgdGhlIHRpbGUgdG8gYmVcbiAqICAgIGRpc3BsYXllZC4gVGhlc2UgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGJ5IGV2YWx1YXRpbmcgdGhlIGNvbXBvc2l0ZSBleHByZXNzaW9uIGZvclxuICogICAgdGhlIGdpdmVuIGZlYXR1cmUgYXQgc3RyYXRlZ2ljYWxseSBjaG9zZW4gem9vbSBsZXZlbHMuIEluIGFkZGl0aW9uIHRvIHRoaXNcbiAqICAgIGF0dHJpYnV0ZSBkYXRhLCB3ZSBhbHNvIHVzZSBhIHVuaWZvcm0gdmFsdWUgd2hpY2ggdGhlIHNoYWRlciB1c2VzIHRvIGludGVycG9sYXRlXG4gKiAgICBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCB2YWx1ZSBhdCB0aGUgZmluYWwgZGlzcGxheWVkIHpvb20gbGV2ZWwuIFRoZSB1c2Ugb2YgYVxuICogICAgdW5pZm9ybSBhbGxvd3MgdXMgdG8gY2hlYXBseSB1cGRhdGUgdGhlIHZhbHVlIG9uIGV2ZXJ5IGZyYW1lLlxuICpcbiAqICBOb3RlIHRoYXQgdGhlIHNoYWRlciBzb3VyY2UgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIHVzaW5nIGEgdW5pZm9ybSBvclxuICogIGF0dHJpYnV0ZS4gV2UgZHluYW1pY2FsbHkgY29tcGlsZSBzaGFkZXJzIGF0IHJ1bnRpbWUgdG8gYWNjb21vZGF0ZSB0aGlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuaW50ZXJmYWNlIEF0dHJpYnV0ZUJpbmRlciB7XG4gICAgcG9wdWxhdGVQYWludEFycmF5KGxlbmd0aDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IHZvaWQ7XG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259KTogdm9pZDtcbiAgICB1cGxvYWQoQ29udGV4dCk6IHZvaWQ7XG4gICAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgVW5pZm9ybUJpbmRlciB7XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHNldFVuaWZvcm0odW5pZm9ybTogVW5pZm9ybTwqPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgY3VycmVudFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8Kj4sIHVuaWZvcm1OYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAgIGdldEJpbmRpbmcoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLCBuYW1lOiBzdHJpbmcpOiAkU2hhcGU8VW5pZm9ybTwqPj47XG59XG5cbmNsYXNzIENvbnN0YW50QmluZGVyIGltcGxlbWVudHMgVW5pZm9ybUJpbmRlciB7XG4gICAgdmFsdWU6IG1peGVkO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogbWl4ZWQsIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVuaWZvcm1OYW1lcyA9IG5hbWVzLm1hcChuYW1lID0+IGB1XyR7bmFtZX1gKTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICBzZXRVbmlmb3JtKHVuaWZvcm06IFVuaWZvcm08Kj4sIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGN1cnJlbnRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG1peGVkPik6IHZvaWQge1xuICAgICAgICB1bmlmb3JtLnNldChjdXJyZW50VmFsdWUuY29uc3RhbnRPcih0aGlzLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sIF86IHN0cmluZyk6ICRTaGFwZTxVbmlmb3JtPGFueT4+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUgPT09ICdjb2xvcicpID9cbiAgICAgICAgICAgIG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb24pIDpcbiAgICAgICAgICAgIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb24pO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyIGltcGxlbWVudHMgVW5pZm9ybUJpbmRlciB7XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5Gcm9tOiA/QXJyYXk8bnVtYmVyPjtcbiAgICBwYXR0ZXJuVG86ID9BcnJheTxudW1iZXI+O1xuICAgIHBpeGVsUmF0aW9Gcm9tOiBudW1iZXI7XG4gICAgcGl4ZWxSYXRpb1RvOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogbWl4ZWQsIG5hbWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMudW5pZm9ybU5hbWVzID0gbmFtZXMubWFwKG5hbWUgPT4gYHVfJHtuYW1lfWApO1xuICAgICAgICB0aGlzLnBhdHRlcm5Gcm9tID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXR0ZXJuVG8gPSBudWxsO1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW9Gcm9tID0gMS4wO1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW9UbyA9IDEuMDtcbiAgICB9XG5cbiAgICBzZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG86IEltYWdlUG9zaXRpb24sIHBvc0Zyb206IEltYWdlUG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvRnJvbSA9IHBvc0Zyb20ucGl4ZWxSYXRpbztcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvVG8gPSBwb3NUby5waXhlbFJhdGlvO1xuICAgICAgICB0aGlzLnBhdHRlcm5Gcm9tID0gcG9zRnJvbS50bGJyO1xuICAgICAgICB0aGlzLnBhdHRlcm5UbyA9IHBvc1RvLnRsYnI7XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybSh1bmlmb3JtOiBVbmlmb3JtPCo+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBjdXJyZW50VmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxtaXhlZD4sIHVuaWZvcm1OYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcG9zID1cbiAgICAgICAgICAgIHVuaWZvcm1OYW1lID09PSAndV9wYXR0ZXJuX3RvJyA/IHRoaXMucGF0dGVyblRvIDpcbiAgICAgICAgICAgIHVuaWZvcm1OYW1lID09PSAndV9wYXR0ZXJuX2Zyb20nID8gdGhpcy5wYXR0ZXJuRnJvbSA6XG4gICAgICAgICAgICB1bmlmb3JtTmFtZSA9PT0gJ3VfcGl4ZWxfcmF0aW9fdG8nID8gdGhpcy5waXhlbFJhdGlvVG8gOlxuICAgICAgICAgICAgdW5pZm9ybU5hbWUgPT09ICd1X3BpeGVsX3JhdGlvX2Zyb20nID8gdGhpcy5waXhlbFJhdGlvRnJvbSA6IG51bGw7XG4gICAgICAgIGlmIChwb3MpIHVuaWZvcm0uc2V0KHBvcyk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sIG5hbWU6IHN0cmluZyk6ICRTaGFwZTxVbmlmb3JtPGFueT4+IHtcbiAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyKDAsIDkpID09PSAndV9wYXR0ZXJuJyA/XG4gICAgICAgICAgICBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9uKSA6XG4gICAgICAgICAgICBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICB9XG59XG5cbmNsYXNzIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgaW1wbGVtZW50cyBBdHRyaWJ1dGVCaW5kZXIge1xuICAgIGV4cHJlc3Npb246IFNvdXJjZUV4cHJlc3Npb247XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG5cbiAgICBwYWludFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheTtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBwYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IFNvdXJjZUV4cHJlc3Npb24sIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcsIFBhaW50VmVydGV4QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5Pikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLm1heFZhbHVlID0gMDtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBgYV8ke25hbWV9YCxcbiAgICAgICAgICAgIHR5cGU6ICdGbG9hdDMyJyxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHR5cGUgPT09ICdjb2xvcicgPyAyIDogMSxcbiAgICAgICAgICAgIG9mZnNldDogMFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5KG5ld0xlbmd0aDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycygwKSwgZmVhdHVyZSwge30sIGNhbm9uaWNhbCwgW10sIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkucmVzaXplKG5ld0xlbmd0aCk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWUoc3RhcnQsIG5ld0xlbmd0aCwgdmFsdWUpO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXkoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiAwfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZShzdGFydCwgZW5kLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgX3NldFBhaW50VmFsdWUoc3RhcnQsIGVuZCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgY29sb3IgPSBwYWNrQ29sb3IodmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLCBjb2xvclswXSwgY29sb3JbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgTWF0aC5hYnModmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnBhaW50VmVydGV4QnVmZmVyLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnBhaW50VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5wYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyIGltcGxlbWVudHMgQXR0cmlidXRlQmluZGVyLCBVbmlmb3JtQmluZGVyIHtcbiAgICBleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uO1xuICAgIHVuaWZvcm1OYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdXNlSW50ZWdlclpvb206IGJvb2xlYW47XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG5cbiAgICBwYWludFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheTtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBwYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb24sIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcsIHVzZUludGVnZXJab29tOiBib29sZWFuLCB6b29tOiBudW1iZXIsIFBhaW50VmVydGV4QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5Pikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLnVuaWZvcm1OYW1lcyA9IG5hbWVzLm1hcChuYW1lID0+IGB1XyR7bmFtZX1fdGApO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnVzZUludGVnZXJab29tID0gdXNlSW50ZWdlclpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIHRoaXMubWF4VmFsdWUgPSAwO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBhXyR7bmFtZX1gLFxuICAgICAgICAgICAgdHlwZTogJ0Zsb2F0MzInLFxuICAgICAgICAgICAgY29tcG9uZW50czogdHlwZSA9PT0gJ2NvbG9yJyA/IDQgOiAyLFxuICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZmVhdHVyZSwge30sIGNhbm9uaWNhbCwgW10sIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSArIDEpLCBmZWF0dXJlLCB7fSwgY2Fub25pY2FsLCBbXSwgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wYWludFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5LnJlc2l6ZShuZXdMZW5ndGgpO1xuICAgICAgICB0aGlzLl9zZXRQYWludFZhbHVlKHN0YXJ0LCBuZXdMZW5ndGgsIG1pbiwgbWF4KTtcbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEFycmF5KHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSkge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHRoaXMuem9vbX0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogdGhpcy56b29tICsgMX0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWUoc3RhcnQsIGVuZCwgbWluLCBtYXgpO1xuICAgIH1cblxuICAgIF9zZXRQYWludFZhbHVlKHN0YXJ0LCBlbmQsIG1pbiwgbWF4KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbkNvbG9yID0gcGFja0NvbG9yKG1pbik7XG4gICAgICAgICAgICBjb25zdCBtYXhDb2xvciA9IHBhY2tDb2xvcihtYXgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLCBtaW5Db2xvclswXSwgbWluQ29sb3JbMV0sIG1heENvbG9yWzBdLCBtYXhDb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGksIG1pbiwgbWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBNYXRoLm1heCh0aGlzLm1heFZhbHVlLCBNYXRoLmFicyhtaW4pLCBNYXRoLmFicyhtYXgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnBhaW50VmVydGV4QnVmZmVyLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnBhaW50VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5wYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybSh1bmlmb3JtOiBVbmlmb3JtPCo+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRab29tID0gdGhpcy51c2VJbnRlZ2VyWm9vbSA/IE1hdGguZmxvb3IoZ2xvYmFscy56b29tKSA6IGdsb2JhbHMuem9vbTtcbiAgICAgICAgY29uc3QgZmFjdG9yID0gY2xhbXAodGhpcy5leHByZXNzaW9uLmludGVycG9sYXRpb25GYWN0b3IoY3VycmVudFpvb20sIHRoaXMuem9vbSwgdGhpcy56b29tICsgMSksIDAsIDEpO1xuICAgICAgICB1bmlmb3JtLnNldChmYWN0b3IpO1xuICAgIH1cblxuICAgIGdldEJpbmRpbmcoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLCBfOiBzdHJpbmcpOiBVbmlmb3JtMWYge1xuICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyIGltcGxlbWVudHMgQXR0cmlidXRlQmluZGVyIHtcbiAgICBleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB1c2VJbnRlZ2VyWm9vbTogYm9vbGVhbjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgbGF5ZXJJZDogc3RyaW5nO1xuXG4gICAgem9vbUluUGFpbnRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgem9vbU91dFBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHpvb21JblBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIHpvb21PdXRQYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb24sIHR5cGU6IHN0cmluZywgdXNlSW50ZWdlclpvb206IGJvb2xlYW4sIHpvb206IG51bWJlciwgUGFpbnRWZXJ0ZXhBcnJheTogQ2xhc3M8U3RydWN0QXJyYXk+LCBsYXllcklkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy51c2VJbnRlZ2VyWm9vbSA9IHVzZUludGVnZXJab29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBsYXllcklkO1xuXG4gICAgICAgIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkgPSBuZXcgUGFpbnRWZXJ0ZXhBcnJheSgpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheShsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkucmVzaXplKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkucmVzaXplKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWVzKHN0YXJ0LCBsZW5ndGgsIGZlYXR1cmUucGF0dGVybnMgJiYgZmVhdHVyZS5wYXR0ZXJuc1t0aGlzLmxheWVySWRdLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWVzKHN0YXJ0LCBlbmQsIGZlYXR1cmUucGF0dGVybnMgJiYgZmVhdHVyZS5wYXR0ZXJuc1t0aGlzLmxheWVySWRdLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgX3NldFBhaW50VmFsdWVzKHN0YXJ0LCBlbmQsIHBhdHRlcm5zLCBwb3NpdGlvbnMpIHtcbiAgICAgICAgaWYgKCFwb3NpdGlvbnMgfHwgIXBhdHRlcm5zKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qge21pbiwgbWlkLCBtYXh9ID0gcGF0dGVybnM7XG4gICAgICAgIGNvbnN0IGltYWdlTWluID0gcG9zaXRpb25zW21pbl07XG4gICAgICAgIGNvbnN0IGltYWdlTWlkID0gcG9zaXRpb25zW21pZF07XG4gICAgICAgIGNvbnN0IGltYWdlTWF4ID0gcG9zaXRpb25zW21heF07XG4gICAgICAgIGlmICghaW1hZ2VNaW4gfHwgIWltYWdlTWlkIHx8ICFpbWFnZU1heCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFdlIHBvcHVsYXRlIHR3byBwYWludCBhcnJheXMgYmVjYXVzZSwgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIHdlIGRvbid0IGtub3cgd2hpY2ggZGlyZWN0aW9uXG4gICAgICAgIC8vIHdlJ3JlIGNyb3NzLWZhZGluZyB0byBhdCBsYXlvdXQgdGltZS4gSW4gb3JkZXIgdG8ga2VlcCB2ZXJ0ZXggYXR0cmlidXRlcyB0byBhIG1pbmltdW0gYW5kIG5vdCBwYXNzXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IHZlcnRleCBkYXRhIHRvIHRoZSBzaGFkZXJzLCB3ZSBkZXRlcm1pbmUgd2hpY2ggdG8gdXBsb2FkIGF0IGRyYXcgdGltZS5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGksXG4gICAgICAgICAgICAgICAgaW1hZ2VNaWQudGxbMF0sIGltYWdlTWlkLnRsWzFdLCBpbWFnZU1pZC5iclswXSwgaW1hZ2VNaWQuYnJbMV0sXG4gICAgICAgICAgICAgICAgaW1hZ2VNaW4udGxbMF0sIGltYWdlTWluLnRsWzFdLCBpbWFnZU1pbi5iclswXSwgaW1hZ2VNaW4uYnJbMV0sXG4gICAgICAgICAgICAgICAgaW1hZ2VNaWQucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICBpbWFnZU1pbi5waXhlbFJhdGlvLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLFxuICAgICAgICAgICAgICAgIGltYWdlTWlkLnRsWzBdLCBpbWFnZU1pZC50bFsxXSwgaW1hZ2VNaWQuYnJbMF0sIGltYWdlTWlkLmJyWzFdLFxuICAgICAgICAgICAgICAgIGltYWdlTWF4LnRsWzBdLCBpbWFnZU1heC50bFsxXSwgaW1hZ2VNYXguYnJbMF0sIGltYWdlTWF4LmJyWzFdLFxuICAgICAgICAgICAgICAgIGltYWdlTWlkLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgaW1hZ2VNYXgucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5ICYmIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheS5hcnJheUJ1ZmZlciAmJiB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5ICYmIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXksIHBhdHRlcm5BdHRyaWJ1dGVzLm1lbWJlcnMsIHRoaXMuZXhwcmVzc2lvbi5pc1N0YXRlRGVwZW5kZW50KTtcbiAgICAgICAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSwgcGF0dGVybkF0dHJpYnV0ZXMubWVtYmVycywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbi8qKlxuICogUHJvZ3JhbUNvbmZpZ3VyYXRpb24gY29udGFpbnMgdGhlIGxvZ2ljIGZvciBiaW5kaW5nIHN0eWxlIGxheWVyIHByb3BlcnRpZXMgYW5kIHRpbGVcbiAqIGxheWVyIGZlYXR1cmUgZGF0YSBpbnRvIEdMIHByb2dyYW0gdW5pZm9ybXMgYW5kIHZlcnRleCBhdHRyaWJ1dGVzLlxuICpcbiAqIE5vbi1kYXRhLWRyaXZlbiBwcm9wZXJ0eSB2YWx1ZXMgYXJlIGJvdW5kIHRvIHNoYWRlciB1bmlmb3Jtcy4gRGF0YS1kcml2ZW4gcHJvcGVydHlcbiAqIHZhbHVlcyBhcmUgYm91bmQgdG8gdmVydGV4IGF0dHJpYnV0ZXMuIEluIG9yZGVyIHRvIHN1cHBvcnQgYSB1bmlmb3JtIEdMU0wgc3ludGF4IG92ZXJcbiAqIGJvdGgsIFtNYXBib3ggR0wgU2hhZGVyc10oaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtc2hhZGVycykgZGVmaW5lcyBhIGAjcHJhZ21hYFxuICogYWJzdHJhY3Rpb24sIHdoaWNoIFByb2dyYW1Db25maWd1cmF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcuIEF0IHJ1bnRpbWUsXG4gKiBpdCBleGFtaW5lcyB0aGUgYXR0cmlidXRlcyBvZiBhIHBhcnRpY3VsYXIgbGF5ZXIsIGNvbWJpbmVzIHRoaXMgd2l0aCBmaXhlZCBrbm93bGVkZ2VcbiAqIGFib3V0IGhvdyBsYXllcnMgb2YgdGhlIHBhcnRpY3VsYXIgdHlwZSBhcmUgaW1wbGVtZW50ZWQsIGFuZCBkZXRlcm1pbmVzIHdoaWNoIHVuaWZvcm1zXG4gKiBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgd2lsbCBiZSByZXF1aXJlZC4gSXQgY2FuIHRoZW4gc3Vic3RpdHV0ZSB0aGUgYXBwcm9wcmlhdGUgdGV4dFxuICogaW50byB0aGUgc2hhZGVyIHNvdXJjZSBjb2RlLCBjcmVhdGUgYW5kIGxpbmsgYSBwcm9ncmFtLCBhbmQgYmluZCB0aGUgdW5pZm9ybXMgYW5kXG4gKiB2ZXJ0ZXggYXR0cmlidXRlcyBpbiBwcmVwYXJhdGlvbiBmb3IgZHJhd2luZy5cbiAqXG4gKiBXaGVuIGEgdmVjdG9yIHRpbGUgaXMgcGFyc2VkLCB0aGlzIHNhbWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvXG4gKiBwb3B1bGF0ZSB0aGUgYXR0cmlidXRlIGJ1ZmZlcnMgbmVlZGVkIGZvciBkYXRhLWRyaXZlbiBzdHlsaW5nIHVzaW5nIHRoZSB6b29tXG4gKiBsZXZlbCBhbmQgZmVhdHVyZSBwcm9wZXJ0eSBkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICBiaW5kZXJzOiB7W186IHN0cmluZ106IChBdHRyaWJ1dGVCaW5kZXIgfCBVbmlmb3JtQmluZGVyKSB9O1xuICAgIGNhY2hlS2V5OiBzdHJpbmc7XG5cbiAgICBfYnVmZmVyczogQXJyYXk8VmVydGV4QnVmZmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBUeXBlZFN0eWxlTGF5ZXIsIHpvb206IG51bWJlciwgZmlsdGVyUHJvcGVydGllczogKF86IHN0cmluZykgPT4gYm9vbGVhbikge1xuICAgICAgICB0aGlzLmJpbmRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGtleXMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGxheWVyLnBhaW50Ll92YWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICghZmlsdGVyUHJvcGVydGllcyhwcm9wZXJ0eSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsYXllci5wYWludC5nZXQocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUpIHx8ICFzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbih2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBwYWludEF0dHJpYnV0ZU5hbWVzKHByb3BlcnR5LCBsYXllci50eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnR5cGU7XG4gICAgICAgICAgICBjb25zdCB1c2VJbnRlZ2VyWm9vbSA9IHZhbHVlLnByb3BlcnR5LnVzZUludGVnZXJab29tO1xuICAgICAgICAgICAgY29uc3QgcHJvcFR5cGUgPSB2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uWydwcm9wZXJ0eS10eXBlJ107XG4gICAgICAgICAgICBjb25zdCBpc0Nyb3NzRmFkZWQgPSBwcm9wVHlwZSA9PT0gJ2Nyb3NzLWZhZGVkJyB8fCBwcm9wVHlwZSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcblxuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZGVyc1twcm9wZXJ0eV0gPSBpc0Nyb3NzRmFkZWQgP1xuICAgICAgICAgICAgICAgICAgICBuZXcgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKGV4cHJlc3Npb24udmFsdWUsIG5hbWVzKSA6XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDb25zdGFudEJpbmRlcihleHByZXNzaW9uLnZhbHVlLCBuYW1lcywgdHlwZSk7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvdV8ke3Byb3BlcnR5fWApO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ3NvdXJjZScgfHwgaXNDcm9zc0ZhZGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgU3RydWN0QXJyYXlMYXlvdXQgPSBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCAnc291cmNlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XSA9IGlzQ3Jvc3NGYWRlZCA/XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKGV4cHJlc3Npb24sIHR5cGUsIHVzZUludGVnZXJab29tLCB6b29tLCBTdHJ1Y3RBcnJheUxheW91dCwgbGF5ZXIuaWQpIDpcbiAgICAgICAgICAgICAgICAgICAgbmV3IFNvdXJjZUV4cHJlc3Npb25CaW5kZXIoZXhwcmVzc2lvbiwgbmFtZXMsIHR5cGUsIFN0cnVjdEFycmF5TGF5b3V0KTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC9hXyR7cHJvcGVydHl9YCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgU3RydWN0QXJyYXlMYXlvdXQgPSBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCAnY29tcG9zaXRlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKGV4cHJlc3Npb24sIG5hbWVzLCB0eXBlLCB1c2VJbnRlZ2VyWm9vbSwgem9vbSwgU3RydWN0QXJyYXlMYXlvdXQpO1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChgL3pfJHtwcm9wZXJ0eX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FjaGVLZXkgPSBrZXlzLnNvcnQoKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBnZXRNYXhWYWx1ZShwcm9wZXJ0eTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgcmV0dXJuIGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciA/IGJpbmRlci5tYXhWYWx1ZSA6IDA7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhuZXdMZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpXG4gICAgICAgICAgICAgICAgKGJpbmRlcjogQXR0cmlidXRlQmluZGVyKS5wb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoLCBmZWF0dXJlLCBpbWFnZVBvc2l0aW9ucywgY2Fub25pY2FsLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG86IEltYWdlUG9zaXRpb24sIHBvc0Zyb206IEltYWdlUG9zaXRpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKVxuICAgICAgICAgICAgICAgIGJpbmRlci5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG8sIHBvc0Zyb20pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheXMoZmVhdHVyZVN0YXRlczogRmVhdHVyZVN0YXRlcywgZmVhdHVyZU1hcDogRmVhdHVyZVBvc2l0aW9uTWFwLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGxheWVyOiBUeXBlZFN0eWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGZlYXR1cmVTdGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGZlYXR1cmVNYXAuZ2V0UG9zaXRpb25zKGlkKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwb3Mgb2YgcG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHZ0TGF5ZXIuZmVhdHVyZShwb3MuaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChiaW5kZXIgaW5zdGFuY2VvZiBTb3VyY2VFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKSAmJiAoYmluZGVyOiBhbnkpLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9BSE06IFJlbW92ZSBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjI1NVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsYXllci5wYWludC5nZXQocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmRlcjogYW55KS5leHByZXNzaW9uID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAoYmluZGVyOiBBdHRyaWJ1dGVCaW5kZXIpLnVwZGF0ZVBhaW50QXJyYXkocG9zLnN0YXJ0LCBwb3MuZW5kLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGVzW2lkXSwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXJ0eTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgQ29uc3RhbnRCaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uYmluZGVyLnVuaWZvcm1OYW1lcy5tYXAobmFtZSA9PiBgI2RlZmluZSBIQVNfVU5JRk9STV8ke25hbWV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0QmluZGVyQXR0cmlidXRlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluZGVyLnBhaW50VmVydGV4QXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChiaW5kZXIucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybkF0dHJpYnV0ZXMubWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwYXR0ZXJuQXR0cmlidXRlcy5tZW1iZXJzW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEJpbmRlclVuaWZvcm1zKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCB1bmlmb3JtcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBDb25zdGFudEJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdW5pZm9ybU5hbWUgb2YgYmluZGVyLnVuaWZvcm1OYW1lcykge1xuICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5wdXNoKHVuaWZvcm1OYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuaWZvcm1zO1xuICAgIH1cblxuICAgIGdldFBhaW50VmVydGV4QnVmZmVycygpOiBBcnJheTxWZXJ0ZXhCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlcnM7XG4gICAgfVxuXG4gICAgZ2V0VW5pZm9ybXMoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQXJyYXk8QmluZGVyVW5pZm9ybT4ge1xuICAgICAgICBjb25zdCB1bmlmb3JtcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBDb25zdGFudEJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBiaW5kZXIudW5pZm9ybU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRpbmcgPSBiaW5kZXIuZ2V0QmluZGluZyhjb250ZXh0LCBsb2NhdGlvbnNbbmFtZV0sIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMucHVzaCh7bmFtZSwgcHJvcGVydHksIGJpbmRpbmd9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pZm9ybXM7XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybXM8UHJvcGVydGllczogT2JqZWN0Pihjb250ZXh0OiBDb250ZXh0LCBiaW5kZXJVbmlmb3JtczogQXJyYXk8QmluZGVyVW5pZm9ybT4sIHByb3BlcnRpZXM6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BlcnRpZXM+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIC8vIFVuaWZvcm0gc3RhdGUgYmluZGluZ3MgYXJlIG93bmVkIGJ5IHRoZSBQcm9ncmFtLCBidXQgd2Ugc2V0IHRoZW1cbiAgICAgICAgLy8gZnJvbSB3aXRoaW4gdGhlIFByb2dyYW1Db25maWd1cmF0b24ncyBiaW5kZXIgbWVtYmVycy5cbiAgICAgICAgZm9yIChjb25zdCB7bmFtZSwgcHJvcGVydHksIGJpbmRpbmd9IG9mIGJpbmRlclVuaWZvcm1zKSB7XG4gICAgICAgICAgICAodGhpcy5iaW5kZXJzW3Byb3BlcnR5XTogYW55KS5zZXRVbmlmb3JtKGJpbmRpbmcsIGdsb2JhbHMsIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEJ1ZmZlcnMoY3Jvc3NmYWRlPzogQ3Jvc3NmYWRlUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLl9idWZmZXJzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoY3Jvc3NmYWRlICYmIGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuVmVydGV4QnVmZmVyID0gY3Jvc3NmYWRlLmZyb21TY2FsZSA9PT0gMiA/IGJpbmRlci56b29tSW5QYWludFZlcnRleEJ1ZmZlciA6IGJpbmRlci56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5WZXJ0ZXhCdWZmZXIpIHRoaXMuX2J1ZmZlcnMucHVzaChwYXR0ZXJuVmVydGV4QnVmZmVyKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmICgoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKSAmJiBiaW5kZXIucGFpbnRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXJzLnB1c2goYmluZGVyLnBhaW50VmVydGV4QnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKVxuICAgICAgICAgICAgICAgIGJpbmRlci51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQYWludEJ1ZmZlcnMoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBTb3VyY2VFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcilcbiAgICAgICAgICAgICAgICBiaW5kZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4ge1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczoge1tfOiBzdHJpbmddOiBQcm9ncmFtQ29uZmlndXJhdGlvbn07XG4gICAgbmVlZHNVcGxvYWQ6IGJvb2xlYW47XG4gICAgX2ZlYXR1cmVNYXA6IEZlYXR1cmVQb3NpdGlvbk1hcDtcbiAgICBfYnVmZmVyT2Zmc2V0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcnM6ICRSZWFkT25seUFycmF5PExheWVyPiwgem9vbTogbnVtYmVyLCBmaWx0ZXJQcm9wZXJ0aWVzOiAoXzogc3RyaW5nKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZSkge1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXIuaWRdID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uKGxheWVyLCB6b29tLCBmaWx0ZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmVNYXAgPSBuZXcgRmVhdHVyZVBvc2l0aW9uTWFwKCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNba2V5XS5wb3B1bGF0ZVBhaW50QXJyYXlzKGxlbmd0aCwgZmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnMsIGNhbm9uaWNhbCwgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmVhdHVyZS5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9mZWF0dXJlTWFwLmFkZChmZWF0dXJlLmlkLCBpbmRleCwgdGhpcy5fYnVmZmVyT2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IGxlbmd0aDtcblxuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEFycmF5cyhmZWF0dXJlU3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGxheWVyczogJFJlYWRPbmx5QXJyYXk8VHlwZWRTdHlsZUxheWVyPiwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllci5pZF0udXBkYXRlUGFpbnRBcnJheXMoZmVhdHVyZVN0YXRlcywgdGhpcy5fZmVhdHVyZU1hcCwgdnRMYXllciwgbGF5ZXIsIGltYWdlUG9zaXRpb25zKSB8fCB0aGlzLm5lZWRzVXBsb2FkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0KGxheWVySWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF07XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5lZWRzVXBsb2FkKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF0udXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2xheWVySWRdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFpbnRBdHRyaWJ1dGVOYW1lcyhwcm9wZXJ0eSwgdHlwZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVFeGNlcHRpb25zID0ge1xuICAgICAgICAndGV4dC1vcGFjaXR5JzogWydvcGFjaXR5J10sXG4gICAgICAgICdpY29uLW9wYWNpdHknOiBbJ29wYWNpdHknXSxcbiAgICAgICAgJ3RleHQtY29sb3InOiBbJ2ZpbGxfY29sb3InXSxcbiAgICAgICAgJ2ljb24tY29sb3InOiBbJ2ZpbGxfY29sb3InXSxcbiAgICAgICAgJ3RleHQtaGFsby1jb2xvcic6IFsnaGFsb19jb2xvciddLFxuICAgICAgICAnaWNvbi1oYWxvLWNvbG9yJzogWydoYWxvX2NvbG9yJ10sXG4gICAgICAgICd0ZXh0LWhhbG8tYmx1cic6IFsnaGFsb19ibHVyJ10sXG4gICAgICAgICdpY29uLWhhbG8tYmx1cic6IFsnaGFsb19ibHVyJ10sXG4gICAgICAgICd0ZXh0LWhhbG8td2lkdGgnOiBbJ2hhbG9fd2lkdGgnXSxcbiAgICAgICAgJ2ljb24taGFsby13aWR0aCc6IFsnaGFsb193aWR0aCddLFxuICAgICAgICAnbGluZS1nYXAtd2lkdGgnOiBbJ2dhcHdpZHRoJ10sXG4gICAgICAgICdsaW5lLXBhdHRlcm4nOiBbJ3BhdHRlcm5fdG8nLCAncGF0dGVybl9mcm9tJywgJ3BpeGVsX3JhdGlvX3RvJywgJ3BpeGVsX3JhdGlvX2Zyb20nXSxcbiAgICAgICAgJ2ZpbGwtcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nLCAncGl4ZWxfcmF0aW9fdG8nLCAncGl4ZWxfcmF0aW9fZnJvbSddLFxuICAgICAgICAnZmlsbC1leHRydXNpb24tcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nLCAncGl4ZWxfcmF0aW9fdG8nLCAncGl4ZWxfcmF0aW9fZnJvbSddLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXR0cmlidXRlTmFtZUV4Y2VwdGlvbnNbcHJvcGVydHldIHx8IFtwcm9wZXJ0eS5yZXBsYWNlKGAke3R5cGV9LWAsICcnKS5yZXBsYWNlKC8tL2csICdfJyldO1xufVxuXG5mdW5jdGlvbiBnZXRMYXlvdXRFeGNlcHRpb24ocHJvcGVydHkpIHtcbiAgICBjb25zdCBwcm9wZXJ0eUV4Y2VwdGlvbnMgPSB7XG4gICAgICAgICdsaW5lLXBhdHRlcm4nOntcbiAgICAgICAgICAgICdzb3VyY2UnOiBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgICAgICAgICAnY29tcG9zaXRlJzogUGF0dGVybkxheW91dEFycmF5XG4gICAgICAgIH0sXG4gICAgICAgICdmaWxsLXBhdHRlcm4nOiB7XG4gICAgICAgICAgICAnc291cmNlJzogUGF0dGVybkxheW91dEFycmF5LFxuICAgICAgICAgICAgJ2NvbXBvc2l0ZSc6IFBhdHRlcm5MYXlvdXRBcnJheVxuICAgICAgICB9LFxuICAgICAgICAnZmlsbC1leHRydXNpb24tcGF0dGVybic6e1xuICAgICAgICAgICAgJ3NvdXJjZSc6IFBhdHRlcm5MYXlvdXRBcnJheSxcbiAgICAgICAgICAgICdjb21wb3NpdGUnOiBQYXR0ZXJuTGF5b3V0QXJyYXlcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcHJvcGVydHlFeGNlcHRpb25zW3Byb3BlcnR5XTtcbn1cblxuZnVuY3Rpb24gbGF5b3V0VHlwZShwcm9wZXJ0eSwgdHlwZSwgYmluZGVyVHlwZSkge1xuICAgIGNvbnN0IGRlZmF1bHRMYXlvdXRzID0ge1xuICAgICAgICAnY29sb3InOiB7XG4gICAgICAgICAgICAnc291cmNlJzogU3RydWN0QXJyYXlMYXlvdXQyZjgsXG4gICAgICAgICAgICAnY29tcG9zaXRlJzogU3RydWN0QXJyYXlMYXlvdXQ0ZjE2XG4gICAgICAgIH0sXG4gICAgICAgICdudW1iZXInOiB7XG4gICAgICAgICAgICAnc291cmNlJzogU3RydWN0QXJyYXlMYXlvdXQxZjQsXG4gICAgICAgICAgICAnY29tcG9zaXRlJzogU3RydWN0QXJyYXlMYXlvdXQyZjhcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBsYXlvdXRFeGNlcHRpb24gPSBnZXRMYXlvdXRFeGNlcHRpb24ocHJvcGVydHkpO1xuICAgIHJldHVybiAgbGF5b3V0RXhjZXB0aW9uICYmIGxheW91dEV4Y2VwdGlvbltiaW5kZXJUeXBlXSB8fCBkZWZhdWx0TGF5b3V0c1t0eXBlXVtiaW5kZXJUeXBlXTtcbn1cblxucmVnaXN0ZXIoJ0NvbnN0YW50QmluZGVyJywgQ29uc3RhbnRCaW5kZXIpO1xucmVnaXN0ZXIoJ0Nyb3NzRmFkZWRDb25zdGFudEJpbmRlcicsIENyb3NzRmFkZWRDb25zdGFudEJpbmRlcik7XG5yZWdpc3RlcignU291cmNlRXhwcmVzc2lvbkJpbmRlcicsIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIpO1xucmVnaXN0ZXIoJ0Nyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXInLCBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKTtcbnJlZ2lzdGVyKCdDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyJywgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcik7XG5yZWdpc3RlcignUHJvZ3JhbUNvbmZpZ3VyYXRpb24nLCBQcm9ncmFtQ29uZmlndXJhdGlvbiwge29taXQ6IFsnX2J1ZmZlcnMnXX0pO1xucmVnaXN0ZXIoJ1Byb2dyYW1Db25maWd1cmF0aW9uU2V0JywgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBMaW5lSW5kZXhBcnJheSxcbiAgICBUcmlhbmdsZUluZGV4QXJyYXksXG4gICAgTGluZVN0cmlwSW5kZXhBcnJheVxufSBmcm9tICcuL2FycmF5X3R5cGVzJztcblxuLyoqXG4gKiBBbiBpbmRleCBhcnJheSBzdG9yZXMgVWludDE2IGluZGljZXMgb2YgdmVydGV4ZXMgaW4gYSBjb3JyZXNwb25kaW5nIHZlcnRleCBhcnJheS4gV2UgdXNlXG4gKiB0aHJlZSBraW5kcyBvZiBpbmRleCBhcnJheXM6IGFycmF5cyBzdG9yaW5nIGdyb3VwcyBvZiB0aHJlZSBpbmRpY2VzLCBmb3JtaW5nIHRyaWFuZ2xlcztcbiAqIGFycmF5cyBzdG9yaW5nIHBhaXJzIG9mIGluZGljZXMsIGZvcm1pbmcgbGluZSBzZWdtZW50czsgYW5kIGFycmF5cyBzdG9yaW5nIHNpbmdsZSBpbmRpY2VzLFxuICogZm9ybWluZyBhIGxpbmUgc3RyaXAuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQge0xpbmVJbmRleEFycmF5LCBUcmlhbmdsZUluZGV4QXJyYXksIExpbmVTdHJpcEluZGV4QXJyYXl9O1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBUaGUgbWF4aW11bSB2YWx1ZSBvZiBhIGNvb3JkaW5hdGUgaW4gdGhlIGludGVybmFsIHRpbGUgY29vcmRpbmF0ZSBzeXN0ZW0uIENvb3JkaW5hdGVzIG9mXG4gKiBhbGwgc291cmNlIGZlYXR1cmVzIG5vcm1hbGl6ZWQgdG8gdGhpcyBleHRlbnQgdXBvbiBsb2FkLlxuICpcbiAqIFRoZSB2YWx1ZSBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogKiBWZXJ0ZXggYnVmZmVyIHN0b3JlIHBvc2l0aW9ucyBhcyBzaWduZWQgMTYgYml0IGludGVnZXJzLlxuICogKiBPbmUgYml0IGlzIGxvc3QgZm9yIHNpZ25lZG5lc3MgdG8gc3VwcG9ydCB0aWxlIGJ1ZmZlcnMuXG4gKiAqIE9uZSBiaXQgaXMgbG9zdCBiZWNhdXNlIHRoZSBsaW5lIHZlcnRleCBidWZmZXIgdXNlZCB0byBwYWNrIDEgYml0IG9mIG90aGVyIGRhdGEgaW50byB0aGUgaW50LlxuICogKiBPbmUgYml0IGlzIGxvc3QgdG8gc3VwcG9ydCBmZWF0dXJlcyBleHRlbmRpbmcgcGFzdCB0aGUgZXh0ZW50IG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0aWxlLlxuICogKiBUaGlzIGxlYXZlcyB1cyB3aXRoIDJeMTMgPSA4MTkyXG4gKlxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5leHBvcnQgZGVmYXVsdCA4MTkyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt3YXJuT25jZSwgY2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCBFWFRFTlQgZnJvbSAnLi9leHRlbnQnO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuLy8gVGhlc2UgYm91bmRzIGRlZmluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBzdXBwb3J0ZWQgY29vcmRpbmF0ZSB2YWx1ZXMuXG4vLyBXaGlsZSB2aXNpYmxlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gWzAsIEVYVEVOVF0sIHRpbGVzIG1heSB0aGVvcmV0aWNhbGx5XG4vLyBjb250YWluIGNvcmRpbmF0ZXMgd2l0aGluIFstSW5maW5pdHksIEluZmluaXR5XS4gT3VyIHJhbmdlIGlzIGxpbWl0ZWQgYnkgdGhlXG4vLyBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29vcmRpbmF0ZS5cbmNvbnN0IEJJVFMgPSAxNTtcbmNvbnN0IE1BWCA9IE1hdGgucG93KDIsIEJJVFMgLSAxKSAtIDE7XG5jb25zdCBNSU4gPSAtTUFYIC0gMTtcblxuLyoqXG4gKiBMb2FkcyBhIGdlb21ldHJ5IGZyb20gYSBWZWN0b3JUaWxlRmVhdHVyZSBhbmQgc2NhbGVzIGl0IHRvIHRoZSBjb21tb24gZXh0ZW50XG4gKiB1c2VkIGludGVybmFsbHkuXG4gKiBAcGFyYW0ge1ZlY3RvclRpbGVGZWF0dXJlfSBmZWF0dXJlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2FkR2VvbWV0cnkoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUpOiBBcnJheTxBcnJheTxQb2ludD4+IHtcbiAgICBjb25zdCBzY2FsZSA9IEVYVEVOVCAvIGZlYXR1cmUuZXh0ZW50O1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gZmVhdHVyZS5sb2FkR2VvbWV0cnkoKTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IGdlb21ldHJ5Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBnZW9tZXRyeVtyXTtcbiAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCByaW5nLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHJpbmdbcF07XG4gICAgICAgICAgICAvLyByb3VuZCBoZXJlIGJlY2F1c2UgbWFwYm94LWdsLW5hdGl2ZSB1c2VzIGludGVnZXJzIHRvIHJlcHJlc2VudFxuICAgICAgICAgICAgLy8gcG9pbnRzIGFuZCB3ZSBuZWVkIHRvIGRvIHRoZSBzYW1lIHRvIGF2b2lkIHJlbmVyaW5nIGRpZmZlcmVuY2VzLlxuICAgICAgICAgICAgY29uc3QgeCA9IE1hdGgucm91bmQocG9pbnQueCAqIHNjYWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBNYXRoLnJvdW5kKHBvaW50LnkgKiBzY2FsZSk7XG5cbiAgICAgICAgICAgIHBvaW50LnggPSBjbGFtcCh4LCBNSU4sIE1BWCk7XG4gICAgICAgICAgICBwb2ludC55ID0gY2xhbXAoeSwgTUlOLCBNQVgpO1xuXG4gICAgICAgICAgICBpZiAoeCA8IHBvaW50LnggfHwgeCA+IHBvaW50LnggKyAxIHx8IHkgPCBwb2ludC55IHx8IHkgPiBwb2ludC55ICsgMSkge1xuICAgICAgICAgICAgICAgIC8vIHdhcm4gd2hlbiBleGNlZWRpbmcgYWxsb3dlZCBleHRlbnQgZXhjZXB0IGZvciB0aGUgMS1weC1vZmYgY2FzZVxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy84OTkyXG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ0dlb21ldHJ5IGV4Y2VlZHMgYWxsb3dlZCBleHRlbnQsIHJlZHVjZSB5b3VyIHZlY3RvciB0aWxlIGJ1ZmZlciBzaXplJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdlb21ldHJ5O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtDaXJjbGVMYXlvdXRBcnJheX0gZnJvbSAnLi4vYXJyYXlfdHlwZXMnO1xuXG5pbXBvcnQge21lbWJlcnMgYXMgbGF5b3V0QXR0cmlidXRlc30gZnJvbSAnLi9jaXJjbGVfYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50JztcbmltcG9ydCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQge1RyaWFuZ2xlSW5kZXhBcnJheX0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9leHRlbnQnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0JztcbmltcG9ydCB0eXBlIENpcmNsZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi8uLi9zb3VyY2Uvc291cmNlX3N0YXRlJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi8uLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuXG5mdW5jdGlvbiBhZGRDaXJjbGVWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIHgsIHksIGV4dHJ1ZGVYLCBleHRydWRlWSkge1xuICAgIGxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAoeCAqIDIpICsgKChleHRydWRlWCArIDEpIC8gMiksXG4gICAgICAgICh5ICogMikgKyAoKGV4dHJ1ZGVZICsgMSkgLyAyKSk7XG59XG5cbi8qKlxuICogQ2lyY2xlcyBhcmUgcmVwcmVzZW50ZWQgYnkgdHdvIHRyaWFuZ2xlcy5cbiAqXG4gKiBFYWNoIGNvcm5lciBoYXMgYSBwb3MgdGhhdCBpcyB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUgYW5kIGFuIGV4dHJ1c2lvblxuICogdmVjdG9yIHRoYXQgaXMgd2hlcmUgaXQgcG9pbnRzLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ2lyY2xlQnVja2V0PExheWVyOiBDaXJjbGVTdHlsZUxheWVyIHwgSGVhdG1hcFN0eWxlTGF5ZXI+IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIGxheWVyczogQXJyYXk8TGF5ZXI+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcklkczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBDaXJjbGVMYXlvdXRBcnJheTtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQnVja2V0UGFyYW1ldGVyczxMYXllcj4pIHtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IENpcmNsZUxheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uU2V0KG9wdGlvbnMubGF5ZXJzLCBvcHRpb25zLnpvb20pO1xuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlcyA9IFtdO1xuICAgICAgICBsZXQgY2lyY2xlU29ydEtleSA9IG51bGw7XG5cbiAgICAgICAgLy8gSGVhdG1hcCBsYXllcnMgYXJlIGhhbmRsZWQgaW4gdGhpcyBidWNrZXQgYW5kIGhhdmUgbm8gZXZhbHVhdGVkIHByb3BlcnRpZXMsIHNvIHdlIGNoZWNrIG91ciBhY2Nlc3NcbiAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgIGNpcmNsZVNvcnRLZXkgPSAoKHN0eWxlTGF5ZXI6IGFueSk6IENpcmNsZVN0eWxlTGF5ZXIpLmxheW91dC5nZXQoJ2NpcmNsZS1zb3J0LWtleScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5O1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvbkZlYXR1cmUgPSB7dHlwZTogZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbmVlZEdlb21ldHJ5ID8gbG9hZEdlb21ldHJ5KGZlYXR1cmUpIDogW119O1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIW5lZWRHZW9tZXRyeSkgIGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuICAgICAgICAgICAgY29uc3Qgc29ydEtleSA9IGNpcmNsZVNvcnRLZXkgP1xuICAgICAgICAgICAgICAgIGNpcmNsZVNvcnRLZXkuZXZhbHVhdGUoZXZhbHVhdGlvbkZlYXR1cmUsIHt9LCBjYW5vbmljYWwpIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5IDogZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnB1c2goYnVja2V0RmVhdHVyZSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaXJjbGVTb3J0S2V5KSB7XG4gICAgICAgICAgICBidWNrZXRGZWF0dXJlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYS5zb3J0S2V5IGlzIGFsd2F5cyBhIG51bWJlciB3aGVuIGluIHVzZVxuICAgICAgICAgICAgICAgIHJldHVybiAoKGEuc29ydEtleTogYW55KTogbnVtYmVyKSAtICgoYi5zb3J0S2V5OiBhbnkpOiBudW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGJ1Y2tldEZlYXR1cmUgb2YgYnVja2V0RmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9ID0gYnVja2V0RmVhdHVyZTtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1tpbmRleF0uZmVhdHVyZTtcblxuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgIG9wdGlvbnMuZmVhdHVyZUluZGV4Lmluc2VydChmZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICB1cGxvYWRQZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQ7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlKGZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBpbmRleDogbnVtYmVyLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcmluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBwb2ludC54O1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBwb2ludC55O1xuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IGluY2x1ZGUgcG9pbnRzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcmllcy5cbiAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSBFWFRFTlQgfHwgeSA8IDAgfHwgeSA+PSBFWFRFTlQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBnZW9tZXRyeSB3aWxsIGJlIG9mIHRoZSBQb2ludCB0eXBlLCBhbmQgd2UnbGwgZGVyaXZlXG4gICAgICAgICAgICAgICAgLy8gdHdvIHRyaWFuZ2xlcyBmcm9tIGl0LlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICAgICAgICAgICAgLy8g4pSCIDMgICAgIDIg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSCICAgICAgICAg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSCIDAgICAgIDEg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXksIGZlYXR1cmUuc29ydEtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHgsIHksIDEsIDEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgMSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMywgaW5kZXggKyAyKTtcblxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCB7fSwgY2Fub25pY2FsKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdDaXJjbGVCdWNrZXQnLCBDaXJjbGVCdWNrZXQsIHtvbWl0OiBbJ2xheWVycyddfSk7XG5cbmV4cG9ydCBkZWZhdWx0IENpcmNsZUJ1Y2tldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7aXNDb3VudGVyQ2xvY2t3aXNlfSBmcm9tICcuL3V0aWwnO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmV4cG9ydCB7cG9seWdvbkludGVyc2VjdHNCdWZmZXJlZFBvaW50LCBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbiwgcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZSwgcG9seWdvbkludGVyc2VjdHNQb2x5Z29uLCBkaXN0VG9TZWdtZW50U3F1YXJlZCwgcG9seWdvbkludGVyc2VjdHNCb3h9O1xuXG50eXBlIExpbmUgPSBBcnJheTxQb2ludD47XG50eXBlIE11bHRpTGluZSA9IEFycmF5PExpbmU+O1xudHlwZSBSaW5nID0gQXJyYXk8UG9pbnQ+O1xudHlwZSBQb2x5Z29uID0gQXJyYXk8UG9pbnQ+O1xudHlwZSBNdWx0aVBvbHlnb24gPSBBcnJheTxQb2x5Z29uPjtcblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHBvbHlnb25BOiBQb2x5Z29uLCBwb2x5Z29uQjogUG9seWdvbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25CLCBwb2x5Z29uQVtpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25BLCBwb2x5Z29uQltpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbkEsIHBvbHlnb25CKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludChwb2x5Z29uOiBQb2x5Z29uLCBwb2ludDogUG9pbnQsIHJhZGl1czogbnVtYmVyKSB7XG4gICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIHBvaW50KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShwb2ludCwgcG9seWdvbiwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbihwb2x5Z29uOiBQb2x5Z29uLCBtdWx0aVBvbHlnb246IE11bHRpUG9seWdvbikge1xuXG4gICAgaWYgKHBvbHlnb24ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbiwgcG9seWdvblswXSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgY29uc3QgcmluZyA9IG11bHRpUG9seWdvblttXTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaW5nLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbiwgcmluZ1tuXSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbiwgcG9seWdvbltpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbXVsdGlQb2x5Z29uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbiwgbXVsdGlQb2x5Z29uW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lKHBvbHlnb246IFBvbHlnb24sIG11bHRpTGluZTogTXVsdGlMaW5lLCByYWRpdXM6IG51bWJlcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXVsdGlMaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBtdWx0aUxpbmVbaV07XG5cbiAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCBsaW5lW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUocG9seWdvbiwgbGluZSwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUE6IExpbmUsIGxpbmVCOiBMaW5lLCByYWRpdXM6IG51bWJlcikge1xuXG4gICAgaWYgKGxpbmVBLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShsaW5lQSwgbGluZUIpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBwb2ludCBpbiBlaXRoZXIgbGluZSBpcyB3aXRoaW4gcmFkaXVzIG9mIHRoZSBvdGhlciBsaW5lXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUJbal0sIGxpbmVBLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZUEubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQVtrXSwgbGluZUIsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNMaW5lKGxpbmVBOiBMaW5lLCBsaW5lQjogTGluZSkge1xuICAgIGlmIChsaW5lQS5sZW5ndGggPT09IDAgfHwgbGluZUIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgYTAgPSBsaW5lQVtpXTtcbiAgICAgICAgY29uc3QgYTEgPSBsaW5lQVtpICsgMV07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBiMCA9IGxpbmVCW2pdO1xuICAgICAgICAgICAgY29uc3QgYjEgPSBsaW5lQltqICsgMV07XG4gICAgICAgICAgICBpZiAobGluZVNlZ21lbnRJbnRlcnNlY3RzTGluZVNlZ21lbnQoYTAsIGExLCBiMCwgYjEpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVTZWdtZW50SW50ZXJzZWN0c0xpbmVTZWdtZW50KGEwOiBQb2ludCwgYTE6IFBvaW50LCBiMDogUG9pbnQsIGIxOiBQb2ludCkge1xuICAgIHJldHVybiBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGIwLCBiMSkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMSwgYjAsIGIxKSAmJlxuICAgICAgICBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGExLCBiMCkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYTEsIGIxKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKHA6IFBvaW50LCBsaW5lOiBMaW5lLCByYWRpdXM6IG51bWJlcikge1xuICAgIGNvbnN0IHJhZGl1c1NxdWFyZWQgPSByYWRpdXMgKiByYWRpdXM7XG5cbiAgICBpZiAobGluZS5sZW5ndGggPT09IDEpIHJldHVybiBwLmRpc3RTcXIobGluZVswXSkgPCByYWRpdXNTcXVhcmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEZpbmQgbGluZSBzZWdtZW50cyB0aGF0IGhhdmUgYSBkaXN0YW5jZSA8PSByYWRpdXNeMiB0byBwXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgdHJlYXQgdGhlIGxpbmUgYXMgXCJjb250YWluaW5nIHBvaW50IHBcIi5cbiAgICAgICAgY29uc3QgdiA9IGxpbmVbaSAtIDFdLCB3ID0gbGluZVtpXTtcbiAgICAgICAgaWYgKGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIHYsIHcpIDwgcmFkaXVzU3F1YXJlZCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gQ29kZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MDE3MjUvMzMxMzc5LlxuZnVuY3Rpb24gZGlzdFRvU2VnbWVudFNxdWFyZWQocDogUG9pbnQsIHY6IFBvaW50LCB3OiBQb2ludCkge1xuICAgIGNvbnN0IGwyID0gdi5kaXN0U3FyKHcpO1xuICAgIGlmIChsMiA9PT0gMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBjb25zdCB0ID0gKChwLnggLSB2LngpICogKHcueCAtIHYueCkgKyAocC55IC0gdi55KSAqICh3LnkgLSB2LnkpKSAvIGwyO1xuICAgIGlmICh0IDwgMCkgcmV0dXJuIHAuZGlzdFNxcih2KTtcbiAgICBpZiAodCA+IDEpIHJldHVybiBwLmRpc3RTcXIodyk7XG4gICAgcmV0dXJuIHAuZGlzdFNxcih3LnN1Yih2KS5fbXVsdCh0KS5fYWRkKHYpKTtcbn1cblxuLy8gcG9pbnQgaW4gcG9seWdvbiByYXkgY2FzdGluZyBhbGdvcml0aG1cbmZ1bmN0aW9uIG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQocmluZ3M6IEFycmF5PFJpbmc+LCBwOiBQb2ludCkge1xuICAgIGxldCBjID0gZmFsc2UsXG4gICAgICAgIHJpbmcsIHAxLCBwMjtcblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcmluZ3MubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgcmluZyA9IHJpbmdzW2tdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJpbmcubGVuZ3RoIC0gMTsgaSA8IHJpbmcubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgICAgICBpZiAoKChwMS55ID4gcC55KSAhPT0gKHAyLnkgPiBwLnkpKSAmJiAocC54IDwgKHAyLnggLSBwMS54KSAqIChwLnkgLSBwMS55KSAvIChwMi55IC0gcDEueSkgKyBwMS54KSkge1xuICAgICAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcG9seWdvbkNvbnRhaW5zUG9pbnQocmluZzogUmluZywgcDogUG9pbnQpIHtcbiAgICBsZXQgYyA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgY29uc3QgcDEgPSByaW5nW2ldO1xuICAgICAgICBjb25zdCBwMiA9IHJpbmdbal07XG4gICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICBjID0gIWM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzQm94KHJpbmc6IFJpbmcsIGJveFgxOiBudW1iZXIsIGJveFkxOiBudW1iZXIsIGJveFgyOiBudW1iZXIsIGJveFkyOiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgcmluZykge1xuICAgICAgICBpZiAoYm94WDEgPD0gcC54ICYmXG4gICAgICAgICAgICBib3hZMSA8PSBwLnkgJiZcbiAgICAgICAgICAgIGJveFgyID49IHAueCAmJlxuICAgICAgICAgICAgYm94WTIgPj0gcC55KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3JuZXJzID0gW1xuICAgICAgICBuZXcgUG9pbnQoYm94WDEsIGJveFkxKSxcbiAgICAgICAgbmV3IFBvaW50KGJveFgxLCBib3hZMiksXG4gICAgICAgIG5ldyBQb2ludChib3hYMiwgYm94WTIpLFxuICAgICAgICBuZXcgUG9pbnQoYm94WDIsIGJveFkxKV07XG5cbiAgICBpZiAocmluZy5sZW5ndGggPiAyKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29ybmVyIG9mIGNvcm5lcnMpIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChyaW5nLCBjb3JuZXIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcDEgPSByaW5nW2ldO1xuICAgICAgICBjb25zdCBwMiA9IHJpbmdbaSArIDFdO1xuICAgICAgICBpZiAoZWRnZUludGVyc2VjdHNCb3gocDEsIHAyLCBjb3JuZXJzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBlZGdlSW50ZXJzZWN0c0JveChlMTogUG9pbnQsIGUyOiBQb2ludCwgY29ybmVyczogQXJyYXk8UG9pbnQ+KSB7XG4gICAgY29uc3QgdGwgPSBjb3JuZXJzWzBdO1xuICAgIGNvbnN0IGJyID0gY29ybmVyc1syXTtcbiAgICAvLyB0aGUgZWRnZSBhbmQgYm94IGRvIG5vdCBpbnRlcnNlY3QgaW4gZWl0aGVyIHRoZSB4IG9yIHkgZGltZW5zaW9uc1xuICAgIGlmICgoKGUxLnggPCB0bC54KSAmJiAoZTIueCA8IHRsLngpKSB8fFxuICAgICAgICAoKGUxLnggPiBici54KSAmJiAoZTIueCA+IGJyLngpKSB8fFxuICAgICAgICAoKGUxLnkgPCB0bC55KSAmJiAoZTIueSA8IHRsLnkpKSB8fFxuICAgICAgICAoKGUxLnkgPiBici55KSAmJiAoZTIueSA+IGJyLnkpKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gY2hlY2sgaWYgYWxsIGNvcm5lcnMgb2YgdGhlIGJveCBhcmUgb24gdGhlIHNhbWUgc2lkZSBvZiB0aGUgZWRnZVxuICAgIGNvbnN0IGRpciA9IGlzQ291bnRlckNsb2Nrd2lzZShlMSwgZTIsIGNvcm5lcnNbMF0pO1xuICAgIHJldHVybiBkaXIgIT09IGlzQ291bnRlckNsb2Nrd2lzZShlMSwgZTIsIGNvcm5lcnNbMV0pIHx8XG4gICAgICAgIGRpciAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1syXSkgfHxcbiAgICAgICAgZGlyICE9PSBpc0NvdW50ZXJDbG9ja3dpc2UoZTEsIGUyLCBjb3JuZXJzWzNdKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUge1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSBcIi4vcHJvcGVydGllc1wiO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heGltdW1QYWludFZhbHVlKHByb3BlcnR5OiBzdHJpbmcsIGxheWVyOiBTdHlsZUxheWVyLCBidWNrZXQ6IENpcmNsZUJ1Y2tldDwqPiB8IExpbmVCdWNrZXQpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlID0gKChsYXllci5wYWludDogYW55KS5nZXQocHJvcGVydHkpOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8YW55PikudmFsdWU7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCkuZ2V0TWF4VmFsdWUocHJvcGVydHkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZURpc3RhbmNlKHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSkge1xuICAgIHJldHVybiBNYXRoLnNxcnQodHJhbnNsYXRlWzBdICogdHJhbnNsYXRlWzBdICsgdHJhbnNsYXRlWzFdICogdHJhbnNsYXRlWzFdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUFuY2hvcjogJ3ZpZXdwb3J0JyB8ICdtYXAnLFxuICAgICAgICAgICAgICAgICAgIGJlYXJpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkge1xuICAgICAgICByZXR1cm4gcXVlcnlHZW9tZXRyeTtcbiAgICB9XG4gICAgY29uc3QgcHQgPSBQb2ludC5jb252ZXJ0KHRyYW5zbGF0ZSkuX211bHQocGl4ZWxzVG9UaWxlVW5pdHMpO1xuXG4gICAgaWYgKHRyYW5zbGF0ZUFuY2hvciA9PT0gXCJ2aWV3cG9ydFwiKSB7XG4gICAgICAgIHB0Ll9yb3RhdGUoLWJlYXJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5R2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBxdWVyeUdlb21ldHJ5W2ldO1xuICAgICAgICB0cmFuc2xhdGVkLnB1c2gocG9pbnQuc3ViKHB0KSk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkO1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwiY2lyY2xlLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJjaXJjbGUtc29ydC1rZXlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfY2lyY2xlXCJdW1wiY2lyY2xlLXNvcnQta2V5XCJdKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImNpcmNsZS1yYWRpdXNcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImNpcmNsZS1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiY2lyY2xlLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImNpcmNsZS1zdHJva2UtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImNpcmNsZS1yYWRpdXNcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtcmFkaXVzXCJdKSxcbiAgICBcImNpcmNsZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1jb2xvclwiXSksXG4gICAgXCJjaXJjbGUtYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1ibHVyXCJdKSxcbiAgICBcImNpcmNsZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLW9wYWNpdHlcIl0pLFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiY2lyY2xlLXBpdGNoLXNjYWxlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIl0pLFxuICAgIFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS13aWR0aFwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS1jb2xvclwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLyoqXHJcbiAqIENvbW1vbiB1dGlsaXRpZXNcclxuICogQG1vZHVsZSBnbE1hdHJpeFxyXG4gKi9cbi8vIENvbmZpZ3VyYXRpb24gQ29uc3RhbnRzXG5leHBvcnQgdmFyIEVQU0lMT04gPSAwLjAwMDAwMTtcbmV4cG9ydCB2YXIgQVJSQVlfVFlQRSA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gRmxvYXQzMkFycmF5IDogQXJyYXk7XG5leHBvcnQgdmFyIFJBTkRPTSA9IE1hdGgucmFuZG9tO1xuLyoqXHJcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheUNvbnN0cnVjdG9yIHwgQXJyYXlDb25zdHJ1Y3Rvcn0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE1hdHJpeEFycmF5VHlwZSh0eXBlKSB7XG4gIEFSUkFZX1RZUEUgPSB0eXBlO1xufVxudmFyIGRlZ3JlZSA9IE1hdGguUEkgLyAxODA7XG4vKipcclxuICogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIEFuZ2xlIGluIERlZ3JlZXNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JhZGlhbihhKSB7XG4gIHJldHVybiBhICogZGVncmVlO1xufVxuLyoqXHJcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IHRoZSBhcmd1bWVudHMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHZhbHVlLCB3aXRoaW4gYW4gYWJzb2x1dGVcclxuICogb3IgcmVsYXRpdmUgdG9sZXJhbmNlIG9mIGdsTWF0cml4LkVQU0lMT04gKGFuIGFic29sdXRlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciB2YWx1ZXMgbGVzc1xyXG4gKiB0aGFuIG9yIGVxdWFsIHRvIDEuMCwgYW5kIGEgcmVsYXRpdmUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIGxhcmdlciB2YWx1ZXMpXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIFRoZSBmaXJzdCBudW1iZXIgdG8gdGVzdC5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCBudW1iZXIgdG8gdGVzdC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlcnMgYXJlIGFwcHJveGltYXRlbHkgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IEVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG5pZiAoIU1hdGguaHlwb3QpIE1hdGguaHlwb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB5ID0gMCxcbiAgICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICB5ICs9IGFyZ3VtZW50c1tpXSAqIGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIHJldHVybiBNYXRoLnNxcnQoeSk7XG59OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDJ4MiBNYXRyaXhcclxuICogQG1vZHVsZSBtYXQyXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBtYXQyIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXQgQSBuZXcgMngyIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDIgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTEwLCBtMTEpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlXG4gIC8vIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTEgPSBhWzFdO1xuICAgIG91dFsxXSA9IGFbMl07XG4gICAgb3V0WzJdID0gYTE7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGFbMV07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogSW52ZXJ0cyBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSBhMyAqIGRldDtcbiAgb3V0WzFdID0gLWExICogZGV0O1xuICBvdXRbMl0gPSAtYTIgKiBkZXQ7XG4gIG91dFszXSA9IGEwICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgLy8gQ2FjaGluZyB0aGlzIHZhbHVlIGlzIG5lc3NlY2FyeSBpZiBvdXQgPT0gYVxuICB2YXIgYTAgPSBhWzBdO1xuICBvdXRbMF0gPSBhWzNdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGEwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQyJ3NcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdDIgYnkgdGhlIGdpdmVuIGFuZ2xlXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGEwICogYyArIGEyICogcztcbiAgb3V0WzFdID0gYTEgKiBjICsgYTMgKiBzO1xuICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyB0aGUgbWF0MiBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0Mi5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAtcztcbiAgb3V0WzNdID0gYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDIuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQyLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSB2WzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQyXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xufVxuLyoqXHJcbiAqIFJldHVybnMgTCwgRCBhbmQgVSBtYXRyaWNlcyAoTG93ZXIgdHJpYW5ndWxhciwgRGlhZ29uYWwgYW5kIFVwcGVyIHRyaWFuZ3VsYXIpIGJ5IGZhY3Rvcml6aW5nIHRoZSBpbnB1dCBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IEwgdGhlIGxvd2VyIHRyaWFuZ3VsYXIgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBEIHRoZSBkaWFnb25hbCBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBpbnB1dCBtYXRyaXggdG8gZmFjdG9yaXplXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gTERVKEwsIEQsIFUsIGEpIHtcbiAgTFsyXSA9IGFbMl0gLyBhWzBdO1xuICBVWzBdID0gYVswXTtcbiAgVVsxXSA9IGFbMV07XG4gIFVbM10gPSBhWzNdIC0gTFsyXSAqIFVbMV07XG4gIHJldHVybiBbTCwgRCwgVV07XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxyXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MidzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDJ4MyBNYXRyaXhcclxuICogQG1vZHVsZSBtYXQyZFxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcclxuICogPHByZT5cclxuICogW2EsIGIsXHJcbiAqICBjLCBkLFxyXG4gKiAgdHgsIHR5XVxyXG4gKiA8L3ByZT5cclxuICogVGhpcyBpcyBhIHNob3J0IGZvcm0gZm9yIHRoZSAzeDMgbWF0cml4OlxyXG4gKiA8cHJlPlxyXG4gKiBbYSwgYiwgMCxcclxuICogIGMsIGQsIDAsXHJcbiAqICB0eCwgdHksIDFdXHJcbiAqIDwvcHJlPlxyXG4gKiBUaGUgbGFzdCBjb2x1bW4gaXMgaWdub3JlZCBzbyB0aGUgYXJyYXkgaXMgc2hvcnRlciBhbmQgb3BlcmF0aW9ucyBhcmUgZmFzdGVyLlxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MmRcclxuICpcclxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQyZCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyZCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCBhIG1hdDJkIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hdDJkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBDb21wb25lbnQgQSAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgQ29tcG9uZW50IEIgKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZCBDb21wb25lbnQgRCAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR4IENvbXBvbmVudCBUWCAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcclxuICogQHJldHVybnMge21hdDJkfSBBIG5ldyBtYXQyZFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoYSwgYiwgYywgZCwgdHgsIHR5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgb3V0WzBdID0gYTtcbiAgb3V0WzFdID0gYjtcbiAgb3V0WzJdID0gYztcbiAgb3V0WzNdID0gZDtcbiAgb3V0WzRdID0gdHg7XG4gIG91dFs1XSA9IHR5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDJkIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIENvbXBvbmVudCBBIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBDb21wb25lbnQgQiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGMgQ29tcG9uZW50IEMgKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBkIENvbXBvbmVudCBEIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gdHggQ29tcG9uZW50IFRYIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gdHkgQ29tcG9uZW50IFRZIChpbmRleCA1KVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICBvdXRbMF0gPSBhO1xuICBvdXRbMV0gPSBiO1xuICBvdXRbMl0gPSBjO1xuICBvdXRbM10gPSBkO1xuICBvdXRbNF0gPSB0eDtcbiAgb3V0WzVdID0gdHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogSW52ZXJ0cyBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhYSA9IGFbMF0sXG4gICAgICBhYiA9IGFbMV0sXG4gICAgICBhYyA9IGFbMl0sXG4gICAgICBhZCA9IGFbM107XG4gIHZhciBhdHggPSBhWzRdLFxuICAgICAgYXR5ID0gYVs1XTtcbiAgdmFyIGRldCA9IGFhICogYWQgLSBhYiAqIGFjO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGFkICogZGV0O1xuICBvdXRbMV0gPSAtYWIgKiBkZXQ7XG4gIG91dFsyXSA9IC1hYyAqIGRldDtcbiAgb3V0WzNdID0gYWEgKiBkZXQ7XG4gIG91dFs0XSA9IChhYyAqIGF0eSAtIGFkICogYXR4KSAqIGRldDtcbiAgb3V0WzVdID0gKGFiICogYXR4IC0gYWEgKiBhdHkpICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MmRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHJldHVybiBhWzBdICogYVszXSAtIGFbMV0gKiBhWzJdO1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDJkJ3NcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV07XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICBvdXRbNF0gPSBhMCAqIGI0ICsgYTIgKiBiNSArIGE0O1xuICBvdXRbNV0gPSBhMSAqIGI0ICsgYTMgKiBiNSArIGE1O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXQyZCBieSB0aGUgZ2l2ZW4gYW5nbGVcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYTAgKiBjICsgYTIgKiBzO1xuICBvdXRbMV0gPSBhMSAqIGMgKyBhMyAqIHM7XG4gIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gIG91dFs0XSA9IGE0O1xuICBvdXRbNV0gPSBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIHYwID0gdlswXSxcbiAgICAgIHYxID0gdlsxXTtcbiAgb3V0WzBdID0gYTAgKiB2MDtcbiAgb3V0WzFdID0gYTEgKiB2MDtcbiAgb3V0WzJdID0gYTIgKiB2MTtcbiAgb3V0WzNdID0gYTMgKiB2MTtcbiAgb3V0WzRdID0gYTQ7XG4gIG91dFs1XSA9IGE1O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zbGF0ZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gdHJhbnNsYXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMDtcbiAgb3V0WzFdID0gYTE7XG4gIG91dFsyXSA9IGEyO1xuICBvdXRbM10gPSBhMztcbiAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgb3V0WzVdID0gYTEgKiB2MCArIGEzICogdjEgKyBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0MmQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDJkLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSB2WzFdO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0MmQudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IHZbMF07XG4gIG91dFs1XSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0MmQoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIsIFwiICsgYVs0XSArIFwiLCBcIiArIGFbNV0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MmRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIDEpO1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDJkJ3NcclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDJkJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDJkLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDN4MyBNYXRyaXhcclxuICogQG1vZHVsZSBtYXQzXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQzXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcGllcyB0aGUgdXBwZXItbGVmdCAzeDMgdmFsdWVzIGludG8gdGhlIGdpdmVuIG1hdDMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgM3gzIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSAgIHRoZSBzb3VyY2UgNHg0IG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbU1hdDQob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbNF07XG4gIG91dFs0XSA9IGFbNV07XG4gIG91dFs1XSA9IGFbNl07XG4gIG91dFs2XSA9IGFbOF07XG4gIG91dFs3XSA9IGFbOV07XG4gIG91dFs4XSA9IGFbMTBdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBtYXRyaXggdG8gY2xvbmVcclxuICogQHJldHVybnMge21hdDN9IGEgbmV3IDN4MyBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MyB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBtYXQzIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxyXG4gKiBAcmV0dXJucyB7bWF0M30gQSBuZXcgbWF0M1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0MyB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgbWF0MyB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMiA9IGFbNV07XG4gICAgb3V0WzFdID0gYVszXTtcbiAgICBvdXRbMl0gPSBhWzZdO1xuICAgIG91dFszXSA9IGEwMTtcbiAgICBvdXRbNV0gPSBhWzddO1xuICAgIG91dFs2XSA9IGEwMjtcbiAgICBvdXRbN10gPSBhMTI7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzNdO1xuICAgIG91dFsyXSA9IGFbNl07XG4gICAgb3V0WzNdID0gYVsxXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbN107XG4gICAgb3V0WzZdID0gYVsyXTtcbiAgICBvdXRbN10gPSBhWzVdO1xuICAgIG91dFs4XSA9IGFbOF07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHZhciBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjE7XG4gIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwO1xuICB2YXIgYjIxID0gYTIxICogYTEwIC0gYTExICogYTIwOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMTtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSBiMDEgKiBkZXQ7XG4gIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldDtcbiAgb3V0WzJdID0gKGExMiAqIGEwMSAtIGEwMiAqIGExMSkgKiBkZXQ7XG4gIG91dFszXSA9IGIxMSAqIGRldDtcbiAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXQ7XG4gIG91dFs1XSA9ICgtYTEyICogYTAwICsgYTAyICogYTEwKSAqIGRldDtcbiAgb3V0WzZdID0gYjIxICogZGV0O1xuICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXQ7XG4gIG91dFs4XSA9IChhMTEgKiBhMDAgLSBhMDEgKiBhMTApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgb3V0WzBdID0gYTExICogYTIyIC0gYTEyICogYTIxO1xuICBvdXRbMV0gPSBhMDIgKiBhMjEgLSBhMDEgKiBhMjI7XG4gIG91dFsyXSA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgb3V0WzNdID0gYTEyICogYTIwIC0gYTEwICogYTIyO1xuICBvdXRbNF0gPSBhMDAgKiBhMjIgLSBhMDIgKiBhMjA7XG4gIG91dFs1XSA9IGEwMiAqIGExMCAtIGEwMCAqIGExMjtcbiAgb3V0WzZdID0gYTEwICogYTIxIC0gYTExICogYTIwO1xuICBvdXRbN10gPSBhMDEgKiBhMjAgLSBhMDAgKiBhMjE7XG4gIG91dFs4XSA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgcmV0dXJuIGEwMCAqIChhMjIgKiBhMTEgLSBhMTIgKiBhMjEpICsgYTAxICogKC1hMjIgKiBhMTAgKyBhMTIgKiBhMjApICsgYTAyICogKGEyMSAqIGExMCAtIGExMSAqIGEyMCk7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0MydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHZhciBiMDAgPSBiWzBdLFxuICAgICAgYjAxID0gYlsxXSxcbiAgICAgIGIwMiA9IGJbMl07XG4gIHZhciBiMTAgPSBiWzNdLFxuICAgICAgYjExID0gYls0XSxcbiAgICAgIGIxMiA9IGJbNV07XG4gIHZhciBiMjAgPSBiWzZdLFxuICAgICAgYjIxID0gYls3XSxcbiAgICAgIGIyMiA9IGJbOF07XG4gIG91dFswXSA9IGIwMCAqIGEwMCArIGIwMSAqIGExMCArIGIwMiAqIGEyMDtcbiAgb3V0WzFdID0gYjAwICogYTAxICsgYjAxICogYTExICsgYjAyICogYTIxO1xuICBvdXRbMl0gPSBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjI7XG4gIG91dFszXSA9IGIxMCAqIGEwMCArIGIxMSAqIGExMCArIGIxMiAqIGEyMDtcbiAgb3V0WzRdID0gYjEwICogYTAxICsgYjExICogYTExICsgYjEyICogYTIxO1xuICBvdXRbNV0gPSBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjI7XG4gIG91dFs2XSA9IGIyMCAqIGEwMCArIGIyMSAqIGExMCArIGIyMiAqIGEyMDtcbiAgb3V0WzddID0gYjIwICogYTAxICsgYjIxICogYTExICsgYjIyICogYTIxO1xuICBvdXRbOF0gPSBiMjAgKiBhMDIgKyBiMjEgKiBhMTIgKyBiMjIgKiBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XSxcbiAgICAgIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XSxcbiAgICAgIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV07XG4gIG91dFswXSA9IGEwMDtcbiAgb3V0WzFdID0gYTAxO1xuICBvdXRbMl0gPSBhMDI7XG4gIG91dFszXSA9IGExMDtcbiAgb3V0WzRdID0gYTExO1xuICBvdXRbNV0gPSBhMTI7XG4gIG91dFs2XSA9IHggKiBhMDAgKyB5ICogYTEwICsgYTIwO1xuICBvdXRbN10gPSB4ICogYTAxICsgeSAqIGExMSArIGEyMTtcbiAgb3V0WzhdID0geCAqIGEwMiArIHkgKiBhMTIgKyBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdDMgYnkgdGhlIGdpdmVuIGFuZ2xlXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XSxcbiAgICAgIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XSxcbiAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGMgKiBhMDAgKyBzICogYTEwO1xuICBvdXRbMV0gPSBjICogYTAxICsgcyAqIGExMTtcbiAgb3V0WzJdID0gYyAqIGEwMiArIHMgKiBhMTI7XG4gIG91dFszXSA9IGMgKiBhMTAgLSBzICogYTAwO1xuICBvdXRbNF0gPSBjICogYTExIC0gcyAqIGEwMTtcbiAgb3V0WzVdID0gYyAqIGExMiAtIHMgKiBhMDI7XG4gIG91dFs2XSA9IGEyMDtcbiAgb3V0WzddID0gYTIxO1xuICBvdXRbOF0gPSBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIHRoZSBtYXQzIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV07XG4gIG91dFswXSA9IHggKiBhWzBdO1xuICBvdXRbMV0gPSB4ICogYVsxXTtcbiAgb3V0WzJdID0geCAqIGFbMl07XG4gIG91dFszXSA9IHkgKiBhWzNdO1xuICBvdXRbNF0gPSB5ICogYVs0XTtcbiAgb3V0WzVdID0geSAqIGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDMudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IHZbMF07XG4gIG91dFs3XSA9IHZbMV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0My5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAtcztcbiAgb3V0WzRdID0gYztcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQzLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB2WzFdO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBtYXQyZCBpbnRvIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjb3B5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbU1hdDJkKG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSBhWzJdO1xuICBvdXRbNF0gPSBhWzNdO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSBhWzRdO1xuICBvdXRbN10gPSBhWzVdO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYSAzeDMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQob3V0LCBxKSB7XG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeXggPSB5ICogeDI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHp4ID0geiAqIHgyO1xuICB2YXIgenkgPSB6ICogeTI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gIG91dFszXSA9IHl4IC0gd3o7XG4gIG91dFs2XSA9IHp4ICsgd3k7XG4gIG91dFsxXSA9IHl4ICsgd3o7XG4gIG91dFs0XSA9IDEgLSB4eCAtIHp6O1xuICBvdXRbN10gPSB6eSAtIHd4O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbNV0gPSB6eSArIHd4O1xuICBvdXRbOF0gPSAxIC0geHggLSB5eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgTWF0NCB0byBkZXJpdmUgdGhlIG5vcm1hbCBtYXRyaXggZnJvbVxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsRnJvbU1hdDQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gIG91dFsyXSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICBvdXRbNl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIDJEIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCBXaWR0aCBvZiB5b3VyIGdsIGNvbnRleHRcclxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgZ2wgY29udGV4dFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdGlvbihvdXQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgb3V0WzBdID0gMiAvIHdpZHRoO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAtMiAvIGhlaWdodDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gLTE7XG4gIG91dFs3XSA9IDE7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcIm1hdDMoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIsIFwiICsgYVs0XSArIFwiLCBcIiArIGFbNV0gKyBcIiwgXCIgKyBhWzZdICsgXCIsIFwiICsgYVs3XSArIFwiLCBcIiArIGFbOF0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddLCBhWzhdKTtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQzJ3NcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICBvdXRbNV0gPSBhWzVdIC0gYls1XTtcbiAgb3V0WzZdID0gYVs2XSAtIGJbNl07XG4gIG91dFs3XSA9IGFbN10gLSBiWzddO1xuICBvdXRbOF0gPSBhWzhdIC0gYls4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICBvdXRbOF0gPSBhWzhdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQzJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdICogc2NhbGU7XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdICogc2NhbGU7XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdICogc2NhbGU7XG4gIG91dFs3XSA9IGFbN10gKyBiWzddICogc2NhbGU7XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddLFxuICAgICAgYTggPSBhWzhdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdLFxuICAgICAgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddLFxuICAgICAgYjggPSBiWzhdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOCksIE1hdGguYWJzKGI4KSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogNHg0IE1hdHJpeDxicj5Gb3JtYXQ6IGNvbHVtbi1tYWpvciwgd2hlbiB0eXBlZCBvdXQgaXQgbG9va3MgbGlrZSByb3ctbWFqb3I8YnI+VGhlIG1hdHJpY2VzIGFyZSBiZWluZyBwb3N0IG11bHRpcGxpZWQuXHJcbiAqIEBtb2R1bGUgbWF0NFxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0NFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIG1hdHJpeCB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgb3V0WzldID0gYVs5XTtcbiAgb3V0WzEwXSA9IGFbMTBdO1xuICBvdXRbMTFdID0gYVsxMV07XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICBvdXRbOV0gPSBhWzldO1xuICBvdXRbMTBdID0gYVsxMF07XG4gIG91dFsxMV0gPSBhWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBtYXQ0IHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAzIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDMgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA1KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDYpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA4KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDkpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjMgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzAgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMTIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzIgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzMgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTUpXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBBIG5ldyBtYXQ0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyhtMDAsIG0wMSwgbTAyLCBtMDMsIG0xMCwgbTExLCBtMTIsIG0xMywgbTIwLCBtMjEsIG0yMiwgbTIzLCBtMzAsIG0zMSwgbTMyLCBtMzMpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0wMjtcbiAgb3V0WzNdID0gbTAzO1xuICBvdXRbNF0gPSBtMTA7XG4gIG91dFs1XSA9IG0xMTtcbiAgb3V0WzZdID0gbTEyO1xuICBvdXRbN10gPSBtMTM7XG4gIG91dFs4XSA9IG0yMDtcbiAgb3V0WzldID0gbTIxO1xuICBvdXRbMTBdID0gbTIyO1xuICBvdXRbMTFdID0gbTIzO1xuICBvdXRbMTJdID0gbTMwO1xuICBvdXRbMTNdID0gbTMxO1xuICBvdXRbMTRdID0gbTMyO1xuICBvdXRbMTVdID0gbTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDQgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAzIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDMgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA1KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDYpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA4KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDkpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjMgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzAgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMTIpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzIgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzMgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTUpXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0xMCwgbTExLCBtMTIsIG0xMywgbTIwLCBtMjEsIG0yMiwgbTIzLCBtMzAsIG0zMSwgbTMyLCBtMzMpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0wMjtcbiAgb3V0WzNdID0gbTAzO1xuICBvdXRbNF0gPSBtMTA7XG4gIG91dFs1XSA9IG0xMTtcbiAgb3V0WzZdID0gbTEyO1xuICBvdXRbN10gPSBtMTM7XG4gIG91dFs4XSA9IG0yMDtcbiAgb3V0WzldID0gbTIxO1xuICBvdXRbMTBdID0gbTIyO1xuICBvdXRbMTFdID0gbTIzO1xuICBvdXRbMTJdID0gbTMwO1xuICBvdXRbMTNdID0gbTMxO1xuICBvdXRbMTRdID0gbTMyO1xuICBvdXRbMTVdID0gbTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCBhIG1hdDQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdO1xuICAgIHZhciBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuICAgIHZhciBhMjMgPSBhWzExXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYTAxO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYTAyO1xuICAgIG91dFs5XSA9IGExMjtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGEwMztcbiAgICBvdXRbMTNdID0gYTEzO1xuICAgIG91dFsxNF0gPSBhMjM7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYVsxXTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYVsyXTtcbiAgICBvdXRbOV0gPSBhWzZdO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGFbM107XG4gICAgb3V0WzEzXSA9IGFbN107XG4gICAgb3V0WzE0XSA9IGFbMTFdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogSW52ZXJ0cyBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIG91dFswXSA9IGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKTtcbiAgb3V0WzFdID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICBvdXRbMl0gPSBhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFszXSA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzRdID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xuICBvdXRbNV0gPSBhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMik7XG4gIG91dFs2XSA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzddID0gYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpO1xuICBvdXRbOF0gPSBhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSk7XG4gIG91dFs5XSA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTtcbiAgb3V0WzEwXSA9IGEwMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKTtcbiAgb3V0WzExXSA9IC0oYTAwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcbiAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcbiAgb3V0WzEzXSA9IGEwMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKTtcbiAgb3V0WzE0XSA9IC0oYTAwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTtcbiAgb3V0WzE1XSA9IGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICByZXR1cm4gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdOyAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcblxuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICBvdXRbMF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzFdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsyXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbM10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzRdO1xuICBiMSA9IGJbNV07XG4gIGIyID0gYls2XTtcbiAgYjMgPSBiWzddO1xuICBvdXRbNF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzVdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFs2XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbN10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzhdO1xuICBiMSA9IGJbOV07XG4gIGIyID0gYlsxMF07XG4gIGIzID0gYlsxMV07XG4gIG91dFs4XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbOV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzEwXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbMTFdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYlsxMl07XG4gIGIxID0gYlsxM107XG4gIGIyID0gYlsxNF07XG4gIGIzID0gYlsxNV07XG4gIG91dFsxMl0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzEzXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTRdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxNV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXSxcbiAgICAgIHogPSB2WzJdO1xuICB2YXIgYTAwLCBhMDEsIGEwMiwgYTAzO1xuICB2YXIgYTEwLCBhMTEsIGExMiwgYTEzO1xuICB2YXIgYTIwLCBhMjEsIGEyMiwgYTIzO1xuXG4gIGlmIChhID09PSBvdXQpIHtcbiAgICBvdXRbMTJdID0gYVswXSAqIHggKyBhWzRdICogeSArIGFbOF0gKiB6ICsgYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbM10gKiB4ICsgYVs3XSAqIHkgKyBhWzExXSAqIHogKyBhWzE1XTtcbiAgfSBlbHNlIHtcbiAgICBhMDAgPSBhWzBdO1xuICAgIGEwMSA9IGFbMV07XG4gICAgYTAyID0gYVsyXTtcbiAgICBhMDMgPSBhWzNdO1xuICAgIGExMCA9IGFbNF07XG4gICAgYTExID0gYVs1XTtcbiAgICBhMTIgPSBhWzZdO1xuICAgIGExMyA9IGFbN107XG4gICAgYTIwID0gYVs4XTtcbiAgICBhMjEgPSBhWzldO1xuICAgIGEyMiA9IGFbMTBdO1xuICAgIGEyMyA9IGFbMTFdO1xuICAgIG91dFswXSA9IGEwMDtcbiAgICBvdXRbMV0gPSBhMDE7XG4gICAgb3V0WzJdID0gYTAyO1xuICAgIG91dFszXSA9IGEwMztcbiAgICBvdXRbNF0gPSBhMTA7XG4gICAgb3V0WzVdID0gYTExO1xuICAgIG91dFs2XSA9IGExMjtcbiAgICBvdXRbN10gPSBhMTM7XG4gICAgb3V0WzhdID0gYTIwO1xuICAgIG91dFs5XSA9IGEyMTtcbiAgICBvdXRbMTBdID0gYTIyO1xuICAgIG91dFsxMV0gPSBhMjM7XG4gICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYTAyICogeCArIGExMiAqIHkgKyBhMjIgKiB6ICsgYVsxNF07XG4gICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgdGhlIG1hdDQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzMgbm90IHVzaW5nIHZlY3Rvcml6YXRpb25cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdLFxuICAgICAgeiA9IHZbMl07XG4gIG91dFswXSA9IGFbMF0gKiB4O1xuICBvdXRbMV0gPSBhWzFdICogeDtcbiAgb3V0WzJdID0gYVsyXSAqIHg7XG4gIG91dFszXSA9IGFbM10gKiB4O1xuICBvdXRbNF0gPSBhWzRdICogeTtcbiAgb3V0WzVdID0gYVs1XSAqIHk7XG4gIG91dFs2XSA9IGFbNl0gKiB5O1xuICBvdXRbN10gPSBhWzddICogeTtcbiAgb3V0WzhdID0gYVs4XSAqIHo7XG4gIG91dFs5XSA9IGFbOV0gKiB6O1xuICBvdXRbMTBdID0gYVsxMF0gKiB6O1xuICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQsIGF4aXMpIHtcbiAgdmFyIHggPSBheGlzWzBdLFxuICAgICAgeSA9IGF4aXNbMV0sXG4gICAgICB6ID0gYXhpc1syXTtcbiAgdmFyIGxlbiA9IE1hdGguaHlwb3QoeCwgeSwgeik7XG4gIHZhciBzLCBjLCB0O1xuICB2YXIgYTAwLCBhMDEsIGEwMiwgYTAzO1xuICB2YXIgYTEwLCBhMTEsIGExMiwgYTEzO1xuICB2YXIgYTIwLCBhMjEsIGEyMiwgYTIzO1xuICB2YXIgYjAwLCBiMDEsIGIwMjtcbiAgdmFyIGIxMCwgYjExLCBiMTI7XG4gIHZhciBiMjAsIGIyMSwgYjIyO1xuXG4gIGlmIChsZW4gPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZW4gPSAxIC8gbGVuO1xuICB4ICo9IGxlbjtcbiAgeSAqPSBsZW47XG4gIHogKj0gbGVuO1xuICBzID0gTWF0aC5zaW4ocmFkKTtcbiAgYyA9IE1hdGguY29zKHJhZCk7XG4gIHQgPSAxIC0gYztcbiAgYTAwID0gYVswXTtcbiAgYTAxID0gYVsxXTtcbiAgYTAyID0gYVsyXTtcbiAgYTAzID0gYVszXTtcbiAgYTEwID0gYVs0XTtcbiAgYTExID0gYVs1XTtcbiAgYTEyID0gYVs2XTtcbiAgYTEzID0gYVs3XTtcbiAgYTIwID0gYVs4XTtcbiAgYTIxID0gYVs5XTtcbiAgYTIyID0gYVsxMF07XG4gIGEyMyA9IGFbMTFdOyAvLyBDb25zdHJ1Y3QgdGhlIGVsZW1lbnRzIG9mIHRoZSByb3RhdGlvbiBtYXRyaXhcblxuICBiMDAgPSB4ICogeCAqIHQgKyBjO1xuICBiMDEgPSB5ICogeCAqIHQgKyB6ICogcztcbiAgYjAyID0geiAqIHggKiB0IC0geSAqIHM7XG4gIGIxMCA9IHggKiB5ICogdCAtIHogKiBzO1xuICBiMTEgPSB5ICogeSAqIHQgKyBjO1xuICBiMTIgPSB6ICogeSAqIHQgKyB4ICogcztcbiAgYjIwID0geCAqIHogKiB0ICsgeSAqIHM7XG4gIGIyMSA9IHkgKiB6ICogdCAtIHggKiBzO1xuICBiMjIgPSB6ICogeiAqIHQgKyBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGEwMCAqIGIwMCArIGExMCAqIGIwMSArIGEyMCAqIGIwMjtcbiAgb3V0WzFdID0gYTAxICogYjAwICsgYTExICogYjAxICsgYTIxICogYjAyO1xuICBvdXRbMl0gPSBhMDIgKiBiMDAgKyBhMTIgKiBiMDEgKyBhMjIgKiBiMDI7XG4gIG91dFszXSA9IGEwMyAqIGIwMCArIGExMyAqIGIwMSArIGEyMyAqIGIwMjtcbiAgb3V0WzRdID0gYTAwICogYjEwICsgYTEwICogYjExICsgYTIwICogYjEyO1xuICBvdXRbNV0gPSBhMDEgKiBiMTAgKyBhMTEgKiBiMTEgKyBhMjEgKiBiMTI7XG4gIG91dFs2XSA9IGEwMiAqIGIxMCArIGExMiAqIGIxMSArIGEyMiAqIGIxMjtcbiAgb3V0WzddID0gYTAzICogYjEwICsgYTEzICogYjExICsgYTIzICogYjEyO1xuICBvdXRbOF0gPSBhMDAgKiBiMjAgKyBhMTAgKiBiMjEgKyBhMjAgKiBiMjI7XG4gIG91dFs5XSA9IGEwMSAqIGIyMCArIGExMSAqIGIyMSArIGEyMSAqIGIyMjtcbiAgb3V0WzEwXSA9IGEwMiAqIGIyMCArIGExMiAqIGIyMSArIGEyMiAqIGIyMjtcbiAgb3V0WzExXSA9IGEwMyAqIGIyMCArIGExMyAqIGIyMSArIGEyMyAqIGIyMjtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTEwID0gYVs0XTtcbiAgdmFyIGExMSA9IGFbNV07XG4gIHZhciBhMTIgPSBhWzZdO1xuICB2YXIgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF07XG4gIHZhciBhMjEgPSBhWzldO1xuICB2YXIgYTIyID0gYVsxMF07XG4gIHZhciBhMjMgPSBhWzExXTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFs0XSA9IGExMCAqIGMgKyBhMjAgKiBzO1xuICBvdXRbNV0gPSBhMTEgKiBjICsgYTIxICogcztcbiAgb3V0WzZdID0gYTEyICogYyArIGEyMiAqIHM7XG4gIG91dFs3XSA9IGExMyAqIGMgKyBhMjMgKiBzO1xuICBvdXRbOF0gPSBhMjAgKiBjIC0gYTEwICogcztcbiAgb3V0WzldID0gYTIxICogYyAtIGExMSAqIHM7XG4gIG91dFsxMF0gPSBhMjIgKiBjIC0gYTEyICogcztcbiAgb3V0WzExXSA9IGEyMyAqIGMgLSBhMTMgKiBzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTAwID0gYVswXTtcbiAgdmFyIGEwMSA9IGFbMV07XG4gIHZhciBhMDIgPSBhWzJdO1xuICB2YXIgYTAzID0gYVszXTtcbiAgdmFyIGEyMCA9IGFbOF07XG4gIHZhciBhMjEgPSBhWzldO1xuICB2YXIgYTIyID0gYVsxMF07XG4gIHZhciBhMjMgPSBhWzExXTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFswXSA9IGEwMCAqIGMgLSBhMjAgKiBzO1xuICBvdXRbMV0gPSBhMDEgKiBjIC0gYTIxICogcztcbiAgb3V0WzJdID0gYTAyICogYyAtIGEyMiAqIHM7XG4gIG91dFszXSA9IGEwMyAqIGMgLSBhMjMgKiBzO1xuICBvdXRbOF0gPSBhMDAgKiBzICsgYTIwICogYztcbiAgb3V0WzldID0gYTAxICogcyArIGEyMSAqIGM7XG4gIG91dFsxMF0gPSBhMDIgKiBzICsgYTIyICogYztcbiAgb3V0WzExXSA9IGEwMyAqIHMgKyBhMjMgKiBjO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTAwID0gYVswXTtcbiAgdmFyIGEwMSA9IGFbMV07XG4gIHZhciBhMDIgPSBhWzJdO1xuICB2YXIgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF07XG4gIHZhciBhMTEgPSBhWzVdO1xuICB2YXIgYTEyID0gYVs2XTtcbiAgdmFyIGExMyA9IGFbN107XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFswXSA9IGEwMCAqIGMgKyBhMTAgKiBzO1xuICBvdXRbMV0gPSBhMDEgKiBjICsgYTExICogcztcbiAgb3V0WzJdID0gYTAyICogYyArIGExMiAqIHM7XG4gIG91dFszXSA9IGEwMyAqIGMgKyBhMTMgKiBzO1xuICBvdXRbNF0gPSBhMTAgKiBjIC0gYTAwICogcztcbiAgb3V0WzVdID0gYTExICogYyAtIGEwMSAqIHM7XG4gIG91dFs2XSA9IGExMiAqIGMgLSBhMDIgKiBzO1xuICBvdXRbN10gPSBhMTMgKiBjIC0gYTAzICogcztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSB2WzFdO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gdlsyXTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlIGFyb3VuZCBhIGdpdmVuIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkLCBheGlzKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQsIGF4aXMpIHtcbiAgdmFyIHggPSBheGlzWzBdLFxuICAgICAgeSA9IGF4aXNbMV0sXG4gICAgICB6ID0gYXhpc1syXTtcbiAgdmFyIGxlbiA9IE1hdGguaHlwb3QoeCwgeSwgeik7XG4gIHZhciBzLCBjLCB0O1xuXG4gIGlmIChsZW4gPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZW4gPSAxIC8gbGVuO1xuICB4ICo9IGxlbjtcbiAgeSAqPSBsZW47XG4gIHogKj0gbGVuO1xuICBzID0gTWF0aC5zaW4ocmFkKTtcbiAgYyA9IE1hdGguY29zKHJhZCk7XG4gIHQgPSAxIC0gYzsgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSB4ICogeCAqIHQgKyBjO1xuICBvdXRbMV0gPSB5ICogeCAqIHQgKyB6ICogcztcbiAgb3V0WzJdID0geiAqIHggKiB0IC0geSAqIHM7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHggKiB5ICogdCAtIHogKiBzO1xuICBvdXRbNV0gPSB5ICogeSAqIHQgKyBjO1xuICBvdXRbNl0gPSB6ICogeSAqIHQgKyB4ICogcztcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geCAqIHogKiB0ICsgeSAqIHM7XG4gIG91dFs5XSA9IHkgKiB6ICogdCAtIHggKiBzO1xuICBvdXRbMTBdID0geiAqIHogKiB0ICsgYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGVYKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21YUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBjO1xuICBvdXRbNl0gPSBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAtcztcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlWShkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHM7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZVooZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVpSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IC1zO1xuICBvdXRbNV0gPSBjO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xyXG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xyXG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIHEsIHYpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtICh5eSArIHp6KTtcbiAgb3V0WzFdID0geHkgKyB3ejtcbiAgb3V0WzJdID0geHogLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geHkgLSB3ejtcbiAgb3V0WzVdID0gMSAtICh4eCArIHp6KTtcbiAgb3V0WzZdID0geXogKyB3eDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geHogKyB3eTtcbiAgb3V0WzldID0geXogLSB3eDtcbiAgb3V0WzEwXSA9IDEgLSAoeHggKyB5eSk7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgZnJvbSBhIGR1YWwgcXVhdC5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgTWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb25cclxuICogQHJldHVybnMge21hdDR9IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdDIob3V0LCBhKSB7XG4gIHZhciB0cmFuc2xhdGlvbiA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddO1xuICB2YXIgbWFnbml0dWRlID0gYnggKiBieCArIGJ5ICogYnkgKyBieiAqIGJ6ICsgYncgKiBidzsgLy9Pbmx5IHNjYWxlIGlmIGl0IG1ha2VzIHNlbnNlXG5cbiAgaWYgKG1hZ25pdHVkZSA+IDApIHtcbiAgICB0cmFuc2xhdGlvblswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDIgLyBtYWduaXR1ZGU7XG4gICAgdHJhbnNsYXRpb25bMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzJdID0gKGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngpICogMiAvIG1hZ25pdHVkZTtcbiAgfSBlbHNlIHtcbiAgICB0cmFuc2xhdGlvblswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDI7XG4gICAgdHJhbnNsYXRpb25bMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzJdID0gKGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngpICogMjtcbiAgfVxuXG4gIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dCwgYSwgdHJhbnNsYXRpb24pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciBjb21wb25lbnQgb2YgYSB0cmFuc2Zvcm1hdGlvblxyXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLFxyXG4gKiAgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3JcclxuICogIG9yaWdpbmFsbHkgc3VwcGxpZWQuXHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSB0cmFuc2xhdGlvbiBjb21wb25lbnRcclxuICogQHBhcmFtICB7UmVhZG9ubHlNYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxyXG4gKiBAcmV0dXJuIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihvdXQsIG1hdCkge1xuICBvdXRbMF0gPSBtYXRbMTJdO1xuICBvdXRbMV0gPSBtYXRbMTNdO1xuICBvdXRbMl0gPSBtYXRbMTRdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNjYWxpbmcgZmFjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXHJcbiAqICBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGggZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZVxyXG4gKiAgd2l0aCBhIG5vcm1hbGl6ZWQgUXVhdGVybmlvbiBwYXJhbXRlciwgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlXHJcbiAqICB0aGUgc2FtZSBhcyB0aGUgc2NhbGluZyB2ZWN0b3JcclxuICogIG9yaWdpbmFsbHkgc3VwcGxpZWQuXHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnRcclxuICogQHBhcmFtICB7UmVhZG9ubHlNYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxyXG4gKiBAcmV0dXJuIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsaW5nKG91dCwgbWF0KSB7XG4gIHZhciBtMTEgPSBtYXRbMF07XG4gIHZhciBtMTIgPSBtYXRbMV07XG4gIHZhciBtMTMgPSBtYXRbMl07XG4gIHZhciBtMjEgPSBtYXRbNF07XG4gIHZhciBtMjIgPSBtYXRbNV07XG4gIHZhciBtMjMgPSBtYXRbNl07XG4gIHZhciBtMzEgPSBtYXRbOF07XG4gIHZhciBtMzIgPSBtYXRbOV07XG4gIHZhciBtMzMgPSBtYXRbMTBdO1xuICBvdXRbMF0gPSBNYXRoLmh5cG90KG0xMSwgbTEyLCBtMTMpO1xuICBvdXRbMV0gPSBNYXRoLmh5cG90KG0yMSwgbTIyLCBtMjMpO1xuICBvdXRbMl0gPSBNYXRoLmh5cG90KG0zMSwgbTMyLCBtMzMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcm90YXRpb25hbCBjb21wb25lbnRcclxuICogIG9mIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoXHJcbiAqICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbiwgdGhlIHJldHVybmVkIHF1YXRlcm5pb24gd2lsbCBiZSB0aGVcclxuICogIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gb3JpZ2luYWxseSBzdXBwbGllZC5cclxuICogQHBhcmFtIHtxdWF0fSBvdXQgUXVhdGVybmlvbiB0byByZWNlaXZlIHRoZSByb3RhdGlvbiBjb21wb25lbnRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXHJcbiAqIEByZXR1cm4ge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdGF0aW9uKG91dCwgbWF0KSB7XG4gIHZhciBzY2FsaW5nID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIGdldFNjYWxpbmcoc2NhbGluZywgbWF0KTtcbiAgdmFyIGlzMSA9IDEgLyBzY2FsaW5nWzBdO1xuICB2YXIgaXMyID0gMSAvIHNjYWxpbmdbMV07XG4gIHZhciBpczMgPSAxIC8gc2NhbGluZ1syXTtcbiAgdmFyIHNtMTEgPSBtYXRbMF0gKiBpczE7XG4gIHZhciBzbTEyID0gbWF0WzFdICogaXMyO1xuICB2YXIgc20xMyA9IG1hdFsyXSAqIGlzMztcbiAgdmFyIHNtMjEgPSBtYXRbNF0gKiBpczE7XG4gIHZhciBzbTIyID0gbWF0WzVdICogaXMyO1xuICB2YXIgc20yMyA9IG1hdFs2XSAqIGlzMztcbiAgdmFyIHNtMzEgPSBtYXRbOF0gKiBpczE7XG4gIHZhciBzbTMyID0gbWF0WzldICogaXMyO1xuICB2YXIgc20zMyA9IG1hdFsxMF0gKiBpczM7XG4gIHZhciB0cmFjZSA9IHNtMTEgKyBzbTIyICsgc20zMztcbiAgdmFyIFMgPSAwO1xuXG4gIGlmICh0cmFjZSA+IDApIHtcbiAgICBTID0gTWF0aC5zcXJ0KHRyYWNlICsgMS4wKSAqIDI7XG4gICAgb3V0WzNdID0gMC4yNSAqIFM7XG4gICAgb3V0WzBdID0gKHNtMjMgLSBzbTMyKSAvIFM7XG4gICAgb3V0WzFdID0gKHNtMzEgLSBzbTEzKSAvIFM7XG4gICAgb3V0WzJdID0gKHNtMTIgLSBzbTIxKSAvIFM7XG4gIH0gZWxzZSBpZiAoc20xMSA+IHNtMjIgJiYgc20xMSA+IHNtMzMpIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIHNtMTEgLSBzbTIyIC0gc20zMykgKiAyO1xuICAgIG91dFszXSA9IChzbTIzIC0gc20zMikgLyBTO1xuICAgIG91dFswXSA9IDAuMjUgKiBTO1xuICAgIG91dFsxXSA9IChzbTEyICsgc20yMSkgLyBTO1xuICAgIG91dFsyXSA9IChzbTMxICsgc20xMykgLyBTO1xuICB9IGVsc2UgaWYgKHNtMjIgPiBzbTMzKSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTIyIC0gc20xMSAtIHNtMzMpICogMjtcbiAgICBvdXRbM10gPSAoc20zMSAtIHNtMTMpIC8gUztcbiAgICBvdXRbMF0gPSAoc20xMiArIHNtMjEpIC8gUztcbiAgICBvdXRbMV0gPSAwLjI1ICogUztcbiAgICBvdXRbMl0gPSAoc20yMyArIHNtMzIpIC8gUztcbiAgfSBlbHNlIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIHNtMzMgLSBzbTExIC0gc20yMikgKiAyO1xuICAgIG91dFszXSA9IChzbTEyIC0gc20yMSkgLyBTO1xuICAgIG91dFswXSA9IChzbTMxICsgc20xMykgLyBTO1xuICAgIG91dFsxXSA9IChzbTIzICsgc20zMikgLyBTO1xuICAgIG91dFsyXSA9IDAuMjUgKiBTO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZVxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xyXG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xyXG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcyBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZShvdXQsIHEsIHYsIHMpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgb3V0WzBdID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIG91dFsxXSA9ICh4eSArIHd6KSAqIHN4O1xuICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gKHh5IC0gd3opICogc3k7XG4gIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICBvdXRbNl0gPSAoeXogKyB3eCkgKiBzeTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gIG91dFs5XSA9ICh5eiAtIHd4KSAqIHN6O1xuICBvdXRbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZSwgcm90YXRpbmcgYW5kIHNjYWxpbmcgYXJvdW5kIHRoZSBnaXZlbiBvcmlnaW5cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG9yaWdpbik7XHJcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XHJcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG5lZ2F0aXZlT3JpZ2luKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBzIFNjYWxpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBvIFRoZSBvcmlnaW4gdmVjdG9yIGFyb3VuZCB3aGljaCB0byBzY2FsZSBhbmQgcm90YXRlXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlT3JpZ2luKG91dCwgcSwgdiwgcywgbykge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICB2YXIgc3ggPSBzWzBdO1xuICB2YXIgc3kgPSBzWzFdO1xuICB2YXIgc3ogPSBzWzJdO1xuICB2YXIgb3ggPSBvWzBdO1xuICB2YXIgb3kgPSBvWzFdO1xuICB2YXIgb3ogPSBvWzJdO1xuICB2YXIgb3V0MCA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xuICB2YXIgb3V0MSA9ICh4eSArIHd6KSAqIHN4O1xuICB2YXIgb3V0MiA9ICh4eiAtIHd5KSAqIHN4O1xuICB2YXIgb3V0NCA9ICh4eSAtIHd6KSAqIHN5O1xuICB2YXIgb3V0NSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICB2YXIgb3V0NiA9ICh5eiArIHd4KSAqIHN5O1xuICB2YXIgb3V0OCA9ICh4eiArIHd5KSAqIHN6O1xuICB2YXIgb3V0OSA9ICh5eiAtIHd4KSAqIHN6O1xuICB2YXIgb3V0MTAgPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzBdID0gb3V0MDtcbiAgb3V0WzFdID0gb3V0MTtcbiAgb3V0WzJdID0gb3V0MjtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gb3V0NDtcbiAgb3V0WzVdID0gb3V0NTtcbiAgb3V0WzZdID0gb3V0NjtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gb3V0ODtcbiAgb3V0WzldID0gb3V0OTtcbiAgb3V0WzEwXSA9IG91dDEwO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF0gKyBveCAtIChvdXQwICogb3ggKyBvdXQ0ICogb3kgKyBvdXQ4ICogb3opO1xuICBvdXRbMTNdID0gdlsxXSArIG95IC0gKG91dDEgKiBveCArIG91dDUgKiBveSArIG91dDkgKiBveik7XG4gIG91dFsxNF0gPSB2WzJdICsgb3ogLSAob3V0MiAqIG94ICsgb3V0NiAqIG95ICsgb3V0MTAgKiBveik7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgYSA0eDQgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQob3V0LCBxKSB7XG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeXggPSB5ICogeDI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHp4ID0geiAqIHgyO1xuICB2YXIgenkgPSB6ICogeTI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gIG91dFsxXSA9IHl4ICsgd3o7XG4gIG91dFsyXSA9IHp4IC0gd3k7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHl4IC0gd3o7XG4gIG91dFs1XSA9IDEgLSB4eCAtIHp6O1xuICBvdXRbNl0gPSB6eSArIHd4O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB6eCArIHd5O1xuICBvdXRbOV0gPSB6eSAtIHd4O1xuICBvdXRbMTBdID0gMSAtIHh4IC0geXk7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBmcnVzdHVtIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge051bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcnVzdHVtKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIHJsID0gMSAvIChyaWdodCAtIGxlZnQpO1xuICB2YXIgdGIgPSAxIC8gKHRvcCAtIGJvdHRvbSk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IG5lYXIgKiAyICogcmw7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IG5lYXIgKiAyICogdGI7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IChyaWdodCArIGxlZnQpICogcmw7XG4gIG91dFs5XSA9ICh0b3AgKyBib3R0b20pICogdGI7XG4gIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgb3V0WzExXSA9IC0xO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSBmYXIgKiBuZWFyICogMiAqIG5mO1xuICBvdXRbMTVdID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXHJcbiAqIFBhc3NpbmcgbnVsbC91bmRlZmluZWQvbm8gdmFsdWUgZm9yIGZhciB3aWxsIGdlbmVyYXRlIGluZmluaXRlIHByb2plY3Rpb24gbWF0cml4LlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3Z5IFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xyXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxyXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtLCBjYW4gYmUgbnVsbCBvciBJbmZpbml0eVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGVyc3BlY3RpdmUob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgIG5mO1xuICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBmO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE1XSA9IDA7XG5cbiAgaWYgKGZhciAhPSBudWxsICYmIGZhciAhPT0gSW5maW5pdHkpIHtcbiAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxNF0gPSAyICogZmFyICogbmVhciAqIG5mO1xuICB9IGVsc2Uge1xuICAgIG91dFsxMF0gPSAtMTtcbiAgICBvdXRbMTRdID0gLTIgKiBuZWFyO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBmaWVsZCBvZiB2aWV3LlxyXG4gKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgcHJvamVjdGlvbiBtYXRyaWNlcyB0byBiZSB1c2VkXHJcbiAqIHdpdGggdGhlIHN0aWxsIGV4cGVyaWVtZW50YWwgV2ViVlIgQVBJLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBmb3YgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IHVwRGVncmVlcywgZG93bkRlZ3JlZXMsIGxlZnREZWdyZWVzLCByaWdodERlZ3JlZXNcclxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGVyc3BlY3RpdmVGcm9tRmllbGRPZlZpZXcob3V0LCBmb3YsIG5lYXIsIGZhcikge1xuICB2YXIgdXBUYW4gPSBNYXRoLnRhbihmb3YudXBEZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIGRvd25UYW4gPSBNYXRoLnRhbihmb3YuZG93bkRlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgbGVmdFRhbiA9IE1hdGgudGFuKGZvdi5sZWZ0RGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciByaWdodFRhbiA9IE1hdGgudGFuKGZvdi5yaWdodERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgeFNjYWxlID0gMi4wIC8gKGxlZnRUYW4gKyByaWdodFRhbik7XG4gIHZhciB5U2NhbGUgPSAyLjAgLyAodXBUYW4gKyBkb3duVGFuKTtcbiAgb3V0WzBdID0geFNjYWxlO1xuICBvdXRbMV0gPSAwLjA7XG4gIG91dFsyXSA9IDAuMDtcbiAgb3V0WzNdID0gMC4wO1xuICBvdXRbNF0gPSAwLjA7XG4gIG91dFs1XSA9IHlTY2FsZTtcbiAgb3V0WzZdID0gMC4wO1xuICBvdXRbN10gPSAwLjA7XG4gIG91dFs4XSA9IC0oKGxlZnRUYW4gLSByaWdodFRhbikgKiB4U2NhbGUgKiAwLjUpO1xuICBvdXRbOV0gPSAodXBUYW4gLSBkb3duVGFuKSAqIHlTY2FsZSAqIDAuNTtcbiAgb3V0WzEwXSA9IGZhciAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzExXSA9IC0xLjA7XG4gIG91dFsxMl0gPSAwLjA7XG4gIG91dFsxM10gPSAwLjA7XG4gIG91dFsxNF0gPSBmYXIgKiBuZWFyIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMTVdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gb3J0aG8ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCk7XG4gIHZhciBidCA9IDEgLyAoYm90dG9tIC0gdG9wKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gLTIgKiBscjtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gLTIgKiBidDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDIgKiBuZjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgb3V0WzE0XSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBsb29rLWF0IG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBleWUgcG9zaXRpb24sIGZvY2FsIHBvaW50LCBhbmQgdXAgYXhpcy5cclxuICogSWYgeW91IHdhbnQgYSBtYXRyaXggdGhhdCBhY3R1YWxseSBtYWtlcyBhbiBvYmplY3QgbG9vayBhdCBhbm90aGVyIG9iamVjdCwgeW91IHNob3VsZCB1c2UgdGFyZ2V0VG8gaW5zdGVhZC5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxvb2tBdChvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICB2YXIgeDAsIHgxLCB4MiwgeTAsIHkxLCB5MiwgejAsIHoxLCB6MiwgbGVuO1xuICB2YXIgZXlleCA9IGV5ZVswXTtcbiAgdmFyIGV5ZXkgPSBleWVbMV07XG4gIHZhciBleWV6ID0gZXllWzJdO1xuICB2YXIgdXB4ID0gdXBbMF07XG4gIHZhciB1cHkgPSB1cFsxXTtcbiAgdmFyIHVweiA9IHVwWzJdO1xuICB2YXIgY2VudGVyeCA9IGNlbnRlclswXTtcbiAgdmFyIGNlbnRlcnkgPSBjZW50ZXJbMV07XG4gIHZhciBjZW50ZXJ6ID0gY2VudGVyWzJdO1xuXG4gIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IGdsTWF0cml4LkVQU0lMT04gJiYgTWF0aC5hYnMoZXlleiAtIGNlbnRlcnopIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBpZGVudGl0eShvdXQpO1xuICB9XG5cbiAgejAgPSBleWV4IC0gY2VudGVyeDtcbiAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgejIgPSBleWV6IC0gY2VudGVyejtcbiAgbGVuID0gMSAvIE1hdGguaHlwb3QoejAsIHoxLCB6Mik7XG4gIHowICo9IGxlbjtcbiAgejEgKj0gbGVuO1xuICB6MiAqPSBsZW47XG4gIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyO1xuICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeDAsIHgxLCB4Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB4MCA9IDA7XG4gICAgeDEgPSAwO1xuICAgIHgyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHgwICo9IGxlbjtcbiAgICB4MSAqPSBsZW47XG4gICAgeDIgKj0gbGVuO1xuICB9XG5cbiAgeTAgPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcbiAgbGVuID0gTWF0aC5oeXBvdCh5MCwgeTEsIHkyKTtcblxuICBpZiAoIWxlbikge1xuICAgIHkwID0gMDtcbiAgICB5MSA9IDA7XG4gICAgeTIgPSAwO1xuICB9IGVsc2Uge1xuICAgIGxlbiA9IDEgLyBsZW47XG4gICAgeTAgKj0gbGVuO1xuICAgIHkxICo9IGxlbjtcbiAgICB5MiAqPSBsZW47XG4gIH1cblxuICBvdXRbMF0gPSB4MDtcbiAgb3V0WzFdID0geTA7XG4gIG91dFsyXSA9IHowO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB4MTtcbiAgb3V0WzVdID0geTE7XG4gIG91dFs2XSA9IHoxO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4MjtcbiAgb3V0WzldID0geTI7XG4gIG91dFsxMF0gPSB6MjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gIG91dFsxM10gPSAtKHkwICogZXlleCArIHkxICogZXlleSArIHkyICogZXlleik7XG4gIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIG1hdHJpeCB0aGF0IG1ha2VzIHNvbWV0aGluZyBsb29rIGF0IHNvbWV0aGluZyBlbHNlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdGFyZ2V0VG8ob3V0LCBleWUsIHRhcmdldCwgdXApIHtcbiAgdmFyIGV5ZXggPSBleWVbMF0sXG4gICAgICBleWV5ID0gZXllWzFdLFxuICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgdXB5ID0gdXBbMV0sXG4gICAgICB1cHogPSB1cFsyXTtcbiAgdmFyIHowID0gZXlleCAtIHRhcmdldFswXSxcbiAgICAgIHoxID0gZXlleSAtIHRhcmdldFsxXSxcbiAgICAgIHoyID0gZXlleiAtIHRhcmdldFsyXTtcbiAgdmFyIGxlbiA9IHowICogejAgKyB6MSAqIHoxICsgejIgKiB6MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcbiAgfVxuXG4gIHZhciB4MCA9IHVweSAqIHoyIC0gdXB6ICogejEsXG4gICAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejIsXG4gICAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gIGxlbiA9IHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIG91dFswXSA9IHgwO1xuICBvdXRbMV0gPSB4MTtcbiAgb3V0WzJdID0geDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHoxICogeDIgLSB6MiAqIHgxO1xuICBvdXRbNV0gPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgb3V0WzZdID0gejAgKiB4MSAtIHoxICogeDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHowO1xuICBvdXRbOV0gPSB6MTtcbiAgb3V0WzEwXSA9IHoyO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IGV5ZXg7XG4gIG91dFsxM10gPSBleWV5O1xuICBvdXRbMTRdID0gZXllejtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcIm1hdDQoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIsIFwiICsgYVs0XSArIFwiLCBcIiArIGFbNV0gKyBcIiwgXCIgKyBhWzZdICsgXCIsIFwiICsgYVs3XSArIFwiLCBcIiArIGFbOF0gKyBcIiwgXCIgKyBhWzldICsgXCIsIFwiICsgYVsxMF0gKyBcIiwgXCIgKyBhWzExXSArIFwiLCBcIiArIGFbMTJdICsgXCIsIFwiICsgYVsxM10gKyBcIiwgXCIgKyBhWzE0XSArIFwiLCBcIiArIGFbMTVdICsgXCIpXCI7XG59XG4vKipcclxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcclxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSwgYVs3XSwgYVs4XSwgYVs5XSwgYVsxMF0sIGFbMTFdLCBhWzEyXSwgYVsxM10sIGFbMTRdLCBhWzE1XSk7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0NCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgb3V0WzddID0gYVs3XSArIGJbN107XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdO1xuICBvdXRbOV0gPSBhWzldICsgYls5XTtcbiAgb3V0WzEwXSA9IGFbMTBdICsgYlsxMF07XG4gIG91dFsxMV0gPSBhWzExXSArIGJbMTFdO1xuICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdICsgYlsxM107XG4gIG91dFsxNF0gPSBhWzE0XSArIGJbMTRdO1xuICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICBvdXRbOV0gPSBhWzldIC0gYls5XTtcbiAgb3V0WzEwXSA9IGFbMTBdIC0gYlsxMF07XG4gIG91dFsxMV0gPSBhWzExXSAtIGJbMTFdO1xuICBvdXRbMTJdID0gYVsxMl0gLSBiWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdIC0gYlsxM107XG4gIG91dFsxNF0gPSBhWzE0XSAtIGJbMTRdO1xuICBvdXRbMTVdID0gYVsxNV0gLSBiWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICBvdXRbOF0gPSBhWzhdICogYjtcbiAgb3V0WzldID0gYVs5XSAqIGI7XG4gIG91dFsxMF0gPSBhWzEwXSAqIGI7XG4gIG91dFsxMV0gPSBhWzExXSAqIGI7XG4gIG91dFsxMl0gPSBhWzEyXSAqIGI7XG4gIG91dFsxM10gPSBhWzEzXSAqIGI7XG4gIG91dFsxNF0gPSBhWzE0XSAqIGI7XG4gIG91dFsxNV0gPSBhWzE1XSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0NCdzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICBvdXRbOV0gPSBhWzldICsgYls5XSAqIHNjYWxlO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXSAqIHNjYWxlO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXSAqIHNjYWxlO1xuICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXSAqIHNjYWxlO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXSAqIHNjYWxlO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XSAqIHNjYWxlO1xuICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XSAmJiBhWzldID09PSBiWzldICYmIGFbMTBdID09PSBiWzEwXSAmJiBhWzExXSA9PT0gYlsxMV0gJiYgYVsxMl0gPT09IGJbMTJdICYmIGFbMTNdID09PSBiWzEzXSAmJiBhWzE0XSA9PT0gYlsxNF0gJiYgYVsxNV0gPT09IGJbMTVdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddO1xuICB2YXIgYTggPSBhWzhdLFxuICAgICAgYTkgPSBhWzldLFxuICAgICAgYTEwID0gYVsxMF0sXG4gICAgICBhMTEgPSBhWzExXTtcbiAgdmFyIGExMiA9IGFbMTJdLFxuICAgICAgYTEzID0gYVsxM10sXG4gICAgICBhMTQgPSBhWzE0XSxcbiAgICAgIGExNSA9IGFbMTVdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICB2YXIgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddO1xuICB2YXIgYjggPSBiWzhdLFxuICAgICAgYjkgPSBiWzldLFxuICAgICAgYjEwID0gYlsxMF0sXG4gICAgICBiMTEgPSBiWzExXTtcbiAgdmFyIGIxMiA9IGJbMTJdLFxuICAgICAgYjEzID0gYlsxM10sXG4gICAgICBiMTQgPSBiWzE0XSxcbiAgICAgIGIxNSA9IGJbMTVdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOCksIE1hdGguYWJzKGI4KSkgJiYgTWF0aC5hYnMoYTkgLSBiOSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTkpLCBNYXRoLmFicyhiOSkpICYmIE1hdGguYWJzKGExMCAtIGIxMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEwKSwgTWF0aC5hYnMoYjEwKSkgJiYgTWF0aC5hYnMoYTExIC0gYjExKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTEpLCBNYXRoLmFicyhiMTEpKSAmJiBNYXRoLmFicyhhMTIgLSBiMTIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMiksIE1hdGguYWJzKGIxMikpICYmIE1hdGguYWJzKGExMyAtIGIxMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEzKSwgTWF0aC5hYnMoYjEzKSkgJiYgTWF0aC5hYnMoYTE0IC0gYjE0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTQpLCBNYXRoLmFicyhiMTQpKSAmJiBNYXRoLmFicyhhMTUgLSBiMTUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNSksIE1hdGguYWJzKGIxNSkpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDMgRGltZW5zaW9uYWwgVmVjdG9yXHJcbiAqIEBtb2R1bGUgdmVjM1xyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzNcclxuICpcclxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMyB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeikge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjZWlsXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLnJvdW5kKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyBhIHZlYzMgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTm9ybWFsaXplIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIG91dFsyXSA9IGFbMl0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07XG59XG4vKipcclxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdO1xuICB2YXIgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdO1xuICBvdXRbMF0gPSBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF4ICogYnkgLSBheSAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgaGVybWl0ZSBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaGVybWl0ZShvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGZhY3RvclRpbWVzMiAqICgyICogdCAtIDMpICsgMTtcbiAgdmFyIGZhY3RvcjIgPSBmYWN0b3JUaW1lczIgKiAodCAtIDIpICsgdDtcbiAgdmFyIGZhY3RvcjMgPSBmYWN0b3JUaW1lczIgKiAodCAtIDEpO1xuICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqICgzIC0gMiAqIHQpO1xuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgYmV6aWVyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBpbnZlcnNlRmFjdG9yID0gMSAtIHQ7XG4gIHZhciBpbnZlcnNlRmFjdG9yVGltZXNUd28gPSBpbnZlcnNlRmFjdG9yICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGludmVyc2VGYWN0b3JUaW1lc1R3byAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3IyID0gMyAqIHQgKiBpbnZlcnNlRmFjdG9yVGltZXNUd287XG4gIHZhciBmYWN0b3IzID0gMyAqIGZhY3RvclRpbWVzMiAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogdDtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICB2YXIgeiA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wIC0gMS4wO1xuICB2YXIgelNjYWxlID0gTWF0aC5zcXJ0KDEuMCAtIHogKiB6KSAqIHNjYWxlO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHpTY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQ0LlxyXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICB3ID0gdyB8fCAxLjA7XG4gIG91dFswXSA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgLyB3O1xuICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgb3V0WzJdID0gKG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSkgLyB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIHRoZSAzeDMgbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIHF1YXRcclxuICogQ2FuIGFsc28gYmUgdXNlZCBmb3IgZHVhbCBxdWF0ZXJuaW9ucy4gKE11bHRpcGx5IGl0IHdpdGggdGhlIHJlYWwgcGFydClcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgLy8gYmVuY2htYXJrczogaHR0cHM6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zLWZpeGVkXG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07IC8vIHZhciBxdmVjID0gW3F4LCBxeSwgcXpdO1xuICAvLyB2YXIgdXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCBhKTtcblxuICB2YXIgdXZ4ID0gcXkgKiB6IC0gcXogKiB5LFxuICAgICAgdXZ5ID0gcXogKiB4IC0gcXggKiB6LFxuICAgICAgdXZ6ID0gcXggKiB5IC0gcXkgKiB4OyAvLyB2YXIgdXV2ID0gdmVjMy5jcm9zcyhbXSwgcXZlYywgdXYpO1xuXG4gIHZhciB1dXZ4ID0gcXkgKiB1dnogLSBxeiAqIHV2eSxcbiAgICAgIHV1dnkgPSBxeiAqIHV2eCAtIHF4ICogdXZ6LFxuICAgICAgdXV2eiA9IHF4ICogdXZ5IC0gcXkgKiB1dng7IC8vIHZlYzMuc2NhbGUodXYsIHV2LCAyICogdyk7XG5cbiAgdmFyIHcyID0gcXcgKiAyO1xuICB1dnggKj0gdzI7XG4gIHV2eSAqPSB3MjtcbiAgdXZ6ICo9IHcyOyAvLyB2ZWMzLnNjYWxlKHV1diwgdXV2LCAyKTtcblxuICB1dXZ4ICo9IDI7XG4gIHV1dnkgKj0gMjtcbiAgdXV2eiAqPSAyOyAvLyByZXR1cm4gdmVjMy5hZGQob3V0LCBhLCB2ZWMzLmFkZChvdXQsIHV2LCB1dXYpKTtcblxuICBvdXRbMF0gPSB4ICsgdXZ4ICsgdXV2eDtcbiAgb3V0WzFdID0geSArIHV2eSArIHV1dnk7XG4gIG91dFsyXSA9IHogKyB1dnogKyB1dXZ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdO1xuICByWzFdID0gcFsxXSAqIE1hdGguY29zKHJhZCkgLSBwWzJdICogTWF0aC5zaW4ocmFkKTtcbiAgclsyXSA9IHBbMV0gKiBNYXRoLnNpbihyYWQpICsgcFsyXSAqIE1hdGguY29zKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzJdICogTWF0aC5zaW4ocmFkKSArIHBbMF0gKiBNYXRoLmNvcyhyYWQpO1xuICByWzFdID0gcFsxXTtcbiAgclsyXSA9IHBbMl0gKiBNYXRoLmNvcyhyYWQpIC0gcFswXSAqIE1hdGguc2luKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdICogTWF0aC5jb3MocmFkKSAtIHBbMV0gKiBNYXRoLnNpbihyYWQpO1xuICByWzFdID0gcFswXSAqIE1hdGguc2luKHJhZCkgKyBwWzFdICogTWF0aC5jb3MocmFkKTtcbiAgclsyXSA9IHBbMl07IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gM0QgdmVjdG9yc1xyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBtYWcxID0gTWF0aC5zcXJ0KGF4ICogYXggKyBheSAqIGF5ICsgYXogKiBheiksXG4gICAgICBtYWcyID0gTWF0aC5zcXJ0KGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiksXG4gICAgICBtYWcgPSBtYWcxICogbWFnMixcbiAgICAgIGNvc2luZSA9IG1hZyAmJiBkb3QoYSwgYikgLyBtYWc7XG4gIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpKTtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHplcm9cclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMyhcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpdmlkZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWREaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzNzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzMuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDM7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICB2ZWNbMl0gPSBhW2kgKyAyXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgICAgYVtpICsgMl0gPSB2ZWNbMl07XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcclxuICogNCBEaW1lbnNpb25hbCBWZWN0b3JcclxuICogQG1vZHVsZSB2ZWM0XHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjNFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjNCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeiwgdykge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5jZWlsKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguZmxvb3IoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICBvdXRbM10gPSBNYXRoLm1pbihhWzNdLCBiWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByb3VuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIG91dFszXSA9IE1hdGgucm91bmQoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIGEgdmVjNCBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzQncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgdmFyIHcgPSBiWzNdIC0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHosIHcpO1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSAtYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdztcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IHggKiBsZW47XG4gIG91dFsxXSA9IHkgKiBsZW47XG4gIG91dFsyXSA9IHogKiBsZW47XG4gIG91dFszXSA9IHcgKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBjcm9zcy1wcm9kdWN0IG9mIHRocmVlIHZlY3RvcnMgaW4gYSA0LWRpbWVuc2lvbmFsIHNwYWNlXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSByZXN1bHQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFUgdGhlIGZpcnN0IHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVyB0aGUgdGhpcmQgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSByZXN1bHRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIHUsIHYsIHcpIHtcbiAgdmFyIEEgPSB2WzBdICogd1sxXSAtIHZbMV0gKiB3WzBdLFxuICAgICAgQiA9IHZbMF0gKiB3WzJdIC0gdlsyXSAqIHdbMF0sXG4gICAgICBDID0gdlswXSAqIHdbM10gLSB2WzNdICogd1swXSxcbiAgICAgIEQgPSB2WzFdICogd1syXSAtIHZbMl0gKiB3WzFdLFxuICAgICAgRSA9IHZbMV0gKiB3WzNdIC0gdlszXSAqIHdbMV0sXG4gICAgICBGID0gdlsyXSAqIHdbM10gLSB2WzNdICogd1syXTtcbiAgdmFyIEcgPSB1WzBdO1xuICB2YXIgSCA9IHVbMV07XG4gIHZhciBJID0gdVsyXTtcbiAgdmFyIEogPSB1WzNdO1xuICBvdXRbMF0gPSBIICogRiAtIEkgKiBFICsgSiAqIEQ7XG4gIG91dFsxXSA9IC0oRyAqIEYpICsgSSAqIEMgLSBKICogQjtcbiAgb3V0WzJdID0gRyAqIEUgLSBIICogQyArIEogKiBBO1xuICBvdXRbM10gPSAtKEcgKiBEKSArIEggKiBCIC0gSSAqIEE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF07XG4gIHZhciBheSA9IGFbMV07XG4gIHZhciBheiA9IGFbMl07XG4gIHZhciBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gIG91dFszXSA9IGF3ICsgdCAqIChiWzNdIC0gYXcpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDsgLy8gTWFyc2FnbGlhLCBHZW9yZ2UuIENob29zaW5nIGEgUG9pbnQgZnJvbSB0aGUgU3VyZmFjZSBvZiBhXG4gIC8vIFNwaGVyZS4gQW5uLiBNYXRoLiBTdGF0aXN0LiA0MyAoMTk3MiksIG5vLiAyLCA2NDUtLTY0Ni5cbiAgLy8gaHR0cDovL3Byb2plY3RldWNsaWQub3JnL2V1Y2xpZC5hb21zLzExNzc2OTI2NDQ7XG5cbiAgdmFyIHYxLCB2MiwgdjMsIHY0O1xuICB2YXIgczEsIHMyO1xuXG4gIGRvIHtcbiAgICB2MSA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMxID0gdjEgKiB2MSArIHYyICogdjI7XG4gIH0gd2hpbGUgKHMxID49IDEpO1xuXG4gIGRvIHtcbiAgICB2MyA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgdjQgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHMyID0gdjMgKiB2MyArIHY0ICogdjQ7XG4gIH0gd2hpbGUgKHMyID49IDEpO1xuXG4gIHZhciBkID0gTWF0aC5zcXJ0KCgxIC0gczEpIC8gczIpO1xuICBvdXRbMF0gPSBzY2FsZSAqIHYxO1xuICBvdXRbMV0gPSBzY2FsZSAqIHYyO1xuICBvdXRbMl0gPSBzY2FsZSAqIHYzICogZDtcbiAgb3V0WzNdID0gc2NhbGUgKiB2NCAqIGQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIHF1YXRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTsgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcblxuICB2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG4gIHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcbiAgdmFyIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuICB2YXIgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6OyAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cbiAgb3V0WzBdID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcbiAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHplcm9cclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWM0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnN1YnRyYWN0fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjNHMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDQ7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICB2ZWNbMl0gPSBhW2kgKyAyXTtcbiAgICAgIHZlY1szXSA9IGFbaSArIDNdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICAgIGFbaSArIDNdID0gdmVjWzNdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0ICogYXMgbWF0MyBmcm9tIFwiLi9tYXQzLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWMzIGZyb20gXCIuL3ZlYzMuanNcIjtcbmltcG9ydCAqIGFzIHZlYzQgZnJvbSBcIi4vdmVjNC5qc1wiO1xuLyoqXHJcbiAqIFF1YXRlcm5pb25cclxuICogQG1vZHVsZSBxdWF0XHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBxdWF0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gIH1cblxuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCBhIHF1YXQgdG8gdGhlIGlkZW50aXR5IHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXRzIGEgcXVhdCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhbmQgcm90YXRpb24gYXhpcyxcclxuICogdGhlbiByZXR1cm5zIGl0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXhpc0FuZ2xlKG91dCwgYXhpcywgcmFkKSB7XG4gIHJhZCA9IHJhZCAqIDAuNTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICBvdXRbMF0gPSBzICogYXhpc1swXTtcbiAgb3V0WzFdID0gcyAqIGF4aXNbMV07XG4gIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICBvdXRbM10gPSBNYXRoLmNvcyhyYWQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldHMgdGhlIHJvdGF0aW9uIGF4aXMgYW5kIGFuZ2xlIGZvciBhIGdpdmVuXHJcbiAqICBxdWF0ZXJuaW9uLiBJZiBhIHF1YXRlcm5pb24gaXMgY3JlYXRlZCB3aXRoXHJcbiAqICBzZXRBeGlzQW5nbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lXHJcbiAqICB2YWx1ZXMgYXMgcHJvdmlkaWVkIGluIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIgbGlzdFxyXG4gKiAgT1IgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdmFsdWVzLlxyXG4gKiBFeGFtcGxlOiBUaGUgcXVhdGVybmlvbiBmb3JtZWQgYnkgYXhpcyBbMCwgMCwgMV0gYW5kXHJcbiAqICBhbmdsZSAtOTAgaXMgdGhlIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gZm9ybWVkIGJ5XHJcbiAqICBbMCwgMCwgMV0gYW5kIDI3MC4gVGhpcyBtZXRob2QgZmF2b3JzIHRoZSBsYXR0ZXIuXHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dF9heGlzICBWZWN0b3IgcmVjZWl2aW5nIHRoZSBheGlzIG9mIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdH0gcSAgICAgUXVhdGVybmlvbiB0byBiZSBkZWNvbXBvc2VkXHJcbiAqIEByZXR1cm4ge051bWJlcn0gICAgIEFuZ2xlLCBpbiByYWRpYW5zLCBvZiB0aGUgcm90YXRpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGlzQW5nbGUob3V0X2F4aXMsIHEpIHtcbiAgdmFyIHJhZCA9IE1hdGguYWNvcyhxWzNdKSAqIDIuMDtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQgLyAyLjApO1xuXG4gIGlmIChzID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIG91dF9heGlzWzBdID0gcVswXSAvIHM7XG4gICAgb3V0X2F4aXNbMV0gPSBxWzFdIC8gcztcbiAgICBvdXRfYXhpc1syXSA9IHFbMl0gLyBzO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHMgaXMgemVybywgcmV0dXJuIGFueSBheGlzIChubyByb3RhdGlvbiAtIGF4aXMgZG9lcyBub3QgbWF0dGVyKVxuICAgIG91dF9heGlzWzBdID0gMTtcbiAgICBvdXRfYXhpc1sxXSA9IDA7XG4gICAgb3V0X2F4aXNbMl0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJhZDtcbn1cbi8qKlxyXG4gKiBHZXRzIHRoZSBhbmd1bGFyIGRpc3RhbmNlIGJldHdlZW4gdHdvIHVuaXQgcXVhdGVybmlvbnNcclxuICpcclxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0fSBhICAgICBPcmlnaW4gdW5pdCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdH0gYiAgICAgRGVzdGluYXRpb24gdW5pdCBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm4ge051bWJlcn0gICAgIEFuZ2xlLCBpbiByYWRpYW5zLCBiZXR3ZWVuIHRoZSB0d28gcXVhdGVybmlvbnNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmdsZShhLCBiKSB7XG4gIHZhciBkb3Rwcm9kdWN0ID0gZG90KGEsIGIpO1xuICByZXR1cm4gTWF0aC5hY29zKDIgKiBkb3Rwcm9kdWN0ICogZG90cHJvZHVjdCAtIDEpO1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFggYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnggPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieDtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF6ICogYng7XG4gIG91dFsyXSA9IGF6ICogYncgLSBheSAqIGJ4O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFkgYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnkgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gIG91dFsyXSA9IGF6ICogYncgKyBheCAqIGJ5O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXkgKiBieTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFogYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnogPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3ICsgYXkgKiBiejtcbiAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBXIGNvbXBvbmVudCBvZiBhIHF1YXQgZnJvbSB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cy5cclxuICogQXNzdW1lcyB0aGF0IHF1YXRlcm5pb24gaXMgMSB1bml0IGluIGxlbmd0aC5cclxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIFcgY29tcG9uZW50IG9mXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBleHBvbmVudGlhbCBvZiBhIHVuaXQgcXVhdGVybmlvbi5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIHRoZSBleHBvbmVudGlhbCBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciBldCA9IE1hdGguZXhwKHcpO1xuICB2YXIgcyA9IHIgPiAwID8gZXQgKiBNYXRoLnNpbihyKSAvIHIgOiAwO1xuICBvdXRbMF0gPSB4ICogcztcbiAgb3V0WzFdID0geSAqIHM7XG4gIG91dFsyXSA9IHogKiBzO1xuICBvdXRbM10gPSBldCAqIE1hdGguY29zKHIpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgYSB1bml0IHF1YXRlcm5pb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxuKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciB0ID0gciA+IDAgPyBNYXRoLmF0YW4yKHIsIHcpIC8gciA6IDA7XG4gIG91dFswXSA9IHggKiB0O1xuICBvdXRbMV0gPSB5ICogdDtcbiAgb3V0WzJdID0geiAqIHQ7XG4gIG91dFszXSA9IDAuNSAqIE1hdGgubG9nKHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIHNjYWxhciBwb3dlciBvZiBhIHVuaXQgcXVhdGVybmlvbi5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIHRoZSBleHBvbmVudGlhbCBvZlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHF1YXRlcm5pb24gYnlcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvdyhvdXQsIGEsIGIpIHtcbiAgbG4ob3V0LCBhKTtcbiAgc2NhbGUob3V0LCBvdXQsIGIpO1xuICBleHAob3V0LCBvdXQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHF1YXRcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgLy8gYmVuY2htYXJrczpcbiAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgdmFyIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxOyAvLyBjYWxjIGNvc2luZVxuXG4gIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidzsgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG5cbiAgaWYgKGNvc29tIDwgMC4wKSB7XG4gICAgY29zb20gPSAtY29zb207XG4gICAgYnggPSAtYng7XG4gICAgYnkgPSAtYnk7XG4gICAgYnogPSAtYno7XG4gICAgYncgPSAtYnc7XG4gIH0gLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuXG5cbiAgaWYgKDEuMCAtIGNvc29tID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKVxuICAgIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcbiAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XG4gIH0gZWxzZSB7XG4gICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgIC8vICAuLi4gc28gd2UgY2FuIGRvIGEgbGluZWFyIGludGVycG9sYXRpb25cbiAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgIHNjYWxlMSA9IHQ7XG4gIH0gLy8gY2FsY3VsYXRlIGZpbmFsIHZhbHVlc1xuXG5cbiAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgb3V0WzFdID0gc2NhbGUwICogYXkgKyBzY2FsZTEgKiBieTtcbiAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdW5pdCBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCkge1xuICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBodHRwOi8vcGxhbm5pbmcuY3MudWl1Yy5lZHUvbm9kZTE5OC5odG1sXG4gIC8vIFRPRE86IENhbGxpbmcgcmFuZG9tIDMgdGltZXMgaXMgcHJvYmFibHkgbm90IHRoZSBmYXN0ZXN0IHNvbHV0aW9uXG4gIHZhciB1MSA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgdTIgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHUzID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciBzcXJ0MU1pbnVzVTEgPSBNYXRoLnNxcnQoMSAtIHUxKTtcbiAgdmFyIHNxcnRVMSA9IE1hdGguc3FydCh1MSk7XG4gIG91dFswXSA9IHNxcnQxTWludXNVMSAqIE1hdGguc2luKDIuMCAqIE1hdGguUEkgKiB1Mik7XG4gIG91dFsxXSA9IHNxcnQxTWludXNVMSAqIE1hdGguY29zKDIuMCAqIE1hdGguUEkgKiB1Mik7XG4gIG91dFsyXSA9IHNxcnRVMSAqIE1hdGguc2luKDIuMCAqIE1hdGguUEkgKiB1Myk7XG4gIG91dFszXSA9IHNxcnRVMSAqIE1hdGguY29zKDIuMCAqIE1hdGguUEkgKiB1Myk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgaW52ZXJzZSBvZiBhIHF1YXRcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGRvdCA9IGEwICogYTAgKyBhMSAqIGExICsgYTIgKiBhMiArIGEzICogYTM7XG4gIHZhciBpbnZEb3QgPSBkb3QgPyAxLjAgLyBkb3QgOiAwOyAvLyBUT0RPOiBXb3VsZCBiZSBmYXN0ZXIgdG8gcmV0dXJuIFswLDAsMCwwXSBpbW1lZGlhdGVseSBpZiBkb3QgPT0gMFxuXG4gIG91dFswXSA9IC1hMCAqIGludkRvdDtcbiAgb3V0WzFdID0gLWExICogaW52RG90O1xuICBvdXRbMl0gPSAtYTIgKiBpbnZEb3Q7XG4gIG91dFszXSA9IGEzICogaW52RG90O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRcclxuICogSWYgdGhlIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiBxdWF0LmludmVyc2UgYW5kIHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdC5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIDN4MyByb3RhdGlvbiBtYXRyaXguXHJcbiAqXHJcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXHJcbiAqIHRvIHJlbm9ybWFsaXplIHRoZSBxdWF0ZXJuaW9uIHlvdXJzZWxmIHdoZXJlIG5lY2Vzc2FyeS5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIHJvdGF0aW9uIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQzKG91dCwgbSkge1xuICAvLyBBbGdvcml0aG0gaW4gS2VuIFNob2VtYWtlJ3MgYXJ0aWNsZSBpbiAxOTg3IFNJR0dSQVBIIGNvdXJzZSBub3Rlc1xuICAvLyBhcnRpY2xlIFwiUXVhdGVybmlvbiBDYWxjdWx1cyBhbmQgRmFzdCBBbmltYXRpb25cIi5cbiAgdmFyIGZUcmFjZSA9IG1bMF0gKyBtWzRdICsgbVs4XTtcbiAgdmFyIGZSb290O1xuXG4gIGlmIChmVHJhY2UgPiAwLjApIHtcbiAgICAvLyB8d3wgPiAxLzIsIG1heSBhcyB3ZWxsIGNob29zZSB3ID4gMS8yXG4gICAgZlJvb3QgPSBNYXRoLnNxcnQoZlRyYWNlICsgMS4wKTsgLy8gMndcblxuICAgIG91dFszXSA9IDAuNSAqIGZSb290O1xuICAgIGZSb290ID0gMC41IC8gZlJvb3Q7IC8vIDEvKDR3KVxuXG4gICAgb3V0WzBdID0gKG1bNV0gLSBtWzddKSAqIGZSb290O1xuICAgIG91dFsxXSA9IChtWzZdIC0gbVsyXSkgKiBmUm9vdDtcbiAgICBvdXRbMl0gPSAobVsxXSAtIG1bM10pICogZlJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgLy8gfHd8IDw9IDEvMlxuICAgIHZhciBpID0gMDtcbiAgICBpZiAobVs0XSA+IG1bMF0pIGkgPSAxO1xuICAgIGlmIChtWzhdID4gbVtpICogMyArIGldKSBpID0gMjtcbiAgICB2YXIgaiA9IChpICsgMSkgJSAzO1xuICAgIHZhciBrID0gKGkgKyAyKSAlIDM7XG4gICAgZlJvb3QgPSBNYXRoLnNxcnQobVtpICogMyArIGldIC0gbVtqICogMyArIGpdIC0gbVtrICogMyArIGtdICsgMS4wKTtcbiAgICBvdXRbaV0gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290O1xuICAgIG91dFszXSA9IChtW2ogKiAzICsga10gLSBtW2sgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2pdID0gKG1baiAqIDMgKyBpXSArIG1baSAqIDMgKyBqXSkgKiBmUm9vdDtcbiAgICBvdXRba10gPSAobVtrICogMyArIGldICsgbVtpICogMyArIGtdKSAqIGZSb290O1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiBldWxlciBhbmdsZSB4LCB5LCB6LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHt4fSBBbmdsZSB0byByb3RhdGUgYXJvdW5kIFggYXhpcyBpbiBkZWdyZWVzLlxyXG4gKiBAcGFyYW0ge3l9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWSBheGlzIGluIGRlZ3JlZXMuXHJcbiAqIEBwYXJhbSB7en0gQW5nbGUgdG8gcm90YXRlIGFyb3VuZCBaIGF4aXMgaW4gZGVncmVlcy5cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXVsZXIob3V0LCB4LCB5LCB6KSB7XG4gIHZhciBoYWxmVG9SYWQgPSAwLjUgKiBNYXRoLlBJIC8gMTgwLjA7XG4gIHggKj0gaGFsZlRvUmFkO1xuICB5ICo9IGhhbGZUb1JhZDtcbiAgeiAqPSBoYWxmVG9SYWQ7XG4gIHZhciBzeCA9IE1hdGguc2luKHgpO1xuICB2YXIgY3ggPSBNYXRoLmNvcyh4KTtcbiAgdmFyIHN5ID0gTWF0aC5zaW4oeSk7XG4gIHZhciBjeSA9IE1hdGguY29zKHkpO1xuICB2YXIgc3ogPSBNYXRoLnNpbih6KTtcbiAgdmFyIGN6ID0gTWF0aC5jb3Moeik7XG4gIG91dFswXSA9IHN4ICogY3kgKiBjeiAtIGN4ICogc3kgKiBzejtcbiAgb3V0WzFdID0gY3ggKiBzeSAqIGN6ICsgc3ggKiBjeSAqIHN6O1xuICBvdXRbMl0gPSBjeCAqIGN5ICogc3ogLSBzeCAqIHN5ICogY3o7XG4gIG91dFszXSA9IGN4ICogY3kgKiBjeiArIHN4ICogc3kgKiBzejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcXVhdGVuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJxdWF0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdGVybmlvbiB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgY2xvbmUgPSB2ZWM0LmNsb25lO1xuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHF1YXQgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIHNvdXJjZSBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGNvcHkgPSB2ZWM0LmNvcHk7XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgcXVhdCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzZXQgPSB2ZWM0LnNldDtcbi8qKlxyXG4gKiBBZGRzIHR3byBxdWF0J3NcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBhZGQgPSB2ZWM0LmFkZDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBTY2FsZXMgYSBxdWF0IGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNjYWxlID0gdmVjNC5zY2FsZTtcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkb3QgPSB2ZWM0LmRvdDtcbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVycCA9IHZlYzQubGVycDtcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHZlYzQubGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3F1YXJlZExlbmd0aCA9IHZlYzQuc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogTm9ybWFsaXplIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdGVybmlvbiB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbm9ybWFsaXplID0gdmVjNC5ub3JtYWxpemU7XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcXVhdGVybmlvbnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBUaGUgZmlyc3QgcXVhdGVybmlvbi5cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgVGhlIHNlY29uZCBxdWF0ZXJuaW9uLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCB2YXIgZXhhY3RFcXVhbHMgPSB2ZWM0LmV4YWN0RXF1YWxzO1xuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IHZhciBlcXVhbHMgPSB2ZWM0LmVxdWFscztcbi8qKlxyXG4gKiBTZXRzIGEgcXVhdGVybmlvbiB0byByZXByZXNlbnQgdGhlIHNob3J0ZXN0IHJvdGF0aW9uIGZyb20gb25lXHJcbiAqIHZlY3RvciB0byBhbm90aGVyLlxyXG4gKlxyXG4gKiBCb3RoIHZlY3RvcnMgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGguXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvbi5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGluaXRpYWwgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IHZhciByb3RhdGlvblRvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdG1wdmVjMyA9IHZlYzMuY3JlYXRlKCk7XG4gIHZhciB4VW5pdFZlYzMgPSB2ZWMzLmZyb21WYWx1ZXMoMSwgMCwgMCk7XG4gIHZhciB5VW5pdFZlYzMgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGRvdCA9IHZlYzMuZG90KGEsIGIpO1xuXG4gICAgaWYgKGRvdCA8IC0wLjk5OTk5OSkge1xuICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCB4VW5pdFZlYzMsIGEpO1xuICAgICAgaWYgKHZlYzMubGVuKHRtcHZlYzMpIDwgMC4wMDAwMDEpIHZlYzMuY3Jvc3ModG1wdmVjMywgeVVuaXRWZWMzLCBhKTtcbiAgICAgIHZlYzMubm9ybWFsaXplKHRtcHZlYzMsIHRtcHZlYzMpO1xuICAgICAgc2V0QXhpc0FuZ2xlKG91dCwgdG1wdmVjMywgTWF0aC5QSSk7XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH0gZWxzZSBpZiAoZG90ID4gMC45OTk5OTkpIHtcbiAgICAgIG91dFswXSA9IDA7XG4gICAgICBvdXRbMV0gPSAwO1xuICAgICAgb3V0WzJdID0gMDtcbiAgICAgIG91dFszXSA9IDE7XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIGEsIGIpO1xuICAgICAgb3V0WzBdID0gdG1wdmVjM1swXTtcbiAgICAgIG91dFsxXSA9IHRtcHZlYzNbMV07XG4gICAgICBvdXRbMl0gPSB0bXB2ZWMzWzJdO1xuICAgICAgb3V0WzNdID0gMSArIGRvdDtcbiAgICAgIHJldHVybiBub3JtYWxpemUob3V0LCBvdXQpO1xuICAgIH1cbiAgfTtcbn0oKTtcbi8qKlxyXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBjIHRoZSB0aGlyZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBkIHRoZSBmb3VydGggb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCB2YXIgc3FsZXJwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGVtcDEgPSBjcmVhdGUoKTtcbiAgdmFyIHRlbXAyID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gICAgc2xlcnAodGVtcDEsIGEsIGQsIHQpO1xuICAgIHNsZXJwKHRlbXAyLCBiLCBjLCB0KTtcbiAgICBzbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTtcbiAgICByZXR1cm4gb3V0O1xuICB9O1xufSgpO1xuLyoqXHJcbiAqIFNldHMgdGhlIHNwZWNpZmllZCBxdWF0ZXJuaW9uIHdpdGggdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuXHJcbiAqIGF4ZXMuIEVhY2ggYXhpcyBpcyBhIHZlYzMgYW5kIGlzIGV4cGVjdGVkIHRvIGJlIHVuaXQgbGVuZ3RoIGFuZFxyXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHZpZXcgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSB2aWV3aW5nIGRpcmVjdGlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcmlnaHQgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIFwicmlnaHRcIiBkaXJlY3Rpb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwICAgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBcInVwXCIgZGlyZWN0aW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCB2YXIgc2V0QXhlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgbWF0clswXSA9IHJpZ2h0WzBdO1xuICAgIG1hdHJbM10gPSByaWdodFsxXTtcbiAgICBtYXRyWzZdID0gcmlnaHRbMl07XG4gICAgbWF0clsxXSA9IHVwWzBdO1xuICAgIG1hdHJbNF0gPSB1cFsxXTtcbiAgICBtYXRyWzddID0gdXBbMl07XG4gICAgbWF0clsyXSA9IC12aWV3WzBdO1xuICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICBtYXRyWzhdID0gLXZpZXdbMl07XG4gICAgcmV0dXJuIG5vcm1hbGl6ZShvdXQsIGZyb21NYXQzKG91dCwgbWF0cikpO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0ICogYXMgcXVhdCBmcm9tIFwiLi9xdWF0LmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQ0IGZyb20gXCIuL21hdDQuanNcIjtcbi8qKlxyXG4gKiBEdWFsIFF1YXRlcm5pb248YnI+XHJcbiAqIEZvcm1hdDogW3JlYWwsIGR1YWxdPGJyPlxyXG4gKiBRdWF0ZXJuaW9uIGZvcm1hdDogWFlaVzxicj5cclxuICogTWFrZSBzdXJlIHRvIGhhdmUgbm9ybWFsaXplZCBkdWFsIHF1YXRlcm5pb25zLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9ucyBtYXkgbm90IHdvcmsgYXMgaW50ZW5kZWQuPGJyPlxyXG4gKiBAbW9kdWxlIHF1YXQyXHJcbiAqL1xuXG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBkdWFsIHF1YXRcclxuICpcclxuICogQHJldHVybnMge3F1YXQyfSBhIG5ldyBkdWFsIHF1YXRlcm5pb24gW3JlYWwgLT4gcm90YXRpb24sIGR1YWwgLT4gdHJhbnNsYXRpb25dXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgZHEgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg4KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBkcVswXSA9IDA7XG4gICAgZHFbMV0gPSAwO1xuICAgIGRxWzJdID0gMDtcbiAgICBkcVs0XSA9IDA7XG4gICAgZHFbNV0gPSAwO1xuICAgIGRxWzZdID0gMDtcbiAgICBkcVs3XSA9IDA7XG4gIH1cblxuICBkcVszXSA9IDE7XG4gIHJldHVybiBkcTtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gY2xvbmVcclxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0gYVswXTtcbiAgZHFbMV0gPSBhWzFdO1xuICBkcVsyXSA9IGFbMl07XG4gIGRxWzNdID0gYVszXTtcbiAgZHFbNF0gPSBhWzRdO1xuICBkcVs1XSA9IGFbNV07XG4gIGRxWzZdID0gYVs2XTtcbiAgZHFbN10gPSBhWzddO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdzIgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIsIHcyKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IHgxO1xuICBkcVsxXSA9IHkxO1xuICBkcVsyXSA9IHoxO1xuICBkcVszXSA9IHcxO1xuICBkcVs0XSA9IHgyO1xuICBkcVs1XSA9IHkyO1xuICBkcVs2XSA9IHoyO1xuICBkcVs3XSA9IHcyO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gdmFsdWVzIChxdWF0IGFuZCB0cmFuc2xhdGlvbilcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHgxIFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gejEgWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcxIFcgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblZhbHVlcyh4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6Mikge1xuICB2YXIgZHEgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg4KTtcbiAgZHFbMF0gPSB4MTtcbiAgZHFbMV0gPSB5MTtcbiAgZHFbMl0gPSB6MTtcbiAgZHFbM10gPSB3MTtcbiAgdmFyIGF4ID0geDIgKiAwLjUsXG4gICAgICBheSA9IHkyICogMC41LFxuICAgICAgYXogPSB6MiAqIDAuNTtcbiAgZHFbNF0gPSBheCAqIHcxICsgYXkgKiB6MSAtIGF6ICogeTE7XG4gIGRxWzVdID0gYXkgKiB3MSArIGF6ICogeDEgLSBheCAqIHoxO1xuICBkcVs2XSA9IGF6ICogdzEgKyBheCAqIHkxIC0gYXkgKiB4MTtcbiAgZHFbN10gPSAtYXggKiB4MSAtIGF5ICogeTEgLSBheiAqIHoxO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgcXVhdGVybmlvbiBhbmQgYSB0cmFuc2xhdGlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBhIG5vcm1hbGl6ZWQgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdCB0cmFubGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIHEsIHQpIHtcbiAgdmFyIGF4ID0gdFswXSAqIDAuNSxcbiAgICAgIGF5ID0gdFsxXSAqIDAuNSxcbiAgICAgIGF6ID0gdFsyXSAqIDAuNSxcbiAgICAgIGJ4ID0gcVswXSxcbiAgICAgIGJ5ID0gcVsxXSxcbiAgICAgIGJ6ID0gcVsyXSxcbiAgICAgIGJ3ID0gcVszXTtcbiAgb3V0WzBdID0gYng7XG4gIG91dFsxXSA9IGJ5O1xuICBvdXRbMl0gPSBiejtcbiAgb3V0WzNdID0gYnc7XG4gIG91dFs0XSA9IGF4ICogYncgKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbNl0gPSBheiAqIGJ3ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFs3XSA9IC1heCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgdHJhbnNsYXRpb25cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHQgdHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHQpIHtcbiAgb3V0WzBdID0gMDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgb3V0WzRdID0gdFswXSAqIDAuNTtcbiAgb3V0WzVdID0gdFsxXSAqIDAuNTtcbiAgb3V0WzZdID0gdFsyXSAqIDAuNTtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgZHVhbCBxdWF0IGZyb20gYSBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHRoZSBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHEpIHtcbiAgb3V0WzBdID0gcVswXTtcbiAgb3V0WzFdID0gcVsxXTtcbiAgb3V0WzJdID0gcVsyXTtcbiAgb3V0WzNdID0gcVszXTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGR1YWwgcXVhdCBmcm9tIGEgbWF0cml4ICg0eDQpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXhcclxuICogQHJldHVybnMge3F1YXQyfSBkdWFsIHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbU1hdDQob3V0LCBhKSB7XG4gIC8vVE9ETyBPcHRpbWl6ZSB0aGlzXG4gIHZhciBvdXRlciA9IHF1YXQuY3JlYXRlKCk7XG4gIG1hdDQuZ2V0Um90YXRpb24ob3V0ZXIsIGEpO1xuICB2YXIgdCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBtYXQ0LmdldFRyYW5zbGF0aW9uKHQsIGEpO1xuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIG91dGVyLCB0KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgZHVhbCBxdWF0IHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgc291cmNlIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCBhIGR1YWwgcXVhdCB0byB0aGUgaWRlbnRpdHkgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBkdWFsIHF1YXQgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdzIgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIsIHcyKSB7XG4gIG91dFswXSA9IHgxO1xuICBvdXRbMV0gPSB5MTtcbiAgb3V0WzJdID0gejE7XG4gIG91dFszXSA9IHcxO1xuICBvdXRbNF0gPSB4MjtcbiAgb3V0WzVdID0geTI7XG4gIG91dFs2XSA9IHoyO1xuICBvdXRbN10gPSB3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXRzIHRoZSByZWFsIHBhcnQgb2YgYSBkdWFsIHF1YXRcclxuICogQHBhcmFtICB7cXVhdH0gb3V0IHJlYWwgcGFydFxyXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxyXG4gKiBAcmV0dXJuIHtxdWF0fSByZWFsIHBhcnRcclxuICovXG5cbmV4cG9ydCB2YXIgZ2V0UmVhbCA9IHF1YXQuY29weTtcbi8qKlxyXG4gKiBHZXRzIHRoZSBkdWFsIHBhcnQgb2YgYSBkdWFsIHF1YXRcclxuICogQHBhcmFtICB7cXVhdH0gb3V0IGR1YWwgcGFydFxyXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxyXG4gKiBAcmV0dXJuIHtxdWF0fSBkdWFsIHBhcnRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREdWFsKG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzRdO1xuICBvdXRbMV0gPSBhWzVdO1xuICBvdXRbMl0gPSBhWzZdO1xuICBvdXRbM10gPSBhWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgcmVhbCBjb21wb25lbnQgb2YgYSBkdWFsIHF1YXQgdG8gdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIHRoZSByZWFsIHBhcnRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNldFJlYWwgPSBxdWF0LmNvcHk7XG4vKipcclxuICogU2V0IHRoZSBkdWFsIGNvbXBvbmVudCBvZiBhIGR1YWwgcXVhdCB0byB0aGUgZ2l2ZW4gcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIGR1YWwgcGFydFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREdWFsKG91dCwgcSkge1xuICBvdXRbNF0gPSBxWzBdO1xuICBvdXRbNV0gPSBxWzFdO1xuICBvdXRbNl0gPSBxWzJdO1xuICBvdXRbN10gPSBxWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIGEgbm9ybWFsaXplZCBkdWFsIHF1YXRcclxuICogQHBhcmFtICB7dmVjM30gb3V0IHRyYW5zbGF0aW9uXHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uIHRvIGJlIGRlY29tcG9zZWRcclxuICogQHJldHVybiB7dmVjM30gdHJhbnNsYXRpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihvdXQsIGEpIHtcbiAgdmFyIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXTtcbiAgb3V0WzBdID0gKGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnkpICogMjtcbiAgb3V0WzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMjtcbiAgb3V0WzJdID0gKGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngpICogMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2xhdGVzIGEgZHVhbCBxdWF0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYXgxID0gYVswXSxcbiAgICAgIGF5MSA9IGFbMV0sXG4gICAgICBhejEgPSBhWzJdLFxuICAgICAgYXcxID0gYVszXSxcbiAgICAgIGJ4MSA9IHZbMF0gKiAwLjUsXG4gICAgICBieTEgPSB2WzFdICogMC41LFxuICAgICAgYnoxID0gdlsyXSAqIDAuNSxcbiAgICAgIGF4MiA9IGFbNF0sXG4gICAgICBheTIgPSBhWzVdLFxuICAgICAgYXoyID0gYVs2XSxcbiAgICAgIGF3MiA9IGFbN107XG4gIG91dFswXSA9IGF4MTtcbiAgb3V0WzFdID0gYXkxO1xuICBvdXRbMl0gPSBhejE7XG4gIG91dFszXSA9IGF3MTtcbiAgb3V0WzRdID0gYXcxICogYngxICsgYXkxICogYnoxIC0gYXoxICogYnkxICsgYXgyO1xuICBvdXRbNV0gPSBhdzEgKiBieTEgKyBhejEgKiBieDEgLSBheDEgKiBiejEgKyBheTI7XG4gIG91dFs2XSA9IGF3MSAqIGJ6MSArIGF4MSAqIGJ5MSAtIGF5MSAqIGJ4MSArIGF6MjtcbiAgb3V0WzddID0gLWF4MSAqIGJ4MSAtIGF5MSAqIGJ5MSAtIGF6MSAqIGJ6MSArIGF3MjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCB0aGUgWCBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBob3cgZmFyIHNob3VsZCB0aGUgcm90YXRpb24gYmVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBheDEgPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5LFxuICAgICAgYXkxID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieixcbiAgICAgIGF6MSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngsXG4gICAgICBhdzEgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICBxdWF0LnJvdGF0ZVgob3V0LCBhLCByYWQpO1xuICBieCA9IG91dFswXTtcbiAgYnkgPSBvdXRbMV07XG4gIGJ6ID0gb3V0WzJdO1xuICBidyA9IG91dFszXTtcbiAgb3V0WzRdID0gYXgxICogYncgKyBhdzEgKiBieCArIGF5MSAqIGJ6IC0gYXoxICogYnk7XG4gIG91dFs1XSA9IGF5MSAqIGJ3ICsgYXcxICogYnkgKyBhejEgKiBieCAtIGF4MSAqIGJ6O1xuICBvdXRbNl0gPSBhejEgKiBidyArIGF3MSAqIGJ6ICsgYXgxICogYnkgLSBheTEgKiBieDtcbiAgb3V0WzddID0gYXcxICogYncgLSBheDEgKiBieCAtIGF5MSAqIGJ5IC0gYXoxICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgdGhlIFkgYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgaG93IGZhciBzaG91bGQgdGhlIHJvdGF0aW9uIGJlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYXgxID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSxcbiAgICAgIGF5MSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnosXG4gICAgICBhejEgPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4LFxuICAgICAgYXcxID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcXVhdC5yb3RhdGVZKG91dCwgYSwgcmFkKTtcbiAgYnggPSBvdXRbMF07XG4gIGJ5ID0gb3V0WzFdO1xuICBieiA9IG91dFsyXTtcbiAgYncgPSBvdXRbM107XG4gIG91dFs0XSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbNV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzZdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFs3XSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIHRoZSBaIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGhvdyBmYXIgc2hvdWxkIHRoZSByb3RhdGlvbiBiZVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGF4MSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnksXG4gICAgICBheTEgPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6LFxuICAgICAgYXoxID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCxcbiAgICAgIGF3MSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHF1YXQucm90YXRlWihvdXQsIGEsIHJhZCk7XG4gIGJ4ID0gb3V0WzBdO1xuICBieSA9IG91dFsxXTtcbiAgYnogPSBvdXRbMl07XG4gIGJ3ID0gb3V0WzNdO1xuICBvdXRbNF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzVdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFs2XSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbN10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGJ5IGEgZ2l2ZW4gcXVhdGVybmlvbiAoYSAqIHEpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byByb3RhdGUgYnlcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVCeVF1YXRBcHBlbmQob3V0LCBhLCBxKSB7XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM10sXG4gICAgICBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICogcXcgKyBhdyAqIHF4ICsgYXkgKiBxeiAtIGF6ICogcXk7XG4gIG91dFsxXSA9IGF5ICogcXcgKyBhdyAqIHF5ICsgYXogKiBxeCAtIGF4ICogcXo7XG4gIG91dFsyXSA9IGF6ICogcXcgKyBhdyAqIHF6ICsgYXggKiBxeSAtIGF5ICogcXg7XG4gIG91dFszXSA9IGF3ICogcXcgLSBheCAqIHF4IC0gYXkgKiBxeSAtIGF6ICogcXo7XG4gIGF4ID0gYVs0XTtcbiAgYXkgPSBhWzVdO1xuICBheiA9IGFbNl07XG4gIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBxdyArIGF3ICogcXggKyBheSAqIHF6IC0gYXogKiBxeTtcbiAgb3V0WzVdID0gYXkgKiBxdyArIGF3ICogcXkgKyBheiAqIHF4IC0gYXggKiBxejtcbiAgb3V0WzZdID0gYXogKiBxdyArIGF3ICogcXogKyBheCAqIHF5IC0gYXkgKiBxeDtcbiAgb3V0WzddID0gYXcgKiBxdyAtIGF4ICogcXggLSBheSAqIHF5IC0gYXogKiBxejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGJ5IGEgZ2l2ZW4gcXVhdGVybmlvbiAocSAqIGEpXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHJvdGF0ZSBieVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVCeVF1YXRQcmVwZW5kKG91dCwgcSwgYSkge1xuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdLFxuICAgICAgYnggPSBhWzBdLFxuICAgICAgYnkgPSBhWzFdLFxuICAgICAgYnogPSBhWzJdLFxuICAgICAgYncgPSBhWzNdO1xuICBvdXRbMF0gPSBxeCAqIGJ3ICsgcXcgKiBieCArIHF5ICogYnogLSBxeiAqIGJ5O1xuICBvdXRbMV0gPSBxeSAqIGJ3ICsgcXcgKiBieSArIHF6ICogYnggLSBxeCAqIGJ6O1xuICBvdXRbMl0gPSBxeiAqIGJ3ICsgcXcgKiBieiArIHF4ICogYnkgLSBxeSAqIGJ4O1xuICBvdXRbM10gPSBxdyAqIGJ3IC0gcXggKiBieCAtIHF5ICogYnkgLSBxeiAqIGJ6O1xuICBieCA9IGFbNF07XG4gIGJ5ID0gYVs1XTtcbiAgYnogPSBhWzZdO1xuICBidyA9IGFbN107XG4gIG91dFs0XSA9IHF4ICogYncgKyBxdyAqIGJ4ICsgcXkgKiBieiAtIHF6ICogYnk7XG4gIG91dFs1XSA9IHF5ICogYncgKyBxdyAqIGJ5ICsgcXogKiBieCAtIHF4ICogYno7XG4gIG91dFs2XSA9IHF6ICogYncgKyBxdyAqIGJ6ICsgcXggKiBieSAtIHF5ICogYng7XG4gIG91dFs3XSA9IHF3ICogYncgLSBxeCAqIGJ4IC0gcXkgKiBieSAtIHF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgYSBnaXZlbiBheGlzLiBEb2VzIHRoZSBub3JtYWxpc2F0aW9uIGF1dG9tYXRpY2FsbHlcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgaG93IGZhciB0aGUgcm90YXRpb24gc2hvdWxkIGJlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQXJvdW5kQXhpcyhvdXQsIGEsIGF4aXMsIHJhZCkge1xuICAvL1NwZWNpYWwgY2FzZSBmb3IgcmFkID0gMFxuICBpZiAoTWF0aC5hYnMocmFkKSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gY29weShvdXQsIGEpO1xuICB9XG5cbiAgdmFyIGF4aXNMZW5ndGggPSBNYXRoLmh5cG90KGF4aXNbMF0sIGF4aXNbMV0sIGF4aXNbMl0pO1xuICByYWQgPSByYWQgKiAwLjU7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGJ4ID0gcyAqIGF4aXNbMF0gLyBheGlzTGVuZ3RoO1xuICB2YXIgYnkgPSBzICogYXhpc1sxXSAvIGF4aXNMZW5ndGg7XG4gIHZhciBieiA9IHMgKiBheGlzWzJdIC8gYXhpc0xlbmd0aDtcbiAgdmFyIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGF4MSA9IGFbMF0sXG4gICAgICBheTEgPSBhWzFdLFxuICAgICAgYXoxID0gYVsyXSxcbiAgICAgIGF3MSA9IGFbM107XG4gIG91dFswXSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbMV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzJdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFszXSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICB2YXIgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddO1xuICBvdXRbNF0gPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xuICBvdXRbNV0gPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbNl0gPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4O1xuICBvdXRbN10gPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIGR1YWwgcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBkdWFsIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGF4MCA9IGFbMF0sXG4gICAgICBheTAgPSBhWzFdLFxuICAgICAgYXowID0gYVsyXSxcbiAgICAgIGF3MCA9IGFbM10sXG4gICAgICBieDEgPSBiWzRdLFxuICAgICAgYnkxID0gYls1XSxcbiAgICAgIGJ6MSA9IGJbNl0sXG4gICAgICBidzEgPSBiWzddLFxuICAgICAgYXgxID0gYVs0XSxcbiAgICAgIGF5MSA9IGFbNV0sXG4gICAgICBhejEgPSBhWzZdLFxuICAgICAgYXcxID0gYVs3XSxcbiAgICAgIGJ4MCA9IGJbMF0sXG4gICAgICBieTAgPSBiWzFdLFxuICAgICAgYnowID0gYlsyXSxcbiAgICAgIGJ3MCA9IGJbM107XG4gIG91dFswXSA9IGF4MCAqIGJ3MCArIGF3MCAqIGJ4MCArIGF5MCAqIGJ6MCAtIGF6MCAqIGJ5MDtcbiAgb3V0WzFdID0gYXkwICogYncwICsgYXcwICogYnkwICsgYXowICogYngwIC0gYXgwICogYnowO1xuICBvdXRbMl0gPSBhejAgKiBidzAgKyBhdzAgKiBiejAgKyBheDAgKiBieTAgLSBheTAgKiBieDA7XG4gIG91dFszXSA9IGF3MCAqIGJ3MCAtIGF4MCAqIGJ4MCAtIGF5MCAqIGJ5MCAtIGF6MCAqIGJ6MDtcbiAgb3V0WzRdID0gYXgwICogYncxICsgYXcwICogYngxICsgYXkwICogYnoxIC0gYXowICogYnkxICsgYXgxICogYncwICsgYXcxICogYngwICsgYXkxICogYnowIC0gYXoxICogYnkwO1xuICBvdXRbNV0gPSBheTAgKiBidzEgKyBhdzAgKiBieTEgKyBhejAgKiBieDEgLSBheDAgKiBiejEgKyBheTEgKiBidzAgKyBhdzEgKiBieTAgKyBhejEgKiBieDAgLSBheDEgKiBiejA7XG4gIG91dFs2XSA9IGF6MCAqIGJ3MSArIGF3MCAqIGJ6MSArIGF4MCAqIGJ5MSAtIGF5MCAqIGJ4MSArIGF6MSAqIGJ3MCArIGF3MSAqIGJ6MCArIGF4MSAqIGJ5MCAtIGF5MSAqIGJ4MDtcbiAgb3V0WzddID0gYXcwICogYncxIC0gYXgwICogYngxIC0gYXkwICogYnkxIC0gYXowICogYnoxICsgYXcxICogYncwIC0gYXgxICogYngwIC0gYXkxICogYnkwIC0gYXoxICogYnowO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdDIubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBTY2FsZXMgYSBkdWFsIHF1YXQgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdCB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIGR1YWwgcXVhdCBieVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBkdWFsIHF1YXQncyAoVGhlIGRvdCBwcm9kdWN0IG9mIHRoZSByZWFsIHBhcnRzKVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkb3QgPSBxdWF0LmRvdDtcbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIGR1YWwgcXVhdHMnc1xyXG4gKiBOT1RFOiBUaGUgcmVzdWx0aW5nIGR1YWwgcXVhdGVybmlvbnMgd29uJ3QgYWx3YXlzIGJlIG5vcm1hbGl6ZWQgKFRoZSBlcnJvciBpcyBtb3N0IG5vdGljZWFibGUgd2hlbiB0ID0gMC41KVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBtdCA9IDEgLSB0O1xuICBpZiAoZG90KGEsIGIpIDwgMCkgdCA9IC10O1xuICBvdXRbMF0gPSBhWzBdICogbXQgKyBiWzBdICogdDtcbiAgb3V0WzFdID0gYVsxXSAqIG10ICsgYlsxXSAqIHQ7XG4gIG91dFsyXSA9IGFbMl0gKiBtdCArIGJbMl0gKiB0O1xuICBvdXRbM10gPSBhWzNdICogbXQgKyBiWzNdICogdDtcbiAgb3V0WzRdID0gYVs0XSAqIG10ICsgYls0XSAqIHQ7XG4gIG91dFs1XSA9IGFbNV0gKiBtdCArIGJbNV0gKiB0O1xuICBvdXRbNl0gPSBhWzZdICogbXQgKyBiWzZdICogdDtcbiAgb3V0WzddID0gYVs3XSAqIG10ICsgYls3XSAqIHQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgaW52ZXJzZSBvZiBhIGR1YWwgcXVhdC4gSWYgdGhleSBhcmUgbm9ybWFsaXplZCwgY29uanVnYXRlIGlzIGNoZWFwZXJcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBzcWxlbiA9IHNxdWFyZWRMZW5ndGgoYSk7XG4gIG91dFswXSA9IC1hWzBdIC8gc3FsZW47XG4gIG91dFsxXSA9IC1hWzFdIC8gc3FsZW47XG4gIG91dFsyXSA9IC1hWzJdIC8gc3FsZW47XG4gIG91dFszXSA9IGFbM10gLyBzcWxlbjtcbiAgb3V0WzRdID0gLWFbNF0gLyBzcWxlbjtcbiAgb3V0WzVdID0gLWFbNV0gLyBzcWxlbjtcbiAgb3V0WzZdID0gLWFbNl0gLyBzcWxlbjtcbiAgb3V0WzddID0gYVs3XSAvIHNxbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbmp1Z2F0ZSBvZiBhIGR1YWwgcXVhdFxyXG4gKiBJZiB0aGUgZHVhbCBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdDIuaW52ZXJzZSBhbmQgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25qdWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IC1hWzRdO1xuICBvdXRbNV0gPSAtYVs1XTtcbiAgb3V0WzZdID0gLWFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXQgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuZ3RoID0gcXVhdC5sZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBkdWFsIHF1YXRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdCB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3F1YXJlZExlbmd0aCA9IHF1YXQuc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQyLnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIGR1YWwgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdGVybmlvbiB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgbWFnbml0dWRlID0gc3F1YXJlZExlbmd0aChhKTtcblxuICBpZiAobWFnbml0dWRlID4gMCkge1xuICAgIG1hZ25pdHVkZSA9IE1hdGguc3FydChtYWduaXR1ZGUpO1xuICAgIHZhciBhMCA9IGFbMF0gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGExID0gYVsxXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYTIgPSBhWzJdIC8gbWFnbml0dWRlO1xuICAgIHZhciBhMyA9IGFbM10gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGIwID0gYVs0XTtcbiAgICB2YXIgYjEgPSBhWzVdO1xuICAgIHZhciBiMiA9IGFbNl07XG4gICAgdmFyIGIzID0gYVs3XTtcbiAgICB2YXIgYV9kb3RfYiA9IGEwICogYjAgKyBhMSAqIGIxICsgYTIgKiBiMiArIGEzICogYjM7XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gKGIwIC0gYTAgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgICBvdXRbNV0gPSAoYjEgLSBhMSAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICAgIG91dFs2XSA9IChiMiAtIGEyICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gICAgb3V0WzddID0gKGIzIC0gYTMgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGR1YWwgcXVhdGVuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHVhbCBxdWF0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwicXVhdDIoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIsIFwiICsgYVs0XSArIFwiLCBcIiArIGFbNV0gKyBcIiwgXCIgKyBhWzZdICsgXCIsIFwiICsgYVs3XSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGR1YWwgcXVhdGVybmlvbnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IGR1YWwgcXVhdGVybmlvbi5cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgZHVhbCBxdWF0ZXJuaW9uLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN107XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3QgZHVhbCBxdWF0LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBkdWFsIHF1YXQuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBkdWFsIHF1YXRzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN107XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpO1xufSIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDIgRGltZW5zaW9uYWwgVmVjdG9yXHJcbiAqIEBtb2R1bGUgdmVjMlxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzJcclxuICpcclxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBzb3VyY2UgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSkge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIERpdmlkZXMgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNlaWxcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBmbG9vclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cbi8qKlxyXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbmVnYXRlXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHk7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufVxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcclxuICogTm90ZSB0aGF0IHRoZSBjcm9zcyBwcm9kdWN0IG11c3QgYnkgZGVmaW5pdGlvbiBwcm9kdWNlIGEgM0QgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXTtcbiAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDIob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcclxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzNdICogeSArIG1bNl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs0XSAqIHkgKyBtWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcclxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMCdcclxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlIGEgMkQgdmVjdG9yXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IFRoZSByZWNlaXZpbmcgdmVjMlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgdmVjMiBwb2ludCB0byByb3RhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgYiwgcmFkKSB7XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgdmFyIHAwID0gYVswXSAtIGJbMF0sXG4gICAgICBwMSA9IGFbMV0gLSBiWzFdLFxuICAgICAgc2luQyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjb3NDID0gTWF0aC5jb3MocmFkKTsgLy9wZXJmb3JtIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHAwICogY29zQyAtIHAxICogc2luQyArIGJbMF07XG4gIG91dFsxXSA9IHAwICogc2luQyArIHAxICogY29zQyArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAyRCB2ZWN0b3JzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlKGEsIGIpIHtcbiAgdmFyIHgxID0gYVswXSxcbiAgICAgIHkxID0gYVsxXSxcbiAgICAgIHgyID0gYlswXSxcbiAgICAgIHkyID0gYlsxXSxcbiAgICAgIC8vIG1hZyBpcyB0aGUgcHJvZHVjdCBvZiB0aGUgbWFnbml0dWRlcyBvZiBhIGFuZCBiXG4gIG1hZyA9IE1hdGguc3FydCh4MSAqIHgxICsgeTEgKiB5MSkgKiBNYXRoLnNxcnQoeDIgKiB4MiArIHkyICogeTIpLFxuICAgICAgLy8gbWFnICYmLi4gc2hvcnQgY2lyY3VpdHMgaWYgbWFnID09IDBcbiAgY29zaW5lID0gbWFnICYmICh4MSAqIHgyICsgeTEgKiB5MikgLyBtYWc7IC8vIE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSBjbGFtcHMgdGhlIGNvc2luZSBiZXR3ZWVuIC0xIGFuZCAxXG5cbiAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkpO1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gemVyb1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIpXCI7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBleGFjdGx5IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV07XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cclxuICogQHJldHVybnMge0FycmF5fSBhXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG5cbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMjtcbiAgICB9XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IENpcmNsZUJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0JztcbmltcG9ydCB7cG9seWdvbkludGVyc2VjdHNCdWZmZXJlZFBvaW50fSBmcm9tICcuLi8uLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5pbXBvcnQge2dldE1heGltdW1QYWludFZhbHVlLCB0cmFuc2xhdGVEaXN0YW5jZSwgdHJhbnNsYXRlfSBmcm9tICcuLi9xdWVyeV91dGlscyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2NpcmNsZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7VHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIExheW91dCwgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHt2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge0J1Y2tldCwgQnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUge0xheW91dFByb3BzLCBQYWludFByb3BzfSBmcm9tICcuL2NpcmNsZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBDaXJjbGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoYnVja2V0OiBCdWNrZXQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjaXJjbGVCdWNrZXQ6IENpcmNsZUJ1Y2tldDxDaXJjbGVTdHlsZUxheWVyPiA9IChidWNrZXQ6IGFueSk7XG4gICAgICAgIHJldHVybiBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnY2lyY2xlLXJhZGl1cycsIHRoaXMsIGNpcmNsZUJ1Y2tldCkgK1xuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2NpcmNsZS1zdHJva2Utd2lkdGgnLCB0aGlzLCBjaXJjbGVCdWNrZXQpICtcbiAgICAgICAgICAgIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcmFkaXVzJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgY29uc3Qgc3Ryb2tlID0gdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgICAgICBjb25zdCBzaXplICA9IHJhZGl1cyArIHN0cm9rZTtcblxuICAgICAgICAvLyBGb3IgcGl0Y2gtYWxpZ25tZW50OiBtYXAsIGNvbXBhcmUgZmVhdHVyZSBnZW9tZXRyeSB0byBxdWVyeSBnZW9tZXRyeSBpbiB0aGUgcGxhbmUgb2YgdGhlIHRpbGVcbiAgICAgICAgLy8gLy8gT3RoZXJ3aXNlLCBjb21wYXJlIGdlb21ldHJ5IGluIHRoZSBwbGFuZSBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgLy8gLy8gQSBjaXJjbGUgd2l0aCBmaXhlZCBzY2FsaW5nIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCBnZXRzIGxhcmdlciBpbiB0aWxlIHNwYWNlIGFzIGl0IG1vdmVzIGludG8gdGhlIGRpc3RhbmNlXG4gICAgICAgIC8vIC8vIEEgY2lyY2xlIHdpdGggZml4ZWQgc2NhbGluZyByZWxhdGl2ZSB0byB0aGUgbWFwIGdldHMgc21hbGxlciBpbiB2aWV3cG9ydCBzcGFjZSBhcyBpdCBtb3ZlcyBpbnRvIHRoZSBkaXN0YW5jZVxuICAgICAgICBjb25zdCBhbGlnbldpdGhNYXAgPSB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRQb2x5Z29uID0gYWxpZ25XaXRoTWFwID8gdHJhbnNsYXRlZFBvbHlnb24gOiBwcm9qZWN0UXVlcnlHZW9tZXRyeSh0cmFuc2xhdGVkUG9seWdvbiwgcGl4ZWxQb3NNYXRyaXgpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFNpemUgPSBhbGlnbldpdGhNYXAgPyBzaXplICogcGl4ZWxzVG9UaWxlVW5pdHMgOiBzaXplO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBnZW9tZXRyeSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiByaW5nKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFBvaW50ID0gYWxpZ25XaXRoTWFwID8gcG9pbnQgOiBwcm9qZWN0UG9pbnQocG9pbnQsIHBpeGVsUG9zTWF0cml4KTtcblxuICAgICAgICAgICAgICAgIGxldCBhZGp1c3RlZFNpemUgPSB0cmFuc2Zvcm1lZFNpemU7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkQ2VudGVyID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcG9pbnQueCwgcG9pbnQueSwgMCwgMV0sIHBpeGVsUG9zTWF0cml4KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAndmlld3BvcnQnICYmIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGVkU2l6ZSAqPSBwcm9qZWN0ZWRDZW50ZXJbM10gLyB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtc2NhbGUnKSA9PT0gJ21hcCcgJiYgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFNpemUgKj0gdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBwcm9qZWN0ZWRDZW50ZXJbM107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludCh0cmFuc2Zvcm1lZFBvbHlnb24sIHRyYW5zZm9ybWVkUG9pbnQsIGFkanVzdGVkU2l6ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHA6IFBvaW50LCBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgcG9pbnQgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwLngsIHAueSwgMCwgMV0sIHBpeGVsUG9zTWF0cml4KTtcbiAgICByZXR1cm4gbmV3IFBvaW50KHBvaW50WzBdIC8gcG9pbnRbM10sIHBvaW50WzFdIC8gcG9pbnRbM10pO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UXVlcnlHZW9tZXRyeShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpIHtcbiAgICByZXR1cm4gcXVlcnlHZW9tZXRyeS5tYXAoKHApID0+IHtcbiAgICAgICAgcmV0dXJuIHByb2plY3RQb2ludChwLCBwaXhlbFBvc01hdHJpeCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENpcmNsZVN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ2lyY2xlQnVja2V0IGZyb20gJy4vY2lyY2xlX2J1Y2tldCc7XG5cbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5cbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuXG5jbGFzcyBIZWF0bWFwQnVja2V0IGV4dGVuZHMgQ2lyY2xlQnVja2V0PEhlYXRtYXBTdHlsZUxheWVyPiB7XG4gICAgLy8gTmVlZGVkIGZvciBmbG93IHRvIGFjY2VwdCBvbWl0OiBbJ2xheWVycyddIGJlbG93LCBkdWUgdG9cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNDI2MlxuICAgIGxheWVyczogQXJyYXk8SGVhdG1hcFN0eWxlTGF5ZXI+O1xufVxuXG5yZWdpc3RlcignSGVhdG1hcEJ1Y2tldCcsIEhlYXRtYXBCdWNrZXQsIHtvbWl0OiBbJ2xheWVycyddfSk7XG5cbmV4cG9ydCBkZWZhdWx0IEhlYXRtYXBCdWNrZXQ7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiaGVhdG1hcC1yYWRpdXNcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoZWF0bWFwLXdlaWdodFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhlYXRtYXAtaW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoZWF0bWFwLWNvbG9yXCI6IENvbG9yUmFtcFByb3BlcnR5LFxuICAgIFwiaGVhdG1hcC1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJoZWF0bWFwLXJhZGl1c1wiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLXJhZGl1c1wiXSksXG4gICAgXCJoZWF0bWFwLXdlaWdodFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLXdlaWdodFwiXSksXG4gICAgXCJoZWF0bWFwLWludGVuc2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtaW50ZW5zaXR5XCJdKSxcbiAgICBcImhlYXRtYXAtY29sb3JcIjogbmV3IENvbG9yUmFtcFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLWNvbG9yXCJdKSxcbiAgICBcImhlYXRtYXAtb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4vaW1hZ2UnO1xuaW1wb3J0IHtpc1Bvd2VyT2ZUd299IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZVByb3BlcnR5RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4JztcblxuZXhwb3J0IHR5cGUgQ29sb3JSYW1wUGFyYW1zID0ge1xuICAgIGV4cHJlc3Npb246IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uO1xuICAgIGV2YWx1YXRpb25LZXk6IHN0cmluZztcbiAgICByZXNvbHV0aW9uPzogbnVtYmVyO1xuICAgIGltYWdlPzogUkdCQUltYWdlO1xuICAgIGNsaXBzPzogQXJyYXk8T2JqZWN0Pjtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBleHByZXNzaW9uIHRoYXQgc2hvdWxkIGV2YWx1YXRlIHRvIGEgY29sb3IgcmFtcCxcbiAqIHJldHVybiBhIFJHQkEgaW1hZ2UgcmVwcmVzZW50aW5nIHRoYXQgcmFtcCBleHByZXNzaW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb2xvclJhbXAocGFyYW1zOiBDb2xvclJhbXBQYXJhbXMpOiBSR0JBSW1hZ2Uge1xuICAgIGNvbnN0IGV2YWx1YXRpb25HbG9iYWxzID0ge307XG4gICAgY29uc3Qgd2lkdGggPSBwYXJhbXMucmVzb2x1dGlvbiB8fCAyNTY7XG4gICAgY29uc3QgaGVpZ2h0ID0gcGFyYW1zLmNsaXBzID8gcGFyYW1zLmNsaXBzLmxlbmd0aCA6IDE7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXJhbXMuaW1hZ2UgfHwgbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0pO1xuXG4gICAgYXNzZXJ0KGlzUG93ZXJPZlR3byh3aWR0aCkpO1xuXG4gICAgY29uc3QgcmVuZGVyUGl4ZWwgPSAoc3RyaWRlLCBpbmRleCwgcHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgZXZhbHVhdGlvbkdsb2JhbHNbcGFyYW1zLmV2YWx1YXRpb25LZXldID0gcHJvZ3Jlc3M7XG4gICAgICAgIGNvbnN0IHB4Q29sb3IgPSBwYXJhbXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSgoZXZhbHVhdGlvbkdsb2JhbHM6IGFueSkpO1xuICAgICAgICAvLyB0aGUgY29sb3JzIGFyZSBiZWluZyB1bnByZW11bHRpcGxpZWQgYmVjYXVzZSBDb2xvciB1c2VzXG4gICAgICAgIC8vIHByZW11bHRpcGxpZWQgdmFsdWVzLCBhbmQgdGhlIFRleHR1cmUgY2xhc3MgZXhwZWN0cyB1bnByZW11bHRpcGxpZWQgb25lc1xuICAgICAgICBpbWFnZS5kYXRhW3N0cmlkZSArIGluZGV4ICsgMF0gPSBNYXRoLmZsb29yKHB4Q29sb3IuciAqIDI1NSAvIHB4Q29sb3IuYSk7XG4gICAgICAgIGltYWdlLmRhdGFbc3RyaWRlICsgaW5kZXggKyAxXSA9IE1hdGguZmxvb3IocHhDb2xvci5nICogMjU1IC8gcHhDb2xvci5hKTtcbiAgICAgICAgaW1hZ2UuZGF0YVtzdHJpZGUgKyBpbmRleCArIDJdID0gTWF0aC5mbG9vcihweENvbG9yLmIgKiAyNTUgLyBweENvbG9yLmEpO1xuICAgICAgICBpbWFnZS5kYXRhW3N0cmlkZSArIGluZGV4ICsgM10gPSBNYXRoLmZsb29yKHB4Q29sb3IuYSAqIDI1NSk7XG4gICAgfTtcblxuICAgIGlmICghcGFyYW1zLmNsaXBzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHdpZHRoOyBpKyssIGogKz0gNCkge1xuICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBpIC8gKHdpZHRoIC0gMSk7XG5cbiAgICAgICAgICAgIHJlbmRlclBpeGVsKDAsIGosIHByb2dyZXNzKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGNsaXAgPSAwLCBzdHJpZGUgPSAwOyBjbGlwIDwgaGVpZ2h0OyArK2NsaXAsIHN0cmlkZSArPSB3aWR0aCAqIDQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHdpZHRoOyBpKyssIGogKz0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbWFwIHByb2dyZXNzIGJldHdlZW4gY2xpcHNcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IGkgLyAod2lkdGggLSAxKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYXJhbXMuY2xpcHNbY2xpcF07XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvblByb2dyZXNzID0gc3RhcnQgKiAoMSAtIHByb2dyZXNzKSArIGVuZCAqIHByb2dyZXNzO1xuICAgICAgICAgICAgICAgIHJlbmRlclBpeGVsKHN0cmlkZSwgaiwgZXZhbHVhdGlvblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbWFnZTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyJztcblxuaW1wb3J0IEhlYXRtYXBCdWNrZXQgZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQvaGVhdG1hcF9idWNrZXQnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uLy4uL3V0aWwvaW1hZ2UnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtyZW5kZXJDb2xvclJhbXB9IGZyb20gJy4uLy4uL3V0aWwvY29sb3JfcmFtcCc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIFRleHR1cmUgZnJvbSAnLi4vLi4vcmVuZGVyL3RleHR1cmUnO1xuaW1wb3J0IHR5cGUgRnJhbWVidWZmZXIgZnJvbSAnLi4vLi4vZ2wvZnJhbWVidWZmZXInO1xuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vaGVhdG1hcF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jbGFzcyBIZWF0bWFwU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgaGVhdG1hcEZibzogP0ZyYW1lYnVmZmVyO1xuICAgIGNvbG9yUmFtcDogUkdCQUltYWdlO1xuICAgIGNvbG9yUmFtcFRleHR1cmU6ID9UZXh0dXJlO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY3JlYXRlQnVja2V0KG9wdGlvbnM6IGFueSkge1xuICAgICAgICByZXR1cm4gbmV3IEhlYXRtYXBCdWNrZXQob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIGNvbG9yIHJhbXAgdGV4dHVyZSBpcyBnZW5lcmF0ZWQgZm9yIGRlZmF1bHQgaGVhdG1hcCBjb2xvciB0b29cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2hlYXRtYXAtY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb2xvclJhbXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVDb2xvclJhbXAoKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2hlYXRtYXAtY29sb3InXS52YWx1ZS5leHByZXNzaW9uO1xuICAgICAgICB0aGlzLmNvbG9yUmFtcCA9IHJlbmRlckNvbG9yUmFtcCh7XG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgZXZhbHVhdGlvbktleTogJ2hlYXRtYXBEZW5zaXR5JyxcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLmNvbG9yUmFtcFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb2xvclJhbXBUZXh0dXJlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlYXRtYXBGYm8pIHtcbiAgICAgICAgICAgIHRoaXMuaGVhdG1hcEZiby5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmhlYXRtYXBGYm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZSgpOiBib29sZWFuICB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpICE9PSAwICYmIHRoaXMudmlzaWJpbGl0eSAhPT0gJ25vbmUnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGVhdG1hcFN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCJdKSxcbiAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiXSksXG4gICAgXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCJdKSxcbiAgICBcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIl0pLFxuICAgIFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiXSksXG4gICAgXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5cbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vaGlsbHNoYWRlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9oaWxsc2hhZGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgSGlsbHNoYWRlU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhaW50LmdldCgnaGlsbHNoYWRlLWV4YWdnZXJhdGlvbicpICE9PSAwICYmIHRoaXMudmlzaWJpbGl0eSAhPT0gJ25vbmUnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGlsbHNoYWRlU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxheW91dDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG5cbiAgICB2YXIgcCA9IGVhci5wcmV2WixcbiAgICAgICAgbiA9IGVhci5uZXh0WjtcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuXG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChuICYmIG4ueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGZpbHRlclBvaW50cyhwKTtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcbiAgICBpZiAob3V0ZXJOb2RlKSB7XG4gICAgICAgIHZhciBiID0gc3BsaXRQb2x5Z29uKG91dGVyTm9kZSwgaG9sZSk7XG5cbiAgICAgICAgLy8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgICAgIGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICAgICAgZmlsdGVyUG9pbnRzKGIsIGIubmV4dCk7XG4gICAgfVxufVxuXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICB2YXIgcCA9IG91dGVyTm9kZSxcbiAgICAgICAgaHggPSBob2xlLngsXG4gICAgICAgIGh5ID0gaG9sZS55LFxuICAgICAgICBxeCA9IC1JbmZpbml0eSxcbiAgICAgICAgbTtcblxuICAgIC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcbiAgICAvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XG4gICAgZG8ge1xuICAgICAgICBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtOyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsZWZ0bW9zdCBlbmRwb2ludFxuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XG5cbiAgICB2YXIgc3RvcCA9IG0sXG4gICAgICAgIG14ID0gbS54LFxuICAgICAgICBteSA9IG0ueSxcbiAgICAgICAgdGFuTWluID0gSW5maW5pdHksXG4gICAgICAgIHRhbjtcblxuICAgIHAgPSBtO1xuXG4gICAgZG8ge1xuICAgICAgICBpZiAoaHggPj0gcC54ICYmIHAueCA+PSBteCAmJiBoeCAhPT0gcC54ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmIChsb2NhbGx5SW5zaWRlKHAsIGhvbGUpICYmXG4gICAgICAgICAgICAgICAgKHRhbiA8IHRhbk1pbiB8fCAodGFuID09PSB0YW5NaW4gJiYgKHAueCA+IG0ueCB8fCAocC54ID09PSBtLnggJiYgc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkpKSkpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdG9wKTtcblxuICAgIHJldHVybiBtO1xufVxuXG4vLyB3aGV0aGVyIHNlY3RvciBpbiB2ZXJ0ZXggbSBjb250YWlucyBzZWN0b3IgaW4gdmVydGV4IHAgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXNcbmZ1bmN0aW9uIHNlY3RvckNvbnRhaW5zU2VjdG9yKG0sIHApIHtcbiAgICByZXR1cm4gYXJlYShtLnByZXYsIG0sIHAucHJldikgPCAwICYmIGFyZWEocC5uZXh0LCBtLCBtLm5leHQpIDwgMDtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxU2l6ZSA9IGluU2l6ZTtcblxuICAgICAgICAgICAgd2hpbGUgKHBTaXplID4gMCB8fCAocVNpemUgPiAwICYmIHEpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocFNpemUgIT09IDAgJiYgKHFTaXplID09PSAwIHx8ICFxIHx8IHAueiA8PSBxLnopKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcbmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuICAgIHggPSAzMjc2NyAqICh4IC0gbWluWCkgKiBpbnZTaXplO1xuICAgIHkgPSAzMjc2NyAqICh5IC0gbWluWSkgKiBpbnZTaXplO1xuXG4gICAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB4ID0gKHggfCAoeCA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHggPSAoeCB8ICh4IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHkgPSAoeSB8ICh5IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB5ID0gKHkgfCAoeSA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHkgPSAoeSB8ICh5IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICByZXR1cm4geCB8ICh5IDw8IDEpO1xufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkge1xuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGxlZnRtb3N0ID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC54IDwgbGVmdG1vc3QueCB8fCAocC54ID09PSBsZWZ0bW9zdC54ICYmIHAueSA8IGxlZnRtb3N0LnkpKSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiYgLy8gZG9uZXMndCBpbnRlcnNlY3Qgb3RoZXIgZWRnZXNcbiAgICAgICAgICAgKGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYikgJiYgLy8gbG9jYWxseSB2aXNpYmxlXG4gICAgICAgICAgICAoYXJlYShhLnByZXYsIGEsIGIucHJldikgfHwgYXJlYShhLCBiLnByZXYsIGIpKSB8fCAvLyBkb2VzIG5vdCBjcmVhdGUgb3Bwb3NpdGUtZmFjaW5nIHNlY3RvcnNcbiAgICAgICAgICAgIGVxdWFscyhhLCBiKSAmJiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA+IDAgJiYgYXJlYShiLnByZXYsIGIsIGIubmV4dCkgPiAwKTsgLy8gc3BlY2lhbCB6ZXJvLWxlbmd0aCBjYXNlXG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XG4gICAgdmFyIG8xID0gc2lnbihhcmVhKHAxLCBxMSwgcDIpKTtcbiAgICB2YXIgbzIgPSBzaWduKGFyZWEocDEsIHExLCBxMikpO1xuICAgIHZhciBvMyA9IHNpZ24oYXJlYShwMiwgcTIsIHAxKSk7XG4gICAgdmFyIG80ID0gc2lnbihhcmVhKHAyLCBxMiwgcTEpKTtcblxuICAgIGlmIChvMSAhPT0gbzIgJiYgbzMgIT09IG80KSByZXR1cm4gdHJ1ZTsgLy8gZ2VuZXJhbCBjYXNlXG5cbiAgICBpZiAobzEgPT09IDAgJiYgb25TZWdtZW50KHAxLCBwMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBwMiBhcmUgY29sbGluZWFyIGFuZCBwMiBsaWVzIG9uIHAxcTFcbiAgICBpZiAobzIgPT09IDAgJiYgb25TZWdtZW50KHAxLCBxMiwgcTEpKSByZXR1cm4gdHJ1ZTsgLy8gcDEsIHExIGFuZCBxMiBhcmUgY29sbGluZWFyIGFuZCBxMiBsaWVzIG9uIHAxcTFcbiAgICBpZiAobzMgPT09IDAgJiYgb25TZWdtZW50KHAyLCBwMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29sbGluZWFyIGFuZCBwMSBsaWVzIG9uIHAycTJcbiAgICBpZiAobzQgPT09IDAgJiYgb25TZWdtZW50KHAyLCBxMSwgcTIpKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBxMSBhcmUgY29sbGluZWFyIGFuZCBxMSBsaWVzIG9uIHAycTJcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gZm9yIGNvbGxpbmVhciBwb2ludHMgcCwgcSwgciwgY2hlY2sgaWYgcG9pbnQgcSBsaWVzIG9uIHNlZ21lbnQgcHJcbmZ1bmN0aW9uIG9uU2VnbWVudChwLCBxLCByKSB7XG4gICAgcmV0dXJuIHEueCA8PSBNYXRoLm1heChwLngsIHIueCkgJiYgcS54ID49IE1hdGgubWluKHAueCwgci54KSAmJiBxLnkgPD0gTWF0aC5tYXgocC55LCByLnkpICYmIHEueSA+PSBNYXRoLm1pbihwLnksIHIueSk7XG59XG5cbmZ1bmN0aW9uIHNpZ24obnVtKSB7XG4gICAgcmV0dXJuIG51bSA+IDAgPyAxIDogbnVtIDwgMCA/IC0xIDogMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxuICAgICAgICAgICAgICAgIChweCA8IChwLm5leHQueCAtIHAueCkgKiAocHkgLSBwLnkpIC8gKHAubmV4dC55IC0gcC55KSArIHAueCkpXG4gICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oYSwgYikge1xuICAgIHZhciBhMiA9IG5ldyBOb2RlKGEuaSwgYS54LCBhLnkpLFxuICAgICAgICBiMiA9IG5ldyBOb2RlKGIuaSwgYi54LCBiLnkpLFxuICAgICAgICBhbiA9IGEubmV4dCxcbiAgICAgICAgYnAgPSBiLnByZXY7XG5cbiAgICBhLm5leHQgPSBiO1xuICAgIGIucHJldiA9IGE7XG5cbiAgICBhMi5uZXh0ID0gYW47XG4gICAgYW4ucHJldiA9IGEyO1xuXG4gICAgYjIubmV4dCA9IGEyO1xuICAgIGEyLnByZXYgPSBiMjtcblxuICAgIGJwLm5leHQgPSBiMjtcbiAgICBiMi5wcmV2ID0gYnA7XG5cbiAgICByZXR1cm4gYjI7XG59XG5cbi8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBpbnNlcnROb2RlKGksIHgsIHksIGxhc3QpIHtcbiAgICB2YXIgcCA9IG5ldyBOb2RlKGksIHgsIHkpO1xuXG4gICAgaWYgKCFsYXN0KSB7XG4gICAgICAgIHAucHJldiA9IHA7XG4gICAgICAgIHAubmV4dCA9IHA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBwLm5leHQgPSBsYXN0Lm5leHQ7XG4gICAgICAgIHAucHJldiA9IGxhc3Q7XG4gICAgICAgIGxhc3QubmV4dC5wcmV2ID0gcDtcbiAgICAgICAgbGFzdC5uZXh0ID0gcDtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUocCkge1xuICAgIHAubmV4dC5wcmV2ID0gcC5wcmV2O1xuICAgIHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG4gICAgaWYgKHAucHJldlopIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuICAgIGlmIChwLm5leHRaKSBwLm5leHRaLnByZXZaID0gcC5wcmV2Wjtcbn1cblxuZnVuY3Rpb24gTm9kZShpLCB4LCB5KSB7XG4gICAgLy8gdmVydGV4IGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRleCBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgdGhpcy5uZXh0ID0gbnVsbDtcblxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcbiAgICB0aGlzLnogPSBudWxsO1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuICAgIHRoaXMucHJldlogPSBudWxsO1xuICAgIHRoaXMubmV4dFogPSBudWxsO1xuXG4gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcbiAgICB0aGlzLnN0ZWluZXIgPSBmYWxzZTtcbn1cblxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cbmVhcmN1dC5kZXZpYXRpb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xuICAgIGlmIChoYXNIb2xlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyaWFuZ2xlc0FyZWEgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XG4gICAgICAgIHZhciBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcbn07XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcbiAgICAgICAgaiA9IGk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xuZWFyY3V0LmZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge3ZlcnRpY2VzOiBbXSwgaG9sZXM6IFtdLCBkaW1lbnNpb25zOiBkaW19LFxuICAgICAgICBob2xlSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0LmhvbGVzLnB1c2goaG9sZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyLCBrLCBsZWZ0LCByaWdodCwgY29tcGFyZSkge1xuICAgIHF1aWNrc2VsZWN0U3RlcChhcnIsIGssIGxlZnQgfHwgMCwgcmlnaHQgfHwgKGFyci5sZW5ndGggLSAxKSwgY29tcGFyZSB8fCBkZWZhdWx0Q29tcGFyZSk7XG59XG5cbmZ1bmN0aW9uIHF1aWNrc2VsZWN0U3RlcChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG5cbiAgICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgICAgICAgIHZhciBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIHZhciBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIHogPSBNYXRoLmxvZyhuKTtcbiAgICAgICAgICAgIHZhciBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIHZhciBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIHZhciBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHZhciBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIG0pICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHQgPSBhcnJba107XG4gICAgICAgIHZhciBpID0gbGVmdDtcbiAgICAgICAgdmFyIGogPSByaWdodDtcblxuICAgICAgICBzd2FwKGFyciwgbGVmdCwgayk7XG4gICAgICAgIGlmIChjb21wYXJlKGFycltyaWdodF0sIHQpID4gMCkgc3dhcChhcnIsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXAoYXJyLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltpXSwgdCkgPCAwKSBpKys7XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbal0sIHQpID4gMCkgai0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnIsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXAoYXJyLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIHZhciB0bXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRtcDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tICdxdWlja3NlbGVjdCc7XG5cbmltcG9ydCB7Y2FsY3VsYXRlU2lnbmVkQXJlYX0gZnJvbSAnLi91dGlsJztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbi8vIGNsYXNzaWZpZXMgYW4gYXJyYXkgb2YgcmluZ3MgaW50byBwb2x5Z29ucyB3aXRoIG91dGVyIHJpbmdzIGFuZCBob2xlc1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xhc3NpZnlSaW5ncyhyaW5nczogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgbWF4UmluZ3M6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbiA9IHJpbmdzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XG5cbiAgICBjb25zdCBwb2x5Z29ucyA9IFtdO1xuICAgIGxldCBwb2x5Z29uLFxuICAgICAgICBjY3c7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFyZWEgPSBjYWxjdWxhdGVTaWduZWRBcmVhKHJpbmdzW2ldKTtcbiAgICAgICAgaWYgKGFyZWEgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIChyaW5nc1tpXTogYW55KS5hcmVhID0gTWF0aC5hYnMoYXJlYSk7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gdW5kZWZpbmVkKSBjY3cgPSBhcmVhIDwgMDtcblxuICAgICAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xuICAgICAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgICAgICAgICBwb2x5Z29uID0gW3JpbmdzW2ldXTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKHBvbHlnb246IGFueSkucHVzaChyaW5nc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG5cbiAgICAvLyBFYXJjdXQgcGVyZm9ybWFuY2UgZGVncmFkZXMgd2l0aCB0aGUgIyBvZiByaW5ncyBpbiBhIHBvbHlnb24uIEZvciB0aGlzXG4gICAgLy8gcmVhc29uLCB3ZSBsaW1pdCBzdHJpcCBvdXQgYWxsIGJ1dCB0aGUgYG1heFJpbmdzYCBsYXJnZXN0IHJpbmdzLlxuICAgIGlmIChtYXhSaW5ncyA+IDEpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwb2x5Z29ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHBvbHlnb25zW2pdLmxlbmd0aCA8PSBtYXhSaW5ncykgY29udGludWU7XG4gICAgICAgICAgICBxdWlja3NlbGVjdChwb2x5Z29uc1tqXSwgbWF4UmluZ3MsIDEsIHBvbHlnb25zW2pdLmxlbmd0aCAtIDEsIGNvbXBhcmVBcmVhcyk7XG4gICAgICAgICAgICBwb2x5Z29uc1tqXSA9IHBvbHlnb25zW2pdLnNsaWNlKDAsIG1heFJpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gY29tcGFyZUFyZWFzKGEsIGIpIHtcbiAgICByZXR1cm4gYi5hcmVhIC0gYS5hcmVhO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIEZpbGxTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgTGluZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllcic7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXRGZWF0dXJlLFxuICAgIFBvcHVsYXRlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9idWNrZXQnO1xuXG50eXBlIFBhdHRlcm5TdHlsZUxheWVycyA9XG4gICAgQXJyYXk8TGluZVN0eWxlTGF5ZXI+IHxcbiAgICBBcnJheTxGaWxsU3R5bGVMYXllcj4gfFxuICAgIEFycmF5PEZpbGxFeHRydXNpb25TdHlsZUxheWVyPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1BhdHRlcm4odHlwZTogc3RyaW5nLCBsYXllcnM6IFBhdHRlcm5TdHlsZUxheWVycywgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBvcHRpb25zLnBhdHRlcm5EZXBlbmRlbmNpZXM7XG4gICAgbGV0IGhhc1BhdHRlcm4gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldChgJHt0eXBlfS1wYXR0ZXJuYCk7XG4gICAgICAgIGlmICghcGF0dGVyblByb3BlcnR5LmlzQ29uc3RhbnQoKSkge1xuICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybikge1xuICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7XG4gICAgICAgICAgICBwYXR0ZXJuc1tjb25zdGFudFBhdHRlcm4udG9dID0gIHRydWU7XG4gICAgICAgICAgICBwYXR0ZXJuc1tjb25zdGFudFBhdHRlcm4uZnJvbV0gPSAgdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoYXNQYXR0ZXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkUGF0dGVybkRlcGVuZGVuY2llcyh0eXBlOiBzdHJpbmcsIGxheWVyczogUGF0dGVyblN0eWxlTGF5ZXJzLCBwYXR0ZXJuRmVhdHVyZTogQnVja2V0RmVhdHVyZSwgem9vbTogbnVtYmVyLCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IG9wdGlvbnMucGF0dGVybkRlcGVuZGVuY2llcztcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoYCR7dHlwZX0tcGF0dGVybmApO1xuXG4gICAgICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eVZhbHVlID0gcGF0dGVyblByb3BlcnR5LnZhbHVlO1xuICAgICAgICBpZiAocGF0dGVyblByb3BlcnR5VmFsdWUua2luZCAhPT0gXCJjb25zdGFudFwiKSB7XG4gICAgICAgICAgICBsZXQgbWluID0gcGF0dGVyblByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb206IHpvb20gLSAxfSwgcGF0dGVybkZlYXR1cmUsIHt9LCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBsZXQgbWlkID0gcGF0dGVyblByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb219LCBwYXR0ZXJuRmVhdHVyZSwge30sIG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgIGxldCBtYXggPSBwYXR0ZXJuUHJvcGVydHlWYWx1ZS5ldmFsdWF0ZSh7em9vbTogem9vbSArIDF9LCBwYXR0ZXJuRmVhdHVyZSwge30sIG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgIG1pbiA9IG1pbiAmJiBtaW4ubmFtZSA/IG1pbi5uYW1lIDogbWluO1xuICAgICAgICAgICAgbWlkID0gbWlkICYmIG1pZC5uYW1lID8gbWlkLm5hbWUgOiBtaWQ7XG4gICAgICAgICAgICBtYXggPSBtYXggJiYgbWF4Lm5hbWUgPyBtYXgubmFtZSA6IG1heDtcbiAgICAgICAgICAgIC8vIGFkZCB0byBwYXR0ZXJuRGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBwYXR0ZXJuc1ttaW5dID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhdHRlcm5zW21pZF0gPSB0cnVlO1xuICAgICAgICAgICAgcGF0dGVybnNbbWF4XSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIHNhdmUgZm9yIGxheW91dFxuICAgICAgICAgICAgcGF0dGVybkZlYXR1cmUucGF0dGVybnNbbGF5ZXIuaWRdID0ge21pbiwgbWlkLCBtYXh9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuRmVhdHVyZTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7RmlsbExheW91dEFycmF5fSBmcm9tICcuLi9hcnJheV90eXBlcyc7XG5cbmltcG9ydCB7bWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzfSBmcm9tICcuL2ZpbGxfYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50JztcbmltcG9ydCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQge0xpbmVJbmRleEFycmF5LCBUcmlhbmdsZUluZGV4QXJyYXl9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IGVhcmN1dCBmcm9tICdlYXJjdXQnO1xuaW1wb3J0IGNsYXNzaWZ5UmluZ3MgZnJvbSAnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5jb25zdCBFQVJDVVRfTUFYX1JJTkdTID0gNTAwO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcbmltcG9ydCB7aGFzUGF0dGVybiwgYWRkUGF0dGVybkRlcGVuZGVuY2llc30gZnJvbSAnLi9wYXR0ZXJuX2J1Y2tldF9mZWF0dXJlcyc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5cbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0UGFyYW1ldGVycyxcbiAgICBCdWNrZXRGZWF0dXJlLFxuICAgIEluZGV4ZWRGZWF0dXJlLFxuICAgIFBvcHVsYXRlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9idWNrZXQnO1xuaW1wb3J0IHR5cGUgRmlsbFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5cbmNsYXNzIEZpbGxCdWNrZXQgaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJzOiBBcnJheTxGaWxsU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PEZpbGxTdHlsZUxheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5GZWF0dXJlczogQXJyYXk8QnVja2V0RmVhdHVyZT47XG5cbiAgICBsYXlvdXRWZXJ0ZXhBcnJheTogRmlsbExheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXkyOiBMaW5lSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjI6IEluZGV4QnVmZmVyO1xuXG4gICAgaGFzUGF0dGVybjogYm9vbGVhbjtcbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PEZpbGxTdHlsZUxheWVyPjtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBzZWdtZW50czI6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPEZpbGxTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgRmlsbExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5MiA9IG5ldyBMaW5lSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMyID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGhhc1BhdHRlcm4oJ2ZpbGwnLCB0aGlzLmxheWVycywgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGZpbGxTb3J0S2V5ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0LmdldCgnZmlsbC1zb3J0LWtleScpO1xuICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qge2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRHZW9tZXRyeSA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0ge3R5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IG5lZWRHZW9tZXRyeSA/IGxvYWRHZW9tZXRyeShmZWF0dXJlKSA6IFtdfTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5maWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSksIGV2YWx1YXRpb25GZWF0dXJlLCBjYW5vbmljYWwpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKCFuZWVkR2VvbWV0cnkpICBldmFsdWF0aW9uRmVhdHVyZS5nZW9tZXRyeSA9IGxvYWRHZW9tZXRyeShmZWF0dXJlKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydEtleSA9IGZpbGxTb3J0S2V5ID9cbiAgICAgICAgICAgICAgICBmaWxsU29ydEtleS5ldmFsdWF0ZShldmFsdWF0aW9uRmVhdHVyZSwge30sIGNhbm9uaWNhbCwgb3B0aW9ucy5hdmFpbGFibGVJbWFnZXMpIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBldmFsdWF0aW9uRmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge30sXG4gICAgICAgICAgICAgICAgc29ydEtleVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMucHVzaChidWNrZXRGZWF0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxsU29ydEtleSkge1xuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGEuc29ydEtleSBpcyBhbHdheXMgYSBudW1iZXIgd2hlbiBpbiB1c2VcbiAgICAgICAgICAgICAgICByZXR1cm4gKChhLnNvcnRLZXk6IGFueSk6IG51bWJlcikgLSAoKGIuc29ydEtleTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBidWNrZXRGZWF0dXJlIG9mIGJ1Y2tldEZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCB7Z2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSA9IGJ1Y2tldEZlYXR1cmU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuRmVhdHVyZSA9IGFkZFBhdHRlcm5EZXBlbmRlbmNpZXMoJ2ZpbGwnLCB0aGlzLmxheWVycywgYnVja2V0RmVhdHVyZSwgdGhpcy56b29tLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuIGZlYXR1cmVzIGFyZSBhZGRlZCBvbmx5IG9uY2UgdGhlIHBhdHRlcm4gaXMgbG9hZGVkIGludG8gdGhlIGltYWdlIGF0bGFzXG4gICAgICAgICAgICAgICAgLy8gc28gYXJlIHN0b3JlZCBkdXJpbmcgcG9wdWxhdGUgdW50aWwgbGF0ZXIgdXBkYXRlZCB3aXRoIHBvc2l0aW9ucyBieSB0aWxlIHdvcmtlciBpbiBhZGRGZWF0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybkZlYXR1cmVzLnB1c2gocGF0dGVybkZlYXR1cmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYnVja2V0RmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBjYW5vbmljYWwsIHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzW2luZGV4XS5mZWF0dXJlO1xuICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCwgdGhpcy5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZXMob3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHRoaXMucGF0dGVybkZlYXR1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoZmVhdHVyZSwgZmVhdHVyZS5nZW9tZXRyeSwgZmVhdHVyZS5pbmRleCwgY2Fub25pY2FsLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkUGVuZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlcjIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheTIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyMi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMyLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlKGZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBpbmRleDogbnVtYmVyLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIGNsYXNzaWZ5UmluZ3MoZ2VvbWV0cnksIEVBUkNVVF9NQVhfUklOR1MpKSB7XG4gICAgICAgICAgICBsZXQgbnVtVmVydGljZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBudW1WZXJ0aWNlcyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJpYW5nbGVTZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcywgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kZXggPSB0cmlhbmdsZVNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGhvbGVJbmRpY2VzID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyaW5nICE9PSBwb2x5Z29uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvbGVJbmRpY2VzLnB1c2goZmxhdHRlbmVkLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVTZWdtZW50ID0gdGhpcy5zZWdtZW50czIucHJlcGFyZVNlZ21lbnQocmluZy5sZW5ndGgsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVJbmRleCA9IGxpbmVTZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socmluZ1swXS54LCByaW5nWzBdLnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheTIuZW1wbGFjZUJhY2sobGluZUluZGV4ICsgcmluZy5sZW5ndGggLSAxLCBsaW5lSW5kZXgpO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbMF0ueCk7XG4gICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1swXS55KTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHJpbmdbaV0ueCwgcmluZ1tpXS55KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5Mi5lbXBsYWNlQmFjayhsaW5lSW5kZXggKyBpIC0gMSwgbGluZUluZGV4ICsgaSk7XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbaV0ueCk7XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbaV0ueSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGluZVNlZ21lbnQudmVydGV4TGVuZ3RoICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxpbmVTZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGVhcmN1dChmbGF0dGVuZWQsIGhvbGVJbmRpY2VzKTtcbiAgICAgICAgICAgIGFzc2VydChpbmRpY2VzLmxlbmd0aCAlIDMgPT09IDApO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ldLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2kgKyAyXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyaWFuZ2xlU2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gbnVtVmVydGljZXM7XG4gICAgICAgICAgICB0cmlhbmdsZVNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMsIGNhbm9uaWNhbCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignRmlsbEJ1Y2tldCcsIEZpbGxCdWNrZXQsIHtvbWl0OiBbJ2xheWVycycsICdwYXR0ZXJuRmVhdHVyZXMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBGaWxsQnVja2V0O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwiZmlsbC1zb3J0LWtleVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiZmlsbC1zb3J0LWtleVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9maWxsXCJdW1wiZmlsbC1zb3J0LWtleVwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImZpbGwtb3BhY2l0eVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImZpbGwtb3V0bGluZS1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiZmlsbC10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJmaWxsLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxSZXNvbHZlZEltYWdlPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImZpbGwtYW50aWFsaWFzXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC1hbnRpYWxpYXNcIl0pLFxuICAgIFwiZmlsbC1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtb3BhY2l0eVwiXSksXG4gICAgXCJmaWxsLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtY29sb3JcIl0pLFxuICAgIFwiZmlsbC1vdXRsaW5lLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtb3V0bGluZS1jb2xvclwiXSksXG4gICAgXCJmaWxsLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtdHJhbnNsYXRlXCJdKSxcbiAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJmaWxsLXBhdHRlcm5cIjogbmV3IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtcGF0dGVyblwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCwgbGF5b3V0IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+LCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5cbmltcG9ydCBGaWxsQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0JztcbmltcG9ydCB7cG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb259IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJztcbmltcG9ydCB7dHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZX0gZnJvbSAnLi4vcXVlcnlfdXRpbHMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9maWxsX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgTGF5b3V0LCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7QnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7TGF5b3V0UHJvcHMsIFBhaW50UHJvcHN9IGZyb20gJy4vZmlsbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgRmlsbFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdW5ldmFsdWF0ZWRMYXlvdXQ6IExheW91dDxMYXlvdXRQcm9wcz47XG4gICAgbGF5b3V0OiBQb3NzaWJseUV2YWx1YXRlZDxMYXlvdXRQcm9wcz47XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHN1cGVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlcyk7XG5cbiAgICAgICAgY29uc3Qgb3V0bGluZUNvbG9yID0gdGhpcy5wYWludC5fdmFsdWVzWydmaWxsLW91dGxpbmUtY29sb3InXTtcbiAgICAgICAgaWYgKG91dGxpbmVDb2xvci52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnICYmIG91dGxpbmVDb2xvci52YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhaW50Ll92YWx1ZXNbJ2ZpbGwtb3V0bGluZS1jb2xvciddID0gdGhpcy5wYWludC5fdmFsdWVzWydmaWxsLWNvbG9yJ107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVCdWNrZXQocGFyYW1ldGVyczogQnVja2V0UGFyYW1ldGVyczwqPikge1xuICAgICAgICByZXR1cm4gbmV3IEZpbGxCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICB0cmFuc2Zvcm0uYW5nbGUsIHBpeGVsc1RvVGlsZVVuaXRzKTtcbiAgICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uKHRyYW5zbGF0ZWRQb2x5Z29uLCBnZW9tZXRyeSk7XG4gICAgfVxuXG4gICAgaXNUaWxlQ2xpcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxsU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCAgICAgICAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2Ffbm9ybWFsX2VkJywgICAgY29tcG9uZW50czogNCwgdHlwZTogJ0ludDE2J30sXG5dLCA0KTtcblxuZXhwb3J0IGRlZmF1bHQgbGF5b3V0O1xuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gbGF5b3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlRmVhdHVyZTtcclxuXHJcbmZ1bmN0aW9uIFZlY3RvclRpbGVGZWF0dXJlKHBiZiwgZW5kLCBleHRlbnQsIGtleXMsIHZhbHVlcykge1xyXG4gICAgLy8gUHVibGljXHJcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcclxuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xyXG4gICAgdGhpcy50eXBlID0gMDtcclxuXHJcbiAgICAvLyBQcml2YXRlXHJcbiAgICB0aGlzLl9wYmYgPSBwYmY7XHJcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xyXG4gICAgdGhpcy5fa2V5cyA9IGtleXM7XHJcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XHJcblxyXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsIHRoaXMsIGVuZCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHRhZywgZmVhdHVyZSwgcGJmKSB7XHJcbiAgICBpZiAodGFnID09IDEpIGZlYXR1cmUuaWQgPSBwYmYucmVhZFZhcmludCgpO1xyXG4gICAgZWxzZSBpZiAodGFnID09IDIpIHJlYWRUYWcocGJmLCBmZWF0dXJlKTtcclxuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xyXG4gICAgZWxzZSBpZiAodGFnID09IDQpIGZlYXR1cmUuX2dlb21ldHJ5ID0gcGJmLnBvcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFRhZyhwYmYsIGZlYXR1cmUpIHtcclxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcclxuXHJcbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xyXG4gICAgICAgIHZhciBrZXkgPSBmZWF0dXJlLl9rZXlzW3BiZi5yZWFkVmFyaW50KCldLFxyXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcclxuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xyXG4gICAgfVxyXG59XHJcblxyXG5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcclxuXHJcblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XHJcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XHJcblxyXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxyXG4gICAgICAgIGNtZCA9IDEsXHJcbiAgICAgICAgbGVuZ3RoID0gMCxcclxuICAgICAgICB4ID0gMCxcclxuICAgICAgICB5ID0gMCxcclxuICAgICAgICBsaW5lcyA9IFtdLFxyXG4gICAgICAgIGxpbmU7XHJcblxyXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcclxuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XHJcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcclxuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZW5ndGgtLTtcclxuXHJcbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcclxuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcclxuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXHJcbiAgICAgICAgICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcclxuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XHJcblxyXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcclxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcclxuICAgICAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XHJcblxyXG4gICAgcmV0dXJuIGxpbmVzO1xyXG59O1xyXG5cclxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XHJcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XHJcblxyXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxyXG4gICAgICAgIGNtZCA9IDEsXHJcbiAgICAgICAgbGVuZ3RoID0gMCxcclxuICAgICAgICB4ID0gMCxcclxuICAgICAgICB5ID0gMCxcclxuICAgICAgICB4MSA9IEluZmluaXR5LFxyXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxyXG4gICAgICAgIHkxID0gSW5maW5pdHksXHJcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XHJcblxyXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcclxuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XHJcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcclxuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZW5ndGgtLTtcclxuXHJcbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcclxuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcclxuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcclxuICAgICAgICAgICAgaWYgKHggPCB4MSkgeDEgPSB4O1xyXG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XHJcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcclxuICAgICAgICAgICAgaWYgKHkgPiB5MikgeTIgPSB5O1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XHJcbn07XHJcblxyXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeiwgdG9MbmdMYXQpIHtcclxuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcclxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcclxuICAgICAgICB5MCA9IHRoaXMuZXh0ZW50ICogeSxcclxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxyXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdLFxyXG4gICAgICAgIGksIGo7XHJcblxyXG4gICAgZnVuY3Rpb24gcHJvamVjdChsaW5lKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXTtcclxuICAgICAgICAgICAgLy8gdmFyIHkyID0gMTgwIC0gKHAueSArIHkwKSAqIDM2MCAvIHNpemU7XHJcbiAgICAgICAgICAgIC8vIHZhciB5VGVtcCA9IHlMYXQgJiYgeUxhdChwLnkgKyB5MCxzaXplKTtcclxuICAgICAgICAgICAgbGluZVtqXSA9IHRvTG5nTGF0KChwLnggKyB4MCkvIHNpemUgLCAocC55ICsgeTApL3NpemUgICk7XHJcbiAgICAgICAgICAgIC8vIGxpbmVbal0gPSBbXHJcbiAgICAgICAgICAgIC8vICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcclxuICAgICAgICAgICAgLy8gICAgIHlUZW1wPyB5VGVtcCA6IDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIgKiBNYXRoLlBJIC8gMTgwKSkgLSA5MFxyXG4gICAgICAgICAgICAvLyBdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xyXG4gICAgY2FzZSAxOlxyXG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBvaW50c1tpXSA9IGNvb3Jkc1tpXVswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29vcmRzID0gcG9pbnRzO1xyXG4gICAgICAgIHByb2plY3QoY29vcmRzKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICBjYXNlIDI6XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgIGNhc2UgMzpcclxuICAgICAgICBjb29yZHMgPSBjbGFzc2lmeVJpbmdzKGNvb3Jkcyk7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXVtqXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHR5cGUgPSAnTXVsdGknICsgdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVzdWx0ID0ge1xyXG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxyXG4gICAgICAgIGdlb21ldHJ5OiB7XHJcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZHNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoJ2lkJyBpbiB0aGlzKSB7XHJcbiAgICAgICAgcmVzdWx0LmlkID0gdGhpcy5pZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59O1xyXG5cclxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXHJcblxyXG5mdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzKSB7XHJcbiAgICB2YXIgbGVuID0gcmluZ3MubGVuZ3RoO1xyXG5cclxuICAgIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XHJcblxyXG4gICAgdmFyIHBvbHlnb25zID0gW10sXHJcbiAgICAgICAgcG9seWdvbixcclxuICAgICAgICBjY3c7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIHZhciBhcmVhID0gc2lnbmVkQXJlYShyaW5nc1tpXSk7XHJcbiAgICAgICAgaWYgKGFyZWEgPT09IDApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBpZiAoY2N3ID09PSB1bmRlZmluZWQpIGNjdyA9IGFyZWEgPCAwO1xyXG5cclxuICAgICAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xyXG4gICAgICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcclxuICAgICAgICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XHJcblxyXG4gICAgcmV0dXJuIHBvbHlnb25zO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaWduZWRBcmVhKHJpbmcpIHtcclxuICAgIHZhciBzdW0gPSAwO1xyXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDEsIHAyOyBpIDwgbGVuOyBqID0gaSsrKSB7XHJcbiAgICAgICAgcDEgPSByaW5nW2ldO1xyXG4gICAgICAgIHAyID0gcmluZ1tqXTtcclxuICAgICAgICBzdW0gKz0gKHAyLnggLSBwMS54KSAqIChwMS55ICsgcDIueSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VtO1xyXG59XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xyXG5cclxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XHJcbiAgICAvLyBQdWJsaWNcclxuICAgIHRoaXMudmVyc2lvbiA9IDE7XHJcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xyXG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xyXG4gICAgdGhpcy5sZW5ndGggPSAwO1xyXG5cclxuICAgIC8vIFByaXZhdGVcclxuICAgIHRoaXMuX3BiZiA9IHBiZjtcclxuICAgIHRoaXMuX2tleXMgPSBbXTtcclxuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy5fZmVhdHVyZXMgPSBbXTtcclxuXHJcbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XHJcblxyXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcclxuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcclxuICAgIGVsc2UgaWYgKHRhZyA9PT0gMSkgbGF5ZXIubmFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XHJcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XHJcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xyXG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBsYXllci5fa2V5cy5wdXNoKHBiZi5yZWFkU3RyaW5nKCkpO1xyXG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcclxuICAgIHZhciB2YWx1ZSA9IG51bGwsXHJcbiAgICAgICAgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XHJcblxyXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcclxuICAgICAgICB2YXIgdGFnID0gcGJmLnJlYWRWYXJpbnQoKSA+PiAzO1xyXG5cclxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxyXG4gICAgICAgICAgICB0YWcgPT09IDIgPyBwYmYucmVhZEZsb2F0KCkgOlxyXG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcclxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcclxuICAgICAgICAgICAgdGFnID09PSA1ID8gcGJmLnJlYWRWYXJpbnQoKSA6XHJcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcclxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcclxuVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24oaSkge1xyXG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xyXG5cclxuICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1tpXTtcclxuXHJcbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XHJcbiAgICByZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZiwgZW5kLCB0aGlzLmV4dGVudCwgdGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzKTtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGU7XHJcblxyXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XHJcbiAgICB0aGlzLmxheWVycyA9IHBiZi5yZWFkRmllbGRzKHJlYWRUaWxlLCB7fSwgZW5kKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZFRpbGUodGFnLCBsYXllcnMsIHBiZikge1xyXG4gICAgaWYgKHRhZyA9PT0gMykge1xyXG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XHJcbiAgICAgICAgaWYgKGxheWVyLmxlbmd0aCkgbGF5ZXJzW2xheWVyLm5hbWVdID0gbGF5ZXI7XHJcbiAgICB9XHJcbn1cclxuXHJcbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XHJcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcclxubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzJyk7XHJcbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQge0ZpbGxFeHRydXNpb25MYXlvdXRBcnJheX0gZnJvbSAnLi4vYXJyYXlfdHlwZXMnO1xyXG5cclxuaW1wb3J0IHttZW1iZXJzIGFzIGxheW91dEF0dHJpYnV0ZXN9IGZyb20gJy4vZmlsbF9leHRydXNpb25fYXR0cmlidXRlcyc7XHJcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL3NlZ21lbnQnO1xyXG5pbXBvcnQge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQge1RyaWFuZ2xlSW5kZXhBcnJheX0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZSc7XHJcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZXh0ZW50JztcclxuaW1wb3J0IGVhcmN1dCBmcm9tICdlYXJjdXQnO1xyXG5pbXBvcnQgbXZ0IGZyb20gJy4uLy4uL18vQG1hcGJveC92ZWN0b3ItdGlsZSc7XHJcbmNvbnN0IHZlY3RvclRpbGVGZWF0dXJlVHlwZXMgPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXM7XHJcbmltcG9ydCBjbGFzc2lmeVJpbmdzIGZyb20gJy4uLy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MnO1xyXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XHJcbmNvbnN0IEVBUkNVVF9NQVhfUklOR1MgPSA1MDA7XHJcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XHJcbmltcG9ydCB7aGFzUGF0dGVybiwgYWRkUGF0dGVybkRlcGVuZGVuY2llc30gZnJvbSAnLi9wYXR0ZXJuX2J1Y2tldF9mZWF0dXJlcyc7XHJcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeSc7XHJcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xyXG5cclxuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQnO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgICBCdWNrZXQsXHJcbiAgICBCdWNrZXRQYXJhbWV0ZXJzLFxyXG4gICAgQnVja2V0RmVhdHVyZSxcclxuICAgIEluZGV4ZWRGZWF0dXJlLFxyXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXHJcbn0gZnJvbSAnLi4vYnVja2V0JztcclxuXHJcbmltcG9ydCB0eXBlIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyJztcclxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcclxuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyJztcclxuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXInO1xyXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcclxuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xyXG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcclxuXHJcbmNvbnN0IEZBQ1RPUiA9IE1hdGgucG93KDIsIDEzKTtcclxuXHJcbmZ1bmN0aW9uIGFkZFZlcnRleCh2ZXJ0ZXhBcnJheSwgeCwgeSwgbngsIG55LCBueiwgdCwgZSkge1xyXG4gICAgdmVydGV4QXJyYXkuZW1wbGFjZUJhY2soXHJcbiAgICAgICAgLy8gYV9wb3NcclxuICAgICAgICB4LFxyXG4gICAgICAgIHksXHJcbiAgICAgICAgLy8gYV9ub3JtYWxfZWQ6IDMtY29tcG9uZW50IG5vcm1hbCBhbmQgMS1jb21wb25lbnQgZWRnZWRpc3RhbmNlXHJcbiAgICAgICAgTWF0aC5mbG9vcihueCAqIEZBQ1RPUikgKiAyICsgdCxcclxuICAgICAgICBueSAqIEZBQ1RPUiAqIDIsXHJcbiAgICAgICAgbnogKiBGQUNUT1IgKiAyLFxyXG4gICAgICAgIC8vIGVkZ2VkaXN0YW5jZSAodXNlZCBmb3Igd3JhcHBpbmcgcGF0dGVybnMgYXJvdW5kIGV4dHJ1c2lvbiBzaWRlcylcclxuICAgICAgICBNYXRoLnJvdW5kKGUpXHJcbiAgICApO1xyXG59XHJcblxyXG5jbGFzcyBGaWxsRXh0cnVzaW9uQnVja2V0IGltcGxlbWVudHMgQnVja2V0IHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICB6b29tOiBudW1iZXI7XHJcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xyXG4gICAgbGF5ZXJzOiBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XHJcbiAgICBsYXllcklkczogQXJyYXk8c3RyaW5nPjtcclxuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XHJcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xyXG5cclxuICAgIGxheW91dFZlcnRleEFycmF5OiBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXk7XHJcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcclxuXHJcbiAgICBpbmRleEFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXk7XHJcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XHJcblxyXG4gICAgaGFzUGF0dGVybjogYm9vbGVhbjtcclxuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+O1xyXG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XHJcbiAgICB1cGxvYWRlZDogYm9vbGVhbjtcclxuICAgIGZlYXR1cmVzOiBBcnJheTxCdWNrZXRGZWF0dXJlPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPEZpbGxFeHRydXNpb25TdHlsZUxheWVyPikge1xyXG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcclxuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcclxuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xyXG4gICAgICAgIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAobGF5ZXIgPT4gbGF5ZXIuaWQpO1xyXG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xyXG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IEZpbGxFeHRydXNpb25MYXlvdXRBcnJheSgpO1xyXG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcclxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcclxuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcclxuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XHJcbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGhhc1BhdHRlcm4oJ2ZpbGwtZXh0cnVzaW9uJywgdGhpcy5sYXllcnMsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpZCwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5lZWRHZW9tZXRyeSA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtcclxuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvbkZlYXR1cmUgPSB7dHlwZTogZmVhdHVyZS50eXBlLFxyXG4gICAgICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbmVlZEdlb21ldHJ5ID8gbG9hZEdlb21ldHJ5KGZlYXR1cmUpIDogW119O1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxheWVyc1swXS5fZmVhdHVyZUZpbHRlci5maWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSksIGV2YWx1YXRpb25GZWF0dXJlLCBjYW5vbmljYWwpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUgPSB7XHJcbiAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXHJcbiAgICAgICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBuZWVkR2VvbWV0cnkgPyBldmFsdWF0aW9uRmVhdHVyZS5nZW9tZXRyeSA6IGxvYWRHZW9tZXRyeShmZWF0dXJlKSxcclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcclxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcclxuICAgICAgICAgICAgICAgIHBhdHRlcm5zOiB7fVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUGF0dGVybikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKGFkZFBhdHRlcm5EZXBlbmRlbmNpZXMoJ2ZpbGwtZXh0cnVzaW9uJywgdGhpcy5sYXllcnMsIGJ1Y2tldEZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucykpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGJ1Y2tldEZlYXR1cmUsIGJ1Y2tldEZlYXR1cmUuZ2VvbWV0cnksIGluZGV4LCBjYW5vbmljYWwsIHt9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGJ1Y2tldEZlYXR1cmUuZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4LCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRmVhdHVyZXMob3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGhpcy5mZWF0dXJlcykge1xyXG4gICAgICAgICAgICBjb25zdCB7Z2VvbWV0cnl9ID0gZmVhdHVyZTtcclxuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGdlb21ldHJ5LCBmZWF0dXJlLmluZGV4LCBjYW5vbmljYWwsIGltYWdlUG9zaXRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhzdGF0ZXMsIHZ0TGF5ZXIsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIGltYWdlUG9zaXRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0VtcHR5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICB1cGxvYWRQZW5kaW5nKCkge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcclxuICAgIH1cclxuXHJcbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xyXG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRGZWF0dXJlKGZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBpbmRleDogbnVtYmVyLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhnZW9tZXRyeSwgRUFSQ1VUX01BWF9SSU5HUykpIHtcclxuICAgICAgICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgIG51bVZlcnRpY2VzICs9IHJpbmcubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChyaW5nLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc0VudGlyZWx5T3V0c2lkZShyaW5nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBlZGdlRGlzdGFuY2UgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcmluZy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAxID0gcmluZ1twXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwMiA9IHJpbmdbcCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JvdW5kYXJ5RWRnZShwMSwgcDIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyA0ID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVycCA9IHAxLnN1YihwMikuX3BlcnAoKS5fdW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzdCA9IHAyLmRpc3QocDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VEaXN0YW5jZSArIGRpc3QgPiAzMjc2OCkgZWRnZURpc3RhbmNlID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgcGVycC54LCBwZXJwLnksIDAsIDAsIGVkZ2VEaXN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgcGVycC54LCBwZXJwLnksIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZURpc3RhbmNlICs9IGRpc3Q7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAyLngsIHAyLnksIHBlcnAueCwgcGVycC55LCAwLCAwLCBlZGdlRGlzdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAyLngsIHAyLnksIHBlcnAueCwgcGVycC55LCAwLCAxLCBlZGdlRGlzdGFuY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDilIIgMCAgMSDilIIgQ291bnRlci1jbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOKUgiAgICAgIOKUgiBUcmlhbmdsZSAxOiAwID0+IDIgPT4gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4pSCIDIgIDMg4pSCIFRyaWFuZ2xlIDI6IDEgPT4gMiA9PiAzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDilJTilIDilIDilIDilIDilIDilIDilJhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhib3R0b21SaWdodCwgYm90dG9tUmlnaHQgKyAyLCBib3R0b21SaWdodCArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0ICsgMSwgYm90dG9tUmlnaHQgKyAyLCBib3R0b21SaWdodCArIDMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IFNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHtcclxuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KG51bVZlcnRpY2VzLCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL09ubHkgdHJpYW5ndWxhdGUgYW5kIGRyYXcgdGhlIGFyZWEgb2YgdGhlIGZlYXR1cmUgaWYgaXQgaXMgYSBwb2x5Z29uXHJcbiAgICAgICAgICAgIC8vT3RoZXIgZmVhdHVyZSB0eXBlcyAoZS5nLiBMaW5lU3RyaW5nKSBkbyBub3QgaGF2ZSBhcmVhLCBzbyB0cmlhbmd1bGF0aW9uIGlzIHBvaW50bGVzcyAvIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAodmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdICE9PSAnUG9seWdvbicpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBob2xlSW5kaWNlcyA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCB0cmlhbmdsZUluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJpbmcubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJpbmcgIT09IHBvbHlnb25bMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBob2xlSW5kaWNlcy5wdXNoKGZsYXR0ZW5lZC5sZW5ndGggLyAyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gcmluZ1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAueCwgcC55LCAwLCAwLCAxLCAxLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocC54KTtcclxuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChwLnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gZWFyY3V0KGZsYXR0ZW5lZCwgaG9sZUluZGljZXMpO1xyXG4gICAgICAgICAgICBhc3NlcnQoaW5kaWNlcy5sZW5ndGggJSAzID09PSAwKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGogKz0gMykge1xyXG4gICAgICAgICAgICAgICAgLy8gQ291bnRlci1jbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cclxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhcclxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tqXSxcclxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tqICsgMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGVJbmRleCArIGluZGljZXNbaiArIDFdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gaW5kaWNlcy5sZW5ndGggLyAzO1xyXG4gICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSBudW1WZXJ0aWNlcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCBpbWFnZVBvc2l0aW9ucywgY2Fub25pY2FsKTtcclxuICAgIH1cclxufVxyXG5cclxucmVnaXN0ZXIoJ0ZpbGxFeHRydXNpb25CdWNrZXQnLCBGaWxsRXh0cnVzaW9uQnVja2V0LCB7b21pdDogWydsYXllcnMnLCAnZmVhdHVyZXMnXX0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgRmlsbEV4dHJ1c2lvbkJ1Y2tldDtcclxuXHJcbmZ1bmN0aW9uIGlzQm91bmRhcnlFZGdlKHAxLCBwMikge1xyXG4gICAgcmV0dXJuIChwMS54ID09PSBwMi54ICYmIChwMS54IDwgMCB8fCBwMS54ID4gRVhURU5UKSkgfHxcclxuICAgICAgICAocDEueSA9PT0gcDIueSAmJiAocDEueSA8IDAgfHwgcDEueSA+IEVYVEVOVCkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0VudGlyZWx5T3V0c2lkZShyaW5nKSB7XHJcbiAgICByZXR1cm4gcmluZy5ldmVyeShwID0+IHAueCA8IDApIHx8XHJcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueCA+IEVYVEVOVCkgfHxcclxuICAgICAgICByaW5nLmV2ZXJ5KHAgPT4gcC55IDwgMCkgfHxcclxuICAgICAgICByaW5nLmV2ZXJ5KHAgPT4gcC55ID4gRVhURU5UKTtcclxufVxyXG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiZmlsbC1leHRydXNpb24tY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHk8UmVzb2x2ZWRJbWFnZT4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjogbmV3IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24taGVpZ2h0XCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLWJhc2VcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWJhc2VcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnRcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XHJcblxyXG5pbXBvcnQgRmlsbEV4dHJ1c2lvbkJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQnO1xyXG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzUG9seWdvbiwgcG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb259IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJztcclxuaW1wb3J0IHt0cmFuc2xhdGVEaXN0YW5jZSwgdHJhbnNsYXRlfSBmcm9tICcuLi9xdWVyeV91dGlscyc7XHJcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XHJcbmltcG9ydCB7VHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcclxuaW1wb3J0IHt2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xyXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XHJcblxyXG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xyXG5pbXBvcnQgdHlwZSB7QnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xyXG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcclxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0nO1xyXG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcclxuXHJcbmNsYXNzIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XHJcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XHJcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xyXG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcclxuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGaWxsRXh0cnVzaW9uQnVja2V0KHBhcmFtZXRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXJ5UmFkaXVzKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXMzRCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSk6IGJvb2xlYW4gfCBudW1iZXIge1xyXG5cclxuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LFxyXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlJyksXHJcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yJyksXHJcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xyXG5cclxuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24taGVpZ2h0JykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcclxuICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLWJhc2UnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xyXG5cclxuICAgICAgICBjb25zdCBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5ID0gcHJvamVjdFF1ZXJ5R2VvbWV0cnkodHJhbnNsYXRlZFBvbHlnb24sIHBpeGVsUG9zTWF0cml4LCB0cmFuc2Zvcm0sIDApO1xyXG5cclxuICAgICAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0RXh0cnVzaW9uKGdlb21ldHJ5LCBiYXNlLCBoZWlnaHQsIHBpeGVsUG9zTWF0cml4KTtcclxuICAgICAgICBjb25zdCBwcm9qZWN0ZWRCYXNlID0gcHJvamVjdGVkWzBdO1xyXG4gICAgICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IHByb2plY3RlZFsxXTtcclxuICAgICAgICByZXR1cm4gY2hlY2tJbnRlcnNlY3Rpb24ocHJvamVjdGVkQmFzZSwgcHJvamVjdGVkVG9wLCBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG90KGEsIGIpIHtcclxuICAgIHJldHVybiBhLnggKiBiLnggKyBhLnkgKiBiLnk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sIHByb2plY3RlZEZhY2U6IEFycmF5PFBvaW50Pikge1xyXG5cclxuICAgIGlmIChwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIC8vIEZvciBwb2ludCBxdWVyaWVzIGNhbGN1bGF0ZSB0aGUgeiBhdCB3aGljaCB0aGUgcG9pbnQgaW50ZXJzZWN0cyB0aGUgZmFjZVxyXG4gICAgICAgIC8vIHVzaW5nIGJhcnljZW50cmljIGNvb3JkaW5hdGVzLlxyXG5cclxuICAgICAgICAvLyBGaW5kIHRoZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBvZiB0aGUgcHJvamVjdGVkIHBvaW50IHdpdGhpbiB0aGUgZmlyc3RcclxuICAgICAgICAvLyB0cmlhbmdsZSBvZiB0aGUgZmFjZSwgdXNpbmcgb25seSB0aGUgeHkgcGxhbmUuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZVxyXG4gICAgICAgIC8vIHBvaW50IGlzIG91dHNpZGUgdGhlIGZpcnN0IHRyaWFuZ2xlIGJlY2F1c2UgYWxsIHRoZSB0cmlhbmdsZXMgaW4gdGhlIGZhY2VcclxuICAgICAgICAvLyBhcmUgaW4gdGhlIHNhbWUgcGxhbmUuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHBvaW50cyBhcmUgY29pbmNpZGVudCBhbmQgdXNlIG90aGVyIHBvaW50cyBpZiB0aGV5IGFyZS5cclxuICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgY29uc3QgYSA9IHByb2plY3RlZEZhY2VbaSsrXTtcclxuICAgICAgICBsZXQgYjtcclxuICAgICAgICB3aGlsZSAoIWIgfHwgYS5lcXVhbHMoYikpIHtcclxuICAgICAgICAgICAgYiA9IHByb2plY3RlZEZhY2VbaSsrXTtcclxuICAgICAgICAgICAgaWYgKCFiKSByZXR1cm4gSW5maW5pdHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBMb29wIHVudGlsIHBvaW50IGBjYCBpcyBub3QgY29saW5lYXIgd2l0aCBwb2ludHMgYGFgIGFuZCBgYmAuXHJcbiAgICAgICAgZm9yICg7IGkgPCBwcm9qZWN0ZWRGYWNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGMgPSBwcm9qZWN0ZWRGYWNlW2ldO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcCA9IHByb2plY3RlZFF1ZXJ5R2VvbWV0cnlbMF07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhYiA9IGIuc3ViKGEpO1xyXG4gICAgICAgICAgICBjb25zdCBhYyA9IGMuc3ViKGEpO1xyXG4gICAgICAgICAgICBjb25zdCBhcCA9IHAuc3ViKGEpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZG90QUJBQiA9IGRvdChhYiwgYWIpO1xyXG4gICAgICAgICAgICBjb25zdCBkb3RBQkFDID0gZG90KGFiLCBhYyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvdEFDQUMgPSBkb3QoYWMsIGFjKTtcclxuICAgICAgICAgICAgY29uc3QgZG90QVBBQiA9IGRvdChhcCwgYWIpO1xyXG4gICAgICAgICAgICBjb25zdCBkb3RBUEFDID0gZG90KGFwLCBhYyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbm9tID0gZG90QUJBQiAqIGRvdEFDQUMgLSBkb3RBQkFDICogZG90QUJBQztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHYgPSAoZG90QUNBQyAqIGRvdEFQQUIgLSBkb3RBQkFDICogZG90QVBBQykgLyBkZW5vbTtcclxuICAgICAgICAgICAgY29uc3QgdyA9IChkb3RBQkFCICogZG90QVBBQyAtIGRvdEFCQUMgKiBkb3RBUEFCKSAvIGRlbm9tO1xyXG4gICAgICAgICAgICBjb25zdCB1ID0gMSAtIHYgLSB3O1xyXG5cclxuICAgICAgICAgICAgLy8gVXNlIHRoZSBiYXJ5Y2VudHJpYyB3ZWlnaHRpbmcgYWxvbmcgd2l0aCB0aGUgb3JpZ2luYWwgdHJpYW5nbGUgeiBjb29yZGluYXRlcyB0byBnZXQgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbi5cclxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhLnogKiB1ICsgYi56ICogdiArIGMueiAqIHc7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGlzdGFuY2UpKSByZXR1cm4gZGlzdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gSW5maW5pdHk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBUaGUgY291bnRzIGFzIGNsb3Nlc3QgaXMgbGVzcyBjbGVhciB3aGVuIHRoZSBxdWVyeSBpcyBhIGJveC4gVGhpc1xyXG4gICAgICAgIC8vIHJldHVybnMgdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0IHBvaW50IG9uIHRoZSBmYWNlLCB3aGV0aGVyIGl0IGlzXHJcbiAgICAgICAgLy8gd2l0aGluIHRoZSBxdWVyeSBvciBub3QuIEl0IGNvdWxkIGJlIG1vcmUgY29ycmVjdCB0byByZXR1cm4gdGhlXHJcbiAgICAgICAgLy8gZGlzdGFuY2UgdG8gdGhlIGNsb3Nlc3QgcG9pbnQgd2l0aGluIHRoZSBxdWVyeSBib3ggYnV0IHRoaXMgd291bGQgYmVcclxuICAgICAgICAvLyBtb3JlIGNvbXBsaWNhdGVkIGFuZCBleHBlbnNpdmUgdG8gY2FsY3VsYXRlIHdpdGggbGl0dGxlIGJlbmVmaXQuXHJcbiAgICAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xyXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9qZWN0ZWRGYWNlKSB7XHJcbiAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IE1hdGgubWluKGNsb3Nlc3REaXN0YW5jZSwgcC56KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNsb3Nlc3REaXN0YW5jZTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24ocHJvamVjdGVkQmFzZTogQXJyYXk8UG9pbnQ+LCBwcm9qZWN0ZWRUb3A6IEFycmF5PFBvaW50PiwgcHJvamVjdGVkUXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+KSB7XHJcbiAgICBsZXQgY2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XHJcblxyXG4gICAgaWYgKHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIHByb2plY3RlZFRvcCkpIHtcclxuICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBwcm9qZWN0ZWRUb3BbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcHJvamVjdGVkVG9wLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgY29uc3QgcmluZ1RvcCA9IHByb2plY3RlZFRvcFtyXTtcclxuICAgICAgICBjb25zdCByaW5nQmFzZSA9IHByb2plY3RlZEJhc2Vbcl07XHJcbiAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCByaW5nVG9wLmxlbmd0aCAtIDE7IHArKykge1xyXG4gICAgICAgICAgICBjb25zdCB0b3BBID0gcmluZ1RvcFtwXTtcclxuICAgICAgICAgICAgY29uc3QgdG9wQiA9IHJpbmdUb3BbcCArIDFdO1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlQSA9IHJpbmdCYXNlW3BdO1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlQiA9IHJpbmdCYXNlW3AgKyAxXTtcclxuICAgICAgICAgICAgY29uc3QgZmFjZSA9IFt0b3BBLCB0b3BCLCBiYXNlQiwgYmFzZUEsIHRvcEFdO1xyXG4gICAgICAgICAgICBpZiAocG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIGZhY2UpKSB7XHJcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBNYXRoLm1pbihjbG9zZXN0RGlzdGFuY2UsIGdldEludGVyc2VjdGlvbkRpc3RhbmNlKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIGZhY2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xvc2VzdERpc3RhbmNlID09PSBJbmZpbml0eSA/IGZhbHNlIDogY2xvc2VzdERpc3RhbmNlO1xyXG59XHJcblxyXG4vKlxyXG4gKiBQcm9qZWN0IHRoZSBnZW9tZXRyeSB1c2luZyBtYXRyaXggYG1gLiBUaGlzIGlzIGVzc2VudGlhbGx5IGRvaW5nXHJcbiAqIGB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwLngsIHAueSwgeiwgMV0sIG0pYCBidXQgdGhlIG11bHRpcGxpY2F0aW9uXHJcbiAqIGlzIGlubGluZWQgc28gdGhhdCBwYXJ0cyBvZiB0aGUgcHJvamVjdGlvbiB0aGF0IGFyZSB0aGUgc2FtZSBhY3Jvc3NcclxuICogZGlmZmVyZW50IHBvaW50cyBjYW4gb25seSBiZSBkb25lIG9uY2UuIFRoaXMgcHJvZHVjZWQgYSBtZWFzdXJhYmxlXHJcbiAqIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LlxyXG4gKi9cclxuZnVuY3Rpb24gcHJvamVjdEV4dHJ1c2lvbihnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgekJhc2U6IG51bWJlciwgelRvcDogbnVtYmVyLCBtOiBGbG9hdDMyQXJyYXkpIHtcclxuICAgIGNvbnN0IHByb2plY3RlZEJhc2UgPSBbXTtcclxuICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGJhc2VYWiA9IG1bOF0gKiB6QmFzZTtcclxuICAgIGNvbnN0IGJhc2VZWiA9IG1bOV0gKiB6QmFzZTtcclxuICAgIGNvbnN0IGJhc2VaWiA9IG1bMTBdICogekJhc2U7XHJcbiAgICBjb25zdCBiYXNlV1ogPSBtWzExXSAqIHpCYXNlO1xyXG4gICAgY29uc3QgdG9wWFogPSBtWzhdICogelRvcDtcclxuICAgIGNvbnN0IHRvcFlaID0gbVs5XSAqIHpUb3A7XHJcbiAgICBjb25zdCB0b3BaWiA9IG1bMTBdICogelRvcDtcclxuICAgIGNvbnN0IHRvcFdaID0gbVsxMV0gKiB6VG9wO1xyXG5cclxuICAgIGZvciAoY29uc3QgciBvZiBnZW9tZXRyeSkge1xyXG4gICAgICAgIGNvbnN0IHJpbmdCYXNlID0gW107XHJcbiAgICAgICAgY29uc3QgcmluZ1RvcCA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiByKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBwLng7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSBwLnk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzWCA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcclxuICAgICAgICAgICAgY29uc3Qgc1kgPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XHJcbiAgICAgICAgICAgIGNvbnN0IHNaID0gbVsyXSAqIHggKyBtWzZdICogeSArIG1bMTRdO1xyXG4gICAgICAgICAgICBjb25zdCBzVyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzE1XTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VYID0gc1ggKyBiYXNlWFo7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VZID0gc1kgKyBiYXNlWVo7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VaID0gc1ogKyBiYXNlWlo7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VXID0gc1cgKyBiYXNlV1o7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0b3BYID0gc1ggKyB0b3BYWjtcclxuICAgICAgICAgICAgY29uc3QgdG9wWSA9IHNZICsgdG9wWVo7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvcFogPSBzWiArIHRvcFpaO1xyXG4gICAgICAgICAgICBjb25zdCB0b3BXID0gc1cgKyB0b3BXWjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGIgPSBuZXcgUG9pbnQoYmFzZVggLyBiYXNlVywgYmFzZVkgLyBiYXNlVyk7XHJcbiAgICAgICAgICAgIGIueiA9IGJhc2VaIC8gYmFzZVc7XHJcbiAgICAgICAgICAgIHJpbmdCYXNlLnB1c2goYik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFBvaW50KHRvcFggLyB0b3BXLCB0b3BZIC8gdG9wVyk7XHJcbiAgICAgICAgICAgIHQueiA9IHRvcFogLyB0b3BXO1xyXG4gICAgICAgICAgICByaW5nVG9wLnB1c2godCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb2plY3RlZEJhc2UucHVzaChyaW5nQmFzZSk7XHJcbiAgICAgICAgcHJvamVjdGVkVG9wLnB1c2gocmluZ1RvcCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW3Byb2plY3RlZEJhc2UsIHByb2plY3RlZFRvcF07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2plY3RRdWVyeUdlb21ldHJ5KHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PiwgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHo6IG51bWJlcikge1xyXG4gICAgY29uc3QgcHJvamVjdGVkUXVlcnlHZW9tZXRyeSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHF1ZXJ5R2VvbWV0cnkpIHtcclxuICAgICAgICBjb25zdCB2ID0gW3AueCwgcC55LCB6LCAxXTtcclxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodiwgdiwgcGl4ZWxQb3NNYXRyaXgpO1xyXG4gICAgICAgIHByb2plY3RlZFF1ZXJ5R2VvbWV0cnkucHVzaChuZXcgUG9pbnQodlswXSAvIHZbM10sIHZbMV0gLyB2WzNdKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvamVjdGVkUXVlcnlHZW9tZXRyeTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI7XHJcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsaW5lTGF5b3V0QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19ub3JtYWwnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfZGF0YScsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50OCd9XG5dLCA0KTtcblxuZXhwb3J0IGRlZmF1bHQgbGluZUxheW91dEF0dHJpYnV0ZXM7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsaW5lTGF5b3V0QXR0cmlidXRlcztcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuXG5jb25zdCBsaW5lTGF5b3V0QXR0cmlidXRlc0V4dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3V2X3gnLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnRmxvYXQzMid9LFxuICAgIHtuYW1lOiAnYV9zcGxpdF9pbmRleCcsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdGbG9hdDMyJ30sXG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgbGluZUxheW91dEF0dHJpYnV0ZXNFeHQ7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsaW5lTGF5b3V0QXR0cmlidXRlc0V4dDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TGluZUxheW91dEFycmF5LCBMaW5lRXh0TGF5b3V0QXJyYXl9IGZyb20gJy4uL2FycmF5X3R5cGVzJztcblxuaW1wb3J0IHttZW1iZXJzIGFzIGxheW91dEF0dHJpYnV0ZXN9IGZyb20gJy4vbGluZV9hdHRyaWJ1dGVzJztcbmltcG9ydCB7bWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzRXh0fSBmcm9tICcuL2xpbmVfYXR0cmlidXRlc19leHQnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudCc7XG5pbXBvcnQge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtUcmlhbmdsZUluZGV4QXJyYXl9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9leHRlbnQnO1xuaW1wb3J0IG12dCBmcm9tICcuLi8uLi9fL0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuY29uc3QgdmVjdG9yVGlsZUZlYXR1cmVUeXBlcyA9IG12dC5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQge2hhc1BhdHRlcm4sIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXN9IGZyb20gJy4vcGF0dGVybl9idWNrZXRfZmVhdHVyZXMnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5JztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0JztcbmltcG9ydCB0eXBlIExpbmVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7U2VnbWVudH0gZnJvbSAnLi4vc2VnbWVudCc7XG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vLi4vdXRpbC9pbWFnZSc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgVGV4dHVyZSBmcm9tICcuLi8uLi9yZW5kZXIvdGV4dHVyZSc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5cbi8vIE5PVEUgT04gRVhUUlVERSBTQ0FMRTpcbi8vIHNjYWxlIHRoZSBleHRydXNpb24gdmVjdG9yIHNvIHRoYXQgdGhlIG5vcm1hbCBsZW5ndGggaXMgdGhpcyB2YWx1ZS5cbi8vIGNvbnRhaW5zIHRoZSBcInRleHR1cmVcIiBub3JtYWxzICgtMS4uMSkuIHRoaXMgaXMgZGlzdGluY3QgZnJvbSB0aGUgZXh0cnVkZVxuLy8gbm9ybWFscyBmb3IgbGluZSBqb2lucywgYmVjYXVzZSB0aGUgeC12YWx1ZSByZW1haW5zIDAgZm9yIHRoZSB0ZXh0dXJlXG4vLyBub3JtYWwgYXJyYXksIHdoaWxlIHRoZSBleHRydWRlIG5vcm1hbCBhY3R1YWxseSBtb3ZlcyB0aGUgdmVydGV4IHRvIGNyZWF0ZVxuLy8gdGhlIGFjdXRlL2JldmVsbGVkIGxpbmUgam9pbi5cbmNvbnN0IEVYVFJVREVfU0NBTEUgPSA2MztcblxuLypcbiAqIFNoYXJwIGNvcm5lcnMgY2F1c2UgZGFzaGVkIGxpbmVzIHRvIHRpbHQgYmVjYXVzZSB0aGUgZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmVcbiAqIGlzIHRoZSBzYW1lIGF0IGJvdGggdGhlIGlubmVyIGFuZCBvdXRlciBjb3JuZXJzLiBUbyBpbXByb3ZlIHRoZSBhcHBlYXJhbmNlIG9mXG4gKiBkYXNoZWQgbGluZXMgd2UgYWRkIGV4dHJhIHBvaW50cyBuZWFyIHNoYXJwIGNvcm5lcnMgc28gdGhhdCBhIHNtYWxsZXIgcGFydFxuICogb2YgdGhlIGxpbmUgaXMgdGlsdGVkLlxuICpcbiAqIENPU19IQUxGX1NIQVJQX0NPUk5FUiBjb250cm9scyBob3cgc2hhcnAgYSBjb3JuZXIgaGFzIHRvIGJlIGZvciB1cyB0byBhZGQgYW5cbiAqIGV4dHJhIHZlcnRleC4gVGhlIGRlZmF1bHQgaXMgNzUgZGVncmVlcy5cbiAqXG4gKiBUaGUgbmV3bHkgY3JlYXRlZCB2ZXJ0aWNlcyBhcmUgcGxhY2VkIFNIQVJQX0NPUk5FUl9PRkZTRVQgcGl4ZWxzIGZyb20gdGhlIGNvcm5lci5cbiAqL1xuY29uc3QgQ09TX0hBTEZfU0hBUlBfQ09STkVSID0gTWF0aC5jb3MoNzUgLyAyICogKE1hdGguUEkgLyAxODApKTtcbmNvbnN0IFNIQVJQX0NPUk5FUl9PRkZTRVQgPSAxNTtcblxuLy8gQW5nbGUgcGVyIHRyaWFuZ2xlIGZvciBhcHByb3hpbWF0aW5nIHJvdW5kIGxpbmUgam9pbnMuXG5jb25zdCBERUdfUEVSX1RSSUFOR0xFID0gMjA7XG5cbi8vIFRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGxpbmUgZGlzdGFuY2UgaW4gdGhlIGJ1ZmZlci5cbmNvbnN0IExJTkVfRElTVEFOQ0VfQlVGRkVSX0JJVFMgPSAxNTtcblxuLy8gV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggYml0cyBmb3IgdGhlIGxpbmUgZGlzdGFuY2UgYXMgd2UnZCBsaWtlIHRvIGhhdmUsIHNvXG4vLyB1c2UgdGhpcyB2YWx1ZSB0byBzY2FsZSB0aGUgbGluZSBkaXN0YW5jZSAoaW4gdGlsZSB1bml0cykgZG93biB0byBhIHNtYWxsZXJcbi8vIHZhbHVlLiBUaGlzIGxldHMgdXMgc3RvcmUgbG9uZ2VyIGRpc3RhbmNlcyB3aGlsZSBzYWNyaWZpY2luZyBwcmVjaXNpb24uXG5jb25zdCBMSU5FX0RJU1RBTkNFX1NDQUxFID0gMSAvIDI7XG5cbi8vIFRoZSBtYXhpbXVtIGxpbmUgZGlzdGFuY2UsIGluIHRpbGUgdW5pdHMsIHRoYXQgZml0cyBpbiB0aGUgYnVmZmVyLlxuY29uc3QgTUFYX0xJTkVfRElTVEFOQ0UgPSBNYXRoLnBvdygyLCBMSU5FX0RJU1RBTkNFX0JVRkZFUl9CSVRTIC0gMSkgLyBMSU5FX0RJU1RBTkNFX1NDQUxFO1xuXG50eXBlIExpbmVDbGlwcyA9IHtcbiAgICBzdGFydDogbnVtYmVyO1xuICAgIGVuZDogbnVtYmVyO1xufVxuXG50eXBlIEdyYWRpZW50VGV4dHVyZSA9IHtcbiAgICB0ZXh0dXJlOiBUZXh0dXJlO1xuICAgIGdyYWRpZW50OiA/UkdCQUltYWdlO1xuICAgIHZlcnNpb246IG51bWJlcjtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMaW5lQnVja2V0IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBkaXN0YW5jZTogbnVtYmVyO1xuICAgIHRvdGFsRGlzdGFuY2U6IG51bWJlcjtcbiAgICBtYXhMaW5lTGVuZ3RoOiBudW1iZXI7XG4gICAgc2NhbGVkRGlzdGFuY2U6IG51bWJlcjtcbiAgICBsaW5lQ2xpcHM6ID9MaW5lQ2xpcHM7XG5cbiAgICBlMTogbnVtYmVyO1xuICAgIGUyOiBudW1iZXI7XG5cbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8TGluZVN0eWxlTGF5ZXI+O1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIGdyYWRpZW50czoge1tzdHJpbmddOiBHcmFkaWVudFRleHR1cmV9O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxhbnk+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgcGF0dGVybkZlYXR1cmVzOiBBcnJheTxCdWNrZXRGZWF0dXJlPjtcbiAgICBsaW5lQ2xpcHNBcnJheTogQXJyYXk8TGluZUNsaXBzPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBMaW5lTGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgbGF5b3V0VmVydGV4QXJyYXkyOiBMaW5lRXh0TGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyMjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxMaW5lU3R5bGVMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPExpbmVTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdO1xuICAgICAgICB0aGlzLmxpbmVDbGlwc0FycmF5ID0gW107XG4gICAgICAgIHRoaXMuZ3JhZGllbnRzID0ge307XG4gICAgICAgIHRoaXMubGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmFkaWVudHNbbGF5ZXIuaWRdID0ge307XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGluZUxheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkyID0gbmV3IExpbmVFeHRMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uU2V0KG9wdGlvbnMubGF5ZXJzLCBvcHRpb25zLnpvb20pO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5tYXhMaW5lTGVuZ3RoID0gMDtcblxuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gaGFzUGF0dGVybignbGluZScsIHRoaXMubGF5ZXJzLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGluZVNvcnRLZXkgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQuZ2V0KCdsaW5lLXNvcnQta2V5Jyk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5O1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvbkZlYXR1cmUgPSB7dHlwZTogZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbmVlZEdlb21ldHJ5ID8gbG9hZEdlb21ldHJ5KGZlYXR1cmUpIDogW119O1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIW5lZWRHZW9tZXRyeSkgIGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gbGluZVNvcnRLZXkgP1xuICAgICAgICAgICAgICAgIGxpbmVTb3J0S2V5LmV2YWx1YXRlKGV2YWx1YXRpb25GZWF0dXJlLCB7fSwgY2Fub25pY2FsKSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnB1c2goYnVja2V0RmVhdHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZVNvcnRLZXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBhLnNvcnRLZXkgaXMgYWx3YXlzIGEgbnVtYmVyIHdoZW4gaW4gdXNlXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYS5zb3J0S2V5OiBhbnkpOiBudW1iZXIpIC0gKChiLnNvcnRLZXk6IGFueSk6IG51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYnVja2V0RmVhdHVyZSBvZiBidWNrZXRGZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3Qge2dlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gPSBidWNrZXRGZWF0dXJlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybkJ1Y2tldEZlYXR1cmUgPSBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzKCdsaW5lJywgdGhpcy5sYXllcnMsIGJ1Y2tldEZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgLy8gcGF0dGVybiBmZWF0dXJlcyBhcmUgYWRkZWQgb25seSBvbmNlIHRoZSBwYXR0ZXJuIGlzIGxvYWRlZCBpbnRvIHRoZSBpbWFnZSBhdGxhc1xuICAgICAgICAgICAgICAgIC8vIHNvIGFyZSBzdG9yZWQgZHVyaW5nIHBvcHVsYXRlIHVudGlsIGxhdGVyIHVwZGF0ZWQgd2l0aCBwb3NpdGlvbnMgYnkgdGlsZSB3b3JrZXIgaW4gYWRkRmVhdHVyZXNcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcy5wdXNoKHBhdHRlcm5CdWNrZXRGZWF0dXJlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgY2Fub25pY2FsLCB7fSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1tpbmRleF0uZmVhdHVyZTtcbiAgICAgICAgICAgIG9wdGlvbnMuZmVhdHVyZUluZGV4Lmluc2VydChmZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmVzKG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiB0aGlzLnBhdHRlcm5GZWF0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGZlYXR1cmUuZ2VvbWV0cnksIGZlYXR1cmUuaW5kZXgsIGNhbm9uaWNhbCwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dFZlcnRleEFycmF5Mi5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlcjIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5MiwgbGF5b3V0QXR0cmlidXRlc0V4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBsaW5lRmVhdHVyZUNsaXBzKGZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUpOiA/TGluZUNsaXBzIHtcbiAgICAgICAgaWYgKCEhZmVhdHVyZS5wcm9wZXJ0aWVzICYmIGZlYXR1cmUucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgnbWFwYm94X2NsaXBfc3RhcnQnKSAmJiBmZWF0dXJlLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoJ21hcGJveF9jbGlwX2VuZCcpKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9ICtmZWF0dXJlLnByb3BlcnRpZXNbJ21hcGJveF9jbGlwX3N0YXJ0J107XG4gICAgICAgICAgICBjb25zdCBlbmQgPSArZmVhdHVyZS5wcm9wZXJ0aWVzWydtYXBib3hfY2xpcF9lbmQnXTtcbiAgICAgICAgICAgIHJldHVybiB7c3RhcnQsIGVuZH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlKGZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBpbmRleDogbnVtYmVyLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCBqb2luID0gbGF5b3V0LmdldCgnbGluZS1qb2luJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICBjb25zdCBjYXAgPSBsYXlvdXQuZ2V0KCdsaW5lLWNhcCcpO1xuICAgICAgICBjb25zdCBtaXRlckxpbWl0ID0gbGF5b3V0LmdldCgnbGluZS1taXRlci1saW1pdCcpO1xuICAgICAgICBjb25zdCByb3VuZExpbWl0ID0gbGF5b3V0LmdldCgnbGluZS1yb3VuZC1saW1pdCcpO1xuICAgICAgICB0aGlzLmxpbmVDbGlwcyA9IHRoaXMubGluZUZlYXR1cmVDbGlwcyhmZWF0dXJlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTGluZShsaW5lLCBmZWF0dXJlLCBqb2luLCBjYXAsIG1pdGVyTGltaXQsIHJvdW5kTGltaXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSwgaW5kZXgsIGltYWdlUG9zaXRpb25zLCBjYW5vbmljYWwpO1xuICAgIH1cblxuICAgIGFkZExpbmUodmVydGljZXM6IEFycmF5PFBvaW50PiwgZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgam9pbjogc3RyaW5nLCBjYXA6IHN0cmluZywgbWl0ZXJMaW1pdDogbnVtYmVyLCByb3VuZExpbWl0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5kaXN0YW5jZSA9IDA7XG4gICAgICAgIHRoaXMuc2NhbGVkRGlzdGFuY2UgPSAwO1xuICAgICAgICB0aGlzLnRvdGFsRGlzdGFuY2UgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLmxpbmVDbGlwcykge1xuICAgICAgICAgICAgdGhpcy5saW5lQ2xpcHNBcnJheS5wdXNoKHRoaXMubGluZUNsaXBzKTtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgZGlzdGFuY2UsIGluIHRpbGUgdW5pdHMsIG9mIHRoaXMgdGlsZWQgbGluZSBmZWF0dXJlXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWxEaXN0YW5jZSArPSB2ZXJ0aWNlc1tpXS5kaXN0KHZlcnRpY2VzW2kgKyAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjYWxlZERpc3RhbmNlKCk7XG4gICAgICAgICAgICB0aGlzLm1heExpbmVMZW5ndGggPSBNYXRoLm1heCh0aGlzLm1heExpbmVMZW5ndGgsIHRoaXMudG90YWxEaXN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1BvbHlnb24gPSB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2x5Z29uJztcblxuICAgICAgICAvLyBJZiB0aGUgbGluZSBoYXMgZHVwbGljYXRlIHZlcnRpY2VzIGF0IHRoZSBlbmRzLCBhZGp1c3Qgc3RhcnQvbGVuZ3RoIHRvIHJlbW92ZSB0aGVtLlxuICAgICAgICBsZXQgbGVuID0gdmVydGljZXMubGVuZ3RoO1xuICAgICAgICB3aGlsZSAobGVuID49IDIgJiYgdmVydGljZXNbbGVuIC0gMV0uZXF1YWxzKHZlcnRpY2VzW2xlbiAtIDJdKSkge1xuICAgICAgICAgICAgbGVuLS07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpcnN0ID0gMDtcbiAgICAgICAgd2hpbGUgKGZpcnN0IDwgbGVuIC0gMSAmJiB2ZXJ0aWNlc1tmaXJzdF0uZXF1YWxzKHZlcnRpY2VzW2ZpcnN0ICsgMV0pKSB7XG4gICAgICAgICAgICBmaXJzdCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWdub3JlIGludmFsaWQgZ2VvbWV0cnkuXG4gICAgICAgIGlmIChsZW4gPCAoaXNQb2x5Z29uID8gMyA6IDIpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGpvaW4gPT09ICdiZXZlbCcpIG1pdGVyTGltaXQgPSAxLjA1O1xuXG4gICAgICAgIGNvbnN0IHNoYXJwQ29ybmVyT2Zmc2V0ID0gdGhpcy5vdmVyc2NhbGluZyA8PSAxNiA/XG4gICAgICAgICAgICBTSEFSUF9DT1JORVJfT0ZGU0VUICogRVhURU5UIC8gKDUxMiAqIHRoaXMub3ZlcnNjYWxpbmcpIDpcbiAgICAgICAgICAgIDA7XG5cbiAgICAgICAgLy8gd2UgY291bGQgYmUgbW9yZSBwcmVjaXNlLCBidXQgaXQgd291bGQgb25seSBzYXZlIGEgbmVnbGlnaWJsZSBhbW91bnQgb2Ygc3BhY2VcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQobGVuICogMTAsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRWZXJ0ZXg7XG4gICAgICAgIGxldCBwcmV2VmVydGV4ID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcbiAgICAgICAgbGV0IG5leHRWZXJ0ZXggPSAoKHVuZGVmaW5lZDogYW55KTogUG9pbnQpO1xuICAgICAgICBsZXQgcHJldk5vcm1hbCA9ICgodW5kZWZpbmVkOiBhbnkpOiBQb2ludCk7XG4gICAgICAgIGxldCBuZXh0Tm9ybWFsID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcblxuICAgICAgICAvLyB0aGUgbGFzdCB0d28gdmVydGljZXMgYWRkZWRcbiAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTIgPSAtMTtcblxuICAgICAgICBpZiAoaXNQb2x5Z29uKSB7XG4gICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMl07XG4gICAgICAgICAgICBuZXh0Tm9ybWFsID0gdmVydGljZXNbZmlyc3RdLnN1YihjdXJyZW50VmVydGV4KS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykge1xuXG4gICAgICAgICAgICBuZXh0VmVydGV4ID0gaSA9PT0gbGVuIC0gMSA/XG4gICAgICAgICAgICAgICAgKGlzUG9seWdvbiA/IHZlcnRpY2VzW2ZpcnN0ICsgMV0gOiAodW5kZWZpbmVkOiBhbnkpKSA6IC8vIGlmIGl0J3MgYSBwb2x5Z29uLCB0cmVhdCB0aGUgbGFzdCB2ZXJ0ZXggbGlrZSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpICsgMV07IC8vIGp1c3QgdGhlIG5leHQgdmVydGV4XG5cbiAgICAgICAgICAgIC8vIGlmIHR3byBjb25zZWN1dGl2ZSB2ZXJ0aWNlcyBleGlzdCwgc2tpcCB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4ICYmIHZlcnRpY2VzW2ldLmVxdWFscyhuZXh0VmVydGV4KSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChuZXh0Tm9ybWFsKSBwcmV2Tm9ybWFsID0gbmV4dE5vcm1hbDtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmVydGV4KSBwcmV2VmVydGV4ID0gY3VycmVudFZlcnRleDtcblxuICAgICAgICAgICAgY3VycmVudFZlcnRleCA9IHZlcnRpY2VzW2ldO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG5vcm1hbCB0b3dhcmRzIHRoZSBuZXh0IHZlcnRleCBpbiB0aGlzIGxpbmUuIEluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5leHQgdmVydGV4LCBwcmV0ZW5kIHRoYXQgdGhlIGxpbmUgaXMgY29udGludWluZyBzdHJhaWdodCxcbiAgICAgICAgICAgIC8vIG1lYW5pbmcgdGhhdCB3ZSBhcmUganVzdCB1c2luZyB0aGUgcHJldmlvdXMgbm9ybWFsLlxuICAgICAgICAgICAgbmV4dE5vcm1hbCA9IG5leHRWZXJ0ZXggPyBuZXh0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fdW5pdCgpLl9wZXJwKCkgOiBwcmV2Tm9ybWFsO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgcHJldmlvdXMgbm9ybWFsLCB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYVxuICAgICAgICAgICAgLy8gbm9uLWNsb3NlZCBsaW5lLCBzbyB3ZSdyZSBkb2luZyBhIHN0cmFpZ2h0IFwiam9pblwiLlxuICAgICAgICAgICAgcHJldk5vcm1hbCA9IHByZXZOb3JtYWwgfHwgbmV4dE5vcm1hbDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBub3JtYWwgb2YgdGhlIGpvaW4gZXh0cnVzaW9uLiBJdCBpcyB0aGUgYW5nbGUgYmlzZWN0b3JcbiAgICAgICAgICAgIC8vIG9mIHRoZSBzZWdtZW50cyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBsaW5lIGFuZCB0aGUgbmV4dCBsaW5lLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgMTgwwrAgYW5nbGVzLCB0aGUgcHJldiBhbmQgbmV4dCBub3JtYWxzIGNhbmNlbCBlYWNoIG90aGVyIG91dDpcbiAgICAgICAgICAgIC8vIHByZXZOb3JtYWwgKyBuZXh0Tm9ybWFsID0gKDAsIDApLCBpdHMgbWFnbml0dWRlIGlzIDAsIHNvIHRoZSB1bml0IHZlY3RvciB3b3VsZCBiZVxuICAgICAgICAgICAgLy8gdW5kZWZpbmVkLiBJbiB0aGF0IGNhc2UsIHdlJ3JlIGtlZXBpbmcgdGhlIGpvaW5Ob3JtYWwgYXQgKDAsIDApLCBzbyB0aGF0IHRoZSBjb3NIYWxmQW5nbGVcbiAgICAgICAgICAgIC8vIGJlbG93IHdpbGwgYWxzbyBiZWNvbWUgMCBhbmQgbWl0ZXJMZW5ndGggd2lsbCBiZWNvbWUgSW5maW5pdHkuXG4gICAgICAgICAgICBsZXQgam9pbk5vcm1hbCA9IHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpO1xuICAgICAgICAgICAgaWYgKGpvaW5Ob3JtYWwueCAhPT0gMCB8fCBqb2luTm9ybWFsLnkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl91bml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiAgam9pbk5vcm1hbCAgICAgcHJldk5vcm1hbFxuICAgICAgICAgICAgICogICAgICAgICAgICAg4oaWICAgICAg4oaRXG4gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAuX19fX19fX18uIHByZXZWZXJ0ZXhcbiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICAgICAqIG5leHROb3JtYWwgIOKGkCAgfCAgY3VycmVudFZlcnRleFxuICAgICAgICAgICAgICogICAgICAgICAgICAgICAgfFxuICAgICAgICAgICAgICogICAgIG5leHRWZXJ0ZXggIVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgY29zaW5lcyBvZiB0aGUgYW5nbGUgKGFuZCBpdHMgaGFsZikgdXNpbmcgZG90IHByb2R1Y3RcbiAgICAgICAgICAgIGNvbnN0IGNvc0FuZ2xlID0gcHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC54ICsgcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC55O1xuICAgICAgICAgICAgY29uc3QgY29zSGFsZkFuZ2xlID0gam9pbk5vcm1hbC54ICogbmV4dE5vcm1hbC54ICsgam9pbk5vcm1hbC55ICogbmV4dE5vcm1hbC55O1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWl0ZXIgKHRoZSByYXRpbyBvZiB0aGUgbWl0ZXIgdG8gdGhlIHdpZHRoKVxuICAgICAgICAgICAgLy8gYXMgdGhlIGludmVyc2Ugb2YgY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIG5leHQgYW5kIGpvaW4gbm9ybWFsc1xuICAgICAgICAgICAgY29uc3QgbWl0ZXJMZW5ndGggPSBjb3NIYWxmQW5nbGUgIT09IDAgPyAxIC8gY29zSGFsZkFuZ2xlIDogSW5maW5pdHk7XG5cbiAgICAgICAgICAgIC8vIGFwcHJveGltYXRlIGFuZ2xlIGZyb20gY29zaW5lXG4gICAgICAgICAgICBjb25zdCBhcHByb3hBbmdsZSA9IDIgKiBNYXRoLnNxcnQoMiAtIDIgKiBjb3NIYWxmQW5nbGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc1NoYXJwQ29ybmVyID0gY29zSGFsZkFuZ2xlIDwgQ09TX0hBTEZfU0hBUlBfQ09STkVSICYmIHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVUdXJuc0xlZnQgPSBwcmV2Tm9ybWFsLnggKiBuZXh0Tm9ybWFsLnkgLSBwcmV2Tm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnggPiAwO1xuXG4gICAgICAgICAgICBpZiAoaXNTaGFycENvcm5lciAmJiBpID4gZmlyc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2U2VnbWVudExlbmd0aCA9IGN1cnJlbnRWZXJ0ZXguZGlzdChwcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldlNlZ21lbnRMZW5ndGggPiAyICogc2hhcnBDb3JuZXJPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXguc3ViKHByZXZWZXJ0ZXgpLl9tdWx0KHNoYXJwQ29ybmVyT2Zmc2V0IC8gcHJldlNlZ21lbnRMZW5ndGgpLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZShwcmV2VmVydGV4LCBuZXdQcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KG5ld1ByZXZWZXJ0ZXgsIHByZXZOb3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2VmVydGV4ID0gbmV3UHJldlZlcnRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRoZSBqb2luIGlmIGEgbWlkZGxlIHZlcnRleCwgb3RoZXJ3aXNlIHRoZSBjYXAuXG4gICAgICAgICAgICBjb25zdCBtaWRkbGVWZXJ0ZXggPSBwcmV2VmVydGV4ICYmIG5leHRWZXJ0ZXg7XG4gICAgICAgICAgICBsZXQgY3VycmVudEpvaW4gPSBtaWRkbGVWZXJ0ZXggPyBqb2luIDogaXNQb2x5Z29uID8gJ2J1dHQnIDogY2FwO1xuXG4gICAgICAgICAgICBpZiAobWlkZGxlVmVydGV4ICYmIGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgcm91bmRMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdtaXRlcic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaXRlckxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ2Zha2Vyb3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicgJiYgbWl0ZXJMZW5ndGggPiBtaXRlckxpbWl0KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnYmV2ZWwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBleHRydWRlIGxlbmd0aCBpcyAxMjggLyA2MyA9IDIgdGltZXMgdGhlIHdpZHRoIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgLy8gc28gaWYgbWl0ZXJMZW5ndGggPj0gMiB3ZSBuZWVkIHRvIGRyYXcgYSBkaWZmZXJlbnQgdHlwZSBvZiBiZXZlbCBoZXJlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDIpIGN1cnJlbnRKb2luID0gJ2ZsaXBiZXZlbCc7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbWl0ZXJMZW5ndGggaXMgcmVhbGx5IHNtYWxsIGFuZCB0aGUgbGluZSBiZXZlbCB3b3VsZG4ndCBiZSB2aXNpYmxlLFxuICAgICAgICAgICAgICAgIC8vIGp1c3QgZHJhdyBhIG1pdGVyIGpvaW4gdG8gc2F2ZSBhIHRyaWFuZ2xlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQpIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBmYXIgYWxvbmcgdGhlIGxpbmUgdGhlIGN1cnJlbnRWZXJ0ZXggaXNcbiAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB0aGlzLnVwZGF0ZURpc3RhbmNlKHByZXZWZXJ0ZXgsIGN1cnJlbnRWZXJ0ZXgpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicpIHtcblxuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX211bHQobWl0ZXJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2ZsaXBiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBtaXRlciBpcyB0b28gYmlnLCBmbGlwIHRoZSBkaXJlY3Rpb24gdG8gbWFrZSBhIGJldmVsZWQgam9pblxuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbW9zdCBwYXJhbGxlbCBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsID0gbmV4dE5vcm1hbC5tdWx0KC0xKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJldmVsTGVuZ3RoID0gbWl0ZXJMZW5ndGggKiBwcmV2Tm9ybWFsLmFkZChuZXh0Tm9ybWFsKS5tYWcoKSAvIHByZXZOb3JtYWwuc3ViKG5leHROb3JtYWwpLm1hZygpO1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl9wZXJwKCkuX211bHQoYmV2ZWxMZW5ndGggKiAobGluZVR1cm5zTGVmdCA/IC0xIDogMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGpvaW5Ob3JtYWwubXVsdCgtMSksIDAsIDAsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYmV2ZWwnIHx8IGN1cnJlbnRKb2luID09PSAnZmFrZXJvdW5kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IC1NYXRoLnNxcnQobWl0ZXJMZW5ndGggKiBtaXRlckxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldEEgPSBsaW5lVHVybnNMZWZ0ID8gb2Zmc2V0IDogMDtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRCID0gbGluZVR1cm5zTGVmdCA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBiZXZlbFxuICAgICAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBwcmV2Tm9ybWFsLCBvZmZzZXRBLCBvZmZzZXRCLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBqb2luIGFuZ2xlIGlzIHNoYXJwIGVub3VnaCB0aGF0IGEgcm91bmQgam9pbiB3b3VsZCBiZSB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAvLyBCZXZlbCBqb2lucyBmaWxsIHRoZSBnYXAgYmV0d2VlbiBzZWdtZW50cyB3aXRoIGEgc2luZ2xlIHBpZSBzbGljZSB0cmlhbmdsZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcm91bmQgam9pbiBieSBhZGRpbmcgbXVsdGlwbGUgcGllIHNsaWNlcy4gVGhlIGpvaW4gaXNuJ3QgYWN0dWFsbHkgcm91bmQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBsb29rcyBsaWtlIGl0IGlzIGF0IHRoZSBzaXplcyB3ZSByZW5kZXIgbGluZXMgYXQuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGljayB0aGUgbnVtYmVyIG9mIHRyaWFuZ2xlcyBmb3IgYXBwcm94aW1hdGluZyByb3VuZCBqb2luIGJ5IGJhc2VkIG9uIHRoZSBhbmdsZSBiZXR3ZWVuIG5vcm1hbHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IE1hdGgucm91bmQoKGFwcHJveEFuZ2xlICogMTgwIC8gTWF0aC5QSSkgLyBERUdfUEVSX1RSSUFOR0xFKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gMTsgbSA8IG47IG0rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBtIC8gbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9PSAwLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHByb3hpbWF0ZSBzcGhlcmljYWwgaW50ZXJwb2xhdGlvbiBodHRwczovL29ic2VydmFibGVocS5jb20vQG1vdXJuZXIvYXBwcm94aW1hdGluZy1nZW9tZXRyaWMtc2xlcnBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0MiA9IHQgLSAwLjU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQSA9IDEuMDkwNCArIGNvc0FuZ2xlICogKC0zLjI0NTIgKyBjb3NBbmdsZSAqICgzLjU1NjQ1IC0gY29zQW5nbGUgKiAxLjQzNTE5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQiA9IDAuODQ4MDEzICsgY29zQW5nbGUgKiAoLTEuMDYwMjEgKyBjb3NBbmdsZSAqIDAuMjE1NjM4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArIHQgKiB0MiAqICh0IC0gMSkgKiAoQSAqIHQyICogdDIgKyBCKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJ1ZGUgPSBuZXh0Tm9ybWFsLnN1YihwcmV2Tm9ybWFsKS5fbXVsdCh0KS5fYWRkKHByZXZOb3JtYWwpLl91bml0KCkuX211bHQobGluZVR1cm5zTGVmdCA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEhhbGZWZXJ0ZXgoY3VycmVudFZlcnRleCwgZXh0cnVkZS54LCBleHRydWRlLnksIGZhbHNlLCBsaW5lVHVybnNMZWZ0LCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgbmV4dE5vcm1hbCwgLW9mZnNldEEsIC1vZmZzZXRCLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdidXR0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCAwLCAwLCBzZWdtZW50KTsgLy8gYnV0dCBjYXBcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBwcmV2VmVydGV4ID8gMSA6IC0xOyAvLyBjbG9zaW5nIG9yIHN0YXJ0aW5nIHNxdWFyZSBjYXBcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgb2Zmc2V0LCBvZmZzZXQsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAocHJldlZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYnV0dFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgcHJldk5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBvciBsaW5lam9pbiBhdCBlbmQgb2Ygc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgcHJldk5vcm1hbCwgMSwgMSwgc2VnbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgYmVmb3JlIGZpcnN0IHNlZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIG5leHROb3JtYWwsIC0xLCAtMSwgc2VnbWVudCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50IHdpdGggYSBidXR0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBuZXh0Tm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1NoYXJwQ29ybmVyICYmIGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNlZ21lbnRMZW5ndGggPSBjdXJyZW50VmVydGV4LmRpc3QobmV4dFZlcnRleCk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRTZWdtZW50TGVuZ3RoID4gMiAqIHNoYXJwQ29ybmVyT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0N1cnJlbnRWZXJ0ZXggPSBjdXJyZW50VmVydGV4LmFkZChuZXh0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fbXVsdChzaGFycENvcm5lck9mZnNldCAvIG5leHRTZWdtZW50TGVuZ3RoKS5fcm91bmQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzdGFuY2UoY3VycmVudFZlcnRleCwgbmV3Q3VycmVudFZlcnRleCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChuZXdDdXJyZW50VmVydGV4LCBuZXh0Tm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFZlcnRleCA9IG5ld0N1cnJlbnRWZXJ0ZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHR3byB2ZXJ0aWNlcyB0byB0aGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwIHRoZSBsaW5lIHZlcnRleCB0byBhZGQgYnVmZmVyIHZlcnRpY2VzIGZvclxuICAgICAqIEBwYXJhbSBub3JtYWwgdmVydGV4IG5vcm1hbFxuICAgICAqIEBwYXJhbSBlbmRMZWZ0IGV4dHJ1ZGUgdG8gc2hpZnQgdGhlIGxlZnQgdmVydGV4IGFsb25nIHRoZSBsaW5lXG4gICAgICogQHBhcmFtIGVuZFJpZ2h0IGV4dHJ1ZGUgdG8gc2hpZnQgdGhlIGxlZnQgdmVydGV4IGFsb25nIHRoZSBsaW5lXG4gICAgICogQHBhcmFtIHNlZ21lbnQgdGhlIHNlZ21lbnQgb2JqZWN0IHRvIGFkZCB0aGUgdmVydGV4IHRvXG4gICAgICogQHBhcmFtIHJvdW5kIHdoZXRoZXIgdGhpcyBpcyBhIHJvdW5kIGNhcFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkQ3VycmVudFZlcnRleChwOiBQb2ludCwgbm9ybWFsOiBQb2ludCwgZW5kTGVmdDogbnVtYmVyLCBlbmRSaWdodDogbnVtYmVyLCBzZWdtZW50OiBTZWdtZW50LCByb3VuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIC8vIGxlZnQgYW5kIHJpZ2h0IGV4dHJ1ZGUgdmVjdG9ycywgcGVycGVuZGljdWxhcmx5IHNoaWZ0ZWQgYnkgZW5kTGVmdC9lbmRSaWdodFxuICAgICAgICBjb25zdCBsZWZ0WCA9IG5vcm1hbC54ICsgbm9ybWFsLnkgKiBlbmRMZWZ0O1xuICAgICAgICBjb25zdCBsZWZ0WSA9IG5vcm1hbC55IC0gbm9ybWFsLnggKiBlbmRMZWZ0O1xuICAgICAgICBjb25zdCByaWdodFggPSAtbm9ybWFsLnggKyBub3JtYWwueSAqIGVuZFJpZ2h0O1xuICAgICAgICBjb25zdCByaWdodFkgPSAtbm9ybWFsLnkgLSBub3JtYWwueCAqIGVuZFJpZ2h0O1xuXG4gICAgICAgIHRoaXMuYWRkSGFsZlZlcnRleChwLCBsZWZ0WCwgbGVmdFksIHJvdW5kLCBmYWxzZSwgZW5kTGVmdCwgc2VnbWVudCk7XG4gICAgICAgIHRoaXMuYWRkSGFsZlZlcnRleChwLCByaWdodFgsIHJpZ2h0WSwgcm91bmQsIHRydWUsIC1lbmRSaWdodCwgc2VnbWVudCk7XG5cbiAgICAgICAgLy8gVGhlcmUgaXMgYSBtYXhpbXVtIFwiZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmVcIiB0aGF0IHdlIGNhbiBzdG9yZSBpbiB0aGUgYnVmZmVycy5cbiAgICAgICAgLy8gV2hlbiB3ZSBnZXQgY2xvc2UgdG8gdGhlIGRpc3RhbmNlLCByZXNldCBpdCB0byB6ZXJvIGFuZCBhZGQgdGhlIHZlcnRleCBhZ2FpbiB3aXRoXG4gICAgICAgIC8vIGEgZGlzdGFuY2Ugb2YgemVyby4gVGhlIG1heCBkaXN0YW5jZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBudW1iZXIgb2YgYml0cyB3ZSBhbGxvY2F0ZVxuICAgICAgICAvLyB0byBgbGluZXNvZmFyYC5cbiAgICAgICAgaWYgKHRoaXMuZGlzdGFuY2UgPiBNQVhfTElORV9ESVNUQU5DRSAvIDIgJiYgdGhpcy50b3RhbERpc3RhbmNlID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3RhbmNlID0gMDtcbiAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChwLCBub3JtYWwsIGVuZExlZnQsIGVuZFJpZ2h0LCBzZWdtZW50LCByb3VuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRIYWxmVmVydGV4KHt4LCB5fTogUG9pbnQsIGV4dHJ1ZGVYOiBudW1iZXIsIGV4dHJ1ZGVZOiBudW1iZXIsIHJvdW5kOiBib29sZWFuLCB1cDogYm9vbGVhbiwgZGlyOiBudW1iZXIsIHNlZ21lbnQ6IFNlZ21lbnQpIHtcbiAgICAgICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IHRoaXMubGluZUNsaXBzID8gdGhpcy5zY2FsZWREaXN0YW5jZSAqIChNQVhfTElORV9ESVNUQU5DRSAtIDEpIDogdGhpcy5zY2FsZWREaXN0YW5jZTtcbiAgICAgICAgLy8gc2NhbGUgZG93biBzbyB0aGF0IHdlIGNhbiBzdG9yZSBsb25nZXIgZGlzdGFuY2VzIHdoaWxlIHNhY3JpZmljaW5nIHByZWNpc2lvbi5cbiAgICAgICAgY29uc3QgbGluZXNvZmFyU2NhbGVkID0gdG90YWxEaXN0YW5jZSAqIExJTkVfRElTVEFOQ0VfU0NBTEU7XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgIC8vIGFfcG9zX25vcm1hbFxuICAgICAgICAgICAgLy8gRW5jb2RlIHJvdW5kL3VwIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzXG4gICAgICAgICAgICAoeCA8PCAxKSArIChyb3VuZCA/IDEgOiAwKSxcbiAgICAgICAgICAgICh5IDw8IDEpICsgKHVwID8gMSA6IDApLFxuICAgICAgICAgICAgLy8gYV9kYXRhXG4gICAgICAgICAgICAvLyBhZGQgMTI4IHRvIHN0b3JlIGEgYnl0ZSBpbiBhbiB1bnNpZ25lZCBieXRlXG4gICAgICAgICAgICBNYXRoLnJvdW5kKEVYVFJVREVfU0NBTEUgKiBleHRydWRlWCkgKyAxMjgsXG4gICAgICAgICAgICBNYXRoLnJvdW5kKEVYVFJVREVfU0NBTEUgKiBleHRydWRlWSkgKyAxMjgsXG4gICAgICAgICAgICAvLyBFbmNvZGUgdGhlIC0xLzAvMSBkaXJlY3Rpb24gdmFsdWUgaW50byB0aGUgZmlyc3QgdHdvIGJpdHMgb2YgLnogb2YgYV9kYXRhLlxuICAgICAgICAgICAgLy8gQ29tYmluZSBpdCB3aXRoIHRoZSBsb3dlciA2IGJpdHMgb2YgYGxpbmVzb2ZhclNjYWxlZGAgKHNoaWZ0ZWQgYnkgMiBiaXRzIHRvIG1ha2VcbiAgICAgICAgICAgIC8vIHJvb20gZm9yIHRoZSBkaXJlY3Rpb24gdmFsdWUpLiBUaGUgdXBwZXIgOCBiaXRzIG9mIGBsaW5lc29mYXJTY2FsZWRgIGFyZSBwbGFjZWQgaW5cbiAgICAgICAgICAgIC8vIHRoZSBgd2AgY29tcG9uZW50LlxuICAgICAgICAgICAgKChkaXIgPT09IDAgPyAwIDogKGRpciA8IDAgPyAtMSA6IDEpKSArIDEpIHwgKChsaW5lc29mYXJTY2FsZWQgJiAweDNGKSA8PCAyKSxcbiAgICAgICAgICAgIGxpbmVzb2ZhclNjYWxlZCA+PiA2KTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3RzIGEgc2Vjb25kIHZlcnRleCBidWZmZXIgd2l0aCBoaWdoZXIgcHJlY2lzaW9uIGxpbmUgcHJvZ3Jlc3NcbiAgICAgICAgaWYgKHRoaXMubGluZUNsaXBzKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzc1JlYWxpZ25lZCA9IHRoaXMuc2NhbGVkRGlzdGFuY2UgLSB0aGlzLmxpbmVDbGlwcy5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGVuZENsaXBSZWFsaWduZWQgPSB0aGlzLmxpbmVDbGlwcy5lbmQgLSB0aGlzLmxpbmVDbGlwcy5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHV2WCA9IHByb2dyZXNzUmVhbGlnbmVkIC8gZW5kQ2xpcFJlYWxpZ25lZDtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLmVtcGxhY2VCYWNrKHV2WCwgdGhpcy5saW5lQ2xpcHNBcnJheS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZSA9IHNlZ21lbnQudmVydGV4TGVuZ3RoKys7XG4gICAgICAgIGlmICh0aGlzLmUxID49IDAgJiYgdGhpcy5lMiA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodGhpcy5lMSwgdGhpcy5lMiwgZSk7XG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cCkge1xuICAgICAgICAgICAgdGhpcy5lMiA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmUxID0gZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVNjYWxlZERpc3RhbmNlKCkge1xuICAgICAgICAvLyBLbm93aW5nIHRoZSByYXRpbyBvZiB0aGUgZnVsbCBsaW5lc3RyaW5nIGNvdmVyZWQgYnkgdGhpcyB0aWxlZCBmZWF0dXJlLCBhcyB3ZWxsXG4gICAgICAgIC8vIGFzIHRoZSB0b3RhbCBkaXN0YW5jZSAoaW4gdGlsZSB1bml0cykgb2YgdGhpcyB0aWxlZCBmZWF0dXJlLCBhbmQgdGhlIGRpc3RhbmNlXG4gICAgICAgIC8vIChpbiB0aWxlIHVuaXRzKSBvZiB0aGUgY3VycmVudCB2ZXJ0ZXgsIHdlIGNhbiBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGRpc3RhbmNlXG4gICAgICAgIC8vIG9mIHRoaXMgdmVydGV4IGFsb25nIHRoZSBmdWxsIGxpbmVzdHJpbmcgZmVhdHVyZSBhbmQgc2NhbGUgaXQgdG8gWzAsIDJeMTUpXG4gICAgICAgIHRoaXMuc2NhbGVkRGlzdGFuY2UgPSB0aGlzLmxpbmVDbGlwcyA/XG4gICAgICAgICAgICB0aGlzLmxpbmVDbGlwcy5zdGFydCArICh0aGlzLmxpbmVDbGlwcy5lbmQgLSB0aGlzLmxpbmVDbGlwcy5zdGFydCkgKiB0aGlzLmRpc3RhbmNlIC8gdGhpcy50b3RhbERpc3RhbmNlIDpcbiAgICAgICAgICAgIHRoaXMuZGlzdGFuY2U7XG4gICAgfVxuXG4gICAgdXBkYXRlRGlzdGFuY2UocHJldjogUG9pbnQsIG5leHQ6IFBvaW50KSB7XG4gICAgICAgIHRoaXMuZGlzdGFuY2UgKz0gcHJldi5kaXN0KG5leHQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNjYWxlZERpc3RhbmNlKCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignTGluZUJ1Y2tldCcsIExpbmVCdWNrZXQsIHtvbWl0OiBbJ2xheWVycycsICdwYXR0ZXJuRmVhdHVyZXMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBMaW5lQnVja2V0O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwibGluZS1jYXBcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJidXR0XCIgfCBcInJvdW5kXCIgfCBcInNxdWFyZVwiPixcbiAgICBcImxpbmUtam9pblwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJiZXZlbFwiIHwgXCJyb3VuZFwiIHwgXCJtaXRlclwiPixcbiAgICBcImxpbmUtbWl0ZXItbGltaXRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtcm91bmQtbGltaXRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtc29ydC1rZXlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImxpbmUtY2FwXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtY2FwXCJdKSxcbiAgICBcImxpbmUtam9pblwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1qb2luXCJdKSxcbiAgICBcImxpbmUtbWl0ZXItbGltaXRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1taXRlci1saW1pdFwiXSksXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtcm91bmQtbGltaXRcIl0pLFxuICAgIFwibGluZS1zb3J0LWtleVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1zb3J0LWtleVwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJsaW5lLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImxpbmUtd2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLWdhcC13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtb2Zmc2V0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1kYXNoYXJyYXlcIjogQ3Jvc3NGYWRlZFByb3BlcnR5PEFycmF5PG51bWJlcj4+LFxuICAgIFwibGluZS1wYXR0ZXJuXCI6IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHk8UmVzb2x2ZWRJbWFnZT4sXG4gICAgXCJsaW5lLWdyYWRpZW50XCI6IENvbG9yUmFtcFByb3BlcnR5LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwibGluZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb3BhY2l0eVwiXSksXG4gICAgXCJsaW5lLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtY29sb3JcIl0pLFxuICAgIFwibGluZS10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwibGluZS13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ2FwLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb2Zmc2V0XCJdKSxcbiAgICBcImxpbmUtYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLWJsdXJcIl0pLFxuICAgIFwibGluZS1kYXNoYXJyYXlcIjogbmV3IENyb3NzRmFkZWRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1kYXNoYXJyYXlcIl0pLFxuICAgIFwibGluZS1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXBhdHRlcm5cIl0pLFxuICAgIFwibGluZS1ncmFkaWVudFwiOiBuZXcgQ29sb3JSYW1wUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ3JhZGllbnRcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgTGluZUJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldCc7XG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmV9IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJztcbmltcG9ydCB7Z2V0TWF4aW11bVBhaW50VmFsdWUsIHRyYW5zbGF0ZURpc3RhbmNlLCB0cmFuc2xhdGV9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7ZXh0ZW5kLCBNQVhfU0FGRV9JTlRFR0VSfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBMYXlvdXQsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhRHJpdmVuUHJvcGVydHl9IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgU3RlcCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvc3RlcCc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlLCBab29tQ29uc3RhbnRFeHByZXNzaW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUge0J1Y2tldCwgQnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUge0xheW91dFByb3BzLCBQYWludFByb3BzfSBmcm9tICcuL2xpbmVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgTGluZUZsb29yd2lkdGhQcm9wZXJ0eSBleHRlbmRzIERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+IHtcbiAgICB1c2VJbnRlZ2VyWm9vbTogdHJ1ZTtcblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSksIHtcbiAgICAgICAgICAgIG5vdzogcGFyYW1ldGVycy5ub3csXG4gICAgICAgICAgICBmYWRlRHVyYXRpb246IHBhcmFtZXRlcnMuZmFkZUR1cmF0aW9uLFxuICAgICAgICAgICAgem9vbUhpc3Rvcnk6IHBhcmFtZXRlcnMuem9vbUhpc3RvcnksXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBwYXJhbWV0ZXJzLnRyYW5zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdXBlci5wb3NzaWJseUV2YWx1YXRlKHZhbHVlLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSh2YWx1ZSwgZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSB7XG4gICAgICAgIGdsb2JhbHMgPSBleHRlbmQoe30sIGdsb2JhbHMsIHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSl9KTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmV2YWx1YXRlKHZhbHVlLCBnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgIH1cbn1cblxuY29uc3QgbGluZUZsb29yd2lkdGhQcm9wZXJ0eSA9IG5ldyBMaW5lRmxvb3J3aWR0aFByb3BlcnR5KHByb3BlcnRpZXMucGFpbnQucHJvcGVydGllc1snbGluZS13aWR0aCddLnNwZWNpZmljYXRpb24pO1xubGluZUZsb29yd2lkdGhQcm9wZXJ0eS51c2VJbnRlZ2VyWm9vbSA9IHRydWU7XG5cbmNsYXNzIExpbmVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgZ3JhZGllbnRWZXJzaW9uOiBudW1iZXI7XG4gICAgc3RlcEludGVycG9sYW50OiBib29sZWFuO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuZ3JhZGllbnRWZXJzaW9uID0gMDtcbiAgICB9XG5cbiAgICBfaGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnbGluZS1ncmFkaWVudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb246IFpvb21Db25zdGFudEV4cHJlc3Npb248J3NvdXJjZSc+ID0gKCh0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2xpbmUtZ3JhZGllbnQnXS52YWx1ZS5leHByZXNzaW9uKTogYW55KTtcbiAgICAgICAgICAgIHRoaXMuc3RlcEludGVycG9sYW50ID0gZXhwcmVzc2lvbi5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24gaW5zdGFuY2VvZiBTdGVwO1xuICAgICAgICAgICAgdGhpcy5ncmFkaWVudFZlcnNpb24gPSAodGhpcy5ncmFkaWVudFZlcnNpb24gKyAxKSAlIE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBncmFkaWVudEV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2xpbmUtZ3JhZGllbnQnXS52YWx1ZS5leHByZXNzaW9uO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgc3VwZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzKTtcblxuICAgICAgICAodGhpcy5wYWludC5fdmFsdWVzOiBhbnkpWydsaW5lLWZsb29yd2lkdGgnXSA9XG4gICAgICAgICAgICBsaW5lRmxvb3J3aWR0aFByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50Ll92YWx1ZXNbJ2xpbmUtd2lkdGgnXS52YWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKGJ1Y2tldDogQnVja2V0KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbGluZUJ1Y2tldDogTGluZUJ1Y2tldCA9IChidWNrZXQ6IGFueSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2V0TGluZVdpZHRoKFxuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtd2lkdGgnLCB0aGlzLCBsaW5lQnVja2V0KSxcbiAgICAgICAgICAgIGdldE1heGltdW1QYWludFZhbHVlKCdsaW5lLWdhcC13aWR0aCcsIHRoaXMsIGxpbmVCdWNrZXQpKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtb2Zmc2V0JywgdGhpcywgbGluZUJ1Y2tldCk7XG4gICAgICAgIHJldHVybiB3aWR0aCAvIDIgKyBNYXRoLmFicyhvZmZzZXQpICsgdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGggPSBwaXhlbHNUb1RpbGVVbml0cyAvIDIgKiBnZXRMaW5lV2lkdGgoXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS13aWR0aCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS1nYXAtd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpKTtcbiAgICAgICAgY29uc3QgbGluZU9mZnNldCA9IHRoaXMucGFpbnQuZ2V0KCdsaW5lLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIGlmIChsaW5lT2Zmc2V0KSB7XG4gICAgICAgICAgICBnZW9tZXRyeSA9IG9mZnNldExpbmUoZ2VvbWV0cnksIGxpbmVPZmZzZXQgKiBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZSh0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnksIGhhbGZXaWR0aCk7XG4gICAgfVxuXG4gICAgaXNUaWxlQ2xpcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5lU3R5bGVMYXllcjtcblxuZnVuY3Rpb24gZ2V0TGluZVdpZHRoKGxpbmVXaWR0aCwgbGluZUdhcFdpZHRoKSB7XG4gICAgaWYgKGxpbmVHYXBXaWR0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmVHYXBXaWR0aCArIDIgKiBsaW5lV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxpbmVXaWR0aDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldExpbmUocmluZ3MsIG9mZnNldCkge1xuICAgIGNvbnN0IG5ld1JpbmdzID0gW107XG4gICAgY29uc3QgemVybyA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmdzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSByaW5nc1trXTtcbiAgICAgICAgY29uc3QgbmV3UmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2kgLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYyA9IHJpbmdbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgYVRvQiA9IGkgPT09IDAgPyB6ZXJvIDogYi5zdWIoYSkuX3VuaXQoKS5fcGVycCgpO1xuICAgICAgICAgICAgY29uc3QgYlRvQyA9IGkgPT09IHJpbmcubGVuZ3RoIC0gMSA/IHplcm8gOiBjLnN1YihiKS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgICAgICBjb25zdCBleHRydWRlID0gYVRvQi5fYWRkKGJUb0MpLl91bml0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvc0hhbGZBbmdsZSA9IGV4dHJ1ZGUueCAqIGJUb0MueCArIGV4dHJ1ZGUueSAqIGJUb0MueTtcbiAgICAgICAgICAgIGV4dHJ1ZGUuX211bHQoMSAvIGNvc0hhbGZBbmdsZSk7XG5cbiAgICAgICAgICAgIG5ld1JpbmcucHVzaChleHRydWRlLl9tdWx0KG9mZnNldCkuX2FkZChiKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmluZ3MucHVzaChuZXdSaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JpbmdzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuZXhwb3J0IGNvbnN0IHN5bWJvbExheW91dEF0dHJpYnV0ZXMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3Nfb2Zmc2V0JywgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9kYXRhJywgICAgICAgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGl4ZWxvZmZzZXQnLCAgICAgICAgY29tcG9uZW50czogNCwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgY29uc3QgZHluYW1pY0xheW91dEF0dHJpYnV0ZXMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wcm9qZWN0ZWRfcG9zJywgY29tcG9uZW50czogMywgdHlwZTogJ0Zsb2F0MzInfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBwbGFjZW1lbnRPcGFjaXR5QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MzInfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcGxhY2VkJywgY29tcG9uZW50czogMiwgdHlwZTogJ1VpbnQ4J30sXG4gICAge25hbWU6ICdhX3NoaWZ0JywgY29tcG9uZW50czogMiwgdHlwZTogJ0Zsb2F0MzInfVxuXSk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25Cb3ggPSBjcmVhdGVMYXlvdXQoW1xuICAgIC8vIHRoZSBib3ggaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBhbmNob3IgcG9pbnRcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclBvaW50WCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yUG9pbnRZJ30sXG5cbiAgICAvLyBkaXN0YW5jZXMgdG8gdGhlIGVkZ2VzIGZyb20gdGhlIGFuY2hvclxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAneDEnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3kxJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd4Mid9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAneTInfSxcblxuICAgIC8vIHRoZSBpbmRleCBvZiB0aGUgZmVhdHVyZSBpbiB0aGUgb3JpZ2luYWwgdmVjdG9ydGlsZVxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ2ZlYXR1cmVJbmRleCd9LFxuICAgIC8vIHRoZSBzb3VyY2UgbGF5ZXIgdGhlIGZlYXR1cmUgYXBwZWFycyBpblxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3NvdXJjZUxheWVySW5kZXgnfSxcbiAgICAvLyB0aGUgYnVja2V0IHRoZSBmZWF0dXJlIGFwcGVhcnMgaW5cbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdidWNrZXRJbmRleCd9LFxuXSk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25Cb3hMYXlvdXQgPSBjcmVhdGVMYXlvdXQoWyAvLyB1c2VkIHRvIHJlbmRlciBjb2xsaXNpb24gYm94ZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgIHtuYW1lOiAnYV9wb3MnLCAgICAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX2FuY2hvcl9wb3MnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfZXh0cnVkZScsICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG5dLCA0KTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkNpcmNsZUxheW91dCA9IGNyZWF0ZUxheW91dChbIC8vIHVzZWQgdG8gcmVuZGVyIGNvbGxpc2lvbiBjaXJjbGVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICB7bmFtZTogJ2FfcG9zJywgICAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdGbG9hdDMyJ30sXG4gICAge25hbWU6ICdhX3JhZGl1cycsICAgICBjb21wb25lbnRzOiAxLCB0eXBlOiAnRmxvYXQzMid9LFxuICAgIHtuYW1lOiAnYV9mbGFncycsICAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgY29uc3QgcXVhZFRyaWFuZ2xlID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ3RyaWFuZ2xlJywgY29tcG9uZW50czogMywgdHlwZTogJ1VpbnQxNid9LFxuXSk7XG5cbmV4cG9ydCBjb25zdCBwbGFjZW1lbnQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yWCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yWSd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2dseXBoU3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ251bUdseXBocyd9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ3ZlcnRleFN0YXJ0SW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQzMicsIG5hbWU6ICdsaW5lU3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ2xpbmVMZW5ndGgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdzZWdtZW50J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbG93ZXJTaXplJ30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAndXBwZXJTaXplJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2xpbmVPZmZzZXRYJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2xpbmVPZmZzZXRZJ30sXG4gICAge3R5cGU6ICdVaW50OCcsIG5hbWU6ICd3cml0aW5nTW9kZSd9LFxuICAgIHt0eXBlOiAnVWludDgnLCBuYW1lOiAncGxhY2VkT3JpZW50YXRpb24nfSxcbiAgICB7dHlwZTogJ1VpbnQ4JywgbmFtZTogJ2hpZGRlbid9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ2Nyb3NzVGlsZUlEJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdhc3NvY2lhdGVkSWNvbkluZGV4J31cbl0pO1xuXG5leHBvcnQgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yWCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yWSd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ2NlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAnbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAndmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3BsYWNlZEljb25TeW1ib2xJbmRleCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAndmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdrZXknfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd0ZXh0Qm94U3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3RleHRCb3hFbmRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3ZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2ljb25Cb3hTdGFydEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnaWNvbkJveEVuZEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAndmVydGljYWxJY29uQm94U3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3ZlcnRpY2FsSWNvbkJveEVuZEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnZmVhdHVyZUluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1WZXJ0aWNhbEdseXBoVmVydGljZXMnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1JY29uVmVydGljZXMnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1WZXJ0aWNhbEljb25WZXJ0aWNlcyd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3VzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzJ30sXG4gICAge3R5cGU6ICdVaW50MzInLCBuYW1lOiAnY3Jvc3NUaWxlSUQnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAndGV4dEJveFNjYWxlJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgY29tcG9uZW50czogMiwgbmFtZTogJ3RleHRPZmZzZXQnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXInfSxcbl0pO1xuXG5leHBvcnQgY29uc3QgZ2x5cGhPZmZzZXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdvZmZzZXRYJ31cbl0pO1xuXG5leHBvcnQgY29uc3QgbGluZVZlcnRleCA9IGNyZWF0ZUxheW91dChbXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd4J30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd5J30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcid9XG5dKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7cGx1Z2luIGFzIHJ0bFRleHRQbHVnaW59IGZyb20gJy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4nO1xuXG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRleHQodGV4dDogc3RyaW5nLCBsYXllcjogU3ltYm9sU3R5bGVMYXllciwgZmVhdHVyZTogRmVhdHVyZSkge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtdHJhbnNmb3JtJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nKSB7XG4gICAgICAgIHRleHQgPSBydGxUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyh0ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odGV4dDogRm9ybWF0dGVkLCBsYXllcjogU3ltYm9sU3R5bGVMYXllciwgZmVhdHVyZTogRmVhdHVyZSk6IEZvcm1hdHRlZCB7XG4gICAgdGV4dC5zZWN0aW9ucy5mb3JFYWNoKHNlY3Rpb24gPT4ge1xuICAgICAgICBzZWN0aW9uLnRleHQgPSB0cmFuc2Zvcm1UZXh0KHNlY3Rpb24udGV4dCwgbGF5ZXIsIGZlYXR1cmUpO1xuICAgIH0pO1xuICAgIHJldHVybiB0ZXh0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1N5bWJvbEZlYXR1cmV9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZmVhdHVyZXM6IEFycmF5PFN5bWJvbEZlYXR1cmU+KTogQXJyYXk8U3ltYm9sRmVhdHVyZT4ge1xuICAgIGNvbnN0IGxlZnRJbmRleDoge1tfOiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgcmlnaHRJbmRleDoge1tfOiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgbWVyZ2VkRmVhdHVyZXMgPSBbXTtcbiAgICBsZXQgbWVyZ2VkSW5kZXggPSAwO1xuXG4gICAgZnVuY3Rpb24gYWRkKGspIHtcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXMucHVzaChmZWF0dXJlc1trXSk7XG4gICAgICAgIG1lcmdlZEluZGV4Kys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tUmlnaHQobGVmdEtleTogc3RyaW5nLCByaWdodEtleTogc3RyaW5nLCBnZW9tKSB7XG4gICAgICAgIGNvbnN0IGkgPSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgcmlnaHRJbmRleFtyaWdodEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnBvcCgpO1xuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXSA9IG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLmNvbmNhdChnZW9tWzBdKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tTGVmdChsZWZ0S2V5OiBzdHJpbmcsIHJpZ2h0S2V5OiBzdHJpbmcsIGdlb20pIHtcbiAgICAgICAgY29uc3QgaSA9IGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbcmlnaHRLZXldO1xuICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnNoaWZ0KCk7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdID0gZ2VvbVswXS5jb25jYXQobWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXkodGV4dCwgZ2VvbSwgb25SaWdodCkge1xuICAgICAgICBjb25zdCBwb2ludCA9IG9uUmlnaHQgPyBnZW9tWzBdW2dlb21bMF0ubGVuZ3RoIC0gMV0gOiBnZW9tWzBdWzBdO1xuICAgICAgICByZXR1cm4gYCR7dGV4dH06JHtwb2ludC54fToke3BvaW50Lnl9YDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGZlYXR1cmVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1trXTtcbiAgICAgICAgY29uc3QgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBmZWF0dXJlLnRleHQgPyBmZWF0dXJlLnRleHQudG9TdHJpbmcoKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICBhZGQoayk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlZnRLZXkgPSBnZXRLZXkodGV4dCwgZ2VvbSksXG4gICAgICAgICAgICByaWdodEtleSA9IGdldEtleSh0ZXh0LCBnZW9tLCB0cnVlKTtcblxuICAgICAgICBpZiAoKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkgJiYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkgJiYgKHJpZ2h0SW5kZXhbbGVmdEtleV0gIT09IGxlZnRJbmRleFtyaWdodEtleV0pKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgYWRqYWNlbnQgdG8gYm90aCBlbmRzIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlIGFsbCB0aHJlZVxuICAgICAgICAgICAgY29uc3QgaiA9IG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuICAgICAgICAgICAgY29uc3QgaSA9IG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXksIHJpZ2h0S2V5LCBtZXJnZWRGZWF0dXJlc1tqXS5nZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbbGVmdEtleV07XG4gICAgICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtyaWdodEtleV07XG5cbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbZ2V0S2V5KHRleHQsIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5LCB0cnVlKV0gPSBpO1xuICAgICAgICAgICAgbWVyZ2VkRmVhdHVyZXNbal0uZ2VvbWV0cnkgPSAobnVsbDogYW55KTtcblxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyaWdodEtleSBpbiBsZWZ0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBhZGphY2VudCBsaW5lcywgYWRkIGFzIGEgbmV3IGl0ZW1cbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZEZlYXR1cmVzLmZpbHRlcigoZikgPT4gZi5nZW9tZXRyeSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIGNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbixcbn0gZnJvbSAnLi9zY3JpcHRfZGV0ZWN0aW9uJztcblxuZXhwb3J0IGNvbnN0IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcCA9IHtcbiAgICAnISc6ICfvuJUnLFxuICAgICcjJzogJ++8gycsXG4gICAgJyQnOiAn77yEJyxcbiAgICAnJSc6ICfvvIUnLFxuICAgICcmJzogJ++8hicsXG4gICAgJygnOiAn77i1JyxcbiAgICAnKSc6ICfvuLYnLFxuICAgICcqJzogJ++8iicsXG4gICAgJysnOiAn77yLJyxcbiAgICAnLCc6ICfvuJAnLFxuICAgICctJzogJ++4sicsXG4gICAgJy4nOiAn44O7JyxcbiAgICAnLyc6ICfvvI8nLFxuICAgICc6JzogJ++4kycsXG4gICAgJzsnOiAn77iUJyxcbiAgICAnPCc6ICfvuL8nLFxuICAgICc9JzogJ++8nScsXG4gICAgJz4nOiAn77mAJyxcbiAgICAnPyc6ICfvuJYnLFxuICAgICdAJzogJ++8oCcsXG4gICAgJ1snOiAn77mHJyxcbiAgICAnXFxcXCc6ICfvvLwnLFxuICAgICddJzogJ++5iCcsXG4gICAgJ14nOiAn77y+JyxcbiAgICAnXyc6ICfvuLMnLFxuICAgICdgJzogJ++9gCcsXG4gICAgJ3snOiAn77i3JyxcbiAgICAnfCc6ICfigJUnLFxuICAgICd9JzogJ++4uCcsXG4gICAgJ34nOiAn772eJyxcbiAgICAnwqInOiAn77+gJyxcbiAgICAnwqMnOiAn77+hJyxcbiAgICAnwqUnOiAn77+lJyxcbiAgICAnwqYnOiAn77+kJyxcbiAgICAnwqwnOiAn77+iJyxcbiAgICAnwq8nOiAn77+jJyxcbiAgICAn4oCTJzogJ++4sicsXG4gICAgJ+KAlCc6ICfvuLEnLFxuICAgICfigJgnOiAn77mDJyxcbiAgICAn4oCZJzogJ++5hCcsXG4gICAgJ+KAnCc6ICfvuYEnLFxuICAgICfigJ0nOiAn77mCJyxcbiAgICAn4oCmJzogJ++4mScsXG4gICAgJ+KApyc6ICfjg7snLFxuICAgICfigqknOiAn77+mJyxcbiAgICAn44CBJzogJ++4kScsXG4gICAgJ+OAgic6ICfvuJInLFxuICAgICfjgIgnOiAn77i/JyxcbiAgICAn44CJJzogJ++5gCcsXG4gICAgJ+OAiic6ICfvuL0nLFxuICAgICfjgIsnOiAn77i+JyxcbiAgICAn44CMJzogJ++5gScsXG4gICAgJ+OAjSc6ICfvuYInLFxuICAgICfjgI4nOiAn77mDJyxcbiAgICAn44CPJzogJ++5hCcsXG4gICAgJ+OAkCc6ICfvuLsnLFxuICAgICfjgJEnOiAn77i8JyxcbiAgICAn44CUJzogJ++4uScsXG4gICAgJ+OAlSc6ICfvuLonLFxuICAgICfjgJYnOiAn77iXJyxcbiAgICAn44CXJzogJ++4mCcsXG4gICAgJ++8gSc6ICfvuJUnLFxuICAgICfvvIgnOiAn77i1JyxcbiAgICAn77yJJzogJ++4ticsXG4gICAgJ++8jCc6ICfvuJAnLFxuICAgICfvvI0nOiAn77iyJyxcbiAgICAn77yOJzogJ+ODuycsXG4gICAgJ++8mic6ICfvuJMnLFxuICAgICfvvJsnOiAn77iUJyxcbiAgICAn77ycJzogJ++4vycsXG4gICAgJ++8nic6ICfvuYAnLFxuICAgICfvvJ8nOiAn77iWJyxcbiAgICAn77y7JzogJ++5hycsXG4gICAgJ++8vSc6ICfvuYgnLFxuICAgICfvvL8nOiAn77izJyxcbiAgICAn772bJzogJ++4tycsXG4gICAgJ++9nCc6ICfigJUnLFxuICAgICfvvZ0nOiAn77i4JyxcbiAgICAn772fJzogJ++4tScsXG4gICAgJ++9oCc6ICfvuLYnLFxuICAgICfvvaEnOiAn77iSJyxcbiAgICAn772iJzogJ++5gScsXG4gICAgJ++9oyc6ICfvuYInXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKGlucHV0OiBzdHJpbmcpIHtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSArIDEpIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IHByZXZDaGFyQ29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSAtIDEpIHx8IG51bGw7XG5cbiAgICAgICAgY29uc3QgY2FuUmVwbGFjZVB1bmN0dWF0aW9uID0gKFxuICAgICAgICAgICAgKCFuZXh0Q2hhckNvZGUgfHwgIWNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihuZXh0Q2hhckNvZGUpIHx8IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpICsgMV1dKSAmJlxuICAgICAgICAgICAgKCFwcmV2Q2hhckNvZGUgfHwgIWNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihwcmV2Q2hhckNvZGUpIHx8IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpIC0gMV1dKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjYW5SZXBsYWNlUHVuY3R1YXRpb24gJiYgdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW2lucHV0W2ldXSkge1xuICAgICAgICAgICAgb3V0cHV0ICs9IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG4iLCIvLyBAZmxvd1xuLy8gT05FX0VNIGNvbnN0YW50IHVzZWQgdG8gZ28gYmV0d2VlbiBcImVtXCIgdW5pdHMgdXNlZCBpbiBzdHlsZSBzcGVjIGFuZCBcInBvaW50c1wiIHVzZWQgaW50ZXJuYWxseSBmb3IgbGF5b3V0XG5cbmV4cG9ydCBkZWZhdWx0IDI0O1xuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBiZjtcblxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0Jyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9IEFycmF5QnVmZmVyLmlzVmlldyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYnVmKSA/IGJ1ZiA6IG5ldyBVaW50OEFycmF5KGJ1ZiB8fCAwKTtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy50eXBlID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyO1xuXG4vLyBUaHJlc2hvbGQgY2hvc2VuIGJhc2VkIG9uIGJvdGggYmVuY2htYXJraW5nIGFuZCBrbm93bGVkZ2UgYWJvdXQgYnJvd3NlciBzdHJpbmdcbi8vIGRhdGEgc3RydWN0dXJlcyAod2hpY2ggY3VycmVudGx5IHN3aXRjaCBzdHJ1Y3R1cmUgdHlwZXMgYXQgMTIgYnl0ZXMgb3IgbW9yZSlcbnZhciBURVhUX0RFQ09ERVJfTUlOX0xFTkdUSCA9IDEyO1xudmFyIHV0ZjhUZXh0RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogbmV3IFRleHREZWNvZGVyKCd1dGY4Jyk7XG5cblBiZi5wcm90b3R5cGUgPSB7XG5cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5idWYgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gUkVBRElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcmVhZEZpZWxkczogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQsIGVuZCkge1xuICAgICAgICBlbmQgPSBlbmQgfHwgdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5yZWFkVmFyaW50KCksXG4gICAgICAgICAgICAgICAgdGFnID0gdmFsID4+IDMsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnBvcztcblxuICAgICAgICAgICAgdGhpcy50eXBlID0gdmFsICYgMHg3O1xuICAgICAgICAgICAgcmVhZEZpZWxkKHRhZywgcmVzdWx0LCB0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSBzdGFydFBvcykgdGhpcy5za2lwKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgcmVhZE1lc3NhZ2U6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGaWVsZHMocmVhZEZpZWxkLCByZXN1bHQsIHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MpO1xuICAgIH0sXG5cbiAgICByZWFkRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkSW50MzIodGhpcy5idWYsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpICsgcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IGllZWU3NTQucmVhZCh0aGlzLmJ1ZiwgdGhpcy5wb3MsIHRydWUsIDIzLCA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSBpZWVlNzU0LnJlYWQodGhpcy5idWYsIHRoaXMucG9zLCB0cnVlLCA1MiwgOCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKGlzU2lnbmVkKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYjtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgID0gIGIgJiAweDdmOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCA3OyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAxNDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAyMTsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zXTsgICB2YWwgfD0gKGIgJiAweDBmKSA8PCAyODtcblxuICAgICAgICByZXR1cm4gcmVhZFZhcmludFJlbWFpbmRlcih2YWwsIGlzU2lnbmVkLCB0aGlzKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHsgLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2Mi4wLjFcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFZhcmludCh0cnVlKTtcbiAgICB9LFxuXG4gICAgcmVhZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbnVtID0gdGhpcy5yZWFkVmFyaW50KCk7XG4gICAgICAgIHJldHVybiBudW0gJSAyID09PSAxID8gKG51bSArIDEpIC8gLTIgOiBudW0gLyAyOyAvLyB6aWd6YWcgZW5jb2RpbmdcbiAgICB9LFxuXG4gICAgcmVhZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgfSxcblxuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcblxuICAgICAgICBpZiAoZW5kIC0gcG9zID49IFRFWFRfREVDT0RFUl9NSU5fTEVOR1RIICYmIHV0ZjhUZXh0RGVjb2Rlcikge1xuICAgICAgICAgICAgLy8gbG9uZ2VyIHN0cmluZ3MgYXJlIGZhc3Qgd2l0aCB0aGUgYnVpbHQtaW4gYnJvd3NlciBUZXh0RGVjb2RlciBBUElcbiAgICAgICAgICAgIHJldHVybiByZWFkVXRmOFRleHREZWNvZGVyKHRoaXMuYnVmLCBwb3MsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2hvcnQgc3RyaW5ncyBhcmUgZmFzdCB3aXRoIG91ciBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgICAgICAgcmV0dXJuIHJlYWRVdGY4KHRoaXMuYnVmLCBwb3MsIGVuZCk7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKGFyciwgaXNTaWduZWQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KGlzU2lnbmVkKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KGlzU2lnbmVkKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZsb2F0OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgICAgICAgICAgYnVmLnNldCh0aGlzLmJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhbCA9ICt2YWwgfHwgMDtcblxuICAgICAgICBpZiAodmFsID4gMHhmZmZmZmZmIHx8IHZhbCA8IDApIHtcbiAgICAgICAgICAgIHdyaXRlQmlnVmFyaW50KHZhbCwgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG5cbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICAgICAgICAgdmFsICYgMHg3ZiAgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+PSA3KSAmIDB4N2YpIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+Pj0gNykgJiAweDdmKSB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICh2YWwgPj4+IDcpICYgMHg3ZjtcbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKHN0ci5sZW5ndGggKiA0KTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgc3RyaW5nIGxlbmd0aFxuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICAvLyB3cml0ZSB0aGUgc3RyaW5nIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB0aGlzLnBvcyA9IHdyaXRlVXRmOCh0aGlzLmJ1Ziwgc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIGlmIChsZW4gPj0gMHg4MCkgbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCB0aGlzKTtcblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlRmxvYXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIGllZWU3NTQud3JpdGUodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MsIHRydWUsIDIzLCA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVEb3VibGU6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIGllZWU3NTQud3JpdGUodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MsIHRydWUsIDUyLCA4KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVSYXdNZXNzYWdlOiBmdW5jdGlvbihmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMucG9zKys7IC8vIHJlc2VydmUgMSBieXRlIGZvciBzaG9ydCBtZXNzYWdlIGxlbmd0aFxuXG4gICAgICAgIC8vIHdyaXRlIHRoZSBtZXNzYWdlIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgZm4ob2JqLCB0aGlzKTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMucG9zIC0gc3RhcnRQb3M7XG5cbiAgICAgICAgaWYgKGxlbiA+PSAweDgwKSBtYWtlUm9vbUZvckV4dHJhTGVuZ3RoKHN0YXJ0UG9zLCBsZW4sIHRoaXMpO1xuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbih0YWcsIGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVSYXdNZXNzYWdlKGZuLCBvYmopO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFZhcmludCwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkU1ZhcmludDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU1ZhcmludCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRCb29sZWFuOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZsb2F0LCBhcnIpOyAgICB9LFxuICAgIHdyaXRlUGFja2VkRG91YmxlOiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRG91YmxlLCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDMyOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDMyLCBhcnIpOyB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQ2NCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiByZWFkVmFyaW50UmVtYWluZGVyKGwsIHMsIHApIHtcbiAgICB2YXIgYnVmID0gcC5idWYsXG4gICAgICAgIGgsIGI7XG5cbiAgICBiID0gYnVmW3AucG9zKytdOyBoICA9IChiICYgMHg3MCkgPj4gNDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAzOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDEwOyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMTc7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAyNDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4MDEpIDw8IDMxOyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcblxuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2tlZEVuZChwYmYpIHtcbiAgICByZXR1cm4gcGJmLnR5cGUgPT09IFBiZi5CeXRlcyA/XG4gICAgICAgIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zIDogcGJmLnBvcyArIDE7XG59XG5cbmZ1bmN0aW9uIHRvTnVtKGxvdywgaGlnaCwgaXNTaWduZWQpIHtcbiAgICBpZiAoaXNTaWduZWQpIHtcbiAgICAgICAgcmV0dXJuIGhpZ2ggKiAweDEwMDAwMDAwMCArIChsb3cgPj4+IDApO1xuICAgIH1cblxuICAgIHJldHVybiAoKGhpZ2ggPj4+IDApICogMHgxMDAwMDAwMDApICsgKGxvdyA+Pj4gMCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50KHZhbCwgcGJmKSB7XG4gICAgdmFyIGxvdywgaGlnaDtcblxuICAgIGlmICh2YWwgPj0gMCkge1xuICAgICAgICBsb3cgID0gKHZhbCAlIDB4MTAwMDAwMDAwKSB8IDA7XG4gICAgICAgIGhpZ2ggPSAodmFsIC8gMHgxMDAwMDAwMDApIHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb3cgID0gfigtdmFsICUgMHgxMDAwMDAwMDApO1xuICAgICAgICBoaWdoID0gfigtdmFsIC8gMHgxMDAwMDAwMDApO1xuXG4gICAgICAgIGlmIChsb3cgXiAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgICBsb3cgPSAobG93ICsgMSkgfCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG93ID0gMDtcbiAgICAgICAgICAgIGhpZ2ggPSAoaGlnaCArIDEpIHwgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWwgPj0gMHgxMDAwMDAwMDAwMDAwMDAwMCB8fCB2YWwgPCAtMHgxMDAwMDAwMDAwMDAwMDAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBwYmYucmVhbGxvYygxMCk7XG5cbiAgICB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZik7XG4gICAgd3JpdGVCaWdWYXJpbnRIaWdoKGhpZ2gsIHBiZik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50TG93KGxvdywgaGlnaCwgcGJmKSB7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zXSAgID0gbG93ICYgMHg3Zjtcbn1cblxuZnVuY3Rpb24gd3JpdGVCaWdWYXJpbnRIaWdoKGhpZ2gsIHBiZikge1xuICAgIHZhciBsc2IgPSAoaGlnaCAmIDB4MDcpIDw8IDQ7XG5cbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gfD0gbHNiICAgICAgICAgfCAoKGhpZ2ggPj4+PSAzKSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3Zjtcbn1cblxuZnVuY3Rpb24gbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCBwYmYpIHtcbiAgICB2YXIgZXh0cmFMZW4gPVxuICAgICAgICBsZW4gPD0gMHgzZmZmID8gMSA6XG4gICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDIgOlxuICAgICAgICBsZW4gPD0gMHhmZmZmZmZmID8gMyA6IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgIC8vIGlmIDEgYnl0ZSBpc24ndCBlbm91Z2ggZm9yIGVuY29kaW5nIG1lc3NhZ2UgbGVuZ3RoLCBzaGlmdCB0aGUgZGF0YSB0byB0aGUgcmlnaHRcbiAgICBwYmYucmVhbGxvYyhleHRyYUxlbik7XG4gICAgZm9yICh2YXIgaSA9IHBiZi5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHBiZi5idWZbaSArIGV4dHJhTGVuXSA9IHBiZi5idWZbaV07XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGFja2VkVmFyaW50KGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVZhcmludChhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNWYXJpbnQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQoYXJyLCBwYmYpICAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZsb2F0KGFycltpXSk7ICAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRG91YmxlKGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZURvdWJsZShhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUJvb2xlYW4oYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkMzIoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDMyKGFycltpXSk7IH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQ2NChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkNjQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkNjQoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDY0KGFycltpXSk7IH1cblxuLy8gQnVmZmVyIGNvZGUgYmVsb3cgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlciwgTUlULWxpY2Vuc2VkXG5cbmZ1bmN0aW9uIHJlYWRVSW50MzIoYnVmLCBwb3MpIHtcbiAgICByZXR1cm4gKChidWZbcG9zXSkgfFxuICAgICAgICAoYnVmW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgKGJ1Zltwb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSW50MzIoYnVmLCB2YWwsIHBvcykge1xuICAgIGJ1Zltwb3NdID0gdmFsO1xuICAgIGJ1Zltwb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgIGJ1Zltwb3MgKyAyXSA9ICh2YWwgPj4+IDE2KTtcbiAgICBidWZbcG9zICsgM10gPSAodmFsID4+PiAyNCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQzMihidWYsIHBvcykge1xuICAgIHJldHVybiAoKGJ1Zltwb3NdKSB8XG4gICAgICAgIChidWZbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAoYnVmW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAoYnVmW3BvcyArIDNdIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFV0ZjgoYnVmLCBwb3MsIGVuZCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICB2YXIgaSA9IHBvcztcblxuICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgIHZhciBiMCA9IGJ1ZltpXTtcbiAgICAgICAgdmFyIGMgPSBudWxsOyAvLyBjb2RlcG9pbnRcbiAgICAgICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPVxuICAgICAgICAgICAgYjAgPiAweEVGID8gNCA6XG4gICAgICAgICAgICBiMCA+IDB4REYgPyAzIDpcbiAgICAgICAgICAgIGIwID4gMHhCRiA/IDIgOiAxO1xuXG4gICAgICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA+IGVuZCkgYnJlYWs7XG5cbiAgICAgICAgdmFyIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChiMCA8IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gYjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZXNQZXJTZXF1ZW5jZSA9PT0gMikge1xuICAgICAgICAgICAgYjEgPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IChiMCAmIDB4MUYpIDw8IDB4NiB8IChiMSAmIDB4M0YpO1xuICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDMpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGIyID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjIgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweEYpIDw8IDB4QyB8IChiMSAmIDB4M0YpIDw8IDB4NiB8IChiMiAmIDB4M0YpO1xuICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4N0ZGIHx8IChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDQpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGIyID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICAgIGIzID0gYnVmW2kgKyAzXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjIgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjMgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweEYpIDw8IDB4MTIgfCAoYjEgJiAweDNGKSA8PCAweEMgfCAoYjIgJiAweDNGKSA8PCAweDYgfCAoYjMgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweEZGRkYgfHwgYyA+PSAweDExMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgYyA9IDB4RkZGRDtcbiAgICAgICAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoYyA+IDB4RkZGRikge1xuICAgICAgICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG4gICAgICAgICAgICBjID0gMHhEQzAwIHwgYyAmIDB4M0ZGO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiByZWFkVXRmOFRleHREZWNvZGVyKGJ1ZiwgcG9zLCBlbmQpIHtcbiAgICByZXR1cm4gdXRmOFRleHREZWNvZGVyLmRlY29kZShidWYuc3ViYXJyYXkocG9zLCBlbmQpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVVdGY4KGJ1Ziwgc3RyLCBwb3MpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYywgbGVhZDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG4gICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjID0gbGVhZCAtIDB4RDgwMCA8PCAxMCB8IGMgLSAweERDMDAgfCAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gc3RyLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiB8IDB4QzA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweEMgfCAweEUwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4MTIgfCAweEYwO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweEMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHg2ICYgMHgzRiB8IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZbcG9zKytdID0gYyAmIDB4M0YgfCAweDgwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0FscGhhSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UnO1xuXG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcbmNvbnN0IGJvcmRlciA9IDM7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUdseXBofSBmcm9tICcuL3N0eWxlX2dseXBoJztcblxuZnVuY3Rpb24gcmVhZEZvbnRzdGFja3ModGFnOiBudW1iZXIsIGdseXBoczogQXJyYXk8U3R5bGVHbHlwaD4sIHBiZjogUHJvdG9idWYpIHtcbiAgICBpZiAodGFnID09PSAxKSB7XG4gICAgICAgIHBiZi5yZWFkTWVzc2FnZShyZWFkRm9udHN0YWNrLCBnbHlwaHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhZEZvbnRzdGFjayh0YWc6IG51bWJlciwgZ2x5cGhzOiBBcnJheTxTdHlsZUdseXBoPiwgcGJmOiBQcm90b2J1Zikge1xuICAgIGlmICh0YWcgPT09IDMpIHtcbiAgICAgICAgY29uc3Qge2lkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGxlZnQsIHRvcCwgYWR2YW5jZX0gPSBwYmYucmVhZE1lc3NhZ2UocmVhZEdseXBoLCB7fSk7XG4gICAgICAgIGdseXBocy5wdXNoKHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYml0bWFwOiBuZXcgQWxwaGFJbWFnZSh7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoICsgMiAqIGJvcmRlcixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCArIDIgKiBib3JkZXJcbiAgICAgICAgICAgIH0sIGJpdG1hcCksXG4gICAgICAgICAgICBtZXRyaWNzOiB7d2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wLCBhZHZhbmNlfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRHbHlwaCh0YWc6IG51bWJlciwgZ2x5cGg6IE9iamVjdCwgcGJmOiBQcm90b2J1Zikge1xuICAgIGlmICh0YWcgPT09IDEpIGdseXBoLmlkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGdseXBoLmJpdG1hcCA9IHBiZi5yZWFkQnl0ZXMoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGdseXBoLndpZHRoID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGdseXBoLmhlaWdodCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA1KSBnbHlwaC5sZWZ0ID0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA2KSBnbHlwaC50b3AgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDcpIGdseXBoLmFkdmFuY2UgPSBwYmYucmVhZFZhcmludCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5KTogQXJyYXk8U3R5bGVHbHlwaD4ge1xuICAgIHJldHVybiBuZXcgUHJvdG9idWYoZGF0YSkucmVhZEZpZWxkcyhyZWFkRm9udHN0YWNrcywgW10pO1xufVxuXG5leHBvcnQgY29uc3QgR0xZUEhfUEJGX0JPUkRFUiA9IGJvcmRlcjtcbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcG90cGFjayhib3hlcykge1xuXG4gICAgLy8gY2FsY3VsYXRlIHRvdGFsIGJveCBhcmVhIGFuZCBtYXhpbXVtIGJveCB3aWR0aFxuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgbWF4V2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgYXJlYSArPSBib3gudyAqIGJveC5oO1xuICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBib3gudyk7XG4gICAgfVxuXG4gICAgLy8gc29ydCB0aGUgYm94ZXMgZm9yIGluc2VydGlvbiBieSBoZWlnaHQsIGRlc2NlbmRpbmdcbiAgICBib3hlcy5zb3J0KChhLCBiKSA9PiBiLmggLSBhLmgpO1xuXG4gICAgLy8gYWltIGZvciBhIHNxdWFyaXNoIHJlc3VsdGluZyBjb250YWluZXIsXG4gICAgLy8gc2xpZ2h0bHkgYWRqdXN0ZWQgZm9yIHN1Yi0xMDAlIHNwYWNlIHV0aWxpemF0aW9uXG4gICAgY29uc3Qgc3RhcnRXaWR0aCA9IE1hdGgubWF4KE1hdGguY2VpbChNYXRoLnNxcnQoYXJlYSAvIDAuOTUpKSwgbWF4V2lkdGgpO1xuXG4gICAgLy8gc3RhcnQgd2l0aCBhIHNpbmdsZSBlbXB0eSBzcGFjZSwgdW5ib3VuZGVkIGF0IHRoZSBib3R0b21cbiAgICBjb25zdCBzcGFjZXMgPSBbe3g6IDAsIHk6IDAsIHc6IHN0YXJ0V2lkdGgsIGg6IEluZmluaXR5fV07XG5cbiAgICBsZXQgd2lkdGggPSAwO1xuICAgIGxldCBoZWlnaHQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgLy8gbG9vayB0aHJvdWdoIHNwYWNlcyBiYWNrd2FyZHMgc28gdGhhdCB3ZSBjaGVjayBzbWFsbGVyIHNwYWNlcyBmaXJzdFxuICAgICAgICBmb3IgKGxldCBpID0gc3BhY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBzcGFjZSA9IHNwYWNlc1tpXTtcblxuICAgICAgICAgICAgLy8gbG9vayBmb3IgZW1wdHkgc3BhY2VzIHRoYXQgY2FuIGFjY29tbW9kYXRlIHRoZSBjdXJyZW50IGJveFxuICAgICAgICAgICAgaWYgKGJveC53ID4gc3BhY2UudyB8fCBib3guaCA+IHNwYWNlLmgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBmb3VuZCB0aGUgc3BhY2U7IGFkZCB0aGUgYm94IHRvIGl0cyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgICAgICAgIC8vIHwtLS0tLS0tfC0tLS0tLS18XG4gICAgICAgICAgICAvLyB8ICBib3ggIHwgICAgICAgfFxuICAgICAgICAgICAgLy8gfF9fX19fX198ICAgICAgIHxcbiAgICAgICAgICAgIC8vIHwgICAgICAgICBzcGFjZSB8XG4gICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgYm94LnggPSBzcGFjZS54O1xuICAgICAgICAgICAgYm94LnkgPSBzcGFjZS55O1xuXG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGJveC55ICsgYm94LmgpO1xuICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYm94LnggKyBib3gudyk7XG5cbiAgICAgICAgICAgIGlmIChib3gudyA9PT0gc3BhY2UudyAmJiBib3guaCA9PT0gc3BhY2UuaCkge1xuICAgICAgICAgICAgICAgIC8vIHNwYWNlIG1hdGNoZXMgdGhlIGJveCBleGFjdGx5OyByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gc3BhY2VzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChpIDwgc3BhY2VzLmxlbmd0aCkgc3BhY2VzW2ldID0gbGFzdDtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChib3guaCA9PT0gc3BhY2UuaCkge1xuICAgICAgICAgICAgICAgIC8vIHNwYWNlIG1hdGNoZXMgdGhlIGJveCBoZWlnaHQ7IHVwZGF0ZSBpdCBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIC8vIHwtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXxcbiAgICAgICAgICAgICAgICAvLyB8ICBib3ggIHwgdXBkYXRlZCBzcGFjZSB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX198X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIHNwYWNlLnggKz0gYm94Lnc7XG4gICAgICAgICAgICAgICAgc3BhY2UudyAtPSBib3gudztcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChib3gudyA9PT0gc3BhY2Uudykge1xuICAgICAgICAgICAgICAgIC8vIHNwYWNlIG1hdGNoZXMgdGhlIGJveCB3aWR0aDsgdXBkYXRlIGl0IGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgLy8gfC0tLS0tLS0tLS0tLS0tLXxcbiAgICAgICAgICAgICAgICAvLyB8ICAgICAgYm94ICAgICAgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgLy8gfCB1cGRhdGVkIHNwYWNlIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIHNwYWNlLnkgKz0gYm94Lmg7XG4gICAgICAgICAgICAgICAgc3BhY2UuaCAtPSBib3guaDtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGJveCBzcGxpdHMgdGhlIHNwYWNlIGludG8gdHdvIHNwYWNlc1xuICAgICAgICAgICAgICAgIC8vIHwtLS0tLS0tfC0tLS0tLS0tLS0tfFxuICAgICAgICAgICAgICAgIC8vIHwgIGJveCAgfCBuZXcgc3BhY2UgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19ffF9fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIC8vIHwgdXBkYXRlZCBzcGFjZSAgICAgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIHNwYWNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgeDogc3BhY2UueCArIGJveC53LFxuICAgICAgICAgICAgICAgICAgICB5OiBzcGFjZS55LFxuICAgICAgICAgICAgICAgICAgICB3OiBzcGFjZS53IC0gYm94LncsXG4gICAgICAgICAgICAgICAgICAgIGg6IGJveC5oXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3BhY2UueSArPSBib3guaDtcbiAgICAgICAgICAgICAgICBzcGFjZS5oIC09IGJveC5oO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3OiB3aWR0aCwgLy8gY29udGFpbmVyIHdpZHRoXG4gICAgICAgIGg6IGhlaWdodCwgLy8gY29udGFpbmVyIGhlaWdodFxuICAgICAgICBmaWxsOiAoYXJlYSAvICh3aWR0aCAqIGhlaWdodCkpIHx8IDAgLy8gc3BhY2UgdXRpbGl6YXRpb25cbiAgICB9O1xufVxuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcclxuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcclxuaW1wb3J0IHBvdHBhY2sgZnJvbSAncG90cGFjayc7XHJcblxyXG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xyXG5pbXBvcnQgdHlwZSBJbWFnZU1hbmFnZXIgZnJvbSAnLi9pbWFnZV9tYW5hZ2VyJztcclxuaW1wb3J0IHR5cGUgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xyXG5cclxuY29uc3QgSU1BR0VfUEFERElORzogbnVtYmVyID0gMTtcclxuZXhwb3J0IHtJTUFHRV9QQURESU5HfTtcclxuXHJcbnR5cGUgUmVjdCA9IHtcclxuICAgIHg6IG51bWJlcixcclxuICAgIHk6IG51bWJlcixcclxuICAgIHc6IG51bWJlcixcclxuICAgIGg6IG51bWJlclxyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIEltYWdlUG9zaXRpb24ge1xyXG4gICAgcGFkZGVkUmVjdDogUmVjdDtcclxuICAgIHBpeGVsUmF0aW86IG51bWJlcjtcclxuICAgIHZlcnNpb246IG51bWJlcjtcclxuICAgIHN0cmV0Y2hZOiA/QXJyYXk8W251bWJlciwgbnVtYmVyXT47XHJcbiAgICBzdHJldGNoWDogP0FycmF5PFtudW1iZXIsIG51bWJlcl0+O1xyXG4gICAgY29udGVudDogP1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhZGRlZFJlY3Q6IFJlY3QsIHtwaXhlbFJhdGlvLCB2ZXJzaW9uLCBzdHJldGNoWCwgc3RyZXRjaFksIGNvbnRlbnR9OiBTdHlsZUltYWdlKSB7XHJcbiAgICAgICAgdGhpcy5wYWRkZWRSZWN0ID0gcGFkZGVkUmVjdDtcclxuICAgICAgICB0aGlzLnBpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xyXG4gICAgICAgIHRoaXMuc3RyZXRjaFggPSBzdHJldGNoWDtcclxuICAgICAgICB0aGlzLnN0cmV0Y2hZID0gc3RyZXRjaFk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcclxuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xyXG4gICB9XHJcblxyXG4gICAgZ2V0IHRsKCk6IFtudW1iZXIsIG51bWJlcl0ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRoaXMucGFkZGVkUmVjdC54ICsgSU1BR0VfUEFERElORyxcclxuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnkgKyBJTUFHRV9QQURESU5HXHJcbiAgICAgICAgXTtcclxuICAgfVxyXG5cclxuICAgIGdldCBicigpOiBbbnVtYmVyLCBudW1iZXJdIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB0aGlzLnBhZGRlZFJlY3QueCArIHRoaXMucGFkZGVkUmVjdC53IC0gSU1BR0VfUEFERElORyxcclxuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnkgKyB0aGlzLnBhZGRlZFJlY3QuaCAtIElNQUdFX1BBRERJTkdcclxuICAgICAgICBdO1xyXG4gICB9XHJcblxyXG4gICAgZ2V0IHRsYnIoKTogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGwuY29uY2F0KHRoaXMuYnIpO1xyXG4gICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXlTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICh0aGlzLnBhZGRlZFJlY3QudyAtIElNQUdFX1BBRERJTkcgKiAyKSAvIHRoaXMucGl4ZWxSYXRpbyxcclxuICAgICAgICAgICAgKHRoaXMucGFkZGVkUmVjdC5oIC0gSU1BR0VfUEFERElORyAqIDIpIC8gdGhpcy5waXhlbFJhdGlvXHJcbiAgICAgICAgXTtcclxuICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUF0bGFzIHtcclxuICAgIGltYWdlOiBSR0JBSW1hZ2U7XHJcbiAgICBpY29uUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259O1xyXG4gICAgcGF0dGVyblBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufTtcclxuICAgIGhhdmVSZW5kZXJDYWxsYmFja3M6IEFycmF5PHN0cmluZz47XHJcbiAgICB1cGxvYWRlZDogP2Jvb2xlYW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWNvbnM6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sIHBhdHRlcm5zOiB7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9KSB7XHJcbiAgICAgICAgY29uc3QgaWNvblBvc2l0aW9ucyA9IHt9LCBwYXR0ZXJuUG9zaXRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IGJpbnMgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRJbWFnZXMoaWNvbnMsIGljb25Qb3NpdGlvbnMsIGJpbnMpO1xyXG4gICAgICAgIHRoaXMuYWRkSW1hZ2VzKHBhdHRlcm5zLCBwYXR0ZXJuUG9zaXRpb25zLCBiaW5zKTtcclxuXHJcbiAgICAgICAgY29uc3Qge3csIGh9ID0gcG90cGFjayhiaW5zKTtcclxuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiB3IHx8IDEsIGhlaWdodDogaCB8fCAxfSk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gaWNvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3JjID0gaWNvbnNbaWRdO1xyXG4gICAgICAgICAgICBjb25zdCBiaW4gPSBpY29uUG9zaXRpb25zW2lkXS5wYWRkZWRSZWN0O1xyXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiAwLCB5OiAwfSwge3g6IGJpbi54ICsgSU1BR0VfUEFERElORywgeTogYmluLnkgKyBJTUFHRV9QQURESU5HfSwgc3JjLmRhdGEpO1xyXG4gICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHBhdHRlcm5zW2lkXTtcclxuICAgICAgICAgICAgY29uc3QgYmluID0gcGF0dGVyblBvc2l0aW9uc1tpZF0ucGFkZGVkUmVjdDtcclxuICAgICAgICAgICAgY29uc3QgeCA9IGJpbi54ICsgSU1BR0VfUEFERElORyxcclxuICAgICAgICAgICAgICAgIHkgPSBiaW4ueSArIElNQUdFX1BBRERJTkcsXHJcbiAgICAgICAgICAgICAgICB3ID0gc3JjLmRhdGEud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoID0gc3JjLmRhdGEuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogMH0sIHt4LCB5fSwgc3JjLmRhdGEpO1xyXG4gICAgICAgICAgICAvLyBBZGQgMSBwaXhlbCB3cmFwcGVkIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBpbWFnZS5cclxuICAgICAgICAgICAgLy8gUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogaCAtIDF9LCB7eCwgeTogeSAtIDF9LCB7d2lkdGg6IHcsIGhlaWdodDogMX0pOyAvLyBUXHJcbiAgICAgICAgICAgIC8vIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsIHk6ICAgICAwfSwge3gsIHk6IHkgKyBofSwge3dpZHRoOiB3LCBoZWlnaHQ6IDF9KTsgLy8gQlxyXG4gICAgICAgICAgICAvLyBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiB3IC0gMSwgeTogMH0sIHt4OiB4IC0gMSwgeX0sIHt3aWR0aDogMSwgaGVpZ2h0OiBofSk7IC8vIExcclxuICAgICAgICAgICAgLy8gUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgICAgIHk6IDB9LCB7eDogeCArIHcsIHl9LCB7d2lkdGg6IDEsIGhlaWdodDogaH0pOyAvLyBSXHJcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsIHk6IGggLSAxfSwge3gsIHk6IHkgKyBofSwge3dpZHRoOiB3LCBoZWlnaHQ6IDF9KTsgLy8gQlxyXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiAwLCB5OiAwfSwge3gsIHk6IHkgLSAxfSwge3dpZHRoOiB3LCBoZWlnaHQ6IDF9KTsgLy8gVFxyXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiB3IC0gMSwgeTogMH0sIHt4OiB4ICsgdywgeX0sIHt3aWR0aDogMSwgaGVpZ2h0OiBofSk7IC8vIFJcclxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogMH0sIHt4OiB4IC0gMSwgeX0sIHt3aWR0aDogMSwgaGVpZ2h0OiBofSk7IC8vIExcclxuXHJcbiAgICAgICAgICAgIC8vIOWNleS4quWbvueJh+eahDTkuKrpobbngrnloavlhYXlg4/ntKDlgLxcclxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogMH0sIHt4OiAwLCB5OiB5IC0gMX0sIHt3aWR0aDogMSwgaGVpZ2h0OiAxfSk7IC8vIEJMXHJcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IHcgLSAxLCB5OiAwfSwge3g6IHggKyB3LCB5OiB5IC0gMX0sIHt3aWR0aDogMSwgaGVpZ2h0OiAxfSk7IC8vIEJSXHJcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IHcgLSAxLCB5OiBoIC0gMX0sIHt4OiB4ICsgdywgeTogeSArIGh9LCB7d2lkdGg6IDEsIGhlaWdodDogMX0pOyAvLyBUUlxyXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiAwLCB5OiBoIC0gMX0sIHt4OiAwLCB5OiB5ICsgaH0sIHt3aWR0aDogMSwgaGVpZ2h0OiAxfSk7IC8vIFRMXHJcbiAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcclxuICAgICAgICB0aGlzLmljb25Qb3NpdGlvbnMgPSBpY29uUG9zaXRpb25zO1xyXG4gICAgICAgIHRoaXMucGF0dGVyblBvc2l0aW9ucyA9IHBhdHRlcm5Qb3NpdGlvbnM7XHJcbiAgIH1cclxuXHJcbiAgICBhZGRJbWFnZXMoaW1hZ2VzOiB7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9LCBwb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGJpbnM6IEFycmF5PFJlY3Q+KSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBpbWFnZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3JjID0gaW1hZ2VzW2lkXTtcclxuICAgICAgICAgICAgY29uc3QgYmluID0ge1xyXG4gICAgICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICB3OiBzcmMuZGF0YS53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HLFxyXG4gICAgICAgICAgICAgICAgaDogc3JjLmRhdGEuaGVpZ2h0ICsgMiAqIElNQUdFX1BBRERJTkcsXHJcbiAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYmlucy5wdXNoKGJpbik7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uc1tpZF0gPSBuZXcgSW1hZ2VQb3NpdGlvbihiaW4sIHNyYyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3JjLmhhc1JlbmRlckNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MucHVzaChpZCk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICB9XHJcblxyXG4gICAgcGF0Y2hVcGRhdGVkSW1hZ2VzKGltYWdlTWFuYWdlcjogSW1hZ2VNYW5hZ2VyLCB0ZXh0dXJlOiBUZXh0dXJlKSB7XHJcbiAgICAgICAgaW1hZ2VNYW5hZ2VyLmRpc3BhdGNoUmVuZGVyQ2FsbGJhY2tzKHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGltYWdlTWFuYWdlci51cGRhdGVkSW1hZ2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkSW1hZ2UodGhpcy5pY29uUG9zaXRpb25zW25hbWVdLCBpbWFnZU1hbmFnZXIuZ2V0SW1hZ2UobmFtZSksIHRleHR1cmUpO1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZEltYWdlKHRoaXMucGF0dGVyblBvc2l0aW9uc1tuYW1lXSwgaW1hZ2VNYW5hZ2VyLmdldEltYWdlKG5hbWUpLCB0ZXh0dXJlKTtcclxuICAgICAgIH1cclxuICAgfVxyXG5cclxuICAgIHBhdGNoVXBkYXRlZEltYWdlKHBvc2l0aW9uOiA/SW1hZ2VQb3NpdGlvbiwgaW1hZ2U6ID9TdHlsZUltYWdlLCB0ZXh0dXJlOiBUZXh0dXJlKSB7XHJcbiAgICAgICAgaWYgKCFwb3NpdGlvbiB8fCAhaW1hZ2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnZlcnNpb24gPT09IGltYWdlLnZlcnNpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgcG9zaXRpb24udmVyc2lvbiA9IGltYWdlLnZlcnNpb247XHJcbiAgICAgICAgY29uc3QgW3gsIHldID0gcG9zaXRpb24udGw7XHJcbiAgICAgICAgdGV4dHVyZS51cGRhdGUoaW1hZ2UuZGF0YSwgdW5kZWZpbmVkLCB7eCwgeX0pO1xyXG4gICB9XHJcblxyXG59XHJcblxyXG5yZWdpc3RlcignSW1hZ2VQb3NpdGlvbicsIEltYWdlUG9zaXRpb24pO1xyXG5yZWdpc3RlcignSW1hZ2VBdGxhcycsIEltYWdlQXRsYXMpO1xyXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICAgIGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbixcbiAgICBjaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyxcbiAgICBjaGFySW5Db21wbGV4U2hhcGluZ1NjcmlwdFxufSBmcm9tICcuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24nO1xuaW1wb3J0IHZlcnRpY2FsaXplUHVuY3R1YXRpb24gZnJvbSAnLi4vdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbic7XG5pbXBvcnQge3BsdWdpbiBhcyBydGxUZXh0UGx1Z2lufSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi9vbmVfZW0nO1xuaW1wb3J0IHt3YXJuT25jZX0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGgsIEdseXBoTWV0cmljc30gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHtHTFlQSF9QQkZfQk9SREVSfSBmcm9tICcuLi9zdHlsZS9wYXJzZV9nbHlwaF9wYmYnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5pbXBvcnQge0lNQUdFX1BBRERJTkd9IGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XG5pbXBvcnQgdHlwZSB7UmVjdCwgR2x5cGhQb3NpdGlvbn0gZnJvbSAnLi4vcmVuZGVyL2dseXBoX2F0bGFzJztcbmltcG9ydCBGb3JtYXR0ZWQsIHtGb3JtYXR0ZWRTZWN0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuY29uc3QgV3JpdGluZ01vZGUgPSB7XG4gICAgaG9yaXpvbnRhbDogMSxcbiAgICB2ZXJ0aWNhbDogMixcbiAgICBob3Jpem9udGFsT25seTogM1xufTtcblxuY29uc3QgU0hBUElOR19ERUZBVUxUX09GRlNFVCA9IC0xNztcbmV4cG9ydCB7c2hhcGVUZXh0LCBzaGFwZUljb24sIGZpdEljb25Ub1RleHQsIGdldEFuY2hvckFsaWdubWVudCwgV3JpdGluZ01vZGUsIFNIQVBJTkdfREVGQVVMVF9PRkZTRVR9O1xuXG4vLyBUaGUgcG9zaXRpb24gb2YgYSBnbHlwaCByZWxhdGl2ZSB0byB0aGUgdGV4dCdzIGFuY2hvciBwb2ludC5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uZWRHbHlwaCA9IHtcbiAgICBnbHlwaDogbnVtYmVyLFxuICAgIGltYWdlTmFtZTogc3RyaW5nIHwgbnVsbCxcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHZlcnRpY2FsOiBib29sZWFuLFxuICAgIHNjYWxlOiBudW1iZXIsXG4gICAgZm9udFN0YWNrOiBzdHJpbmcsXG4gICAgc2VjdGlvbkluZGV4OiBudW1iZXIsXG4gICAgbWV0cmljczogR2x5cGhNZXRyaWNzLFxuICAgIHJlY3Q6IFJlY3QgfCBudWxsXG59O1xuXG5leHBvcnQgdHlwZSBQb3NpdGlvbmVkTGluZSA9IHtcbiAgICBwb3NpdGlvbmVkR2x5cGhzOiBBcnJheTxQb3NpdGlvbmVkR2x5cGg+LFxuICAgIGxpbmVPZmZzZXQ6IG51bWJlclxufTtcblxuLy8gQSBjb2xsZWN0aW9uIG9mIHBvc2l0aW9uZWQgZ2x5cGhzIGFuZCBzb21lIG1ldGFkYXRhXG5leHBvcnQgdHlwZSBTaGFwaW5nID0ge1xuICAgIHBvc2l0aW9uZWRMaW5lczogQXJyYXk8UG9zaXRpb25lZExpbmU+LFxuICAgIHRvcDogbnVtYmVyLFxuICAgIGJvdHRvbTogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICByaWdodDogbnVtYmVyLFxuICAgIHdyaXRpbmdNb2RlOiAxIHwgMixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgaWNvbnNJblRleHQ6IGJvb2xlYW4sXG4gICAgdmVydGljYWxpemFibGU6IGJvb2xlYW5cbn07XG5cbmZ1bmN0aW9uIGlzRW1wdHkocG9zaXRpb25lZExpbmVzOiBBcnJheTxQb3NpdGlvbmVkTGluZT4pIHtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcG9zaXRpb25lZExpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLnBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEFuY2hvciA9ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbScgfCAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCc7XG5leHBvcnQgdHlwZSBUZXh0SnVzdGlmeSA9ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JztcblxuLy8gTWF4IG51bWJlciBvZiBpbWFnZXMgaW4gbGFiZWwgaXMgNjQwMSBVK0UwMDDigJNVK0Y4RkYgdGhhdCBjb3ZlcnNcbi8vIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSBVbmljb2RlIFByaXZhdGUgVXNlIEFyZWEgKFBVQSkuXG5jb25zdCBQVUFiZWdpbiA9IDB4RTAwMDtcbmNvbnN0IFBVQWVuZCA9IDB4RjhGRjtcblxuY2xhc3MgU2VjdGlvbk9wdGlvbnMge1xuICAgIC8vIFRleHQgb3B0aW9uc1xuICAgIHNjYWxlOiBudW1iZXI7XG4gICAgZm9udFN0YWNrOiBzdHJpbmc7XG4gICAgLy8gSW1hZ2Ugb3B0aW9uc1xuICAgIGltYWdlTmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNjYWxlID0gMS4wO1xuICAgICAgICB0aGlzLmZvbnRTdGFjayA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW1hZ2VOYW1lID0gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9yVGV4dChzY2FsZTogbnVtYmVyIHwgbnVsbCwgZm9udFN0YWNrOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGV4dE9wdGlvbnMgPSBuZXcgU2VjdGlvbk9wdGlvbnMoKTtcbiAgICAgICAgdGV4dE9wdGlvbnMuc2NhbGUgPSBzY2FsZSB8fCAxO1xuICAgICAgICB0ZXh0T3B0aW9ucy5mb250U3RhY2sgPSBmb250U3RhY2s7XG4gICAgICAgIHJldHVybiB0ZXh0T3B0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9ySW1hZ2UoaW1hZ2VOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VPcHRpb25zID0gbmV3IFNlY3Rpb25PcHRpb25zKCk7XG4gICAgICAgIGltYWdlT3B0aW9ucy5pbWFnZU5hbWUgPSBpbWFnZU5hbWU7XG4gICAgICAgIHJldHVybiBpbWFnZU9wdGlvbnM7XG4gICAgfVxuXG59XG5cbmNsYXNzIFRhZ2dlZFN0cmluZyB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHNlY3Rpb25JbmRleDogQXJyYXk8bnVtYmVyPiAvLyBtYXBzIGVhY2ggY2hhcmFjdGVyIGluICd0ZXh0JyB0byBpdHMgY29ycmVzcG9uZGluZyBlbnRyeSBpbiAnc2VjdGlvbnMnXG4gICAgc2VjdGlvbnM6IEFycmF5PFNlY3Rpb25PcHRpb25zPlxuICAgIGltYWdlU2VjdGlvbklEOiBudW1iZXIgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VjdGlvbkluZGV4ID0gW107XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbWFnZVNlY3Rpb25JRCA9IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21GZWF0dXJlKHRleHQ6IEZvcm1hdHRlZCwgZGVmYXVsdEZvbnRTdGFjazogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0LnNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gdGV4dC5zZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIGlmICghc2VjdGlvbi5pbWFnZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRUZXh0U2VjdGlvbihzZWN0aW9uLCBkZWZhdWx0Rm9udFN0YWNrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFkZEltYWdlU2VjdGlvbihzZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uKGluZGV4OiBudW1iZXIpOiBTZWN0aW9uT3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25zW3RoaXMuc2VjdGlvbkluZGV4W2luZGV4XV07XG4gICAgfVxuXG4gICAgZ2V0U2VjdGlvbkluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9uSW5kZXhbaW5kZXhdO1xuICAgIH1cblxuICAgIGdldENoYXJDb2RlKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHZlcnRpY2FsaXplUHVuY3R1YXRpb24oKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHZlcnRpY2FsaXplUHVuY3R1YXRpb24odGhpcy50ZXh0KTtcbiAgICB9XG5cbiAgICB0cmltKCkge1xuICAgICAgICBsZXQgYmVnaW5uaW5nV2hpdGVzcGFjZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwO1xuICAgICAgICAgICAgaSA8IHRoaXMudGV4dC5sZW5ndGggJiYgd2hpdGVzcGFjZVt0aGlzLnRleHQuY2hhckNvZGVBdChpKV07XG4gICAgICAgICAgICBpKyspIHtcbiAgICAgICAgICAgIGJlZ2lubmluZ1doaXRlc3BhY2UrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHJhaWxpbmdXaGl0ZXNwYWNlID0gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMudGV4dC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgaSA+PSAwICYmIGkgPj0gYmVnaW5uaW5nV2hpdGVzcGFjZSAmJiB3aGl0ZXNwYWNlW3RoaXMudGV4dC5jaGFyQ29kZUF0KGkpXTtcbiAgICAgICAgICAgIGktLSkge1xuICAgICAgICAgICAgdHJhaWxpbmdXaGl0ZXNwYWNlLS07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnN1YnN0cmluZyhiZWdpbm5pbmdXaGl0ZXNwYWNlLCB0cmFpbGluZ1doaXRlc3BhY2UpO1xuICAgICAgICB0aGlzLnNlY3Rpb25JbmRleCA9IHRoaXMuc2VjdGlvbkluZGV4LnNsaWNlKGJlZ2lubmluZ1doaXRlc3BhY2UsIHRyYWlsaW5nV2hpdGVzcGFjZSk7XG4gICAgfVxuXG4gICAgc3Vic3RyaW5nKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogVGFnZ2VkU3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3Vic3RyaW5nID0gbmV3IFRhZ2dlZFN0cmluZygpO1xuICAgICAgICBzdWJzdHJpbmcudGV4dCA9IHRoaXMudGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIHN1YnN0cmluZy5zZWN0aW9uSW5kZXggPSB0aGlzLnNlY3Rpb25JbmRleC5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgc3Vic3RyaW5nLnNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucztcbiAgICAgICAgcmV0dXJuIHN1YnN0cmluZztcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cblxuICAgIGdldE1heFNjYWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9uSW5kZXgucmVkdWNlKChtYXgsIGluZGV4KSA9PiBNYXRoLm1heChtYXgsIHRoaXMuc2VjdGlvbnNbaW5kZXhdLnNjYWxlKSwgMCk7XG4gICAgfVxuXG4gICAgYWRkVGV4dFNlY3Rpb24oc2VjdGlvbjogRm9ybWF0dGVkU2VjdGlvbiwgZGVmYXVsdEZvbnRTdGFjazogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudGV4dCArPSBzZWN0aW9uLnRleHQ7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMucHVzaChTZWN0aW9uT3B0aW9ucy5mb3JUZXh0KHNlY3Rpb24uc2NhbGUsIHNlY3Rpb24uZm9udFN0YWNrIHx8IGRlZmF1bHRGb250U3RhY2spKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlY3Rpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VjdGlvbi50ZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25JbmRleC5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEltYWdlU2VjdGlvbihzZWN0aW9uOiBGb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGltYWdlTmFtZSA9IHNlY3Rpb24uaW1hZ2UgPyBzZWN0aW9uLmltYWdlLm5hbWUgOiAnJztcbiAgICAgICAgaWYgKGltYWdlTmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGBDYW4ndCBhZGQgRm9ybWF0dGVkU2VjdGlvbiB3aXRoIGFuIGVtcHR5IGltYWdlLmApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dEltYWdlU2VjdGlvbkNoYXJDb2RlID0gdGhpcy5nZXROZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUoKTtcbiAgICAgICAgaWYgKCFuZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGBSZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyAke1BVQWVuZCAtIFBVQWJlZ2luICsgMn1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRJbWFnZVNlY3Rpb25DaGFyQ29kZSk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMucHVzaChTZWN0aW9uT3B0aW9ucy5mb3JJbWFnZShpbWFnZU5hbWUpKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXgucHVzaCh0aGlzLnNlY3Rpb25zLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIGdldE5leHRJbWFnZVNlY3Rpb25DaGFyQ29kZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlU2VjdGlvbklEKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlU2VjdGlvbklEID0gUFVBYmVnaW47XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZVNlY3Rpb25JRDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltYWdlU2VjdGlvbklEID49IFBVQWVuZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiArK3RoaXMuaW1hZ2VTZWN0aW9uSUQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBicmVha0xpbmVzKGlucHV0OiBUYWdnZWRTdHJpbmcsIGxpbmVCcmVha1BvaW50czogQXJyYXk8bnVtYmVyPik6IEFycmF5PFRhZ2dlZFN0cmluZz4ge1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgY29uc3QgdGV4dCA9IGlucHV0LnRleHQ7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGxpbmVCcmVhayBvZiBsaW5lQnJlYWtQb2ludHMpIHtcbiAgICAgICAgbGluZXMucHVzaChpbnB1dC5zdWJzdHJpbmcoc3RhcnQsIGxpbmVCcmVhaykpO1xuICAgICAgICBzdGFydCA9IGxpbmVCcmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5wdXNoKGlucHV0LnN1YnN0cmluZyhzdGFydCwgdGV4dC5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBzaGFwZVRleHQodGV4dDogRm9ybWF0dGVkLFxuICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9fSxcbiAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uczoge1tfOiBzdHJpbmddOiB7W186IG51bWJlcl06IEdseXBoUG9zaXRpb259fSxcbiAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSxcbiAgICAgICAgICAgICAgICAgICBkZWZhdWx0Rm9udFN0YWNrOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvcjogU3ltYm9sQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5OiBUZXh0SnVzdGlmeSxcbiAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIHdyaXRpbmdNb2RlOiAxIHwgMixcbiAgICAgICAgICAgICAgICAgICBhbGxvd1ZlcnRpY2FsUGxhY2VtZW50OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIHN5bWJvbFBsYWNlbWVudDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemVUaGlzWm9vbTogbnVtYmVyKTogU2hhcGluZyB8IGZhbHNlIHtcbiAgICBjb25zdCBsb2dpY2FsSW5wdXQgPSBUYWdnZWRTdHJpbmcuZnJvbUZlYXR1cmUodGV4dCwgZGVmYXVsdEZvbnRTdGFjayk7XG5cbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgIGxvZ2ljYWxJbnB1dC52ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKCk7XG4gICAgfVxuXG4gICAgbGV0IGxpbmVzOiBBcnJheTxUYWdnZWRTdHJpbmc+O1xuXG4gICAgY29uc3Qge3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCwgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0fSA9IHJ0bFRleHRQbHVnaW47XG4gICAgaWYgKHByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCAmJiBsb2dpY2FsSW5wdXQuc2VjdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEJpZGkgZG9lc24ndCBoYXZlIHRvIGJlIHN0eWxlLWF3YXJlXG4gICAgICAgIGxpbmVzID0gW107XG4gICAgICAgIGNvbnN0IHVudGFnZ2VkTGluZXMgPVxuICAgICAgICAgICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KGxvZ2ljYWxJbnB1dC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplKSk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB1bnRhZ2dlZExpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdnZWRMaW5lID0gbmV3IFRhZ2dlZFN0cmluZygpO1xuICAgICAgICAgICAgdGFnZ2VkTGluZS50ZXh0ID0gbGluZTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUuc2VjdGlvbnMgPSBsb2dpY2FsSW5wdXQuc2VjdGlvbnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25JbmRleC5wdXNoKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZXMucHVzaCh0YWdnZWRMaW5lKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0KSB7XG4gICAgICAgIC8vIE5lZWQgdmVyc2lvbiBvZiBtYXBib3gtZ2wtcnRsLXRleHQgd2l0aCBzdHlsZSBzdXBwb3J0IGZvciBjb21iaW5pbmcgUlRMIHRleHRcbiAgICAgICAgLy8gd2l0aCBmb3JtYXR0aW5nXG4gICAgICAgIGxpbmVzID0gW107XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZExpbmVzID1cbiAgICAgICAgICAgIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dChsb2dpY2FsSW5wdXQudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsSW5wdXQuc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplKSk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBwcm9jZXNzZWRMaW5lcykge1xuICAgICAgICAgICAgY29uc3QgdGFnZ2VkTGluZSA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUudGV4dCA9IGxpbmVbMF07XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25JbmRleCA9IGxpbmVbMV07XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25zID0gbG9naWNhbElucHV0LnNlY3Rpb25zO1xuICAgICAgICAgICAgbGluZXMucHVzaCh0YWdnZWRMaW5lKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzID0gYnJlYWtMaW5lcyhsb2dpY2FsSW5wdXQsIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb25lZExpbmVzID0gW107XG4gICAgY29uc3Qgc2hhcGluZyA9IHtcbiAgICAgICAgcG9zaXRpb25lZExpbmVzLFxuICAgICAgICB0ZXh0OiBsb2dpY2FsSW5wdXQudG9TdHJpbmcoKSxcbiAgICAgICAgdG9wOiB0cmFuc2xhdGVbMV0sXG4gICAgICAgIGJvdHRvbTogdHJhbnNsYXRlWzFdLFxuICAgICAgICBsZWZ0OiB0cmFuc2xhdGVbMF0sXG4gICAgICAgIHJpZ2h0OiB0cmFuc2xhdGVbMF0sXG4gICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICBpY29uc0luVGV4dDogZmFsc2UsXG4gICAgICAgIHZlcnRpY2FsaXphYmxlOiBmYWxzZVxuICAgIH07XG5cbiAgICBzaGFwZUxpbmVzKHNoYXBpbmcsIGdseXBoTWFwLCBnbHlwaFBvc2l0aW9ucywgaW1hZ2VQb3NpdGlvbnMsIGxpbmVzLCBsaW5lSGVpZ2h0LCB0ZXh0QW5jaG9yLCB0ZXh0SnVzdGlmeSwgd3JpdGluZ01vZGUsIHNwYWNpbmcsIGFsbG93VmVydGljYWxQbGFjZW1lbnQsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgIGlmIChpc0VtcHR5KHBvc2l0aW9uZWRMaW5lcykpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzaGFwaW5nO1xufVxuXG4vLyB1c2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMzgwXG4vKiBlc2xpbnQgbm8tdXNlbGVzcy1jb21wdXRlZC1rZXk6IDAgKi9cblxuY29uc3Qgd2hpdGVzcGFjZToge1tfOiBudW1iZXJdOiBib29sZWFufSA9IHtcbiAgICBbMHgwOV06IHRydWUsIC8vIHRhYlxuICAgIFsweDBhXTogdHJ1ZSwgLy8gbmV3bGluZVxuICAgIFsweDBiXTogdHJ1ZSwgLy8gdmVydGljYWwgdGFiXG4gICAgWzB4MGNdOiB0cnVlLCAvLyBmb3JtIGZlZWRcbiAgICBbMHgwZF06IHRydWUsIC8vIGNhcnJpYWdlIHJldHVyblxuICAgIFsweDIwXTogdHJ1ZSwgLy8gc3BhY2Vcbn07XG5cbmNvbnN0IGJyZWFrYWJsZToge1tfOiBudW1iZXJdOiBib29sZWFufSA9IHtcbiAgICBbMHgwYV06ICAgdHJ1ZSwgLy8gbmV3bGluZVxuICAgIFsweDIwXTogICB0cnVlLCAvLyBzcGFjZVxuICAgIFsweDI2XTogICB0cnVlLCAvLyBhbXBlcnNhbmRcbiAgICBbMHgyOF06ICAgdHJ1ZSwgLy8gbGVmdCBwYXJlbnRoZXNpc1xuICAgIFsweDI5XTogICB0cnVlLCAvLyByaWdodCBwYXJlbnRoZXNpc1xuICAgIFsweDJiXTogICB0cnVlLCAvLyBwbHVzIHNpZ25cbiAgICBbMHgyZF06ICAgdHJ1ZSwgLy8gaHlwaGVuLW1pbnVzXG4gICAgWzB4MmZdOiAgIHRydWUsIC8vIHNvbGlkdXNcbiAgICBbMHhhZF06ICAgdHJ1ZSwgLy8gc29mdCBoeXBoZW5cbiAgICBbMHhiN106ICAgdHJ1ZSwgLy8gbWlkZGxlIGRvdFxuICAgIFsweDIwMGJdOiB0cnVlLCAvLyB6ZXJvLXdpZHRoIHNwYWNlXG4gICAgWzB4MjAxMF06IHRydWUsIC8vIGh5cGhlblxuICAgIFsweDIwMTNdOiB0cnVlLCAvLyBlbiBkYXNoXG4gICAgWzB4MjAyN106IHRydWUgIC8vIGludGVycHVuY3RcbiAgICAvLyBNYW55IG90aGVyIGNoYXJhY3RlcnMgbWF5IGJlIHJlYXNvbmFibGUgYnJlYWtwb2ludHNcbiAgICAvLyBDb25zaWRlciBcIm5ldXRyYWwgb3JpZW50YXRpb25cIiBjaGFyYWN0ZXJzIGF0IHNjcmlwdERldGVjdGlvbi5jaGFySGFzTmV1dHJhbFZlcnRpY2FsT3JpZW50YXRpb25cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM2NThcbn07XG5cbmZ1bmN0aW9uIGdldEdseXBoQWR2YW5jZShjb2RlUG9pbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBTZWN0aW9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghc2VjdGlvbi5pbWFnZU5hbWUpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZ2x5cGhNYXBbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICBjb25zdCBnbHlwaCA9IHBvc2l0aW9ucyAmJiBwb3NpdGlvbnNbY29kZVBvaW50XTtcbiAgICAgICAgaWYgKCFnbHlwaCkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiBnbHlwaC5tZXRyaWNzLmFkdmFuY2UgKiBzZWN0aW9uLnNjYWxlICsgc3BhY2luZztcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbWFnZVBvc2l0aW9uID0gaW1hZ2VQb3NpdGlvbnNbc2VjdGlvbi5pbWFnZU5hbWVdO1xuICAgICAgICBpZiAoIWltYWdlUG9zaXRpb24pIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gaW1hZ2VQb3NpdGlvbi5kaXNwbGF5U2l6ZVswXSAqIHNlY3Rpb24uc2NhbGUgKiBPTkVfRU0gLyBsYXlvdXRUZXh0U2l6ZSArIHNwYWNpbmc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGxvZ2ljYWxJbnB1dDogVGFnZ2VkU3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplOiBudW1iZXIpIHtcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbG9naWNhbElucHV0Lmxlbmd0aCgpOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsb2dpY2FsSW5wdXQuZ2V0U2VjdGlvbihpbmRleCk7XG4gICAgICAgIHRvdGFsV2lkdGggKz0gZ2V0R2x5cGhBZHZhbmNlKGxvZ2ljYWxJbnB1dC5nZXRDaGFyQ29kZShpbmRleCksIHNlY3Rpb24sIGdseXBoTWFwLCBpbWFnZVBvc2l0aW9ucywgc3BhY2luZywgbGF5b3V0VGV4dFNpemUpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVDb3VudCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbFdpZHRoIC8gbWF4V2lkdGgpKTtcbiAgICByZXR1cm4gdG90YWxXaWR0aCAvIGxpbmVDb3VudDtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlQmFkbmVzcyhsaW5lV2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RCcmVhazogYm9vbGVhbikge1xuICAgIGNvbnN0IHJhZ2dlZG5lc3MgPSBNYXRoLnBvdyhsaW5lV2lkdGggLSB0YXJnZXRXaWR0aCwgMik7XG4gICAgaWYgKGlzTGFzdEJyZWFrKSB7XG4gICAgICAgIC8vIEZhdm9yIGZpbmFscyBsaW5lcyBzaG9ydGVyIHRoYW4gYXZlcmFnZSBvdmVyIGxvbmdlciB0aGFuIGF2ZXJhZ2VcbiAgICAgICAgaWYgKGxpbmVXaWR0aCA8IHRhcmdldFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmFnZ2VkbmVzcyAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmFnZ2VkbmVzcyAqIDI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmFnZ2VkbmVzcyArIE1hdGguYWJzKHBlbmFsdHkpICogcGVuYWx0eTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlUGVuYWx0eShjb2RlUG9pbnQ6IG51bWJlciwgbmV4dENvZGVQb2ludDogbnVtYmVyLCBwZW5hbGl6YWJsZUlkZW9ncmFwaGljQnJlYWs6IGJvb2xlYW4pIHtcbiAgICBsZXQgcGVuYWx0eSA9IDA7XG4gICAgLy8gRm9yY2UgYnJlYWsgb24gbmV3bGluZVxuICAgIGlmIChjb2RlUG9pbnQgPT09IDB4MGEpIHtcbiAgICAgICAgcGVuYWx0eSAtPSAxMDAwMDtcbiAgICB9XG4gICAgLy8gUGVuYWxpemUgYnJlYWtzIGJldHdlZW4gY2hhcmFjdGVycyB0aGF0IGFsbG93IGlkZW9ncmFwaGljIGJyZWFraW5nIGJlY2F1c2VcbiAgICAvLyB0aGV5IGFyZSBsZXNzIHByZWZlcmFibGUgdGhhbiBicmVha3MgYXQgc3BhY2VzIChvciB6ZXJvIHdpZHRoIHNwYWNlcykuXG4gICAgaWYgKHBlbmFsaXphYmxlSWRlb2dyYXBoaWNCcmVhaykge1xuICAgICAgICBwZW5hbHR5ICs9IDE1MDtcbiAgICB9XG5cbiAgICAvLyBQZW5hbGl6ZSBvcGVuIHBhcmVudGhlc2lzIGF0IGVuZCBvZiBsaW5lXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gMHgyOCB8fCBjb2RlUG9pbnQgPT09IDB4ZmYwOCkge1xuICAgICAgICBwZW5hbHR5ICs9IDUwO1xuICAgIH1cblxuICAgIC8vIFBlbmFsaXplIGNsb3NlIHBhcmVudGhlc2lzIGF0IGJlZ2lubmluZyBvZiBsaW5lXG4gICAgaWYgKG5leHRDb2RlUG9pbnQgPT09IDB4MjkgfHwgbmV4dENvZGVQb2ludCA9PT0gMHhmZjA5KSB7XG4gICAgICAgIHBlbmFsdHkgKz0gNTA7XG4gICAgfVxuICAgIHJldHVybiBwZW5hbHR5O1xufVxuXG50eXBlIEJyZWFrID0ge1xuICAgIGluZGV4OiBudW1iZXIsXG4gICAgeDogbnVtYmVyLFxuICAgIHByaW9yQnJlYWs6ID9CcmVhayxcbiAgICBiYWRuZXNzOiBudW1iZXJcbn07XG5cbmZ1bmN0aW9uIGV2YWx1YXRlQnJlYWsoYnJlYWtJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICBicmVha1g6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsQnJlYWtzOiBBcnJheTxCcmVhaz4sXG4gICAgICAgICAgICAgICAgICAgICAgIHBlbmFsdHk6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0QnJlYWs6IGJvb2xlYW4pOiBCcmVhayB7XG4gICAgLy8gV2UgY291bGQgc2tpcCBldmFsdWF0aW5nIGJyZWFrcyB3aGVyZSB0aGUgbGluZSBsZW5ndGggKGJyZWFrWCAtIHByaW9yQnJlYWsueCkgPiBtYXhXaWR0aFxuICAgIC8vICAuLi5idXQgaW4gZmFjdCB3ZSBhbGxvdyBsaW5lcyBsb25nZXIgdGhhbiBtYXhXaWR0aCAoaWYgdGhlcmUncyBubyBicmVhayBwb2ludHMpXG4gICAgLy8gIC4uLmFuZCB3aGVuIHRhcmdldFdpZHRoIGFuZCBtYXhXaWR0aCBhcmUgY2xvc2UsIHN0cmljdGx5IGVuZm9yY2luZyBtYXhXaWR0aCBjYW4gZ2l2ZVxuICAgIC8vICAgICBtb3JlIGxvcHNpZGVkIHJlc3VsdHMuXG5cbiAgICBsZXQgYmVzdFByaW9yQnJlYWs6ID9CcmVhayA9IG51bGw7XG4gICAgbGV0IGJlc3RCcmVha0JhZG5lc3MgPSBjYWxjdWxhdGVCYWRuZXNzKGJyZWFrWCwgdGFyZ2V0V2lkdGgsIHBlbmFsdHksIGlzTGFzdEJyZWFrKTtcblxuICAgIGZvciAoY29uc3QgcG90ZW50aWFsQnJlYWsgb2YgcG90ZW50aWFsQnJlYWtzKSB7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGJyZWFrWCAtIHBvdGVudGlhbEJyZWFrLng7XG4gICAgICAgIGNvbnN0IGJyZWFrQmFkbmVzcyA9XG4gICAgICAgICAgICBjYWxjdWxhdGVCYWRuZXNzKGxpbmVXaWR0aCwgdGFyZ2V0V2lkdGgsIHBlbmFsdHksIGlzTGFzdEJyZWFrKSArIHBvdGVudGlhbEJyZWFrLmJhZG5lc3M7XG4gICAgICAgIGlmIChicmVha0JhZG5lc3MgPD0gYmVzdEJyZWFrQmFkbmVzcykge1xuICAgICAgICAgICAgYmVzdFByaW9yQnJlYWsgPSBwb3RlbnRpYWxCcmVhaztcbiAgICAgICAgICAgIGJlc3RCcmVha0JhZG5lc3MgPSBicmVha0JhZG5lc3M7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogYnJlYWtJbmRleCxcbiAgICAgICAgeDogYnJlYWtYLFxuICAgICAgICBwcmlvckJyZWFrOiBiZXN0UHJpb3JCcmVhayxcbiAgICAgICAgYmFkbmVzczogYmVzdEJyZWFrQmFkbmVzc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGxlYXN0QmFkQnJlYWtzKGxhc3RMaW5lQnJlYWs6ID9CcmVhayk6IEFycmF5PG51bWJlcj4ge1xuICAgIGlmICghbGFzdExpbmVCcmVhaykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBsZWFzdEJhZEJyZWFrcyhsYXN0TGluZUJyZWFrLnByaW9yQnJlYWspLmNvbmNhdChsYXN0TGluZUJyZWFrLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQ6IFRhZ2dlZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xQbGFjZW1lbnQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemU6IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgIGlmIChzeW1ib2xQbGFjZW1lbnQgIT09ICdwb2ludCcpXG4gICAgICAgIHJldHVybiBbXTtcblxuICAgIGlmICghbG9naWNhbElucHV0KVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICBjb25zdCBwb3RlbnRpYWxMaW5lQnJlYWtzID0gW107XG4gICAgY29uc3QgdGFyZ2V0V2lkdGggPSBkZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBoTWFwLCBpbWFnZVBvc2l0aW9ucywgbGF5b3V0VGV4dFNpemUpO1xuXG4gICAgY29uc3QgaGFzU2VydmVyU3VnZ2VzdGVkQnJlYWtwb2ludHMgPSBsb2dpY2FsSW5wdXQudGV4dC5pbmRleE9mKFwiXFx1MjAwYlwiKSA+PSAwO1xuXG4gICAgbGV0IGN1cnJlbnRYID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9naWNhbElucHV0Lmxlbmd0aCgpOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGxvZ2ljYWxJbnB1dC5nZXRTZWN0aW9uKGkpO1xuICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBsb2dpY2FsSW5wdXQuZ2V0Q2hhckNvZGUoaSk7XG4gICAgICAgIGlmICghd2hpdGVzcGFjZVtjb2RlUG9pbnRdKSBjdXJyZW50WCArPSBnZXRHbHlwaEFkdmFuY2UoY29kZVBvaW50LCBzZWN0aW9uLCBnbHlwaE1hcCwgaW1hZ2VQb3NpdGlvbnMsIHNwYWNpbmcsIGxheW91dFRleHRTaXplKTtcblxuICAgICAgICAvLyBJZGVvZ3JhcGhpYyBjaGFyYWN0ZXJzLCBzcGFjZXMsIGFuZCB3b3JkLWJyZWFraW5nIHB1bmN0dWF0aW9uIHRoYXQgb2Z0ZW4gYXBwZWFyIHdpdGhvdXRcbiAgICAgICAgLy8gc3Vycm91bmRpbmcgc3BhY2VzLlxuICAgICAgICBpZiAoKGkgPCBsb2dpY2FsSW5wdXQubGVuZ3RoKCkgLSAxKSkge1xuICAgICAgICAgICAgY29uc3QgaWRlb2dyYXBoaWNCcmVhayA9IGNoYXJBbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nKGNvZGVQb2ludCk7XG4gICAgICAgICAgICBpZiAoYnJlYWthYmxlW2NvZGVQb2ludF0gfHwgaWRlb2dyYXBoaWNCcmVhayB8fCBzZWN0aW9uLmltYWdlTmFtZSkge1xuXG4gICAgICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZUJyZWFrKFxuICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50WCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBlbmFsdHkoY29kZVBvaW50LCBsb2dpY2FsSW5wdXQuZ2V0Q2hhckNvZGUoaSArIDEpLCBpZGVvZ3JhcGhpY0JyZWFrICYmIGhhc1NlcnZlclN1Z2dlc3RlZEJyZWFrcG9pbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGVhc3RCYWRCcmVha3MoXG4gICAgICAgIGV2YWx1YXRlQnJlYWsoXG4gICAgICAgICAgICBsb2dpY2FsSW5wdXQubGVuZ3RoKCksXG4gICAgICAgICAgICBjdXJyZW50WCxcbiAgICAgICAgICAgIHRhcmdldFdpZHRoLFxuICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0cnVlKSk7XG59XG5cbmZ1bmN0aW9uIGdldEFuY2hvckFsaWdubWVudChhbmNob3I6IFN5bWJvbEFuY2hvcikge1xuICAgIGxldCBob3Jpem9udGFsQWxpZ24gPSAwLjUsIHZlcnRpY2FsQWxpZ24gPSAwLjU7XG5cbiAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIGhvcml6b250YWxBbGlnbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIGhvcml6b250YWxBbGlnbiA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgdmVydGljYWxBbGlnbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4ge2hvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbn07XG59XG5cbmZ1bmN0aW9uIHNoYXBlTGluZXMoc2hhcGluZzogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXA6IHtbXzogc3RyaW5nXToge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaH19LFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uczoge1tfOiBzdHJpbmddOiB7W186IG51bWJlcl06IEdseXBoUG9zaXRpb259fSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzOiBBcnJheTxUYWdnZWRTdHJpbmc+LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbmNob3I6IFN5bWJvbEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZnk6IFRleHRKdXN0aWZ5LFxuICAgICAgICAgICAgICAgICAgICB3cml0aW5nTW9kZTogMSB8IDIsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemVUaGlzWm9vbTogbnVtYmVyKSB7XG5cbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSBTSEFQSU5HX0RFRkFVTFRfT0ZGU0VUO1xuXG4gICAgbGV0IG1heExpbmVMZW5ndGggPSAwO1xuICAgIGxldCBtYXhMaW5lSGVpZ2h0ID0gMDtcblxuICAgIGNvbnN0IGp1c3RpZnkgPVxuICAgICAgICB0ZXh0SnVzdGlmeSA9PT0gJ3JpZ2h0JyA/IDEgOlxuICAgICAgICB0ZXh0SnVzdGlmeSA9PT0gJ2xlZnQnID8gMCA6IDAuNTtcblxuICAgIGxldCBsaW5lSW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBsaW5lLnRyaW0oKTtcblxuICAgICAgICBjb25zdCBsaW5lTWF4U2NhbGUgPSBsaW5lLmdldE1heFNjYWxlKCk7XG4gICAgICAgIGNvbnN0IG1heExpbmVPZmZzZXQgPSAobGluZU1heFNjYWxlIC0gMSkgKiBPTkVfRU07XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uZWRMaW5lID0ge3Bvc2l0aW9uZWRHbHlwaHM6IFtdLCBsaW5lT2Zmc2V0OiAwfTtcbiAgICAgICAgc2hhcGluZy5wb3NpdGlvbmVkTGluZXNbbGluZUluZGV4XSA9IHBvc2l0aW9uZWRMaW5lO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gcG9zaXRpb25lZExpbmUucG9zaXRpb25lZEdseXBocztcbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSAwLjA7XG5cbiAgICAgICAgaWYgKCFsaW5lLmxlbmd0aCgpKSB7XG4gICAgICAgICAgICB5ICs9IGxpbmVIZWlnaHQ7IC8vIFN0aWxsIG5lZWQgYSBsaW5lIGZlZWQgYWZ0ZXIgZW1wdHkgbGluZVxuICAgICAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGgoKTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gbGluZS5nZXRTZWN0aW9uKGkpO1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkluZGV4ID0gbGluZS5nZXRTZWN0aW9uSW5kZXgoaSk7XG4gICAgICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBsaW5lLmdldENoYXJDb2RlKGkpO1xuICAgICAgICAgICAgbGV0IGJhc2VsaW5lT2Zmc2V0ID0gMC4wO1xuICAgICAgICAgICAgbGV0IG1ldHJpY3MgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHJlY3QgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGltYWdlTmFtZSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdmVydGljYWxBZHZhbmNlID0gT05FX0VNO1xuICAgICAgICAgICAgY29uc3QgdmVydGljYWwgPSAhKHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsIHx8XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgdmVydGljYWxpemUgZ2x5cGhzIHRoYXQgaGF2ZSBubyB1cHJpZ2h0IG9yaWVudGF0aW9uIGlmIHZlcnRpY2FsIHBsYWNlbWVudCBpcyBkaXNhYmxlZC5cbiAgICAgICAgICAgICAgICAoIWFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgIWNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjb2RlUG9pbnQpKSB8fFxuICAgICAgICAgICAgICAgIC8vIElmIHZlcnRpY2FsIHBsYWNlbWVudCBpcyBlbmFibGVkLCBkb24ndCB2ZXJ0aWNhbGl6ZSBnbHlwaHMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBmcm9tIGNvbXBsZXggdGV4dCBsYXlvdXQgc2NyaXB0LCBvciB3aGl0ZXNwYWNlcy5cbiAgICAgICAgICAgICAgICAoYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAod2hpdGVzcGFjZVtjb2RlUG9pbnRdIHx8IGNoYXJJbkNvbXBsZXhTaGFwaW5nU2NyaXB0KGNvZGVQb2ludCkpKSk7XG5cbiAgICAgICAgICAgIGlmICghc2VjdGlvbi5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBnbHlwaFBvc2l0aW9uc1tzZWN0aW9uLmZvbnRTdGFja107XG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhQb3NpdGlvbiA9IHBvc2l0aW9ucyAmJiBwb3NpdGlvbnNbY29kZVBvaW50XTtcbiAgICAgICAgICAgICAgICBpZiAoZ2x5cGhQb3NpdGlvbiAmJiBnbHlwaFBvc2l0aW9uLnJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjdCA9IGdseXBoUG9zaXRpb24ucmVjdDtcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljcyA9IGdseXBoUG9zaXRpb24ubWV0cmljcztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHlwaHMgPSBnbHlwaE1hcFtzZWN0aW9uLmZvbnRTdGFja107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gZ2x5cGhzICYmIGdseXBoc1tjb2RlUG9pbnRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljcyA9IGdseXBoLm1ldHJpY3M7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYmFzZWxpbmUsIGJ1dCBzaW5jZSB3ZSdyZSBsYXlpbmcgb3V0XG4gICAgICAgICAgICAgICAgLy8gYXQgMjQgcG9pbnRzLCB3ZSBjYW4gY2FsY3VsYXRlIGhvdyBtdWNoIGl0IHdpbGwgbW92ZSB3aGVuXG4gICAgICAgICAgICAgICAgLy8gd2Ugc2NhbGUgdXAgb3IgZG93bi5cbiAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldCA9IChsaW5lTWF4U2NhbGUgLSBzZWN0aW9uLnNjYWxlKSAqIE9ORV9FTTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VQb3NpdGlvbiA9IGltYWdlUG9zaXRpb25zW3NlY3Rpb24uaW1hZ2VOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIWltYWdlUG9zaXRpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGltYWdlTmFtZSA9IHNlY3Rpb24uaW1hZ2VOYW1lO1xuICAgICAgICAgICAgICAgIHNoYXBpbmcuaWNvbnNJblRleHQgPSBzaGFwaW5nLmljb25zSW5UZXh0IHx8IHRydWU7XG4gICAgICAgICAgICAgICAgcmVjdCA9IGltYWdlUG9zaXRpb24ucGFkZGVkUmVjdDtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gaW1hZ2VQb3NpdGlvbi5kaXNwbGF5U2l6ZTtcbiAgICAgICAgICAgICAgICAvLyBJZiBuZWVkZWQsIGFsbG93IHRvIHNldCBzY2FsZSBmYWN0b3IgZm9yIGFuIGltYWdlIHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gYWxpYXMgXCJpbWFnZS1zY2FsZVwiIHRoYXQgY291bGQgYmUgYWxpYXMgZm9yIFwiZm9udC1zY2FsZVwiXG4gICAgICAgICAgICAgICAgLy8gd2hlbiBGb3JtYXR0ZWRTZWN0aW9uIGlzIGFuIGltYWdlIHNlY3Rpb24uXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5zY2FsZSA9IHNlY3Rpb24uc2NhbGUgKiBPTkVfRU0gLyBsYXlvdXRUZXh0U2l6ZVRoaXNab29tO1xuXG4gICAgICAgICAgICAgICAgbWV0cmljcyA9IHt3aWR0aDogc2l6ZVswXSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzaXplWzFdLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBJTUFHRV9QQURESU5HLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IC1HTFlQSF9QQkZfQk9SREVSLFxuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlOiB2ZXJ0aWNhbCA/IHNpemVbMV0gOiBzaXplWzBdfTtcblxuICAgICAgICAgICAgICAgIC8vIERpZmZlcmVuY2UgYmV0d2VlbiBvbmUgRU0gYW5kIGFuIGltYWdlIHNpemUuXG4gICAgICAgICAgICAgICAgLy8gQWxpZ25zIGJvdHRvbSBvZiBhbiBpbWFnZSB0byBhIGJhc2VsaW5lIGxldmVsLlxuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlT2Zmc2V0ID0gT05FX0VNIC0gc2l6ZVsxXSAqIHNlY3Rpb24uc2NhbGU7XG4gICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZzZXQgPSBtYXhMaW5lT2Zmc2V0ICsgaW1hZ2VPZmZzZXQ7XG4gICAgICAgICAgICAgICAgdmVydGljYWxBZHZhbmNlID0gbWV0cmljcy5hZHZhbmNlO1xuXG4gICAgICAgICAgICAgICAgLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIGhlaWdodCBvZiBhbiBpbWFnZSBhbmQgb25lIEVNIGF0IG1heCBsaW5lIHNjYWxlLlxuICAgICAgICAgICAgICAgIC8vIFB1c2hlcyBjdXJyZW50IGxpbmUgZG93biBpZiBhbiBpbWFnZSBzaXplIGlzIG92ZXIgMSBFTSBhdCBtYXggbGluZSBzY2FsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB2ZXJ0aWNhbCA/IHNpemVbMF0gKiBzZWN0aW9uLnNjYWxlIC0gT05FX0VNICogbGluZU1heFNjYWxlIDpcbiAgICAgICAgICAgICAgICAgICAgc2l6ZVsxXSAqIHNlY3Rpb24uc2NhbGUgLSBPTkVfRU0gKiBsaW5lTWF4U2NhbGU7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IDAgJiYgb2Zmc2V0ID4gbGluZU9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF2ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHMucHVzaCh7Z2x5cGg6IGNvZGVQb2ludCwgaW1hZ2VOYW1lLCB4LCB5OiB5ICsgYmFzZWxpbmVPZmZzZXQsIHZlcnRpY2FsLCBzY2FsZTogc2VjdGlvbi5zY2FsZSwgZm9udFN0YWNrOiBzZWN0aW9uLmZvbnRTdGFjaywgc2VjdGlvbkluZGV4LCBtZXRyaWNzLCByZWN0fSk7XG4gICAgICAgICAgICAgICAgeCArPSBtZXRyaWNzLmFkdmFuY2UgKiBzZWN0aW9uLnNjYWxlICsgc3BhY2luZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2hhcGluZy52ZXJ0aWNhbGl6YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBocy5wdXNoKHtnbHlwaDogY29kZVBvaW50LCBpbWFnZU5hbWUsIHgsIHk6IHkgKyBiYXNlbGluZU9mZnNldCwgdmVydGljYWwsIHNjYWxlOiBzZWN0aW9uLnNjYWxlLCBmb250U3RhY2s6IHNlY3Rpb24uZm9udFN0YWNrLCBzZWN0aW9uSW5kZXgsIG1ldHJpY3MsIHJlY3R9KTtcbiAgICAgICAgICAgICAgICB4ICs9IHZlcnRpY2FsQWR2YW5jZSAqIHNlY3Rpb24uc2NhbGUgKyBzcGFjaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBqdXN0aWZ5IGlmIHdlIHBsYWNlZCBhdCBsZWFzdCBvbmUgZ2x5cGhcbiAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0geCAtIHNwYWNpbmc7XG4gICAgICAgICAgICBtYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgobGluZUxlbmd0aCwgbWF4TGluZUxlbmd0aCk7XG4gICAgICAgICAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCAwLCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCAtIDEsIGp1c3RpZnksIGxpbmVPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgeCA9IDA7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaW5lSGVpZ2h0ID0gbGluZUhlaWdodCAqIGxpbmVNYXhTY2FsZSArIGxpbmVPZmZzZXQ7XG4gICAgICAgIHBvc2l0aW9uZWRMaW5lLmxpbmVPZmZzZXQgPSBNYXRoLm1heChsaW5lT2Zmc2V0LCBtYXhMaW5lT2Zmc2V0KTtcbiAgICAgICAgeSArPSBjdXJyZW50TGluZUhlaWdodDtcbiAgICAgICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KGN1cnJlbnRMaW5lSGVpZ2h0LCBtYXhMaW5lSGVpZ2h0KTtcbiAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBib3VuZGluZyBib3ggYW5kIGp1c3RpZnkgLyBhbGlnbiB0ZXh0IGJsb2NrLlxuICAgIGNvbnN0IGhlaWdodCA9IHkgLSBTSEFQSU5HX0RFRkFVTFRfT0ZGU0VUO1xuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KHRleHRBbmNob3IpO1xuICAgIGFsaWduKHNoYXBpbmcucG9zaXRpb25lZExpbmVzLCBqdXN0aWZ5LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIG1heExpbmVMZW5ndGgsIG1heExpbmVIZWlnaHQsIGxpbmVIZWlnaHQsIGhlaWdodCwgbGluZXMubGVuZ3RoKTtcblxuICAgIHNoYXBpbmcudG9wICs9IC12ZXJ0aWNhbEFsaWduICogaGVpZ2h0O1xuICAgIHNoYXBpbmcuYm90dG9tID0gc2hhcGluZy50b3AgKyBoZWlnaHQ7XG4gICAgc2hhcGluZy5sZWZ0ICs9IC1ob3Jpem9udGFsQWxpZ24gKiBtYXhMaW5lTGVuZ3RoO1xuICAgIHNoYXBpbmcucmlnaHQgPSBzaGFwaW5nLmxlZnQgKyBtYXhMaW5lTGVuZ3RoO1xufVxuXG4vLyBqdXN0aWZ5IHJpZ2h0ID0gMSwgbGVmdCA9IDAsIGNlbnRlciA9IDAuNVxuZnVuY3Rpb24ganVzdGlmeUxpbmUocG9zaXRpb25lZEdseXBoczogQXJyYXk8UG9zaXRpb25lZEdseXBoPixcbiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnk6IDEgfCAwIHwgMC41LFxuICAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldDogbnVtYmVyKSB7XG4gICAgaWYgKCFqdXN0aWZ5ICYmICFsaW5lT2Zmc2V0KVxuICAgICAgICByZXR1cm47XG5cbiAgICBjb25zdCBsYXN0UG9zaXRpb25lZEdseXBoID0gcG9zaXRpb25lZEdseXBoc1tlbmRdO1xuICAgIGNvbnN0IGxhc3RBZHZhbmNlID0gbGFzdFBvc2l0aW9uZWRHbHlwaC5tZXRyaWNzLmFkdmFuY2UgKiBsYXN0UG9zaXRpb25lZEdseXBoLnNjYWxlO1xuICAgIGNvbnN0IGxpbmVJbmRlbnQgPSAocG9zaXRpb25lZEdseXBoc1tlbmRdLnggKyBsYXN0QWR2YW5jZSkgKiBqdXN0aWZ5O1xuXG4gICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IGVuZDsgaisrKSB7XG4gICAgICAgIHBvc2l0aW9uZWRHbHlwaHNbal0ueCAtPSBsaW5lSW5kZW50O1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnkgKz0gbGluZU9mZnNldDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFsaWduKHBvc2l0aW9uZWRMaW5lczogQXJyYXk8UG9zaXRpb25lZExpbmU+LFxuICAgICAgICAgICAgICAganVzdGlmeTogbnVtYmVyLFxuICAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiBudW1iZXIsXG4gICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBudW1iZXIsXG4gICAgICAgICAgICAgICBtYXhMaW5lTGVuZ3RoOiBudW1iZXIsXG4gICAgICAgICAgICAgICBtYXhMaW5lSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICBibG9ja0hlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgbGluZUNvdW50OiBudW1iZXIpIHtcbiAgICBjb25zdCBzaGlmdFggPSAoanVzdGlmeSAtIGhvcml6b250YWxBbGlnbikgKiBtYXhMaW5lTGVuZ3RoO1xuICAgIGxldCBzaGlmdFkgPSAwO1xuXG4gICAgaWYgKG1heExpbmVIZWlnaHQgIT09IGxpbmVIZWlnaHQpIHtcbiAgICAgICAgc2hpZnRZID0gLWJsb2NrSGVpZ2h0ICogdmVydGljYWxBbGlnbiAtIFNIQVBJTkdfREVGQVVMVF9PRkZTRVQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2hpZnRZID0gKC12ZXJ0aWNhbEFsaWduICogbGluZUNvdW50ICsgMC41KSAqIGxpbmVIZWlnaHQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHBvc2l0aW9uZWRMaW5lcykge1xuICAgICAgICBmb3IgKGNvbnN0IHBvc2l0aW9uZWRHbHlwaCBvZiBsaW5lLnBvc2l0aW9uZWRHbHlwaHMpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaC54ICs9IHNoaWZ0WDtcbiAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaC55ICs9IHNoaWZ0WTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUG9zaXRpb25lZEljb24gPSB7XG4gICAgaW1hZ2U6IEltYWdlUG9zaXRpb24sXG4gICAgdG9wOiBudW1iZXIsXG4gICAgYm90dG9tOiBudW1iZXIsXG4gICAgbGVmdDogbnVtYmVyLFxuICAgIHJpZ2h0OiBudW1iZXIsXG4gICAgY29sbGlzaW9uUGFkZGluZz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG59O1xuXG5mdW5jdGlvbiBzaGFwZUljb24oaW1hZ2U6IEltYWdlUG9zaXRpb24sIGljb25PZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sIGljb25BbmNob3I6IFN5bWJvbEFuY2hvcik6IFBvc2l0aW9uZWRJY29uIHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChpY29uQW5jaG9yKTtcbiAgICBjb25zdCBkeCA9IGljb25PZmZzZXRbMF07XG4gICAgY29uc3QgZHkgPSBpY29uT2Zmc2V0WzFdO1xuICAgIGNvbnN0IHgxID0gZHggLSBpbWFnZS5kaXNwbGF5U2l6ZVswXSAqIGhvcml6b250YWxBbGlnbjtcbiAgICBjb25zdCB4MiA9IHgxICsgaW1hZ2UuZGlzcGxheVNpemVbMF07XG4gICAgY29uc3QgeTEgPSBkeSAtIGltYWdlLmRpc3BsYXlTaXplWzFdICogdmVydGljYWxBbGlnbjtcbiAgICBjb25zdCB5MiA9IHkxICsgaW1hZ2UuZGlzcGxheVNpemVbMV07XG4gICAgcmV0dXJuIHtpbWFnZSwgdG9wOiB5MSwgYm90dG9tOiB5MiwgbGVmdDogeDEsIHJpZ2h0OiB4Mn07XG59XG5cbmZ1bmN0aW9uIGZpdEljb25Ub1RleHQoc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24sIHNoYXBlZFRleHQ6IFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgIHRleHRGaXQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogWyBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgaWNvbk9mZnNldDogWyBudW1iZXIsIG51bWJlciBdLCBmb250U2NhbGU6IG51bWJlcik6IFBvc2l0aW9uZWRJY29uIHtcbiAgICBhc3NlcnQodGV4dEZpdCAhPT0gJ25vbmUnKTtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShwYWRkaW5nKSAmJiBwYWRkaW5nLmxlbmd0aCA9PT0gNCk7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoaWNvbk9mZnNldCkgJiYgaWNvbk9mZnNldC5sZW5ndGggPT09IDIpO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBzaGFwZWRJY29uLmltYWdlO1xuXG4gICAgbGV0IGNvbGxpc2lvblBhZGRpbmc7XG4gICAgaWYgKGltYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGltYWdlLmNvbnRlbnQ7XG4gICAgICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBpbWFnZS5waXhlbFJhdGlvIHx8IDE7XG4gICAgICAgIGNvbGxpc2lvblBhZGRpbmcgPSBbXG4gICAgICAgICAgICBjb250ZW50WzBdIC8gcGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIGNvbnRlbnRbMV0gLyBwaXhlbFJhdGlvLFxuICAgICAgICAgICAgaW1hZ2UuZGlzcGxheVNpemVbMF0gLSBjb250ZW50WzJdIC8gcGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIGltYWdlLmRpc3BsYXlTaXplWzFdIC0gY29udGVudFszXSAvIHBpeGVsUmF0aW9cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBXZSBkb24ndCByZXNwZWN0IHRoZSBpY29uLWFuY2hvciwgYmVjYXVzZSBpY29uLXRleHQtZml0IGlzIHNldC4gSW5zdGVhZCxcbiAgICAvLyB0aGUgaWNvbiB3aWxsIGJlIGNlbnRlcmVkIG9uIHRoZSB0ZXh0LCB0aGVuIHN0cmV0Y2hlZCBpbiB0aGUgZ2l2ZW5cbiAgICAvLyBkaW1lbnNpb25zLlxuXG4gICAgY29uc3QgdGV4dExlZnQgPSBzaGFwZWRUZXh0LmxlZnQgKiBmb250U2NhbGU7XG4gICAgY29uc3QgdGV4dFJpZ2h0ID0gc2hhcGVkVGV4dC5yaWdodCAqIGZvbnRTY2FsZTtcblxuICAgIGxldCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQ7XG4gICAgaWYgKHRleHRGaXQgPT09ICd3aWR0aCcgfHwgdGV4dEZpdCA9PT0gJ2JvdGgnKSB7XG4gICAgICAgIC8vIFN0cmV0Y2hlZCBob3Jpem9udGFsbHkgdG8gdGhlIHRleHQgd2lkdGhcbiAgICAgICAgbGVmdCA9IGljb25PZmZzZXRbMF0gKyB0ZXh0TGVmdCAtIHBhZGRpbmdbM107XG4gICAgICAgIHJpZ2h0ID0gaWNvbk9mZnNldFswXSArIHRleHRSaWdodCArIHBhZGRpbmdbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2VudGVyZWQgb24gdGhlIHRleHRcbiAgICAgICAgbGVmdCA9IGljb25PZmZzZXRbMF0gKyAodGV4dExlZnQgKyB0ZXh0UmlnaHQgLSBpbWFnZS5kaXNwbGF5U2l6ZVswXSkgLyAyO1xuICAgICAgICByaWdodCA9IGxlZnQgKyBpbWFnZS5kaXNwbGF5U2l6ZVswXTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0VG9wID0gc2hhcGVkVGV4dC50b3AgKiBmb250U2NhbGU7XG4gICAgY29uc3QgdGV4dEJvdHRvbSA9IHNoYXBlZFRleHQuYm90dG9tICogZm9udFNjYWxlO1xuICAgIGlmICh0ZXh0Rml0ID09PSAnaGVpZ2h0JyB8fCB0ZXh0Rml0ID09PSAnYm90aCcpIHtcbiAgICAgICAgLy8gU3RyZXRjaGVkIHZlcnRpY2FsbHkgdG8gdGhlIHRleHQgaGVpZ2h0XG4gICAgICAgIHRvcCA9IGljb25PZmZzZXRbMV0gKyB0ZXh0VG9wIC0gcGFkZGluZ1swXTtcbiAgICAgICAgYm90dG9tID0gaWNvbk9mZnNldFsxXSArIHRleHRCb3R0b20gKyBwYWRkaW5nWzJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENlbnRlcmVkIG9uIHRoZSB0ZXh0XG4gICAgICAgIHRvcCA9IGljb25PZmZzZXRbMV0gKyAodGV4dFRvcCArIHRleHRCb3R0b20gLSBpbWFnZS5kaXNwbGF5U2l6ZVsxXSkgLyAyO1xuICAgICAgICBib3R0b20gPSB0b3AgKyBpbWFnZS5kaXNwbGF5U2l6ZVsxXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2ltYWdlLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIGNvbGxpc2lvblBhZGRpbmd9O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xuXG5jbGFzcyBBbmNob3IgZXh0ZW5kcyBQb2ludCB7XG4gICAgYW5nbGU6IGFueTtcbiAgICBzZWdtZW50OiBudW1iZXIgfCB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoeDogbnVtYmVyLCB5OiBudW1iZXIsIGFuZ2xlOiBudW1iZXIsIHNlZ21lbnQ/OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoeCwgeSk7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcbiAgICAgICAgaWYgKHNlZ21lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50ID0gc2VnbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFuY2hvcih0aGlzLngsIHRoaXMueSwgdGhpcy5hbmdsZSwgdGhpcy5zZWdtZW50KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdBbmNob3InLCBBbmNob3IpO1xuXG5leHBvcnQgZGVmYXVsdCBBbmNob3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUnO1xuaW1wb3J0IHtjbGFtcH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5pbXBvcnQgdHlwZSB7UHJvcGVydHlWYWx1ZSwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtJbnRlcnBvbGF0aW9uVHlwZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2ludGVycG9sYXRlJztcblxuY29uc3QgU0laRV9QQUNLX0ZBQ1RPUiA9IDEyODtcblxuZXhwb3J0IHtnZXRTaXplRGF0YSwgZXZhbHVhdGVTaXplRm9yRmVhdHVyZSwgZXZhbHVhdGVTaXplRm9yWm9vbSwgU0laRV9QQUNLX0ZBQ1RPUn07XG5cbmV4cG9ydCB0eXBlIFNpemVEYXRhID0ge1xuICAgIGtpbmQ6ICdjb25zdGFudCcsXG4gICAgbGF5b3V0U2l6ZTogbnVtYmVyXG59IHwge1xuICAgIGtpbmQ6ICdzb3VyY2UnXG59IHwge1xuICAgIGtpbmQ6ICdjYW1lcmEnLFxuICAgIG1pblpvb206IG51bWJlcixcbiAgICBtYXhab29tOiBudW1iZXIsXG4gICAgbWluU2l6ZTogbnVtYmVyLFxuICAgIG1heFNpemU6IG51bWJlcixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59IHwge1xuICAgIGtpbmQ6ICdjb21wb3NpdGUnLFxuICAgIG1pblpvb206IG51bWJlcixcbiAgICBtYXhab29tOiBudW1iZXIsXG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZVxufTtcblxuLy8gRm9yIHt0ZXh0LGljb259LXNpemUsIGdldCB0aGUgYnVja2V0LWxldmVsIGRhdGEgdGhhdCB3aWxsIGJlIG5lZWRlZCBieVxuLy8gdGhlIHBhaW50ZXIgdG8gc2V0IHN5bWJvbC1zaXplLXJlbGF0ZWQgdW5pZm9ybXNcbmZ1bmN0aW9uIGdldFNpemVEYXRhKHRpbGVab29tOiBudW1iZXIsIHZhbHVlOiBQcm9wZXJ0eVZhbHVlPG51bWJlciwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4+KTogU2l6ZURhdGEge1xuICAgIGNvbnN0IHtleHByZXNzaW9ufSA9IHZhbHVlO1xuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICBjb25zdCBsYXlvdXRTaXplID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGlsZVpvb20gKyAxKSk7XG4gICAgICAgIHJldHVybiB7a2luZDogJ2NvbnN0YW50JywgbGF5b3V0U2l6ZX07XG5cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuIHtraW5kOiAnc291cmNlJ307XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7em9vbVN0b3BzLCBpbnRlcnBvbGF0aW9uVHlwZX0gPSBleHByZXNzaW9uO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBjb3ZlcmluZyB6b29tIHN0b3BzIGZvciB6b29tLWRlcGVuZGVudCB2YWx1ZXNcbiAgICAgICAgbGV0IGxvd2VyID0gMDtcbiAgICAgICAgd2hpbGUgKGxvd2VyIDwgem9vbVN0b3BzLmxlbmd0aCAmJiB6b29tU3RvcHNbbG93ZXJdIDw9IHRpbGVab29tKSBsb3dlcisrO1xuICAgICAgICBsb3dlciA9IE1hdGgubWF4KDAsIGxvd2VyIC0gMSk7XG4gICAgICAgIGxldCB1cHBlciA9IGxvd2VyO1xuICAgICAgICB3aGlsZSAodXBwZXIgPCB6b29tU3RvcHMubGVuZ3RoICYmIHpvb21TdG9wc1t1cHBlcl0gPCB0aWxlWm9vbSArIDEpIHVwcGVyKys7XG4gICAgICAgIHVwcGVyID0gTWF0aC5taW4oem9vbVN0b3BzLmxlbmd0aCAtIDEsIHVwcGVyKTtcblxuICAgICAgICBjb25zdCBtaW5ab29tID0gem9vbVN0b3BzW2xvd2VyXTtcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IHpvb21TdG9wc1t1cHBlcl07XG5cbiAgICAgICAgLy8gV2UnZCBsaWtlIHRvIGJlIGFibGUgdG8gdXNlIENhbWVyYUV4cHJlc3Npb24gb3IgQ29tcG9zaXRlRXhwcmVzc2lvbiBpbiB0aGVzZVxuICAgICAgICAvLyByZXR1cm4gdHlwZXMgcmF0aGVyIHRoYW4gRXhwcmVzc2lvblNwZWNpZmljYXRpb24sIGJ1dCB0aGUgZm9ybWVyIGFyZSBub3RcbiAgICAgICAgLy8gdHJhbnNmZXJyYWJsZSBhY3Jvc3MgV2ViIFdvcmtlciBib3VuZGFyaWVzLlxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHtraW5kOiAnY29tcG9zaXRlJywgbWluWm9vbSwgbWF4Wm9vbSwgaW50ZXJwb2xhdGlvblR5cGV9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9yIGNhbWVyYSBmdW5jdGlvbnMsIGFsc28gc2F2ZSBvZmYgdGhlIGZ1bmN0aW9uIHZhbHVlc1xuICAgICAgICAvLyBldmFsdWF0ZWQgYXQgdGhlIGNvdmVyaW5nIHpvb20gbGV2ZWxzXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtaW5ab29tKSk7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtYXhab29tKSk7XG5cbiAgICAgICAgcmV0dXJuIHtraW5kOiAnY2FtZXJhJywgbWluWm9vbSwgbWF4Wm9vbSwgbWluU2l6ZSwgbWF4U2l6ZSwgaW50ZXJwb2xhdGlvblR5cGV9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVTaXplRm9yRmVhdHVyZShzaXplRGF0YTogU2l6ZURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt1U2l6ZSwgdVNpemVUfTogeyB1U2l6ZTogbnVtYmVyLCB1U2l6ZVQ6IG51bWJlciB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bG93ZXJTaXplLCB1cHBlclNpemV9OiB7IGxvd2VyU2l6ZTogbnVtYmVyLCB1cHBlclNpemU6IG51bWJlcn0pIHtcbiAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyU2l6ZSAvIFNJWkVfUEFDS19GQUNUT1I7XG4gICAgfSBlbHNlIGlmIChzaXplRGF0YS5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobG93ZXJTaXplIC8gU0laRV9QQUNLX0ZBQ1RPUiwgdXBwZXJTaXplIC8gU0laRV9QQUNLX0ZBQ1RPUiwgdVNpemVUKTtcbiAgICB9XG4gICAgcmV0dXJuIHVTaXplO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhOiBTaXplRGF0YSwgem9vbTogbnVtYmVyKSB7XG4gICAgbGV0IHVTaXplVCA9IDA7XG4gICAgbGV0IHVTaXplID0gMDtcblxuICAgIGlmIChzaXplRGF0YS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgIHVTaXplID0gc2l6ZURhdGEubGF5b3V0U2l6ZTtcblxuICAgIH0gZWxzZSBpZiAoc2l6ZURhdGEua2luZCAhPT0gJ3NvdXJjZScpIHtcbiAgICAgICAgY29uc3Qge2ludGVycG9sYXRpb25UeXBlLCBtaW5ab29tLCBtYXhab29tfSA9IHNpemVEYXRhO1xuXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNvdWxkIGdldCB0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIGNhbWVyYSBmdW5jdGlvblxuICAgICAgICAvLyBhdCB6ID0gdHIuem9vbSwgd2UgaW50ZW50aW9uYWxseSBkbyBub3Q6IGluc3RlYWQsIHdlIGludGVycG9sYXRlXG4gICAgICAgIC8vIGJldHdlZW4gdGhlIGNhbWVyYSBmdW5jdGlvbiB2YWx1ZXMgYXQgYSBwYWlyIG9mIHpvb20gc3RvcHMgY292ZXJpbmdcbiAgICAgICAgLy8gW3RpbGVab29tLCB0aWxlWm9vbSArIDFdIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICAgIC8vIHJlc3RyaWN0aW9uIG9uIGNvbXBvc2l0ZSBmdW5jdGlvbnNcbiAgICAgICAgY29uc3QgdCA9ICFpbnRlcnBvbGF0aW9uVHlwZSA/IDAgOiBjbGFtcChcbiAgICAgICAgICAgIEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IoaW50ZXJwb2xhdGlvblR5cGUsIHpvb20sIG1pblpvb20sIG1heFpvb20pLCAwLCAxKTtcblxuICAgICAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ2NhbWVyYScpIHtcbiAgICAgICAgICAgIHVTaXplID0gaW50ZXJwb2xhdGUoc2l6ZURhdGEubWluU2l6ZSwgc2l6ZURhdGEubWF4U2l6ZSwgdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1U2l6ZVQgPSB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt1U2l6ZVQsIHVTaXplfTtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGNoZWNrTWF4QW5nbGU7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgQW5jaG9yIGZyb20gJy4vYW5jaG9yJztcblxuLyoqXG4gKiBMYWJlbHMgcGxhY2VkIGFyb3VuZCByZWFsbHkgc2hhcnAgYW5nbGVzIGFyZW4ndCByZWFkYWJsZS4gQ2hlY2sgaWYgYW55XG4gKiBwYXJ0IG9mIHRoZSBwb3RlbnRpYWwgbGFiZWwgaGFzIGEgY29tYmluZWQgYW5nbGUgdGhhdCBpcyB0b28gYmlnLlxuICpcbiAqIEBwYXJhbSBsaW5lXG4gKiBAcGFyYW0gYW5jaG9yIFRoZSBwb2ludCBvbiB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICogQHBhcmFtIGxhYmVsTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGluIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHdpbmRvd1NpemUgVGhlIGNoZWNrIGZhaWxzIGlmIHRoZSBjb21iaW5lZCBhbmdsZXMgd2l0aGluIGEgcGFydCBvZiB0aGUgbGluZSB0aGF0IGlzIGB3aW5kb3dTaXplYCBsb25nIGlzIHRvbyBiaWcuXG4gKiBAcGFyYW0gbWF4QW5nbGUgVGhlIG1heGltdW0gY29tYmluZWQgYW5nbGUgdGhhdCBhbnkgd2luZG93IGFsb25nIHRoZSBsYWJlbCBpcyBhbGxvd2VkIHRvIGhhdmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTWF4QW5nbGUobGluZTogQXJyYXk8UG9pbnQ+LCBhbmNob3I6IEFuY2hvciwgbGFiZWxMZW5ndGg6IG51bWJlciwgd2luZG93U2l6ZTogbnVtYmVyLCBtYXhBbmdsZTogbnVtYmVyKSB7XG5cbiAgICAvLyBob3Jpem9udGFsIGxhYmVscyBhbHdheXMgcGFzc1xuICAgIGlmIChhbmNob3Iuc2VnbWVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcblxuICAgIGxldCBwID0gYW5jaG9yO1xuICAgIGxldCBpbmRleCA9IGFuY2hvci5zZWdtZW50ICsgMTtcbiAgICBsZXQgYW5jaG9yRGlzdGFuY2UgPSAwO1xuXG4gICAgLy8gbW92ZSBiYWNrd2FyZHMgYWxvbmcgdGhlIGxpbmUgdG8gdGhlIGZpcnN0IHNlZ21lbnQgdGhlIGxhYmVsIGFwcGVhcnMgb25cbiAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPiAtbGFiZWxMZW5ndGggLyAyKSB7XG4gICAgICAgIGluZGV4LS07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICBhbmNob3JEaXN0YW5jZSAtPSBsaW5lW2luZGV4XS5kaXN0KHApO1xuICAgICAgICBwID0gbGluZVtpbmRleF07XG4gICAgfVxuXG4gICAgYW5jaG9yRGlzdGFuY2UgKz0gbGluZVtpbmRleF0uZGlzdChsaW5lW2luZGV4ICsgMV0pO1xuICAgIGluZGV4Kys7XG5cbiAgICAvLyBzdG9yZSByZWNlbnQgY29ybmVycyBhbmQgdGhlaXIgdG90YWwgYW5nbGUgZGlmZmVyZW5jZVxuICAgIGNvbnN0IHJlY2VudENvcm5lcnMgPSBbXTtcbiAgICBsZXQgcmVjZW50QW5nbGVEZWx0YSA9IDA7XG5cbiAgICAvLyBtb3ZlIGZvcndhcmRzIGJ5IHRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGFuZCBjaGVjayBhbmdsZXMgYWxvbmcgdGhlIHdheVxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA8IGxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICBjb25zdCBwcmV2ID0gbGluZVtpbmRleCAtIDFdO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gbGluZVtpbmRleF07XG4gICAgICAgIGNvbnN0IG5leHQgPSBsaW5lW2luZGV4ICsgMV07XG5cbiAgICAgICAgLy8gdGhlcmUgaXNuJ3QgZW5vdWdoIHJvb20gZm9yIHRoZSBsYWJlbCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoIW5leHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgYW5nbGVEZWx0YSA9IHByZXYuYW5nbGVUbyhjdXJyZW50KSAtIGN1cnJlbnQuYW5nbGVUbyhuZXh0KTtcbiAgICAgICAgLy8gcmVzdHJpY3QgYW5nbGUgdG8gLXBpLi5waSByYW5nZVxuICAgICAgICBhbmdsZURlbHRhID0gTWF0aC5hYnMoKChhbmdsZURlbHRhICsgMyAqIE1hdGguUEkpICUgKE1hdGguUEkgKiAyKSkgLSBNYXRoLlBJKTtcblxuICAgICAgICByZWNlbnRDb3JuZXJzLnB1c2goe1xuICAgICAgICAgICAgZGlzdGFuY2U6IGFuY2hvckRpc3RhbmNlLFxuICAgICAgICAgICAgYW5nbGVEZWx0YVxuICAgICAgICB9KTtcbiAgICAgICAgcmVjZW50QW5nbGVEZWx0YSArPSBhbmdsZURlbHRhO1xuXG4gICAgICAgIC8vIHJlbW92ZSBjb3JuZXJzIHRoYXQgYXJlIGZhciBlbm91Z2ggYXdheSBmcm9tIHRoZSBsaXN0IG9mIHJlY2VudCBhbmNob3JzXG4gICAgICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSAtIHJlY2VudENvcm5lcnNbMF0uZGlzdGFuY2UgPiB3aW5kb3dTaXplKSB7XG4gICAgICAgICAgICByZWNlbnRBbmdsZURlbHRhIC09IHJlY2VudENvcm5lcnMuc2hpZnQoKS5hbmdsZURlbHRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIHN1bSBvZiBhbmdsZXMgd2l0aGluIHRoZSB3aW5kb3cgYXJlYSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUuIGNoZWNrIGZhaWxzLlxuICAgICAgICBpZiAocmVjZW50QW5nbGVEZWx0YSA+IG1heEFuZ2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgKz0gY3VycmVudC5kaXN0KG5leHQpO1xuICAgIH1cblxuICAgIC8vIG5vIHBhcnQgb2YgdGhlIGxpbmUgaGFkIGFuIGFuZ2xlIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkLiBjaGVjayBwYXNzZXMuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcblxuaW1wb3J0IEFuY2hvciBmcm9tICcuLi9zeW1ib2wvYW5jaG9yJztcbmltcG9ydCBjaGVja01heEFuZ2xlIGZyb20gJy4vY2hlY2tfbWF4X2FuZ2xlJztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7U2hhcGluZywgUG9zaXRpb25lZEljb259IGZyb20gJy4vc2hhcGluZyc7XG5cbmV4cG9ydCB7Z2V0QW5jaG9ycywgZ2V0Q2VudGVyQW5jaG9yfTtcblxuZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lOiBBcnJheTxQb2ludD4pOiBudW1iZXIge1xuICAgIGxldCBsaW5lTGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGxpbmUubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgIGxpbmVMZW5ndGggKz0gbGluZVtrXS5kaXN0KGxpbmVbayArIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVMZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGdldEFuZ2xlV2luZG93U2l6ZShzaGFwZWRUZXh0OiA/U2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3hTY2FsZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc2hhcGVkVGV4dCA/XG4gICAgICAgIDMgLyA1ICogZ2x5cGhTaXplICogYm94U2NhbGUgOlxuICAgICAgICAwO1xufVxuXG5mdW5jdGlvbiBnZXRTaGFwZWRMYWJlbExlbmd0aChzaGFwZWRUZXh0OiA/U2hhcGluZywgc2hhcGVkSWNvbjogP1Bvc2l0aW9uZWRJY29uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICAgIHNoYXBlZFRleHQgPyBzaGFwZWRUZXh0LnJpZ2h0IC0gc2hhcGVkVGV4dC5sZWZ0IDogMCxcbiAgICAgICAgc2hhcGVkSWNvbiA/IHNoYXBlZEljb24ucmlnaHQgLSBzaGFwZWRJY29uLmxlZnQgOiAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2VudGVyQW5jaG9yKGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBbmdsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHQ6ID9TaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246ID9Qb3NpdGlvbmVkSWNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBib3hTY2FsZTogbnVtYmVyKSB7XG4gICAgY29uc3QgYW5nbGVXaW5kb3dTaXplID0gZ2V0QW5nbGVXaW5kb3dTaXplKHNoYXBlZFRleHQsIGdseXBoU2l6ZSwgYm94U2NhbGUpO1xuICAgIGNvbnN0IGxhYmVsTGVuZ3RoID0gZ2V0U2hhcGVkTGFiZWxMZW5ndGgoc2hhcGVkVGV4dCwgc2hhcGVkSWNvbikgKiBib3hTY2FsZTtcblxuICAgIGxldCBwcmV2RGlzdGFuY2UgPSAwO1xuICAgIGNvbnN0IGNlbnRlckRpc3RhbmNlID0gZ2V0TGluZUxlbmd0aChsaW5lKSAvIDI7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgYSA9IGxpbmVbaV0sXG4gICAgICAgICAgICBiID0gbGluZVtpICsgMV07XG5cbiAgICAgICAgY29uc3Qgc2VnbWVudERpc3RhbmNlID0gYS5kaXN0KGIpO1xuXG4gICAgICAgIGlmIChwcmV2RGlzdGFuY2UgKyBzZWdtZW50RGlzdGFuY2UgPiBjZW50ZXJEaXN0YW5jZSkge1xuICAgICAgICAgICAgLy8gVGhlIGNlbnRlciBpcyBvbiB0aGlzIHNlZ21lbnRcbiAgICAgICAgICAgIGNvbnN0IHQgPSAoY2VudGVyRGlzdGFuY2UgLSBwcmV2RGlzdGFuY2UpIC8gc2VnbWVudERpc3RhbmNlLFxuICAgICAgICAgICAgICAgIHggPSBpbnRlcnBvbGF0ZShhLngsIGIueCwgdCksXG4gICAgICAgICAgICAgICAgeSA9IGludGVycG9sYXRlKGEueSwgYi55LCB0KTtcblxuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gbmV3IEFuY2hvcih4LCB5LCBiLmFuZ2xlVG8oYSksIGkpO1xuICAgICAgICAgICAgYW5jaG9yLl9yb3VuZCgpO1xuICAgICAgICAgICAgaWYgKCFhbmdsZVdpbmRvd1NpemUgfHwgY2hlY2tNYXhBbmdsZShsaW5lLCBhbmNob3IsIGxhYmVsTGVuZ3RoLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbmNob3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZEaXN0YW5jZSArPSBzZWdtZW50RGlzdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbmNob3JzKGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBtYXhBbmdsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0OiA/U2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogP1Bvc2l0aW9uZWRJY29uLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgdGlsZUV4dGVudDogbnVtYmVyKSB7XG5cbiAgICAvLyBSZXNhbXBsZSBhIGxpbmUgdG8gZ2V0IGFuY2hvciBwb2ludHMgZm9yIGxhYmVscyBhbmQgY2hlY2sgdGhhdCBlYWNoXG4gICAgLy8gcG90ZW50aWFsIGxhYmVsIHBhc3NlcyB0ZXh0LW1heC1hbmdsZSBjaGVjayBhbmQgaGFzIGVub3VnaCBmcm9vbSB0byBmaXRcbiAgICAvLyBvbiB0aGUgbGluZS5cblxuICAgIGNvbnN0IGFuZ2xlV2luZG93U2l6ZSA9IGdldEFuZ2xlV2luZG93U2l6ZShzaGFwZWRUZXh0LCBnbHlwaFNpemUsIGJveFNjYWxlKTtcbiAgICBjb25zdCBzaGFwZWRMYWJlbExlbmd0aCA9IGdldFNoYXBlZExhYmVsTGVuZ3RoKHNoYXBlZFRleHQsIHNoYXBlZEljb24pO1xuICAgIGNvbnN0IGxhYmVsTGVuZ3RoID0gc2hhcGVkTGFiZWxMZW5ndGggKiBib3hTY2FsZTtcblxuICAgIC8vIElzIHRoZSBsaW5lIGNvbnRpbnVlZCBmcm9tIG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcnk/XG4gICAgY29uc3QgaXNMaW5lQ29udGludWVkID0gbGluZVswXS54ID09PSAwIHx8IGxpbmVbMF0ueCA9PT0gdGlsZUV4dGVudCB8fCBsaW5lWzBdLnkgPT09IDAgfHwgbGluZVswXS55ID09PSB0aWxlRXh0ZW50O1xuXG4gICAgLy8gSXMgdGhlIGxhYmVsIGxvbmcsIHJlbGF0aXZlIHRvIHRoZSBzcGFjaW5nP1xuICAgIC8vIElmIHNvLCBhZGp1c3QgdGhlIHNwYWNpbmcgc28gdGhlcmUgaXMgYWx3YXlzIGEgbWluaW11bSBzcGFjZSBvZiBgc3BhY2luZyAvIDRgIGJldHdlZW4gbGFiZWwgZWRnZXMuXG4gICAgaWYgKHNwYWNpbmcgLSBsYWJlbExlbmd0aCA8IHNwYWNpbmcgLyA0KSB7XG4gICAgICAgIHNwYWNpbmcgPSBsYWJlbExlbmd0aCArIHNwYWNpbmcgLyA0O1xuICAgIH1cblxuICAgIC8vIE9mZnNldCB0aGUgZmlyc3QgYW5jaG9yIGJ5OlxuICAgIC8vIEVpdGhlciBoYWxmIHRoZSBsYWJlbCBsZW5ndGggcGx1cyBhIGZpeGVkIGV4dHJhIG9mZnNldCBpZiB0aGUgbGluZSBpcyBub3QgY29udGludWVkXG4gICAgLy8gT3IgaGFsZiB0aGUgc3BhY2luZyBpZiB0aGUgbGluZSBpcyBjb250aW51ZWQuXG5cbiAgICAvLyBGb3Igbm9uLWNvbnRpbnVlZCBsaW5lcywgYWRkIGEgYml0IG9mIGZpeGVkIGV4dHJhIG9mZnNldCB0byBhdm9pZCBjb2xsaXNpb25zIGF0IFQgaW50ZXJzZWN0aW9ucy5cbiAgICBjb25zdCBmaXhlZEV4dHJhT2Zmc2V0ID0gZ2x5cGhTaXplICogMjtcblxuICAgIGNvbnN0IG9mZnNldCA9ICFpc0xpbmVDb250aW51ZWQgP1xuICAgICAgICAoKHNoYXBlZExhYmVsTGVuZ3RoIC8gMiArIGZpeGVkRXh0cmFPZmZzZXQpICogYm94U2NhbGUgKiBvdmVyc2NhbGluZykgJSBzcGFjaW5nIDpcbiAgICAgICAgKHNwYWNpbmcgLyAyICogb3ZlcnNjYWxpbmcpICUgc3BhY2luZztcblxuICAgIHJldHVybiByZXNhbXBsZShsaW5lLCBvZmZzZXQsIHNwYWNpbmcsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUsIGxhYmVsTGVuZ3RoLCBpc0xpbmVDb250aW51ZWQsIGZhbHNlLCB0aWxlRXh0ZW50KTtcbn1cblxuZnVuY3Rpb24gcmVzYW1wbGUobGluZSwgb2Zmc2V0LCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCBwbGFjZUF0TWlkZGxlLCB0aWxlRXh0ZW50KSB7XG5cbiAgICBjb25zdCBoYWxmTGFiZWxMZW5ndGggPSBsYWJlbExlbmd0aCAvIDI7XG4gICAgY29uc3QgbGluZUxlbmd0aCA9IGdldExpbmVMZW5ndGgobGluZSk7XG5cbiAgICBsZXQgZGlzdGFuY2UgPSAwLFxuICAgICAgICBtYXJrZWREaXN0YW5jZSA9IG9mZnNldCAtIHNwYWNpbmc7XG5cbiAgICBsZXQgYW5jaG9ycyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnREaXN0ID0gYS5kaXN0KGIpLFxuICAgICAgICAgICAgYW5nbGUgPSBiLmFuZ2xlVG8oYSk7XG5cbiAgICAgICAgd2hpbGUgKG1hcmtlZERpc3RhbmNlICsgc3BhY2luZyA8IGRpc3RhbmNlICsgc2VnbWVudERpc3QpIHtcbiAgICAgICAgICAgIG1hcmtlZERpc3RhbmNlICs9IHNwYWNpbmc7XG5cbiAgICAgICAgICAgIGNvbnN0IHQgPSAobWFya2VkRGlzdGFuY2UgLSBkaXN0YW5jZSkgLyBzZWdtZW50RGlzdCxcbiAgICAgICAgICAgICAgICB4ID0gaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgICAgIHkgPSBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgdGlsZSBib3VuZGFyaWVzIGFuZCB0aGF0XG4gICAgICAgICAgICAvLyB0aGUgbGFiZWwgd291bGQgZml0IGJlZm9yZSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIC8vIGlmIHBsYWNlZCBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDwgdGlsZUV4dGVudCAmJiB5ID49IDAgJiYgeSA8IHRpbGVFeHRlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgLSBoYWxmTGFiZWxMZW5ndGggPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZWREaXN0YW5jZSArIGhhbGZMYWJlbExlbmd0aCA8PSBsaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gbmV3IEFuY2hvcih4LCB5LCBhbmdsZSwgaSk7XG4gICAgICAgICAgICAgICAgYW5jaG9yLl9yb3VuZCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFhbmdsZVdpbmRvd1NpemUgfHwgY2hlY2tNYXhBbmdsZShsaW5lLCBhbmNob3IsIGxhYmVsTGVuZ3RoLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlKSkge1xuICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnB1c2goYW5jaG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkaXN0YW5jZSArPSBzZWdtZW50RGlzdDtcbiAgICB9XG5cbiAgICBpZiAoIXBsYWNlQXRNaWRkbGUgJiYgIWFuY2hvcnMubGVuZ3RoICYmICFpc0xpbmVDb250aW51ZWQpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IGF0dGVtcHQgYXQgZmluZGluZyBhbmNob3JzIGF0IHdoaWNoIGxhYmVscyBjYW4gYmUgcGxhY2VkIGZhaWxlZC5cbiAgICAgICAgLy8gVHJ5IGFnYWluLCBidXQgdGhpcyB0aW1lIGp1c3QgdHJ5IHBsYWNpbmcgb25lIGFuY2hvciBhdCB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lLlxuICAgICAgICAvLyBUaGlzIGhhcyB0aGUgbW9zdCBlZmZlY3QgZm9yIHNob3J0IGxpbmVzIGluIG92ZXJzY2FsZWQgdGlsZXMsIHNpbmNlIHRoZVxuICAgICAgICAvLyBpbml0aWFsIG9mZnNldCB1c2VkIGluIG92ZXJzY2FsZWQgdGlsZXMgaXMgY2FsY3VsYXRlZCB0byBhbGlnbiBsYWJlbHMgd2l0aCBwb3NpdGlvbnMgaW5cbiAgICAgICAgLy8gcGFyZW50IHRpbGVzIGluc3RlYWQgb2YgcGxhY2luZyB0aGUgbGFiZWwgYXMgY2xvc2UgdG8gdGhlIGJlZ2lubmluZyBhcyBwb3NzaWJsZS5cbiAgICAgICAgYW5jaG9ycyA9IHJlc2FtcGxlKGxpbmUsIGRpc3RhbmNlIC8gMiwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGlzTGluZUNvbnRpbnVlZCwgdHJ1ZSwgdGlsZUV4dGVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2hvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsaXBMaW5lO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcnQgb2YgYSBtdWx0aWxpbmUgdGhhdCBpbnRlcnNlY3RzIHdpdGggdGhlIHByb3ZpZGVkIHJlY3Rhbmd1bGFyIGJveC5cbiAqXG4gKiBAcGFyYW0gbGluZXNcbiAqIEBwYXJhbSB4MSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB5MSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGJveFxuICogQHBhcmFtIHgyIHRoZSByaWdodCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB5MiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGJveFxuICogQHJldHVybnMgbGluZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsaXBMaW5lKGxpbmVzOiBBcnJheTxBcnJheTxQb2ludD4+LCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKTogQXJyYXk8QXJyYXk8UG9pbnQ+PiB7XG4gICAgY29uc3QgY2xpcHBlZExpbmVzID0gW107XG5cbiAgICBmb3IgKGxldCBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tsXTtcbiAgICAgICAgbGV0IGNsaXBwZWRMaW5lO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwMCA9IGxpbmVbaV07XG4gICAgICAgICAgICBsZXQgcDEgPSBsaW5lW2kgKyAxXTtcblxuICAgICAgICAgICAgaWYgKHAwLnggPCB4MSAmJiBwMS54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQoeDEsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MSAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludCh4MSwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgxIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC55IDwgeTEgJiYgcDEueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MSAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkxKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkxIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTEpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueCA+PSB4MiAmJiBwMS54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludCh4MiwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgyIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludCh4MiwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgyIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC55ID49IHkyICYmIHAxLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MiAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkyKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MiAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkyKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFjbGlwcGVkTGluZSB8fCAhcDAuZXF1YWxzKGNsaXBwZWRMaW5lW2NsaXBwZWRMaW5lLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICAgIGNsaXBwZWRMaW5lID0gW3AwXTtcbiAgICAgICAgICAgICAgICBjbGlwcGVkTGluZXMucHVzaChjbGlwcGVkTGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsaXBwZWRMaW5lLnB1c2gocDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWRMaW5lcztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHtHTFlQSF9QQkZfQk9SREVSfSBmcm9tICcuLi9zdHlsZS9wYXJzZV9nbHlwaF9wYmYnO1xuXG5pbXBvcnQgdHlwZSBBbmNob3IgZnJvbSAnLi9hbmNob3InO1xuaW1wb3J0IHR5cGUge1Bvc2l0aW9uZWRJY29uLCBTaGFwaW5nfSBmcm9tICcuL3NoYXBpbmcnO1xuaW1wb3J0IHtTSEFQSU5HX0RFRkFVTFRfT0ZGU0VUfSBmcm9tICcuL3NoYXBpbmcnO1xuaW1wb3J0IHtJTUFHRV9QQURESU5HfSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmV9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuL29uZV9lbSc7XG5cbi8qKlxuICogQSB0ZXh0dXJlZCBxdWFkIGZvciByZW5kZXJpbmcgYSBzaW5nbGUgaWNvbiBvciBnbHlwaC5cbiAqXG4gKiBUaGUgem9vbSByYW5nZSB0aGUgZ2x5cGggY2FuIGJlIHNob3duIGlzIGRlZmluZWQgYnkgbWluU2NhbGUgYW5kIG1heFNjYWxlLlxuICpcbiAqIEBwYXJhbSB0bCBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHRyIFRoZSBvZmZzZXQgb2YgdGhlIHRvcCByaWdodCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIGJsIFRoZSBvZmZzZXQgb2YgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gYnIgVGhlIG9mZnNldCBvZiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gdGV4IFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCB0eXBlIFN5bWJvbFF1YWQgPSB7XG4gICAgdGw6IFBvaW50LFxuICAgIHRyOiBQb2ludCxcbiAgICBibDogUG9pbnQsXG4gICAgYnI6IFBvaW50LFxuICAgIHRleDoge1xuICAgICAgICB4OiBudW1iZXIsXG4gICAgICAgIHk6IG51bWJlcixcbiAgICAgICAgdzogbnVtYmVyLFxuICAgICAgICBoOiBudW1iZXJcbiAgICB9LFxuICAgIHBpeGVsT2Zmc2V0VEw6IFBvaW50LFxuICAgIHBpeGVsT2Zmc2V0QlI6IFBvaW50LFxuICAgIHdyaXRpbmdNb2RlOiBhbnkgfCB2b2lkLFxuICAgIGdseXBoT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHNlY3Rpb25JbmRleDogbnVtYmVyLFxuICAgIGlzU0RGOiBib29sZWFuLFxuICAgIG1pbkZvbnRTY2FsZVg6IG51bWJlcixcbiAgICBtaW5Gb250U2NhbGVZOiBudW1iZXJcbn07XG5cbi8vIElmIHlvdSBoYXZlIGEgMTBweCBpY29uIHRoYXQgaXNuJ3QgcGVyZmVjdGx5IGFsaWduZWQgdG8gdGhlIHBpeGVsIGdyaWQgaXQgd2lsbCBjb3ZlciAxMSBhY3R1YWxcbi8vIHBpeGVscy4gVGhlIHF1YWQgbmVlZHMgdG8gYmUgcGFkZGVkIHRvIGFjY291bnQgZm9yIHRoaXMsIG90aGVyd2lzZSB0aGV5J2xsIGxvb2sgc2xpZ2h0bHkgY2xpcHBlZFxuLy8gb24gb25lIGVkZ2UgaW4gc29tZSBjYXNlcy5cbmNvbnN0IGJvcmRlciA9IElNQUdFX1BBRERJTkc7XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYW4gaWNvbi5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJY29uUXVhZHMoXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgaWNvblJvdGF0ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgIGlzU0RGSWNvbjogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICBoYXNJY29uVGV4dEZpdDogYm9vbGVhbik6IEFycmF5PFN5bWJvbFF1YWQ+IHtcbiAgICBjb25zdCBxdWFkcyA9IFtdO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBzaGFwZWRJY29uLmltYWdlO1xuICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IGltYWdlV2lkdGggPSBpbWFnZS5wYWRkZWRSZWN0LncgLSAyICogYm9yZGVyO1xuICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2UucGFkZGVkUmVjdC5oIC0gMiAqIGJvcmRlcjtcblxuICAgIGNvbnN0IGljb25XaWR0aCA9IHNoYXBlZEljb24ucmlnaHQgLSBzaGFwZWRJY29uLmxlZnQ7XG4gICAgY29uc3QgaWNvbkhlaWdodCA9IHNoYXBlZEljb24uYm90dG9tIC0gc2hhcGVkSWNvbi50b3A7XG5cbiAgICBjb25zdCBzdHJldGNoWCA9IGltYWdlLnN0cmV0Y2hYIHx8IFtbMCwgaW1hZ2VXaWR0aF1dO1xuICAgIGNvbnN0IHN0cmV0Y2hZID0gaW1hZ2Uuc3RyZXRjaFkgfHwgW1swLCBpbWFnZUhlaWdodF1dO1xuXG4gICAgY29uc3QgcmVkdWNlUmFuZ2VzID0gKHN1bSwgcmFuZ2UpID0+IHN1bSArIHJhbmdlWzFdIC0gcmFuZ2VbMF07XG4gICAgY29uc3Qgc3RyZXRjaFdpZHRoID0gc3RyZXRjaFgucmVkdWNlKHJlZHVjZVJhbmdlcywgMCk7XG4gICAgY29uc3Qgc3RyZXRjaEhlaWdodCA9IHN0cmV0Y2hZLnJlZHVjZShyZWR1Y2VSYW5nZXMsIDApO1xuICAgIGNvbnN0IGZpeGVkV2lkdGggPSBpbWFnZVdpZHRoIC0gc3RyZXRjaFdpZHRoO1xuICAgIGNvbnN0IGZpeGVkSGVpZ2h0ID0gaW1hZ2VIZWlnaHQgLSBzdHJldGNoSGVpZ2h0O1xuXG4gICAgbGV0IHN0cmV0Y2hPZmZzZXRYID0gMDtcbiAgICBsZXQgc3RyZXRjaENvbnRlbnRXaWR0aCA9IHN0cmV0Y2hXaWR0aDtcbiAgICBsZXQgc3RyZXRjaE9mZnNldFkgPSAwO1xuICAgIGxldCBzdHJldGNoQ29udGVudEhlaWdodCA9IHN0cmV0Y2hIZWlnaHQ7XG4gICAgbGV0IGZpeGVkT2Zmc2V0WCA9IDA7XG4gICAgbGV0IGZpeGVkQ29udGVudFdpZHRoID0gZml4ZWRXaWR0aDtcbiAgICBsZXQgZml4ZWRPZmZzZXRZID0gMDtcbiAgICBsZXQgZml4ZWRDb250ZW50SGVpZ2h0ID0gZml4ZWRIZWlnaHQ7XG5cbiAgICBpZiAoaW1hZ2UuY29udGVudCAmJiBoYXNJY29uVGV4dEZpdCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gaW1hZ2UuY29udGVudDtcbiAgICAgICAgc3RyZXRjaE9mZnNldFggPSBzdW1XaXRoaW5SYW5nZShzdHJldGNoWCwgMCwgY29udGVudFswXSk7XG4gICAgICAgIHN0cmV0Y2hPZmZzZXRZID0gc3VtV2l0aGluUmFuZ2Uoc3RyZXRjaFksIDAsIGNvbnRlbnRbMV0pO1xuICAgICAgICBzdHJldGNoQ29udGVudFdpZHRoID0gc3VtV2l0aGluUmFuZ2Uoc3RyZXRjaFgsIGNvbnRlbnRbMF0sIGNvbnRlbnRbMl0pO1xuICAgICAgICBzdHJldGNoQ29udGVudEhlaWdodCA9IHN1bVdpdGhpblJhbmdlKHN0cmV0Y2hZLCBjb250ZW50WzFdLCBjb250ZW50WzNdKTtcbiAgICAgICAgZml4ZWRPZmZzZXRYID0gY29udGVudFswXSAtIHN0cmV0Y2hPZmZzZXRYO1xuICAgICAgICBmaXhlZE9mZnNldFkgPSBjb250ZW50WzFdIC0gc3RyZXRjaE9mZnNldFk7XG4gICAgICAgIGZpeGVkQ29udGVudFdpZHRoID0gY29udGVudFsyXSAtIGNvbnRlbnRbMF0gLSBzdHJldGNoQ29udGVudFdpZHRoO1xuICAgICAgICBmaXhlZENvbnRlbnRIZWlnaHQgPSBjb250ZW50WzNdIC0gY29udGVudFsxXSAtIHN0cmV0Y2hDb250ZW50SGVpZ2h0O1xuICAgIH1cblxuICAgIGNvbnN0IG1ha2VCb3ggPSAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbGVmdEVtID0gZ2V0RW1PZmZzZXQobGVmdC5zdHJldGNoIC0gc3RyZXRjaE9mZnNldFgsIHN0cmV0Y2hDb250ZW50V2lkdGgsIGljb25XaWR0aCwgc2hhcGVkSWNvbi5sZWZ0KTtcbiAgICAgICAgY29uc3QgbGVmdFB4ID0gZ2V0UHhPZmZzZXQobGVmdC5maXhlZCAtIGZpeGVkT2Zmc2V0WCwgZml4ZWRDb250ZW50V2lkdGgsIGxlZnQuc3RyZXRjaCwgc3RyZXRjaFdpZHRoKTtcblxuICAgICAgICBjb25zdCB0b3BFbSA9IGdldEVtT2Zmc2V0KHRvcC5zdHJldGNoIC0gc3RyZXRjaE9mZnNldFksIHN0cmV0Y2hDb250ZW50SGVpZ2h0LCBpY29uSGVpZ2h0LCBzaGFwZWRJY29uLnRvcCk7XG4gICAgICAgIGNvbnN0IHRvcFB4ID0gZ2V0UHhPZmZzZXQodG9wLmZpeGVkIC0gZml4ZWRPZmZzZXRZLCBmaXhlZENvbnRlbnRIZWlnaHQsIHRvcC5zdHJldGNoLCBzdHJldGNoSGVpZ2h0KTtcblxuICAgICAgICBjb25zdCByaWdodEVtID0gZ2V0RW1PZmZzZXQocmlnaHQuc3RyZXRjaCAtIHN0cmV0Y2hPZmZzZXRYLCBzdHJldGNoQ29udGVudFdpZHRoLCBpY29uV2lkdGgsIHNoYXBlZEljb24ubGVmdCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0UHggPSBnZXRQeE9mZnNldChyaWdodC5maXhlZCAtIGZpeGVkT2Zmc2V0WCwgZml4ZWRDb250ZW50V2lkdGgsIHJpZ2h0LnN0cmV0Y2gsIHN0cmV0Y2hXaWR0aCk7XG5cbiAgICAgICAgY29uc3QgYm90dG9tRW0gPSBnZXRFbU9mZnNldChib3R0b20uc3RyZXRjaCAtIHN0cmV0Y2hPZmZzZXRZLCBzdHJldGNoQ29udGVudEhlaWdodCwgaWNvbkhlaWdodCwgc2hhcGVkSWNvbi50b3ApO1xuICAgICAgICBjb25zdCBib3R0b21QeCA9IGdldFB4T2Zmc2V0KGJvdHRvbS5maXhlZCAtIGZpeGVkT2Zmc2V0WSwgZml4ZWRDb250ZW50SGVpZ2h0LCBib3R0b20uc3RyZXRjaCwgc3RyZXRjaEhlaWdodCk7XG5cbiAgICAgICAgY29uc3QgdGwgPSBuZXcgUG9pbnQobGVmdEVtLCB0b3BFbSk7XG4gICAgICAgIGNvbnN0IHRyID0gbmV3IFBvaW50KHJpZ2h0RW0sIHRvcEVtKTtcbiAgICAgICAgY29uc3QgYnIgPSBuZXcgUG9pbnQocmlnaHRFbSwgYm90dG9tRW0pO1xuICAgICAgICBjb25zdCBibCA9IG5ldyBQb2ludChsZWZ0RW0sIGJvdHRvbUVtKTtcbiAgICAgICAgY29uc3QgcGl4ZWxPZmZzZXRUTCA9IG5ldyBQb2ludChsZWZ0UHggLyBwaXhlbFJhdGlvLCB0b3BQeCAvIHBpeGVsUmF0aW8pO1xuICAgICAgICBjb25zdCBwaXhlbE9mZnNldEJSID0gbmV3IFBvaW50KHJpZ2h0UHggLyBwaXhlbFJhdGlvLCBib3R0b21QeCAvIHBpeGVsUmF0aW8pO1xuXG4gICAgICAgIGNvbnN0IGFuZ2xlID0gaWNvblJvdGF0ZSAqIE1hdGguUEkgLyAxODA7XG5cbiAgICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgICAgIG1hdHJpeCA9IFtjb3MsIC1zaW4sIHNpbiwgY29zXTtcblxuICAgICAgICAgICAgdGwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIHRyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgICAgICBibC5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgYnIuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHgxID0gbGVmdC5zdHJldGNoICsgbGVmdC5maXhlZDtcbiAgICAgICAgY29uc3QgeDIgPSByaWdodC5zdHJldGNoICsgcmlnaHQuZml4ZWQ7XG4gICAgICAgIGNvbnN0IHkxID0gdG9wLnN0cmV0Y2ggKyB0b3AuZml4ZWQ7XG4gICAgICAgIGNvbnN0IHkyID0gYm90dG9tLnN0cmV0Y2ggKyBib3R0b20uZml4ZWQ7XG5cbiAgICAgICAgY29uc3Qgc3ViUmVjdCA9IHtcbiAgICAgICAgICAgIHg6IGltYWdlLnBhZGRlZFJlY3QueCArIGJvcmRlciArIHgxLFxuICAgICAgICAgICAgeTogaW1hZ2UucGFkZGVkUmVjdC55ICsgYm9yZGVyICsgeTEsXG4gICAgICAgICAgICB3OiB4MiAtIHgxLFxuICAgICAgICAgICAgaDogeTIgLSB5MVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG1pbkZvbnRTY2FsZVggPSBmaXhlZENvbnRlbnRXaWR0aCAvIHBpeGVsUmF0aW8gLyBpY29uV2lkdGg7XG4gICAgICAgIGNvbnN0IG1pbkZvbnRTY2FsZVkgPSBmaXhlZENvbnRlbnRIZWlnaHQgLyBwaXhlbFJhdGlvIC8gaWNvbkhlaWdodDtcblxuICAgICAgICAvLyBJY29uIHF1YWQgaXMgcGFkZGVkLCBzbyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFsc28gbmVlZCB0byBiZSBwYWRkZWQuXG4gICAgICAgIHJldHVybiB7dGwsIHRyLCBibCwgYnIsIHRleDogc3ViUmVjdCwgd3JpdGluZ01vZGU6IHVuZGVmaW5lZCwgZ2x5cGhPZmZzZXQ6IFswLCAwXSwgc2VjdGlvbkluZGV4OiAwLCBwaXhlbE9mZnNldFRMLCBwaXhlbE9mZnNldEJSLCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZLCBpc1NERjogaXNTREZJY29ufTtcbiAgICB9O1xuXG4gICAgaWYgKCFoYXNJY29uVGV4dEZpdCB8fCAoIWltYWdlLnN0cmV0Y2hYICYmICFpbWFnZS5zdHJldGNoWSkpIHtcbiAgICAgICAgcXVhZHMucHVzaChtYWtlQm94KFxuICAgICAgICAgICAge2ZpeGVkOiAwLCBzdHJldGNoOiAtMX0sXG4gICAgICAgICAgICB7Zml4ZWQ6IDAsIHN0cmV0Y2g6IC0xfSxcbiAgICAgICAgICAgIHtmaXhlZDogMCwgc3RyZXRjaDogaW1hZ2VXaWR0aCArIDF9LFxuICAgICAgICAgICAge2ZpeGVkOiAwLCBzdHJldGNoOiBpbWFnZUhlaWdodCArIDF9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeEN1dHMgPSBzdHJldGNoWm9uZXNUb0N1dHMoc3RyZXRjaFgsIGZpeGVkV2lkdGgsIHN0cmV0Y2hXaWR0aCk7XG4gICAgICAgIGNvbnN0IHlDdXRzID0gc3RyZXRjaFpvbmVzVG9DdXRzKHN0cmV0Y2hZLCBmaXhlZEhlaWdodCwgc3RyZXRjaEhlaWdodCk7XG5cbiAgICAgICAgZm9yIChsZXQgeGkgPSAwOyB4aSA8IHhDdXRzLmxlbmd0aCAtIDE7IHhpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHgxID0geEN1dHNbeGldO1xuICAgICAgICAgICAgY29uc3QgeDIgPSB4Q3V0c1t4aSArIDFdO1xuICAgICAgICAgICAgZm9yIChsZXQgeWkgPSAwOyB5aSA8IHlDdXRzLmxlbmd0aCAtIDE7IHlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB5MSA9IHlDdXRzW3lpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB5MiA9IHlDdXRzW3lpICsgMV07XG4gICAgICAgICAgICAgICAgcXVhZHMucHVzaChtYWtlQm94KHgxLCB5MSwgeDIsIHkyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVhZHM7XG59XG5cbmZ1bmN0aW9uIHN1bVdpdGhpblJhbmdlKHJhbmdlcywgbWluLCBtYXgpIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICBzdW0gKz0gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHJhbmdlWzFdKSkgLSBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgcmFuZ2VbMF0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuZnVuY3Rpb24gc3RyZXRjaFpvbmVzVG9DdXRzKHN0cmV0Y2hab25lcywgZml4ZWRTaXplLCBzdHJldGNoU2l6ZSkge1xuICAgIGNvbnN0IGN1dHMgPSBbe2ZpeGVkOiAtYm9yZGVyLCBzdHJldGNoOiAwfV07XG5cbiAgICBmb3IgKGNvbnN0IFtjMSwgYzJdIG9mIHN0cmV0Y2hab25lcykge1xuICAgICAgICBjb25zdCBsYXN0ID0gY3V0c1tjdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXRzLnB1c2goe1xuICAgICAgICAgICAgZml4ZWQ6IGMxIC0gbGFzdC5zdHJldGNoLFxuICAgICAgICAgICAgc3RyZXRjaDogbGFzdC5zdHJldGNoXG4gICAgICAgIH0pO1xuICAgICAgICBjdXRzLnB1c2goe1xuICAgICAgICAgICAgZml4ZWQ6IGMxIC0gbGFzdC5zdHJldGNoLFxuICAgICAgICAgICAgc3RyZXRjaDogbGFzdC5zdHJldGNoICsgKGMyIC0gYzEpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjdXRzLnB1c2goe1xuICAgICAgICBmaXhlZDogZml4ZWRTaXplICsgYm9yZGVyLFxuICAgICAgICBzdHJldGNoOiBzdHJldGNoU2l6ZVxuICAgIH0pO1xuICAgIHJldHVybiBjdXRzO1xufVxuXG5mdW5jdGlvbiBnZXRFbU9mZnNldChzdHJldGNoT2Zmc2V0LCBzdHJldGNoU2l6ZSwgaWNvblNpemUsIGljb25PZmZzZXQpIHtcbiAgICByZXR1cm4gc3RyZXRjaE9mZnNldCAvIHN0cmV0Y2hTaXplICogaWNvblNpemUgKyBpY29uT2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBnZXRQeE9mZnNldChmaXhlZE9mZnNldCwgZml4ZWRTaXplLCBzdHJldGNoT2Zmc2V0LCBzdHJldGNoU2l6ZSkge1xuICAgIHJldHVybiBmaXhlZE9mZnNldCAtIGZpeGVkU2l6ZSAqIHN0cmV0Y2hPZmZzZXQgLyBzdHJldGNoU2l6ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIHF1YWRzIHVzZWQgZm9yIHJlbmRlcmluZyBhIHRleHQgbGFiZWwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2x5cGhRdWFkcyhhbmNob3I6IEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZzogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgIGFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXA6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sXG4gICAgICAgICAgICAgICAgICAgICAgIGFsbG93VmVydGljYWxQbGFjZW1lbnQ6IGJvb2xlYW4pOiBBcnJheTxTeW1ib2xRdWFkPiB7XG5cbiAgICBjb25zdCB0ZXh0Um90YXRlID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgKiBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IHF1YWRzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc2hhcGluZy5wb3NpdGlvbmVkTGluZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb3NpdGlvbmVkR2x5cGggb2YgbGluZS5wb3NpdGlvbmVkR2x5cGhzKSB7XG4gICAgICAgICAgICBpZiAoIXBvc2l0aW9uZWRHbHlwaC5yZWN0KSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHRleHR1cmVSZWN0ID0gcG9zaXRpb25lZEdseXBoLnJlY3QgfHwge307XG5cbiAgICAgICAgICAgIC8vIFRoZSByZWN0cyBoYXZlIGFuIGFkZGl0aW9uYWwgYnVmZmVyIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZWlyIHNpemUuXG4gICAgICAgICAgICBjb25zdCBnbHlwaFBhZGRpbmcgPSAxLjA7XG4gICAgICAgICAgICBsZXQgcmVjdEJ1ZmZlciA9IEdMWVBIX1BCRl9CT1JERVIgKyBnbHlwaFBhZGRpbmc7XG4gICAgICAgICAgICBsZXQgaXNTREYgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHBpeGVsUmF0aW8gPSAxLjA7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldCA9IDAuMDtcblxuICAgICAgICAgICAgY29uc3Qgcm90YXRlVmVydGljYWxHbHlwaCA9IChhbG9uZ0xpbmUgfHwgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCkgJiYgcG9zaXRpb25lZEdseXBoLnZlcnRpY2FsO1xuICAgICAgICAgICAgY29uc3QgaGFsZkFkdmFuY2UgPSBwb3NpdGlvbmVkR2x5cGgubWV0cmljcy5hZHZhbmNlICogcG9zaXRpb25lZEdseXBoLnNjYWxlIC8gMjtcblxuICAgICAgICAgICAgLy8gQWxpZ24gaW1hZ2VzIGFuZCBzY2FsZWQgZ2x5cGhzIGluIHRoZSBtaWRkbGUgb2YgYSB2ZXJ0aWNhbCBsaW5lLlxuICAgICAgICAgICAgaWYgKGFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc2hhcGluZy52ZXJ0aWNhbGl6YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlZEdseXBoT2Zmc2V0ID0gKHBvc2l0aW9uZWRHbHlwaC5zY2FsZSAtIDEpICogT05FX0VNO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlT2Zmc2V0ID0gKE9ORV9FTSAtIHBvc2l0aW9uZWRHbHlwaC5tZXRyaWNzLndpZHRoICogcG9zaXRpb25lZEdseXBoLnNjYWxlKSAvIDI7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldCA9IGxpbmUubGluZU9mZnNldCAvIDIgLSAocG9zaXRpb25lZEdseXBoLmltYWdlTmFtZSA/IC1pbWFnZU9mZnNldCA6IHNjYWxlZEdseXBoT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaC5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlTWFwW3Bvc2l0aW9uZWRHbHlwaC5pbWFnZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlzU0RGID0gaW1hZ2Uuc2RmO1xuICAgICAgICAgICAgICAgIHBpeGVsUmF0aW8gPSBpbWFnZS5waXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIHJlY3RCdWZmZXIgPSBJTUFHRV9QQURESU5HIC8gcGl4ZWxSYXRpbztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZ2x5cGhPZmZzZXQgPSBhbG9uZ0xpbmUgP1xuICAgICAgICAgICAgICAgIFtwb3NpdGlvbmVkR2x5cGgueCArIGhhbGZBZHZhbmNlLCBwb3NpdGlvbmVkR2x5cGgueV0gOlxuICAgICAgICAgICAgICAgIFswLCAwXTtcblxuICAgICAgICAgICAgbGV0IGJ1aWx0SW5PZmZzZXQgPSBhbG9uZ0xpbmUgP1xuICAgICAgICAgICAgICAgIFswLCAwXSA6XG4gICAgICAgICAgICAgICAgW3Bvc2l0aW9uZWRHbHlwaC54ICsgaGFsZkFkdmFuY2UgKyB0ZXh0T2Zmc2V0WzBdLCBwb3NpdGlvbmVkR2x5cGgueSArIHRleHRPZmZzZXRbMV0gLSBsaW5lT2Zmc2V0XTtcblxuICAgICAgICAgICAgbGV0IHZlcnRpY2FsaXplZExhYmVsT2Zmc2V0ID0gWzAsIDBdO1xuICAgICAgICAgICAgaWYgKHJvdGF0ZVZlcnRpY2FsR2x5cGgpIHtcbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCBQT0kgbGFiZWxzIHRoYXQgYXJlIHJvdGF0ZWQgOTBkZWcgQ1cgYW5kIHdob3NlIGdseXBocyBtdXN0IHByZXNlcnZlIHVwcmlnaHQgb3JpZW50YXRpb25cbiAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHJvdGF0ZWQgOTBkZWcgQ0NXLiBBZnRlciBhIHF1YWQgaXMgcm90YXRlZCwgaXQgaXMgdHJhbnNsYXRlZCB0byB0aGUgb3JpZ2luYWwgYnVpbHQtaW4gb2Zmc2V0LlxuICAgICAgICAgICAgICAgIHZlcnRpY2FsaXplZExhYmVsT2Zmc2V0ID0gYnVpbHRJbk9mZnNldDtcbiAgICAgICAgICAgICAgICBidWlsdEluT2Zmc2V0ID0gWzAsIDBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB4MSA9IChwb3NpdGlvbmVkR2x5cGgubWV0cmljcy5sZWZ0IC0gcmVjdEJ1ZmZlcikgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLSBoYWxmQWR2YW5jZSArIGJ1aWx0SW5PZmZzZXRbMF07XG4gICAgICAgICAgICBjb25zdCB5MSA9ICgtcG9zaXRpb25lZEdseXBoLm1ldHJpY3MudG9wIC0gcmVjdEJ1ZmZlcikgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgKyBidWlsdEluT2Zmc2V0WzFdO1xuICAgICAgICAgICAgY29uc3QgeDIgPSB4MSArIHRleHR1cmVSZWN0LncgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLyBwaXhlbFJhdGlvO1xuICAgICAgICAgICAgY29uc3QgeTIgPSB5MSArIHRleHR1cmVSZWN0LmggKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLyBwaXhlbFJhdGlvO1xuXG4gICAgICAgICAgICBjb25zdCB0bCA9IG5ldyBQb2ludCh4MSwgeTEpO1xuICAgICAgICAgICAgY29uc3QgdHIgPSBuZXcgUG9pbnQoeDIsIHkxKTtcbiAgICAgICAgICAgIGNvbnN0IGJsID0gbmV3IFBvaW50KHgxLCB5Mik7XG4gICAgICAgICAgICBjb25zdCBiciA9IG5ldyBQb2ludCh4MiwgeTIpO1xuXG4gICAgICAgICAgICBpZiAocm90YXRlVmVydGljYWxHbHlwaCkge1xuICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsLXN1cHBvcnRpbmcgZ2x5cGhzIGFyZSBsYWlkIG91dCBpbiAyNHgyNCBwb2ludCBib3hlcyAoMSBzcXVhcmUgZW0pXG4gICAgICAgICAgICAgICAgLy8gSW4gaG9yaXpvbnRhbCBvcmllbnRhdGlvbiwgdGhlIHkgdmFsdWVzIGZvciBnbHlwaHMgYXJlIGJlbG93IHRoZSBtaWRsaW5lXG4gICAgICAgICAgICAgICAgLy8gYW5kIHdlIHVzZSBhIFwieU9mZnNldFwiIG9mIC0xNyB0byBwdWxsIHRoZW0gdXAgdG8gdGhlIG1pZGRsZS5cbiAgICAgICAgICAgICAgICAvLyBCeSByb3RhdGluZyBjb3VudGVyLWNsb2Nrd2lzZSBhcm91bmQgdGhlIHBvaW50IGF0IHRoZSBjZW50ZXIgb2YgdGhlIGxlZnRcbiAgICAgICAgICAgICAgICAvLyBlZGdlIG9mIGEgMjR4MjQgbGF5b3V0IGJveCBjZW50ZXJlZCBiZWxvdyB0aGUgbWlkbGluZSwgd2UgYWxpZ24gdGhlIGNlbnRlclxuICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBnbHlwaHMgd2l0aCB0aGUgaG9yaXpvbnRhbCBtaWRsaW5lLCBzbyB0aGUgeU9mZnNldCBpcyBubyBsb25nZXJcbiAgICAgICAgICAgICAgICAvLyBuZWNlc3NhcnksIGJ1dCB3ZSBhbHNvIHB1bGwgdGhlIGdseXBoIHRvIHRoZSBsZWZ0IGFsb25nIHRoZSB4IGF4aXMuXG4gICAgICAgICAgICAgICAgLy8gVGhlIHkgY29vcmRpbmF0ZSBpbmNsdWRlcyBiYXNlbGluZSB5T2Zmc2V0LCB0aHVzIG5lZWRzIHRvIGJlIGFjY291bnRlZFxuICAgICAgICAgICAgICAgIC8vIGZvciB3aGVuIGdseXBoIGlzIHJvdGF0ZWQgYW5kIHRyYW5zbGF0ZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyID0gbmV3IFBvaW50KC1oYWxmQWR2YW5jZSwgaGFsZkFkdmFuY2UgLSBTSEFQSU5HX0RFRkFVTFRfT0ZGU0VUKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFJvdGF0aW9uID0gLU1hdGguUEkgLyAyO1xuXG4gICAgICAgICAgICAgICAgLy8geEhhbGZXaWR0aE9mZnNldENvcnJlY3Rpb24gaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gZnVsbC13aWR0aCBhbmQgaGFsZi13aWR0aFxuICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UsIHNob3VsZCBiZSAwIGZvciBmdWxsLXdpZHRoIGdseXBocyBhbmQgd2lsbCBwdWxsIHVwIGhhbGYtd2lkdGggZ2x5cGhzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHhIYWxmV2lkdGhPZmZzZXRDb3JyZWN0aW9uID0gT05FX0VNIC8gMiAtIGhhbGZBZHZhbmNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHlJbWFnZU9mZnNldENvcnJlY3Rpb24gPSBwb3NpdGlvbmVkR2x5cGguaW1hZ2VOYW1lID8geEhhbGZXaWR0aE9mZnNldENvcnJlY3Rpb24gOiAwLjA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFsZldpZHRoT2Zmc2V0Q29ycmVjdGlvbiA9IG5ldyBQb2ludCg1IC0gU0hBUElOR19ERUZBVUxUX09GRlNFVCAtIHhIYWxmV2lkdGhPZmZzZXRDb3JyZWN0aW9uLCAteUltYWdlT2Zmc2V0Q29ycmVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxPZmZzZXRDb3JyZWN0aW9uID0gbmV3IFBvaW50KC4uLnZlcnRpY2FsaXplZExhYmVsT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB0bC5fcm90YXRlQXJvdW5kKHZlcnRpY2FsUm90YXRpb24sIGNlbnRlcikuX2FkZChoYWxmV2lkdGhPZmZzZXRDb3JyZWN0aW9uKS5fYWRkKHZlcnRpY2FsT2Zmc2V0Q29ycmVjdGlvbik7XG4gICAgICAgICAgICAgICAgdHIuX3JvdGF0ZUFyb3VuZCh2ZXJ0aWNhbFJvdGF0aW9uLCBjZW50ZXIpLl9hZGQoaGFsZldpZHRoT2Zmc2V0Q29ycmVjdGlvbikuX2FkZCh2ZXJ0aWNhbE9mZnNldENvcnJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGJsLl9yb3RhdGVBcm91bmQodmVydGljYWxSb3RhdGlvbiwgY2VudGVyKS5fYWRkKGhhbGZXaWR0aE9mZnNldENvcnJlY3Rpb24pLl9hZGQodmVydGljYWxPZmZzZXRDb3JyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBici5fcm90YXRlQXJvdW5kKHZlcnRpY2FsUm90YXRpb24sIGNlbnRlcikuX2FkZChoYWxmV2lkdGhPZmZzZXRDb3JyZWN0aW9uKS5fYWRkKHZlcnRpY2FsT2Zmc2V0Q29ycmVjdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ZXh0Um90YXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4odGV4dFJvdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKHRleHRSb3RhdGUpLFxuICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgICAgICB0bC5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgICAgIHRyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgICAgICAgICAgYmwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBici5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwaXhlbE9mZnNldFRMID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxPZmZzZXRCUiA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkZvbnRTY2FsZVggPSAwO1xuICAgICAgICAgICAgY29uc3QgbWluRm9udFNjYWxlWSA9IDA7XG4gICAgICAgICAgICBxdWFkcy5wdXNoKHt0bCwgdHIsIGJsLCBiciwgdGV4OiB0ZXh0dXJlUmVjdCwgd3JpdGluZ01vZGU6IHNoYXBpbmcud3JpdGluZ01vZGUsIGdseXBoT2Zmc2V0LCBzZWN0aW9uSW5kZXg6IHBvc2l0aW9uZWRHbHlwaC5zZWN0aW9uSW5kZXgsIGlzU0RGLCBwaXhlbE9mZnNldFRMLCBwaXhlbE9mZnNldEJSLCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVhZHM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7Q29sbGlzaW9uQm94QXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgQW5jaG9yIGZyb20gJy4vYW5jaG9yJztcblxuLyoqXG4gKiBBIENvbGxpc2lvbkZlYXR1cmUgcmVwcmVzZW50cyB0aGUgYXJlYSBvZiB0aGUgdGlsZSBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGxhYmVsLlxuICogSXQgaXMgdXNlZCB3aXRoIENvbGxpc2lvbkluZGV4IHRvIGNoZWNrIGlmIHRoZSBsYWJlbCBvdmVybGFwcyB3aXRoIGFueVxuICogcHJldmlvdXMgbGFiZWxzLiBBIENvbGxpc2lvbkZlYXR1cmUgaXMgbW9zdGx5IGp1c3QgYSBzZXQgb2YgQ29sbGlzaW9uQm94XG4gKiBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbGxpc2lvbkZlYXR1cmUge1xuICAgIGJveFN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICBib3hFbmRJbmRleDogbnVtYmVyO1xuICAgIGNpcmNsZURpYW1ldGVyOiA/bnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgQ29sbGlzaW9uRmVhdHVyZSwgYWRkaW5nIGl0cyBjb2xsaXNpb24gYm94IGRhdGEgdG8gdGhlIGdpdmVuIGNvbGxpc2lvbkJveEFycmF5IGluIHRoZSBwcm9jZXNzLlxuICAgICAqIEZvciBsaW5lIGFsaWduZWQgbGFiZWxzIGEgY29sbGlzaW9uIGNpcmNsZSBkaWFtZXRlciBpcyBjb21wdXRlZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgYWxvbmcgdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAgICAgKiBAcGFyYW0gc2hhcGVkIFRoZSB0ZXh0IG9yIGljb24gc2hhcGluZyByZXN1bHRzLlxuICAgICAqIEBwYXJhbSBib3hTY2FsZSBBIG1hZ2ljIG51bWJlciB1c2VkIHRvIGNvbnZlcnQgZnJvbSBnbHlwaCBtZXRyaWNzIHVuaXRzIHRvIGdlb21ldHJ5IHVuaXRzLlxuICAgICAqIEBwYXJhbSBwYWRkaW5nIFRoZSBhbW91bnQgb2YgcGFkZGluZyB0byBhZGQgYXJvdW5kIHRoZSBsYWJlbCBlZGdlcy5cbiAgICAgKiBAcGFyYW0gYWxpZ25MaW5lIFdoZXRoZXIgdGhlIGxhYmVsIGlzIGFsaWduZWQgd2l0aCB0aGUgbGluZSBvciB0aGUgdmlld3BvcnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgYW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgc2hhcGVkOiBPYmplY3QsXG4gICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgYWxpZ25MaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHJvdGF0ZTogbnVtYmVyKSB7XG5cbiAgICAgICAgdGhpcy5ib3hTdGFydEluZGV4ID0gY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgICAgIGlmIChhbGlnbkxpbmUpIHtcbiAgICAgICAgICAgIC8vIENvbXB1dGUgaGVpZ2h0IG9mIHRoZSBzaGFwZSBpbiBnbHlwaCBtZXRyaWNzIGFuZCBhcHBseSBjb2xsaXNpb24gcGFkZGluZy5cbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcGl4ZWwgYmFzZWQgJ3RleHQtcGFkZGluZycgaXMgYXBwbGllZCBhdCBydW50aW1lXG4gICAgICAgICAgICBsZXQgdG9wID0gc2hhcGVkLnRvcDtcbiAgICAgICAgICAgIGxldCBib3R0b20gPSBzaGFwZWQuYm90dG9tO1xuICAgICAgICAgICAgY29uc3QgY29sbGlzaW9uUGFkZGluZyA9IHNoYXBlZC5jb2xsaXNpb25QYWRkaW5nO1xuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uUGFkZGluZykge1xuICAgICAgICAgICAgICAgIHRvcCAtPSBjb2xsaXNpb25QYWRkaW5nWzFdO1xuICAgICAgICAgICAgICAgIGJvdHRvbSArPSBjb2xsaXNpb25QYWRkaW5nWzNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNldCBtaW5pbXVtIGJveCBoZWlnaHQgdG8gYXZvaWQgdmVyeSBtYW55IHNtYWxsIGxhYmVsc1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEwLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2lyY2xlRGlhbWV0ZXIgPSBoZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgeTEgPSBzaGFwZWQudG9wICogYm94U2NhbGUgLSBwYWRkaW5nO1xuICAgICAgICAgICAgbGV0IHkyID0gc2hhcGVkLmJvdHRvbSAqIGJveFNjYWxlICsgcGFkZGluZztcbiAgICAgICAgICAgIGxldCB4MSA9IHNoYXBlZC5sZWZ0ICogYm94U2NhbGUgLSBwYWRkaW5nO1xuICAgICAgICAgICAgbGV0IHgyID0gc2hhcGVkLnJpZ2h0ICogYm94U2NhbGUgKyBwYWRkaW5nO1xuXG4gICAgICAgICAgICBjb25zdCBjb2xsaXNpb25QYWRkaW5nID0gc2hhcGVkLmNvbGxpc2lvblBhZGRpbmc7XG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uUGFkZGluZykge1xuICAgICAgICAgICAgICAgIHgxIC09IGNvbGxpc2lvblBhZGRpbmdbMF0gKiBib3hTY2FsZTtcbiAgICAgICAgICAgICAgICB5MSAtPSBjb2xsaXNpb25QYWRkaW5nWzFdICogYm94U2NhbGU7XG4gICAgICAgICAgICAgICAgeDIgKz0gY29sbGlzaW9uUGFkZGluZ1syXSAqIGJveFNjYWxlO1xuICAgICAgICAgICAgICAgIHkyICs9IGNvbGxpc2lvblBhZGRpbmdbM10gKiBib3hTY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJvdGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yICotcm90YXRlIGluIHBvaW50IGNvbGxpc2lvbiBib3hlc1xuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjA3NVxuICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgYWNjb3VudCBmb3IgaWNvbi10ZXh0LWZpdFxuXG4gICAgICAgICAgICAgICAgY29uc3QgdGwgPSBuZXcgUG9pbnQoeDEsIHkxKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ciA9IG5ldyBQb2ludCh4MiwgeTEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsID0gbmV3IFBvaW50KHgxLCB5Mik7XG4gICAgICAgICAgICAgICAgY29uc3QgYnIgPSBuZXcgUG9pbnQoeDIsIHkyKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdGF0ZVJhZGlhbnMgPSByb3RhdGUgKiBNYXRoLlBJIC8gMTgwO1xuXG4gICAgICAgICAgICAgICAgdGwuX3JvdGF0ZShyb3RhdGVSYWRpYW5zKTtcbiAgICAgICAgICAgICAgICB0ci5fcm90YXRlKHJvdGF0ZVJhZGlhbnMpO1xuICAgICAgICAgICAgICAgIGJsLl9yb3RhdGUocm90YXRlUmFkaWFucyk7XG4gICAgICAgICAgICAgICAgYnIuX3JvdGF0ZShyb3RhdGVSYWRpYW5zKTtcblxuICAgICAgICAgICAgICAgIC8vIENvbGxpc2lvbiBmZWF0dXJlcyByZXF1aXJlIGFuIFwib24tYXhpc1wiIGdlb21ldHJ5LFxuICAgICAgICAgICAgICAgIC8vIHNvIHRha2UgdGhlIGVudmVsb3BlIG9mIHRoZSByb3RhdGVkIGdlb21ldHJ5XG4gICAgICAgICAgICAgICAgLy8gKG1heSBiZSBxdWl0ZSBsYXJnZSBmb3Igd2lkZSBsYWJlbHMgcm90YXRlZCA0NSBkZWdyZWVzKVxuICAgICAgICAgICAgICAgIHgxID0gTWF0aC5taW4odGwueCwgdHIueCwgYmwueCwgYnIueCk7XG4gICAgICAgICAgICAgICAgeDIgPSBNYXRoLm1heCh0bC54LCB0ci54LCBibC54LCBici54KTtcbiAgICAgICAgICAgICAgICB5MSA9IE1hdGgubWluKHRsLnksIHRyLnksIGJsLnksIGJyLnkpO1xuICAgICAgICAgICAgICAgIHkyID0gTWF0aC5tYXgodGwueSwgdHIueSwgYmwueSwgYnIueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5lbXBsYWNlQmFjayhhbmNob3IueCwgYW5jaG9yLnksIHgxLCB5MSwgeDIsIHkyLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYm94RW5kSW5kZXggPSBjb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb25GZWF0dXJlO1xuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW55UXVldWUge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEgPSBbXSwgY29tcGFyZSA9IGRlZmF1bHRDb21wYXJlKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jb21wYXJlID0gY29tcGFyZTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gKHRoaXMubGVuZ3RoID4+IDEpIC0gMTsgaSA+PSAwOyBpLS0pIHRoaXMuX2Rvd24oaSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGl0ZW0pIHtcbiAgICAgICAgdGhpcy5kYXRhLnB1c2goaXRlbSk7XG4gICAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgICAgIHRoaXMuX3VwKHRoaXMubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgcG9wKCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5kYXRhWzBdO1xuICAgICAgICBjb25zdCBib3R0b20gPSB0aGlzLmRhdGEucG9wKCk7XG4gICAgICAgIHRoaXMubGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhWzBdID0gYm90dG9tO1xuICAgICAgICAgICAgdGhpcy5fZG93bigwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b3A7XG4gICAgfVxuXG4gICAgcGVlaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVswXTtcbiAgICB9XG5cbiAgICBfdXAocG9zKSB7XG4gICAgICAgIGNvbnN0IHtkYXRhLCBjb21wYXJlfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW3Bvc107XG5cbiAgICAgICAgd2hpbGUgKHBvcyA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IChwb3MgLSAxKSA+PiAxO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGRhdGFbcGFyZW50XTtcbiAgICAgICAgICAgIGlmIChjb21wYXJlKGl0ZW0sIGN1cnJlbnQpID49IDApIGJyZWFrO1xuICAgICAgICAgICAgZGF0YVtwb3NdID0gY3VycmVudDtcbiAgICAgICAgICAgIHBvcyA9IHBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbcG9zXSA9IGl0ZW07XG4gICAgfVxuXG4gICAgX2Rvd24ocG9zKSB7XG4gICAgICAgIGNvbnN0IHtkYXRhLCBjb21wYXJlfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGhhbGZMZW5ndGggPSB0aGlzLmxlbmd0aCA+PiAxO1xuICAgICAgICBjb25zdCBpdGVtID0gZGF0YVtwb3NdO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPCBoYWxmTGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IChwb3MgPDwgMSkgKyAxO1xuICAgICAgICAgICAgbGV0IGJlc3QgPSBkYXRhW2xlZnRdO1xuICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBsZWZ0ICsgMTtcblxuICAgICAgICAgICAgaWYgKHJpZ2h0IDwgdGhpcy5sZW5ndGggJiYgY29tcGFyZShkYXRhW3JpZ2h0XSwgYmVzdCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0O1xuICAgICAgICAgICAgICAgIGJlc3QgPSBkYXRhW3JpZ2h0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb21wYXJlKGJlc3QsIGl0ZW0pID49IDApIGJyZWFrO1xuXG4gICAgICAgICAgICBkYXRhW3Bvc10gPSBiZXN0O1xuICAgICAgICAgICAgcG9zID0gbGVmdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbcG9zXSA9IGl0ZW07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFF1ZXVlIGZyb20gJ3RpbnlxdWV1ZSc7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7ZGlzdFRvU2VnbWVudFNxdWFyZWR9IGZyb20gJy4vaW50ZXJzZWN0aW9uX3Rlc3RzJztcblxuLyoqXG4gKiBGaW5kcyBhbiBhcHByb3hpbWF0aW9uIG9mIGEgcG9seWdvbidzIFBvbGUgT2YgSW5hY2Nlc3NpYmlsaXkgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9sZV9vZl9pbmFjY2Vzc2liaWxpdHlcbiAqIFRoaXMgaXMgYSBjb3B5IG9mIGh0dHA6Ly9naXRodWIuY29tL21hcGJveC9wb2x5bGFiZWwgYWRhcHRlZCB0byB1c2UgUG9pbnRzXG4gKlxuICogQHBhcmFtIHBvbHlnb25SaW5ncyBmaXJzdCBpdGVtIGluIGFycmF5IGlzIHRoZSBvdXRlciByaW5nIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgdGhlIGxpc3Qgb2YgaG9sZXMsIHNob3VsZCBiZSBhbiBlbGVtZW50IG9mIHRoZSByZXN1bHQgb2YgdXRpbC9jbGFzc2lmeV9yaW5nc1xuICogQHBhcmFtIHByZWNpc2lvbiBTcGVjaWZpZWQgaW4gaW5wdXQgY29vcmRpbmF0ZSB1bml0cy4gSWYgMCByZXR1cm5zIGFmdGVyIGZpcnN0IHJ1biwgaWYgPiAwIHJlcGVhdGVkbHkgbmFycm93cyB0aGUgc2VhcmNoIHNwYWNlIHVudGlsIHRoZSByYWRpdXMgb2YgdGhlIGFyZWEgc2VhcmNoZWQgZm9yIHRoZSBiZXN0IHBvbGUgaXMgbGVzcyB0aGFuIHByZWNpc2lvblxuICogQHBhcmFtIGRlYnVnIFByaW50IHNvbWUgc3RhdGlzdGljcyB0byB0aGUgY29uc29sZSBkdXJpbmcgZXhlY3V0aW9uXG4gKiBAcmV0dXJucyBQb2xlIG9mIEluYWNjZXNzaWJpbGl5LlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBvbHlnb25SaW5nczogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgcHJlY2lzaW9uPzogbnVtYmVyID0gMSwgZGVidWc/OiBib29sZWFuID0gZmFsc2UpOiBQb2ludCB7XG4gICAgLy8gZmluZCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBvdXRlciByaW5nXG4gICAgbGV0IG1pblggPSBJbmZpbml0eSwgbWluWSA9IEluZmluaXR5LCBtYXhYID0gLUluZmluaXR5LCBtYXhZID0gLUluZmluaXR5O1xuICAgIGNvbnN0IG91dGVyUmluZyA9IHBvbHlnb25SaW5nc1swXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyUmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gb3V0ZXJSaW5nW2ldO1xuICAgICAgICBpZiAoIWkgfHwgcC54IDwgbWluWCkgbWluWCA9IHAueDtcbiAgICAgICAgaWYgKCFpIHx8IHAueSA8IG1pblkpIG1pblkgPSBwLnk7XG4gICAgICAgIGlmICghaSB8fCBwLnggPiBtYXhYKSBtYXhYID0gcC54O1xuICAgICAgICBpZiAoIWkgfHwgcC55ID4gbWF4WSkgbWF4WSA9IHAueTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IG1heFggLSBtaW5YO1xuICAgIGNvbnN0IGhlaWdodCA9IG1heFkgLSBtaW5ZO1xuICAgIGNvbnN0IGNlbGxTaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG4gICAgbGV0IGggPSBjZWxsU2l6ZSAvIDI7XG5cbiAgICAvLyBhIHByaW9yaXR5IHF1ZXVlIG9mIGNlbGxzIGluIG9yZGVyIG9mIHRoZWlyIFwicG90ZW50aWFsXCIgKG1heCBkaXN0YW5jZSB0byBwb2x5Z29uKVxuICAgIGNvbnN0IGNlbGxRdWV1ZSA9IG5ldyBRdWV1ZShbXSwgY29tcGFyZU1heCk7XG5cbiAgICBpZiAoY2VsbFNpemUgPT09IDApIHJldHVybiBuZXcgUG9pbnQobWluWCwgbWluWSk7XG5cbiAgICAvLyBjb3ZlciBwb2x5Z29uIHdpdGggaW5pdGlhbCBjZWxsc1xuICAgIGZvciAobGV0IHggPSBtaW5YOyB4IDwgbWF4WDsgeCArPSBjZWxsU2l6ZSkge1xuICAgICAgICBmb3IgKGxldCB5ID0gbWluWTsgeSA8IG1heFk7IHkgKz0gY2VsbFNpemUpIHtcbiAgICAgICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKHggKyBoLCB5ICsgaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0YWtlIGNlbnRyb2lkIGFzIHRoZSBmaXJzdCBiZXN0IGd1ZXNzXG4gICAgbGV0IGJlc3RDZWxsID0gZ2V0Q2VudHJvaWRDZWxsKHBvbHlnb25SaW5ncyk7XG4gICAgbGV0IG51bVByb2JlcyA9IGNlbGxRdWV1ZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoY2VsbFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAvLyBwaWNrIHRoZSBtb3N0IHByb21pc2luZyBjZWxsIGZyb20gdGhlIHF1ZXVlXG4gICAgICAgIGNvbnN0IGNlbGwgPSBjZWxsUXVldWUucG9wKCk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBiZXN0IGNlbGwgaWYgd2UgZm91bmQgYSBiZXR0ZXIgb25lXG4gICAgICAgIGlmIChjZWxsLmQgPiBiZXN0Q2VsbC5kIHx8ICFiZXN0Q2VsbC5kKSB7XG4gICAgICAgICAgICBiZXN0Q2VsbCA9IGNlbGw7XG4gICAgICAgICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKCdmb3VuZCBiZXN0ICVkIGFmdGVyICVkIHByb2JlcycsIE1hdGgucm91bmQoMWU0ICogY2VsbC5kKSAvIDFlNCwgbnVtUHJvYmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRvIG5vdCBkcmlsbCBkb3duIGZ1cnRoZXIgaWYgdGhlcmUncyBubyBjaGFuY2Ugb2YgYSBiZXR0ZXIgc29sdXRpb25cbiAgICAgICAgaWYgKGNlbGwubWF4IC0gYmVzdENlbGwuZCA8PSBwcmVjaXNpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNwbGl0IHRoZSBjZWxsIGludG8gZm91ciBjZWxsc1xuICAgICAgICBoID0gY2VsbC5oIC8gMjtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggLSBoLCBjZWxsLnAueSAtIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCArIGgsIGNlbGwucC55IC0gaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54IC0gaCwgY2VsbC5wLnkgKyBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggKyBoLCBjZWxsLnAueSArIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBudW1Qcm9iZXMgKz0gNDtcbiAgICB9XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coYG51bSBwcm9iZXM6ICR7bnVtUHJvYmVzfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgYmVzdCBkaXN0YW5jZTogJHtiZXN0Q2VsbC5kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0Q2VsbC5wO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlTWF4KGEsIGIpIHtcbiAgICByZXR1cm4gYi5tYXggLSBhLm1heDtcbn1cblxuZnVuY3Rpb24gQ2VsbCh4LCB5LCBoLCBwb2x5Z29uKSB7XG4gICAgdGhpcy5wID0gbmV3IFBvaW50KHgsIHkpO1xuICAgIHRoaXMuaCA9IGg7IC8vIGhhbGYgdGhlIGNlbGwgc2l6ZVxuICAgIHRoaXMuZCA9IHBvaW50VG9Qb2x5Z29uRGlzdCh0aGlzLnAsIHBvbHlnb24pOyAvLyBkaXN0YW5jZSBmcm9tIGNlbGwgY2VudGVyIHRvIHBvbHlnb25cbiAgICB0aGlzLm1heCA9IHRoaXMuZCArIHRoaXMuaCAqIE1hdGguU1FSVDI7IC8vIG1heCBkaXN0YW5jZSB0byBwb2x5Z29uIHdpdGhpbiBhIGNlbGxcbn1cblxuLy8gc2lnbmVkIGRpc3RhbmNlIGZyb20gcG9pbnQgdG8gcG9seWdvbiBvdXRsaW5lIChuZWdhdGl2ZSBpZiBwb2ludCBpcyBvdXRzaWRlKVxuZnVuY3Rpb24gcG9pbnRUb1BvbHlnb25EaXN0KHAsIHBvbHlnb24pIHtcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gICAgbGV0IG1pbkRpc3RTcSA9IEluZmluaXR5O1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBwb2x5Z29uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBwb2x5Z29uW2tdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDE7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYiA9IHJpbmdbal07XG5cbiAgICAgICAgICAgIGlmICgoYS55ID4gcC55ICE9PSBiLnkgPiBwLnkpICYmXG4gICAgICAgICAgICAgICAgKHAueCA8IChiLnggLSBhLngpICogKHAueSAtIGEueSkgLyAoYi55IC0gYS55KSArIGEueCkpIGluc2lkZSA9ICFpbnNpZGU7XG5cbiAgICAgICAgICAgIG1pbkRpc3RTcSA9IE1hdGgubWluKG1pbkRpc3RTcSwgZGlzdFRvU2VnbWVudFNxdWFyZWQocCwgYSwgYikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChpbnNpZGUgPyAxIDogLTEpICogTWF0aC5zcXJ0KG1pbkRpc3RTcSk7XG59XG5cbi8vIGdldCBwb2x5Z29uIGNlbnRyb2lkXG5mdW5jdGlvbiBnZXRDZW50cm9pZENlbGwocG9seWdvbikge1xuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb25bMF07XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBvaW50cy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IGIgPSBwb2ludHNbal07XG4gICAgICAgIGNvbnN0IGYgPSBhLnggKiBiLnkgLSBiLnggKiBhLnk7XG4gICAgICAgIHggKz0gKGEueCArIGIueCkgKiBmO1xuICAgICAgICB5ICs9IChhLnkgKyBiLnkpICogZjtcbiAgICAgICAgYXJlYSArPSBmICogMztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDZWxsKHggLyBhcmVhLCB5IC8gYXJlYSwgMCwgcG9seWdvbik7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQW5jaG9yIGZyb20gJy4vYW5jaG9yJztcblxuaW1wb3J0IHtnZXRBbmNob3JzLCBnZXRDZW50ZXJBbmNob3J9IGZyb20gJy4vZ2V0X2FuY2hvcnMnO1xuaW1wb3J0IGNsaXBMaW5lIGZyb20gJy4vY2xpcF9saW5lJztcbmltcG9ydCB7c2hhcGVUZXh0LCBzaGFwZUljb24sIFdyaXRpbmdNb2RlLCBmaXRJY29uVG9UZXh0fSBmcm9tICcuL3NoYXBpbmcnO1xuaW1wb3J0IHtnZXRHbHlwaFF1YWRzLCBnZXRJY29uUXVhZHN9IGZyb20gJy4vcXVhZHMnO1xuaW1wb3J0IENvbGxpc2lvbkZlYXR1cmUgZnJvbSAnLi9jb2xsaXNpb25fZmVhdHVyZSc7XG5pbXBvcnQge3dhcm5PbmNlfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHtcbiAgICBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlLFxuICAgIGFsbG93c0xldHRlclNwYWNpbmdcbn0gZnJvbSAnLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uJztcbmltcG9ydCBmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5IGZyb20gJy4uL3V0aWwvZmluZF9wb2xlX29mX2luYWNjZXNzaWJpbGl0eSc7XG5pbXBvcnQgY2xhc3NpZnlSaW5ncyBmcm9tICcuLi91dGlsL2NsYXNzaWZ5X3JpbmdzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHtTSVpFX1BBQ0tfRkFDVE9SfSBmcm9tICcuL3N5bWJvbF9zaXplJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi9vbmVfZW0nO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUge1NoYXBpbmcsIFBvc2l0aW9uZWRJY29uLCBUZXh0SnVzdGlmeX0gZnJvbSAnLi9zaGFwaW5nJztcbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5pbXBvcnQgdHlwZSB7U3ltYm9sRmVhdHVyZX0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2dseXBoJztcbmltcG9ydCB0eXBlIFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMnO1xuaW1wb3J0IHR5cGUge0dseXBoUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcyc7XG5pbXBvcnQgdHlwZSB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IG11cm11cjMgZnJvbSAnbXVybXVyaGFzaC1qcyc7XG5cbi8vIFRoZSBzeW1ib2wgbGF5b3V0IHByb2Nlc3MgbmVlZHMgYHRleHQtc2l6ZWAgZXZhbHVhdGVkIGF0IHVwIHRvIGZpdmUgZGlmZmVyZW50IHpvb20gbGV2ZWxzLCBhbmRcbi8vIGBpY29uLXNpemVgIGF0IHVwIHRvIHRocmVlOlxuLy9cbi8vICAgMS4gYHRleHQtc2l6ZWAgYXQgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGJ1Y2tldC4gVXNlZCB0byBjYWxjdWxhdGUgYSBwZXItZmVhdHVyZSBzaXplIGZvciBzb3VyY2UgYHRleHQtc2l6ZWBcbi8vICAgICAgIGV4cHJlc3Npb25zLCBhbmQgdG8gY2FsY3VsYXRlIHRoZSBib3ggZGltZW5zaW9ucyBmb3IgaWNvbi10ZXh0LWZpdC5cbi8vICAgMi4gYGljb24tc2l6ZWAgYXQgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGJ1Y2tldC4gVXNlZCB0byBjYWxjdWxhdGUgYSBwZXItZmVhdHVyZSBzaXplIGZvciBzb3VyY2UgYGljb24tc2l6ZWBcbi8vICAgICAgIGV4cHJlc3Npb25zLlxuLy8gICAzLiBgdGV4dC1zaXplYCBhbmQgYGljb24tc2l6ZWAgYXQgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGJ1Y2tldCwgcGx1cyBvbmUuIFVzZWQgdG8gY2FsY3VsYXRlIGNvbGxpc2lvbiBib3hlcy5cbi8vICAgNC4gYHRleHQtc2l6ZWAgYXQgem9vbSBsZXZlbCAxOC4gVXNlZCBmb3Igc29tZXRoaW5nIGxpbmUtc3ltYm9sLXBsYWNlbWVudC1yZWxhdGVkLlxuLy8gICA1LiAgRm9yIGNvbXBvc2l0ZSBgKi1zaXplYCBleHByZXNzaW9uczogdHdvIHpvb20gbGV2ZWxzIG9mIGN1cnZlIHN0b3BzIHRoYXQgXCJjb3ZlclwiIHRoZSB6b29tIGxldmVsIG9mIHRoZVxuLy8gICAgICAgYnVja2V0LiBUaGVzZSBnbyBpbnRvIGEgdmVydGV4IGJ1ZmZlciBhbmQgYXJlIHVzZWQgYnkgdGhlIHNoYWRlciB0byBpbnRlcnBvbGF0ZSB0aGUgc2l6ZSBhdCByZW5kZXIgdGltZS5cbi8vXG4vLyAoMSkgYW5kICgyKSBhcmUgc3RvcmVkIGluIGBidWNrZXQubGF5ZXJzWzBdLmxheW91dGAuIFRoZSByZW1haW5kZXIgYXJlIGJlbG93LlxuLy9cbnR5cGUgU2l6ZXMgPSB7XG4gICAgbGF5b3V0VGV4dFNpemU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCAvLyAoMylcbiAgICBsYXlvdXRJY29uU2l6ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4sIC8vICgzKVxuICAgIHRleHRNYXhTaXplOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPiwgICAgLy8gKDQpXG4gICAgY29tcG9zaXRlVGV4dFNpemVzOiBbUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4sIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+XSwgLy8gKDUpXG4gICAgY29tcG9zaXRlSWNvblNpemVzOiBbUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4sIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+XSwgLy8gKDUpXG59O1xuXG5leHBvcnQgdHlwZSBUZXh0QW5jaG9yID0gJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJyB8ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLXJpZ2h0JztcblxuLy8gVGhlIHJhZGlhbCBvZmZzZXQgaXMgdG8gdGhlIGVkZ2Ugb2YgdGhlIHRleHQgYm94XG4vLyBJbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24sIHRoZSBlZGdlIG9mIHRoZSB0ZXh0IGJveCBpcyB3aGVyZSBnbHlwaHMgc3RhcnRcbi8vIEJ1dCBpbiB0aGUgdmVydGljYWwgZGlyZWN0aW9uLCB0aGUgZ2x5cGhzIGFwcGVhciB0byBcInN0YXJ0XCIgYXQgdGhlIGJhc2VsaW5lXG4vLyBXZSBkb24ndCBhY3R1YWxseSBsb2FkIGJhc2VsaW5lIGRhdGEsIGJ1dCB3ZSBhc3N1bWUgYW4gb2Zmc2V0IG9mIE9ORV9FTSAtIDE3XG4vLyAoc2VlIFwieU9mZnNldFwiIGluIHNoYXBpbmcuanMpXG5jb25zdCBiYXNlbGluZU9mZnNldCA9IDc7XG5jb25zdCBJTlZBTElEX1RFWFRfT0ZGU0VUID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVWYXJpYWJsZU9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIG9mZnNldDogW251bWJlciwgbnVtYmVyXSkge1xuXG4gICAgZnVuY3Rpb24gZnJvbVJhZGlhbE9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIHJhZGlhbE9mZnNldDogbnVtYmVyKSB7XG4gICAgICAgIGxldCB4ID0gMCwgeSA9IDA7XG4gICAgICAgIGlmIChyYWRpYWxPZmZzZXQgPCAwKSByYWRpYWxPZmZzZXQgPSAwOyAvLyBJZ25vcmUgbmVnYXRpdmUgb2Zmc2V0LlxuICAgICAgICAvLyBzb2x2ZSBmb3IgciB3aGVyZSByXjIgKyByXjIgPSByYWRpYWxPZmZzZXReMlxuICAgICAgICBjb25zdCBoeXBvdGVudXNlID0gcmFkaWFsT2Zmc2V0IC8gTWF0aC5zcXJ0KDIpO1xuICAgICAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgICAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgICAgICB5ID0gaHlwb3RlbnVzZSAtIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHkgPSAtaHlwb3RlbnVzZSArIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICB5ID0gLXJhZGlhbE9mZnNldCArIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB5ID0gcmFkaWFsT2Zmc2V0IC0gYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgICAgICB4ID0gLWh5cG90ZW51c2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgICAgICB4ID0gaHlwb3RlbnVzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgIHggPSByYWRpYWxPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgeCA9IC1yYWRpYWxPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbVRleHRPZmZzZXQoYW5jaG9yOiBUZXh0QW5jaG9yLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlcikge1xuICAgICAgICBsZXQgeCA9IDAsIHkgPSAwO1xuICAgICAgICAvLyBVc2UgYWJzb2x1dGUgb2Zmc2V0IHZhbHVlcy5cbiAgICAgICAgb2Zmc2V0WCA9IE1hdGguYWJzKG9mZnNldFgpO1xuICAgICAgICBvZmZzZXRZID0gTWF0aC5hYnMob2Zmc2V0WSk7XG5cbiAgICAgICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgeSA9IG9mZnNldFkgLSBiYXNlbGluZU9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICB5ID0gLW9mZnNldFkgKyBiYXNlbGluZU9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgeCA9IC1vZmZzZXRYO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgIHggPSBvZmZzZXRYO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3gsIHldO1xuICAgIH1cblxuICAgIHJldHVybiAob2Zmc2V0WzFdICE9PSBJTlZBTElEX1RFWFRfT0ZGU0VUKSA/IGZyb21UZXh0T2Zmc2V0KGFuY2hvciwgb2Zmc2V0WzBdLCBvZmZzZXRbMV0pIDogZnJvbVJhZGlhbE9mZnNldChhbmNob3IsIG9mZnNldFswXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJmb3JtU3ltYm9sTGF5b3V0KGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7W251bWJlcl06ID9TdHlsZUdseXBofX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiB7W186IHN0cmluZ106IHtbbnVtYmVyXTogR2x5cGhQb3NpdGlvbn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1hcDoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBidWNrZXQuY3JlYXRlQXJyYXlzKCk7XG5cbiAgICBjb25zdCB0aWxlU2l6ZSA9IDUxMiAqIGJ1Y2tldC5vdmVyc2NhbGluZztcbiAgICBidWNrZXQudGlsZVBpeGVsUmF0aW8gPSBFWFRFTlQgLyB0aWxlU2l6ZTtcbiAgICBidWNrZXQuY29tcGFyZVRleHQgPSB7fTtcbiAgICBidWNrZXQuaWNvbnNOZWVkTGluZWFyID0gZmFsc2U7XG5cbiAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICBjb25zdCB1bmV2YWx1YXRlZExheW91dFZhbHVlcyA9IGJ1Y2tldC5sYXllcnNbMF0uX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXM7XG5cbiAgICBjb25zdCBzaXplcyA9IHt9O1xuXG4gICAgaWYgKGJ1Y2tldC50ZXh0U2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pblpvb20sIG1heFpvb219ID0gYnVja2V0LnRleHRTaXplRGF0YTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pLCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heFpvb20pLCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldC5pY29uU2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pblpvb20sIG1heFpvb219ID0gYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pLCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heFpvb20pLCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2l6ZXMubGF5b3V0VGV4dFNpemUgPSB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoYnVja2V0Lnpvb20gKyAxKSwgY2Fub25pY2FsKTtcbiAgICBzaXplcy5sYXlvdXRJY29uU2l6ZSA9IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhidWNrZXQuem9vbSArIDEpLCBjYW5vbmljYWwpO1xuICAgIHNpemVzLnRleHRNYXhTaXplID0gdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKDE4KSk7XG5cbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gbGF5b3V0LmdldCgndGV4dC1saW5lLWhlaWdodCcpICogT05FX0VNO1xuICAgIGNvbnN0IHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCc7XG4gICAgY29uc3Qga2VlcFVwcmlnaHQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWtlZXAtdXByaWdodCcpO1xuICAgIGNvbnN0IHRleHRTaXplID0gbGF5b3V0LmdldCgndGV4dC1zaXplJyk7XG5cbiAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgYnVja2V0LmZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IGZvbnRzdGFjayA9IGxheW91dC5nZXQoJ3RleHQtZm9udCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgbGF5b3V0VGV4dFNpemVUaGlzWm9vbSA9IHRleHRTaXplLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuICAgICAgICBjb25zdCBsYXlvdXRUZXh0U2l6ZSA9IHNpemVzLmxheW91dFRleHRTaXplLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuICAgICAgICBjb25zdCBsYXlvdXRJY29uU2l6ZSA9IHNpemVzLmxheW91dEljb25TaXplLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuXG4gICAgICAgIGNvbnN0IHNoYXBlZFRleHRPcmllbnRhdGlvbnMgPSB7XG4gICAgICAgICAgICBob3Jpem9udGFsOiB7fSxcbiAgICAgICAgICAgIHZlcnRpY2FsOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGZlYXR1cmUudGV4dDtcbiAgICAgICAgbGV0IHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBjb25zdCB1bmZvcm1hdHRlZFRleHQgPSB0ZXh0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBzcGFjaW5nID0gbGF5b3V0LmdldCgndGV4dC1sZXR0ZXItc3BhY2luZycpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpICogT05FX0VNO1xuICAgICAgICAgICAgY29uc3Qgc3BhY2luZ0lmQWxsb3dlZCA9IGFsbG93c0xldHRlclNwYWNpbmcodW5mb3JtYXR0ZWRUZXh0KSA/IHNwYWNpbmcgOiAwO1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0QW5jaG9yID0gbGF5b3V0LmdldCgndGV4dC1hbmNob3InKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlVGV4dEFuY2hvciA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG5cbiAgICAgICAgICAgIGlmICghdmFyaWFibGVUZXh0QW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFkaWFsT2Zmc2V0ID0gbGF5b3V0LmdldCgndGV4dC1yYWRpYWwtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICAgICAgLy8gTGF5ZXJzIHdpdGggdmFyaWFibGUgYW5jaG9ycyB1c2UgdGhlIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHByb3BlcnR5IGFuZCB0aGUgW3gsIHldIG9mZnNldCB2ZWN0b3JcbiAgICAgICAgICAgICAgICAvLyBpcyBjYWxjdWxhdGVkIGF0IHBsYWNlbWVudCB0aW1lIGluc3RlYWQgb2YgbGF5b3V0IHRpbWVcbiAgICAgICAgICAgICAgICBpZiAocmFkaWFsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdHlsZSBzcGVjIHNheXMgZG9uJ3QgdXNlIGB0ZXh0LW9mZnNldGAgYW5kIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hhdCBoYXBwZW5zIGlmIHlvdSB1c2UgYm90aC4gV2UgZ28gd2l0aCB0aGUgcmFkaWFsIG9mZnNldC5cbiAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IGV2YWx1YXRlVmFyaWFibGVPZmZzZXQodGV4dEFuY2hvciwgW3JhZGlhbE9mZnNldCAqIE9ORV9FTSwgSU5WQUxJRF9URVhUX09GRlNFVF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgPSAobGF5b3V0LmdldCgndGV4dC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKS5tYXAodCA9PiB0ICogT05FX0VNKTogYW55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0SnVzdGlmeSA9IHRleHRBbG9uZ0xpbmUgP1xuICAgICAgICAgICAgICAgIFwiY2VudGVyXCIgOlxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtanVzdGlmeScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuXG4gICAgICAgICAgICBjb25zdCBzeW1ib2xQbGFjZW1lbnQgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50Jyk7XG4gICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHN5bWJvbFBsYWNlbWVudCA9PT0gJ3BvaW50JyA/XG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1tYXgtd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKSAqIE9ORV9FTSA6XG4gICAgICAgICAgICAgICAgMDtcblxuICAgICAgICAgICAgY29uc3QgYWRkVmVydGljYWxTaGFwaW5nRm9yUG9pbnRMYWJlbElmTmVlZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlKHVuZm9ybWF0dGVkVGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmVydGljYWwgUE9JIGxhYmVsIHBsYWNlbWVudCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBzY3JpcHRzIHRoYXQgc3VwcG9ydCB2ZXJ0aWNhbFxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0aW5nIG1vZGUsIHRodXMsIGRlZmF1bHQgbGVmdCBqdXN0aWZpY2F0aW9uIGlzIHVzZWQuIElmIExhdGluXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjcmlwdHMgd291bGQgbmVlZCB0byBiZSBzdXBwb3J0ZWQsIHRoaXMgc2hvdWxkIHRha2UgaW50byBhY2NvdW50IG90aGVyIGp1c3RpZmljYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsID0gc2hhcGVUZXh0KHRleHQsIGdseXBoTWFwLCBnbHlwaFBvc2l0aW9ucywgaW1hZ2VQb3NpdGlvbnMsIGZvbnRzdGFjaywgbWF4V2lkdGgsIGxpbmVIZWlnaHQsIHRleHRBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQnLCBzcGFjaW5nSWZBbGxvd2VkLCB0ZXh0T2Zmc2V0LCBXcml0aW5nTW9kZS52ZXJ0aWNhbCwgdHJ1ZSwgc3ltYm9sUGxhY2VtZW50LCBsYXlvdXRUZXh0U2l6ZSwgbGF5b3V0VGV4dFNpemVUaGlzWm9vbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gSWYgdGhpcyBsYXllciB1c2VzIHRleHQtdmFyaWFibGUtYW5jaG9yLCBnZW5lcmF0ZSBzaGFwaW5ncyBmb3IgYWxsIGp1c3RpZmljYXRpb24gcG9zc2liaWxpdGllcy5cbiAgICAgICAgICAgIGlmICghdGV4dEFsb25nTGluZSAmJiB2YXJpYWJsZVRleHRBbmNob3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqdXN0aWZpY2F0aW9ucyA9IHRleHRKdXN0aWZ5ID09PSBcImF1dG9cIiA/XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVGV4dEFuY2hvci5tYXAoYSA9PiBnZXRBbmNob3JKdXN0aWZpY2F0aW9uKGEpKSA6XG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0SnVzdGlmeV07XG5cbiAgICAgICAgICAgICAgICBsZXQgc2luZ2xlTGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwganVzdGlmaWNhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QganVzdGlmaWNhdGlvbjogVGV4dEp1c3RpZnkgPSBqdXN0aWZpY2F0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFtqdXN0aWZpY2F0aW9uXSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2hhcGluZyBmb3IgdGhlIGZpcnN0IGp1c3RpZmljYXRpb24gd2FzIG9ubHkgYSBzaW5nbGUgbGluZSwgd2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiByZS11c2UgaXQgZm9yIHRoZSBvdGhlciBqdXN0aWZpY2F0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsWzBdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdXNpbmcgdGV4dC12YXJpYWJsZS1hbmNob3IgZm9yIHRoZSBsYXllciwgd2UgdXNlIGEgY2VudGVyIGFuY2hvciBmb3IgYWxsIHNoYXBpbmdzIGFuZCBhcHBseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9mZnNldHMgZm9yIHRoZSBhbmNob3IgaW4gdGhlIHBsYWNlbWVudCBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcGluZyA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZ2x5cGhQb3NpdGlvbnMsIGltYWdlUG9zaXRpb25zLCBmb250c3RhY2ssIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmaWNhdGlvbiwgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCwgZmFsc2UsIHN5bWJvbFBsYWNlbWVudCwgbGF5b3V0VGV4dFNpemUsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYXBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbanVzdGlmaWNhdGlvbl0gPSBzaGFwaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUxpbmUgPSBzaGFwaW5nLnBvc2l0aW9uZWRMaW5lcy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0aWNhbFNoYXBpbmdGb3JQb2ludExhYmVsSWZOZWVkZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRKdXN0aWZ5ID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmeSA9IGdldEFuY2hvckp1c3RpZmljYXRpb24odGV4dEFuY2hvcik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBwb2ludCBvciBsaW5lIGxhYmVsLlxuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBpbmcgPSBzaGFwZVRleHQodGV4dCwgZ2x5cGhNYXAsIGdseXBoUG9zaXRpb25zLCBpbWFnZVBvc2l0aW9ucywgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvciwgdGV4dEp1c3RpZnksIHNwYWNpbmdJZkFsbG93ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0LCBXcml0aW5nTW9kZS5ob3Jpem9udGFsLCBmYWxzZSwgc3ltYm9sUGxhY2VtZW50LCBsYXlvdXRUZXh0U2l6ZSwgbGF5b3V0VGV4dFNpemVUaGlzWm9vbSk7XG4gICAgICAgICAgICAgICAgaWYgKHNoYXBpbmcpIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFt0ZXh0SnVzdGlmeV0gPSBzaGFwaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gVmVydGljYWwgcG9pbnQgbGFiZWwgKGlmIGFsbG93VmVydGljYWxQbGFjZW1lbnQgaXMgZW5hYmxlZCkuXG4gICAgICAgICAgICAgICAgYWRkVmVydGljYWxTaGFwaW5nRm9yUG9pbnRMYWJlbElmTmVlZGVkKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbGl6ZWQgbGluZSBsYWJlbC5cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSh1bmZvcm1hdHRlZFRleHQpICYmIHRleHRBbG9uZ0xpbmUgJiYga2VlcFVwcmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZ2x5cGhQb3NpdGlvbnMsIGltYWdlUG9zaXRpb25zLCBmb250c3RhY2ssIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCB0ZXh0QW5jaG9yLCB0ZXh0SnVzdGlmeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nSWZBbGxvd2VkLCB0ZXh0T2Zmc2V0LCBXcml0aW5nTW9kZS52ZXJ0aWNhbCwgZmFsc2UsIHN5bWJvbFBsYWNlbWVudCwgbGF5b3V0VGV4dFNpemUsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaGFwZWRJY29uO1xuICAgICAgICBsZXQgaXNTREZJY29uID0gZmFsc2U7XG4gICAgICAgIGlmIChmZWF0dXJlLmljb24gJiYgZmVhdHVyZS5pY29uLm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gaW1hZ2VNYXBbZmVhdHVyZS5pY29uLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICAgICAgc2hhcGVkSWNvbiA9IHNoYXBlSWNvbihcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnNbZmVhdHVyZS5pY29uLm5hbWVdLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLWFuY2hvcicpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpKTtcbiAgICAgICAgICAgICAgICBpc1NERkljb24gPSBpbWFnZS5zZGY7XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5zZGZJY29ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5zZGZJY29ucyA9IGltYWdlLnNkZjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1Y2tldC5zZGZJY29ucyAhPT0gaW1hZ2Uuc2RmKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdTdHlsZSBzaGVldCB3YXJuaW5nOiBDYW5ub3QgbWl4IFNERiBhbmQgbm9uLVNERiBpY29ucyBpbiBvbmUgYnVmZmVyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbWFnZS5waXhlbFJhdGlvICE9PSBidWNrZXQucGl4ZWxSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuaWNvbnNOZWVkTGluZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91dC5nZXQoJ2ljb24tcm90YXRlJykuY29uc3RhbnRPcigxKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuaWNvbnNOZWVkTGluZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaGFwZWRUZXh0ID0gZ2V0RGVmYXVsdEhvcml6b250YWxTaGFwaW5nKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCkgfHwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbDtcbiAgICAgICAgYnVja2V0Lmljb25zSW5UZXh0ID0gc2hhcGVkVGV4dCA/IHNoYXBlZFRleHQuaWNvbnNJblRleHQgOiBmYWxzZTtcbiAgICAgICAgaWYgKHNoYXBlZFRleHQgfHwgc2hhcGVkSWNvbikge1xuICAgICAgICAgICAgYWRkRmVhdHVyZShidWNrZXQsIGZlYXR1cmUsIHNoYXBlZFRleHRPcmllbnRhdGlvbnMsIHNoYXBlZEljb24sIGltYWdlTWFwLCBzaXplcywgbGF5b3V0VGV4dFNpemUsIGxheW91dEljb25TaXplLCB0ZXh0T2Zmc2V0LCBpc1NERkljb24sIGNhbm9uaWNhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0NvbGxpc2lvbkJveGVzKSB7XG4gICAgICAgIGJ1Y2tldC5nZW5lcmF0ZUNvbGxpc2lvbkRlYnVnQnVmZmVycygpO1xuICAgIH1cbn1cblxuLy8gQ2hvb3NlIHRoZSBqdXN0aWZpY2F0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBUZXh0QW5jaG9yXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbihhbmNob3I6IFRleHRBbmNob3IpOiBUZXh0SnVzdGlmeSAge1xuICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICB9XG4gICAgcmV0dXJuICdjZW50ZXInO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgZmVhdHVyZSBhbmQgaXRzIHNoYXBlZCB0ZXh0IGFuZCBpY29uIGRhdGEsIGFkZCBhICdzeW1ib2xcbiAqIGluc3RhbmNlJyBmb3IgZWFjaCBfcG9zc2libGVfIHBsYWNlbWVudCBvZiB0aGUgc3ltYm9sIGZlYXR1cmUuXG4gKiAoQXQgcmVuZGVyIHRpbWVQbGFjZVN5bWJvbHMjcGxhY2UoKSBzZWxlY3RzIHdoaWNoIG9mIHRoZXNlIGluc3RhbmNlcyB0b1xuICogc2hvdyBvciBoaWRlIGJhc2VkIG9uIGNvbGxpc2lvbnMgd2l0aCBzeW1ib2xzIGluIG90aGVyIGxheWVycy4pXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRGZWF0dXJlKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zOiBhbnksXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246IFBvc2l0aW9uZWRJY29uIHwgdm9pZCxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXA6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sXG4gICAgICAgICAgICAgICAgICAgIHNpemVzOiBTaXplcyxcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SWNvblNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgaXNTREZJY29uOiBib29sZWFuLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxhYmVscyB0aGF0IGp1bXAgYXJvdW5kIHdoZW4gem9vbWluZyB3ZSBuZWVkXG4gICAgLy8gdG8gdXNlIGEgdGV4dC1zaXplIHZhbHVlIHRoYXQgaXMgdGhlIHNhbWUgZm9yIGFsbCB6b29tIGxldmVscy5cbiAgICAvLyBidWNrZXQgY2FsY3VsYXRlcyB0ZXh0LXNpemUgYXQgYSBoaWdoIHpvb20gbGV2ZWwgc28gdGhhdCBhbGwgdGlsZXMgY2FuXG4gICAgLy8gdXNlIHRoZSBzYW1lIHZhbHVlIHdoZW4gY2FsY3VsYXRpbmcgYW5jaG9yIHBvc2l0aW9ucy5cbiAgICBsZXQgdGV4dE1heFNpemUgPSBzaXplcy50ZXh0TWF4U2l6ZS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgaWYgKHRleHRNYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGV4dE1heFNpemUgPSBsYXlvdXRUZXh0U2l6ZTtcbiAgICB9XG4gICAgY29uc3QgbGF5b3V0ID0gYnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG4gICAgY29uc3QgaWNvbk9mZnNldCA9IGxheW91dC5nZXQoJ2ljb24tb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgY29uc3QgZGVmYXVsdEhvcml6b250YWxTaGFwaW5nID0gZ2V0RGVmYXVsdEhvcml6b250YWxTaGFwaW5nKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCk7XG4gICAgY29uc3QgZ2x5cGhTaXplID0gMjQsXG4gICAgICAgIGZvbnRTY2FsZSA9IGxheW91dFRleHRTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICB0ZXh0Qm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBmb250U2NhbGUsXG4gICAgICAgIHRleHRNYXhCb3hTY2FsZSA9IGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyAqIHRleHRNYXhTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICBpY29uQm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRJY29uU2l6ZSxcbiAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXQuZ2V0KCdzeW1ib2wtc3BhY2luZycpLFxuICAgICAgICB0ZXh0UGFkZGluZyA9IGxheW91dC5nZXQoJ3RleHQtcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICBpY29uUGFkZGluZyA9IGxheW91dC5nZXQoJ2ljb24tcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICB0ZXh0TWF4QW5nbGUgPSBsYXlvdXQuZ2V0KCd0ZXh0LW1heC1hbmdsZScpIC8gMTgwICogTWF0aC5QSSxcbiAgICAgICAgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JyxcbiAgICAgICAgaWNvbkFsb25nTGluZSA9IGxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JyxcbiAgICAgICAgc3ltYm9sUGxhY2VtZW50ID0gbGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpLFxuICAgICAgICB0ZXh0UmVwZWF0RGlzdGFuY2UgPSBzeW1ib2xNaW5EaXN0YW5jZSAvIDI7XG5cbiAgICBjb25zdCBpY29uVGV4dEZpdCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKTtcbiAgICBsZXQgdmVydGljYWxseVNoYXBlZEljb247XG4gICAgLy8gQWRqdXN0IHNoYXBlZCBpY29uIHNpemUgd2hlbiBpY29uLXRleHQtZml0IGlzIHVzZWQuXG4gICAgaWYgKHNoYXBlZEljb24gJiYgaWNvblRleHRGaXQgIT09ICdub25lJykge1xuICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdmVydGljYWxseVNoYXBlZEljb24gPSBmaXRJY29uVG9UZXh0KHNoYXBlZEljb24sIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwsIGljb25UZXh0Rml0LFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpLCBpY29uT2Zmc2V0LCBmb250U2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcpIHtcbiAgICAgICAgICAgIHNoYXBlZEljb24gPSBmaXRJY29uVG9UZXh0KHNoYXBlZEljb24sIGRlZmF1bHRIb3Jpem9udGFsU2hhcGluZywgaWNvblRleHRGaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0LXBhZGRpbmcnKSwgaWNvbk9mZnNldCwgZm9udFNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZFN5bWJvbEF0QW5jaG9yID0gKGxpbmUsIGFuY2hvcikgPT4ge1xuICAgICAgICBpZiAoYW5jaG9yLnggPCAwIHx8IGFuY2hvci54ID49IEVYVEVOVCB8fCBhbmNob3IueSA8IDAgfHwgYW5jaG9yLnkgPj0gRVhURU5UKSB7XG4gICAgICAgICAgICAvLyBTeW1ib2wgbGF5ZXJzIGFyZSBkcmF3biBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzLCBXZSBmaWx0ZXIgb3V0IHN5bWJvbHNcbiAgICAgICAgICAgIC8vIG91dHNpZGUgb3VyIHRpbGUgYm91bmRhcmllcyAod2hpY2ggbWF5IGJlIGluY2x1ZGVkIGluIHZlY3RvciB0aWxlIGJ1ZmZlcnMpXG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IGRvdWJsZS1kcmF3aW5nIHN5bWJvbHMuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhZGRTeW1ib2woYnVja2V0LCBhbmNob3IsIGxpbmUsIHNoYXBlZFRleHRPcmllbnRhdGlvbnMsIHNoYXBlZEljb24sIGltYWdlTWFwLCB2ZXJ0aWNhbGx5U2hhcGVkSWNvbiwgYnVja2V0LmxheWVyc1swXSxcbiAgICAgICAgICAgIGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheSwgZmVhdHVyZS5pbmRleCwgZmVhdHVyZS5zb3VyY2VMYXllckluZGV4LCBidWNrZXQuaW5kZXgsXG4gICAgICAgICAgICB0ZXh0Qm94U2NhbGUsIHRleHRQYWRkaW5nLCB0ZXh0QWxvbmdMaW5lLCB0ZXh0T2Zmc2V0LFxuICAgICAgICAgICAgaWNvbkJveFNjYWxlLCBpY29uUGFkZGluZywgaWNvbkFsb25nTGluZSwgaWNvbk9mZnNldCxcbiAgICAgICAgICAgIGZlYXR1cmUsIHNpemVzLCBpc1NERkljb24sIGNhbm9uaWNhbCwgbGF5b3V0VGV4dFNpemUpO1xuICAgIH07XG5cbiAgICBpZiAoc3ltYm9sUGxhY2VtZW50ID09PSAnbGluZScpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGNsaXBMaW5lKGZlYXR1cmUuZ2VvbWV0cnksIDAsIDAsIEVYVEVOVCwgRVhURU5UKSkge1xuICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IGdldEFuY2hvcnMoXG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBzeW1ib2xNaW5EaXN0YW5jZSxcbiAgICAgICAgICAgICAgICB0ZXh0TWF4QW5nbGUsXG4gICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCB8fCBkZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgc2hhcGVkSWNvbixcbiAgICAgICAgICAgICAgICBnbHlwaFNpemUsXG4gICAgICAgICAgICAgICAgdGV4dE1heEJveFNjYWxlLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5vdmVyc2NhbGluZyxcbiAgICAgICAgICAgICAgICBFWFRFTlRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFuY2hvciBvZiBhbmNob3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGVkVGV4dCA9IGRlZmF1bHRIb3Jpem9udGFsU2hhcGluZztcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlZFRleHQgfHwgIWFuY2hvcklzVG9vQ2xvc2UoYnVja2V0LCBzaGFwZWRUZXh0LnRleHQsIHRleHRSZXBlYXREaXN0YW5jZSwgYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3ltYm9sUGxhY2VtZW50ID09PSAnbGluZS1jZW50ZXInKSB7XG4gICAgICAgIC8vIE5vIGNsaXBwaW5nLCBtdWx0aXBsZSBsaW5lcyBwZXIgZmVhdHVyZSBhcmUgYWxsb3dlZFxuICAgICAgICAvLyBcImxpbmVzXCIgd2l0aCBvbmx5IG9uZSBwb2ludCBhcmUgaWdub3JlZCBhcyBpbiBjbGlwTGluZXNcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGZlYXR1cmUuZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSBnZXRDZW50ZXJBbmNob3IoXG4gICAgICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgIHRleHRNYXhBbmdsZSxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCB8fCBkZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb24sXG4gICAgICAgICAgICAgICAgICAgIGdseXBoU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dE1heEJveFNjYWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKGxpbmUsIGFuY2hvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhmZWF0dXJlLmdlb21ldHJ5LCAwKSkge1xuICAgICAgICAgICAgLy8gMTYgaGVyZSByZXByZXNlbnRzIDIgcGl4ZWxzXG4gICAgICAgICAgICBjb25zdCBwb2kgPSBmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5KHBvbHlnb24sIDE2KTtcbiAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKHBvbHlnb25bMF0sIG5ldyBBbmNob3IocG9pLngsIHBvaS55LCAwKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zODA4XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBuZXcgQW5jaG9yKGxpbmVbMF0ueCwgbGluZVswXS55LCAwKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50cyBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKFtwb2ludF0sIG5ldyBBbmNob3IocG9pbnQueCwgcG9pbnQueSwgMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBNQVhfR0xZUEhfSUNPTl9TSVpFID0gMjU1O1xuY29uc3QgTUFYX1BBQ0tFRF9TSVpFID0gTUFYX0dMWVBIX0lDT05fU0laRSAqIFNJWkVfUEFDS19GQUNUT1I7XG5leHBvcnQge01BWF9QQUNLRURfU0laRX07XG5cbmZ1bmN0aW9uIGFkZFRleHRWZXJ0aWNlcyhidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I6IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHQ6IFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXA6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGluZUFycmF5OiB7bGluZVN0YXJ0SW5kZXg6IG51bWJlciwgbGluZUxlbmd0aDogbnVtYmVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nTW9kZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudFR5cGVzOiBBcnJheTwndmVydGljYWwnIHwgJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlczoge1tfOiBzdHJpbmddOiBudW1iZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZEljb25JbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBTaXplcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIGNvbnN0IGdseXBoUXVhZHMgPSBnZXRHbHlwaFF1YWRzKGFuY2hvciwgc2hhcGVkVGV4dCwgdGV4dE9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciwgdGV4dEFsb25nTGluZSwgZmVhdHVyZSwgaW1hZ2VNYXAsIGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50KTtcblxuICAgIGNvbnN0IHNpemVEYXRhID0gYnVja2V0LnRleHRTaXplRGF0YTtcbiAgICBsZXQgdGV4dFNpemVEYXRhID0gbnVsbDtcblxuICAgIGlmIChzaXplRGF0YS5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICB0ZXh0U2l6ZURhdGEgPSBbXG4gICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogbGF5ZXIubGF5b3V0LmdldCgndGV4dC1zaXplJykuZXZhbHVhdGUoZmVhdHVyZSwge30pXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZXh0U2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcInRleHQtc2l6ZVwiIGlzID49ICR7TUFYX0dMWVBIX0lDT05fU0laRX0uIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIHRleHRTaXplRGF0YSA9IFtcbiAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBzaXplcy5jb21wb3NpdGVUZXh0U2l6ZXNbMF0uZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCksXG4gICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzWzFdLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZXh0U2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUgfHwgdGV4dFNpemVEYXRhWzFdID4gTUFYX1BBQ0tFRF9TSVpFKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJ0ZXh0LXNpemVcIiBpcyA+PSAke01BWF9HTFlQSF9JQ09OX1NJWkV9LiBSZWR1Y2UgeW91ciBcInRleHQtc2l6ZVwiLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVja2V0LmFkZFN5bWJvbHMoXG4gICAgICAgIGJ1Y2tldC50ZXh0LFxuICAgICAgICBnbHlwaFF1YWRzLFxuICAgICAgICB0ZXh0U2l6ZURhdGEsXG4gICAgICAgIHRleHRPZmZzZXQsXG4gICAgICAgIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgIGZlYXR1cmUsXG4gICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGxpbmVBcnJheS5saW5lU3RhcnRJbmRleCxcbiAgICAgICAgbGluZUFycmF5LmxpbmVMZW5ndGgsXG4gICAgICAgIHBsYWNlZEljb25JbmRleCxcbiAgICAgICAgY2Fub25pY2FsKTtcblxuICAgIC8vIFRoZSBwbGFjZWRTeW1ib2xBcnJheSBpcyB1c2VkIGF0IHJlbmRlciB0aW1lIGluIGRyYXdUaWxlU3ltYm9sc1xuICAgIC8vIFRoZXNlIGluZGljZXMgYWxsb3cgYWNjZXNzIHRvIHRoZSBhcnJheSBhdCBjb2xsaXNpb24gZGV0ZWN0aW9uIHRpbWVcbiAgICBmb3IgKGNvbnN0IHBsYWNlbWVudFR5cGUgb2YgcGxhY2VtZW50VHlwZXMpIHtcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXNbcGxhY2VtZW50VHlwZV0gPSBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaFF1YWRzLmxlbmd0aCAqIDQ7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRIb3Jpem9udGFsU2hhcGluZyhob3Jpem9udGFsU2hhcGluZzoge1tfOiBUZXh0SnVzdGlmeV06IFNoYXBpbmd9KTogU2hhcGluZyB8IG51bGwge1xuICAgIC8vIFdlIGRvbid0IGNhcmUgd2hpY2ggc2hhcGluZyB3ZSBnZXQgYmVjYXVzZSB0aGlzIGlzIHVzZWQgZm9yIGNvbGxpc2lvbiBwdXJwb3Nlc1xuICAgIC8vIGFuZCBhbGwgdGhlIGp1c3RpZmljYXRpb25zIGhhdmUgdGhlIHNhbWUgY29sbGlzaW9uIGJveFxuICAgIGZvciAoY29uc3QganVzdGlmaWNhdGlvbjogYW55IGluIGhvcml6b250YWxTaGFwaW5nKSB7XG4gICAgICAgIHJldHVybiBob3Jpem9udGFsU2hhcGluZ1tqdXN0aWZpY2F0aW9uXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIGxhYmVsICYgaWNvbiBwbGFjZW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkU3ltYm9sKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgIGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgIGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zOiBhbnksXG4gICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24gfCB2b2lkLFxuICAgICAgICAgICAgICAgICAgIGltYWdlTWFwOiB7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9LFxuICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsbHlTaGFwZWRJY29uOiBQb3NpdGlvbmVkSWNvbiB8IHZvaWQsXG4gICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHRleHRCb3hTY2FsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHRleHRQYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdGV4dEFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGljb25Cb3hTY2FsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGljb25QYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgaWNvbkFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICBpY29uT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzLFxuICAgICAgICAgICAgICAgICAgIGlzU0RGSWNvbjogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCxcbiAgICAgICAgICAgICAgICAgICBsYXlvdXRUZXh0U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgbGluZUFycmF5ID0gYnVja2V0LmFkZFRvTGluZVZlcnRleEFycmF5KGFuY2hvciwgbGluZSk7XG5cbiAgICBsZXQgdGV4dENvbGxpc2lvbkZlYXR1cmUsIGljb25Db2xsaXNpb25GZWF0dXJlLCB2ZXJ0aWNhbFRleHRDb2xsaXNpb25GZWF0dXJlLCB2ZXJ0aWNhbEljb25Db2xsaXNpb25GZWF0dXJlO1xuXG4gICAgbGV0IG51bUljb25WZXJ0aWNlcyA9IDA7XG4gICAgbGV0IG51bVZlcnRpY2FsSWNvblZlcnRpY2VzID0gMDtcbiAgICBsZXQgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMgPSAwO1xuICAgIGxldCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPSAwO1xuICAgIGxldCBwbGFjZWRJY29uU3ltYm9sSW5kZXggPSAtMTtcbiAgICBsZXQgdmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXggPSAtMTtcbiAgICBjb25zdCBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcyA9IHt9O1xuICAgIGxldCBrZXkgPSBtdXJtdXIzKCcnKTtcblxuICAgIGxldCB0ZXh0T2Zmc2V0MCA9IDA7XG4gICAgbGV0IHRleHRPZmZzZXQxID0gMDtcbiAgICBpZiAobGF5ZXIuX3VuZXZhbHVhdGVkTGF5b3V0LmdldFZhbHVlKCd0ZXh0LXJhZGlhbC1vZmZzZXQnKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFt0ZXh0T2Zmc2V0MCwgdGV4dE9mZnNldDFdID0gKGxheWVyLmxheW91dC5nZXQoJ3RleHQtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkubWFwKHQgPT4gdCAqIE9ORV9FTSk6IGFueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dE9mZnNldDAgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJhZGlhbC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKSAqIE9ORV9FTTtcbiAgICAgICAgdGV4dE9mZnNldDEgPSBJTlZBTElEX1RFWFRfT0ZGU0VUO1xuICAgIH1cblxuICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsKSB7XG4gICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsVGV4dFJvdGF0aW9uID0gdGV4dFJvdGF0aW9uICsgOTAuMDtcbiAgICAgICAgY29uc3QgdmVydGljYWxTaGFwaW5nID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbDtcbiAgICAgICAgdmVydGljYWxUZXh0Q29sbGlzaW9uRmVhdHVyZSA9IG5ldyBDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5LCBhbmNob3IsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsIHZlcnRpY2FsU2hhcGluZywgdGV4dEJveFNjYWxlLCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSwgdmVydGljYWxUZXh0Um90YXRpb24pO1xuXG4gICAgICAgIGlmICh2ZXJ0aWNhbGx5U2hhcGVkSWNvbikge1xuICAgICAgICAgICAgdmVydGljYWxJY29uQ29sbGlzaW9uRmVhdHVyZSA9IG5ldyBDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5LCBhbmNob3IsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsIHZlcnRpY2FsbHlTaGFwZWRJY29uLCBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCB0ZXh0QWxvbmdMaW5lLCB2ZXJ0aWNhbFRleHRSb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL1BsYWNlIGljb24gZmlyc3QsIHNvIHRleHQgY2FuIGhhdmUgYSByZWZlcmVuY2UgdG8gaXRzIGluZGV4IGluIHRoZSBwbGFjZWQgc3ltYm9sIGFycmF5LlxuICAgIC8vVGV4dCBzeW1ib2xzIGNhbiBsYXppbHkgc2hpZnQgYXQgcmVuZGVyLXRpbWUgYmVjYXVzZSBvZiB2YXJpYWJsZSBhbmNob3IgcGxhY2VtZW50LlxuICAgIC8vSWYgdGhlIHN0eWxlIHNwZWNpZmllcyBhbiBgaWNvbi10ZXh0LWZpdGAgdGhlbiB0aGUgaWNvbiB3b3VsZCBoYXZlIHRvIHNoaWZ0IGFsb25nIHdpdGggaXQuXG4gICAgLy8gRm9yIG1vcmUgaW5mbyBjaGVjayBgdXBkYXRlVmFyaWFibGVBbmNob3JzYCBpbiBgZHJhd19zeW1ib2wuanNgIC5cbiAgICBpZiAoc2hhcGVkSWNvbikge1xuICAgICAgICBjb25zdCBpY29uUm90YXRlID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1yb3RhdGUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgICAgIGNvbnN0IGhhc0ljb25UZXh0Rml0ID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZSc7XG4gICAgICAgIGNvbnN0IGljb25RdWFkcyA9IGdldEljb25RdWFkcyhzaGFwZWRJY29uLCBpY29uUm90YXRlLCBpc1NERkljb24sIGhhc0ljb25UZXh0Rml0KTtcbiAgICAgICAgY29uc3QgdmVydGljYWxJY29uUXVhZHMgPSB2ZXJ0aWNhbGx5U2hhcGVkSWNvbiA/IGdldEljb25RdWFkcyh2ZXJ0aWNhbGx5U2hhcGVkSWNvbiwgaWNvblJvdGF0ZSwgaXNTREZJY29uLCBoYXNJY29uVGV4dEZpdCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGljb25Db2xsaXNpb25GZWF0dXJlID0gbmV3IENvbGxpc2lvbkZlYXR1cmUoY29sbGlzaW9uQm94QXJyYXksIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgc2hhcGVkSWNvbiwgaWNvbkJveFNjYWxlLCBpY29uUGFkZGluZywgLyphbGlnbiBib3hlcyB0byBsaW5lKi9mYWxzZSwgaWNvblJvdGF0ZSk7XG5cbiAgICAgICAgbnVtSWNvblZlcnRpY2VzID0gaWNvblF1YWRzLmxlbmd0aCAqIDQ7XG5cbiAgICAgICAgY29uc3Qgc2l6ZURhdGEgPSBidWNrZXQuaWNvblNpemVEYXRhO1xuICAgICAgICBsZXQgaWNvblNpemVEYXRhID0gbnVsbDtcblxuICAgICAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgIGljb25TaXplRGF0YSA9IFtcbiAgICAgICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1zaXplJykuZXZhbHVhdGUoZmVhdHVyZSwge30pXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGljb25TaXplRGF0YVswXSA+IE1BWF9QQUNLRURfU0laRSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcImljb24tc2l6ZVwiIGlzID49ICR7TUFYX0dMWVBIX0lDT05fU0laRX0uIFJlZHVjZSB5b3VyIFwiaWNvbi1zaXplXCIuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgICAgIGljb25TaXplRGF0YSA9IFtcbiAgICAgICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzWzBdLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBzaXplcy5jb21wb3NpdGVJY29uU2l6ZXNbMV0uZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbClcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoaWNvblNpemVEYXRhWzBdID4gTUFYX1BBQ0tFRF9TSVpFIHx8IGljb25TaXplRGF0YVsxXSA+IE1BWF9QQUNLRURfU0laRSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcImljb24tc2l6ZVwiIGlzID49ICR7TUFYX0dMWVBIX0lDT05fU0laRX0uIFJlZHVjZSB5b3VyIFwiaWNvbi1zaXplXCIuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuYWRkU3ltYm9scyhcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uLFxuICAgICAgICAgICAgaWNvblF1YWRzLFxuICAgICAgICAgICAgaWNvblNpemVEYXRhLFxuICAgICAgICAgICAgaWNvbk9mZnNldCxcbiAgICAgICAgICAgIGljb25BbG9uZ0xpbmUsXG4gICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBsaW5lQXJyYXkubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBsaW5lQXJyYXkubGluZUxlbmd0aCxcbiAgICAgICAgICAgIC8vIFRoZSBpY29uIGl0c2VsZiBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sIHNpbmNlIHRoZSB0ZXh0IGlzbnQgcGxhY2VkIHlldFxuICAgICAgICAgICAgLTEsIGNhbm9uaWNhbCk7XG5cbiAgICAgICAgcGxhY2VkSWNvblN5bWJvbEluZGV4ID0gYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAodmVydGljYWxJY29uUXVhZHMpIHtcbiAgICAgICAgICAgIG51bVZlcnRpY2FsSWNvblZlcnRpY2VzID0gdmVydGljYWxJY29uUXVhZHMubGVuZ3RoICogNDtcblxuICAgICAgICAgICAgYnVja2V0LmFkZFN5bWJvbHMoXG4gICAgICAgICAgICAgICAgYnVja2V0Lmljb24sXG4gICAgICAgICAgICAgICAgdmVydGljYWxJY29uUXVhZHMsXG4gICAgICAgICAgICAgICAgaWNvblNpemVEYXRhLFxuICAgICAgICAgICAgICAgIGljb25PZmZzZXQsXG4gICAgICAgICAgICAgICAgaWNvbkFsb25nTGluZSxcbiAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgIFdyaXRpbmdNb2RlLnZlcnRpY2FsLFxuICAgICAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgICAgICBsaW5lQXJyYXkubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgbGluZUFycmF5LmxpbmVMZW5ndGgsXG4gICAgICAgICAgICAgICAgLy8gVGhlIGljb24gaXRzZWxmIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wgc2luY2UgdGhlIHRleHQgaXNudCBwbGFjZWQgeWV0XG4gICAgICAgICAgICAgICAgLTEsIGNhbm9uaWNhbCk7XG5cbiAgICAgICAgICAgIHZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4ID0gYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QganVzdGlmaWNhdGlvbjogYW55IGluIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCkge1xuICAgICAgICBjb25zdCBzaGFwaW5nID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dO1xuXG4gICAgICAgIGlmICghdGV4dENvbGxpc2lvbkZlYXR1cmUpIHtcbiAgICAgICAgICAgIGtleSA9IG11cm11cjMoc2hhcGluZy50ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRSb3RhdGUgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuICAgICAgICAgICAgLy8gQXMgYSBjb2xsaXNpb24gYXBwcm94aW1hdGlvbiwgd2UgY2FuIHVzZSBlaXRoZXIgdGhlIHZlcnRpY2FsIG9yIGFueSBvZiB0aGUgaG9yaXpvbnRhbCB2ZXJzaW9ucyBvZiB0aGUgZmVhdHVyZVxuICAgICAgICAgICAgLy8gV2UncmUgY291bnRpbmcgb24gYWxsIHZlcnNpb25zIGhhdmluZyBzaW1pbGFyIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIHRleHRDb2xsaXNpb25GZWF0dXJlID0gbmV3IENvbGxpc2lvbkZlYXR1cmUoY29sbGlzaW9uQm94QXJyYXksIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgc2hhcGluZywgdGV4dEJveFNjYWxlLCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSwgdGV4dFJvdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaW5nbGVMaW5lID0gc2hhcGluZy5wb3NpdGlvbmVkTGluZXMubGVuZ3RoID09PSAxO1xuICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyArPSBhZGRUZXh0VmVydGljZXMoXG4gICAgICAgICAgICBidWNrZXQsIGFuY2hvciwgc2hhcGluZywgaW1hZ2VNYXAsIGxheWVyLCB0ZXh0QWxvbmdMaW5lLCBmZWF0dXJlLCB0ZXh0T2Zmc2V0LCBsaW5lQXJyYXksXG4gICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsID8gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCA6IFdyaXRpbmdNb2RlLmhvcml6b250YWxPbmx5LFxuICAgICAgICAgICAgc2luZ2xlTGluZSA/IChPYmplY3Qua2V5cyhzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWwpOiBhbnkpIDogW2p1c3RpZmljYXRpb25dLFxuICAgICAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMsIHBsYWNlZEljb25TeW1ib2xJbmRleCwgc2l6ZXMsIGNhbm9uaWNhbCk7XG5cbiAgICAgICAgaWYgKHNpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwpIHtcbiAgICAgICAgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzICs9IGFkZFRleHRWZXJ0aWNlcyhcbiAgICAgICAgICAgIGJ1Y2tldCwgYW5jaG9yLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsLCBpbWFnZU1hcCwgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsXG4gICAgICAgICAgICB0ZXh0T2Zmc2V0LCBsaW5lQXJyYXksIFdyaXRpbmdNb2RlLnZlcnRpY2FsLCBbJ3ZlcnRpY2FsJ10sIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLCB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCwgc2l6ZXMsIGNhbm9uaWNhbCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJveFN0YXJ0SW5kZXggPSB0ZXh0Q29sbGlzaW9uRmVhdHVyZSA/IHRleHRDb2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IHRleHRCb3hFbmRJbmRleCA9IHRleHRDb2xsaXNpb25GZWF0dXJlID8gdGV4dENvbGxpc2lvbkZlYXR1cmUuYm94RW5kSW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgY29uc3QgdmVydGljYWxUZXh0Qm94U3RhcnRJbmRleCA9IHZlcnRpY2FsVGV4dENvbGxpc2lvbkZlYXR1cmUgPyB2ZXJ0aWNhbFRleHRDb2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IHZlcnRpY2FsVGV4dEJveEVuZEluZGV4ID0gdmVydGljYWxUZXh0Q29sbGlzaW9uRmVhdHVyZSA/IHZlcnRpY2FsVGV4dENvbGxpc2lvbkZlYXR1cmUuYm94RW5kSW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgY29uc3QgaWNvbkJveFN0YXJ0SW5kZXggPSBpY29uQ29sbGlzaW9uRmVhdHVyZSA/IGljb25Db2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IGljb25Cb3hFbmRJbmRleCA9IGljb25Db2xsaXNpb25GZWF0dXJlID8gaWNvbkNvbGxpc2lvbkZlYXR1cmUuYm94RW5kSW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgY29uc3QgdmVydGljYWxJY29uQm94U3RhcnRJbmRleCA9IHZlcnRpY2FsSWNvbkNvbGxpc2lvbkZlYXR1cmUgPyB2ZXJ0aWNhbEljb25Db2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IHZlcnRpY2FsSWNvbkJveEVuZEluZGV4ID0gdmVydGljYWxJY29uQ29sbGlzaW9uRmVhdHVyZSA/IHZlcnRpY2FsSWNvbkNvbGxpc2lvbkZlYXR1cmUuYm94RW5kSW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgLy8gQ2hlY2sgaWYgcnVudGltZSBjb2xsaXNpb24gY2lyY2xlcyBzaG91bGQgYmUgdXNlZCBmb3IgYW55IG9mIHRoZSBjb2xsaXNpb24gZmVhdHVyZXMuXG4gICAgLy8gSXQgaXMgZW5vdWdoIHRvIGNob29zZSB0aGUgdGFsbGVzdCBmZWF0dXJlIHNoYXBlIGFzIGNpcmNsZXMgYXJlIGFsd2F5cyBwbGFjZWQgb24gYSBsaW5lLlxuICAgIC8vIEFsbCBtZWFzdXJlbWVudHMgYXJlIGluIGdseXBoIG1ldHJpY3MgYW5kIGxhdGVyIGNvbnZlcnRlZCBpbnRvIHBpeGVscyB1c2luZyBwcm9wZXIgZm9udCBzaXplIFwibGF5b3V0VGV4dFNpemVcIlxuICAgIGxldCBjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA9IC0xO1xuXG4gICAgY29uc3QgZ2V0Q29sbGlzaW9uQ2lyY2xlSGVpZ2h0ID0gKGZlYXR1cmU6ID9Db2xsaXNpb25GZWF0dXJlLCBwcmV2SGVpZ2h0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAoZmVhdHVyZSAmJiBmZWF0dXJlLmNpcmNsZURpYW1ldGVyKVxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGZlYXR1cmUuY2lyY2xlRGlhbWV0ZXIsIHByZXZIZWlnaHQpO1xuICAgICAgICByZXR1cm4gcHJldkhlaWdodDtcbiAgICB9O1xuXG4gICAgY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXIgPSBnZXRDb2xsaXNpb25DaXJjbGVIZWlnaHQodGV4dENvbGxpc2lvbkZlYXR1cmUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA9IGdldENvbGxpc2lvbkNpcmNsZUhlaWdodCh2ZXJ0aWNhbFRleHRDb2xsaXNpb25GZWF0dXJlLCBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcik7XG4gICAgY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXIgPSBnZXRDb2xsaXNpb25DaXJjbGVIZWlnaHQoaWNvbkNvbGxpc2lvbkZlYXR1cmUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA9IGdldENvbGxpc2lvbkNpcmNsZUhlaWdodCh2ZXJ0aWNhbEljb25Db2xsaXNpb25GZWF0dXJlLCBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcik7XG4gICAgY29uc3QgdXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMgPSAoY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXIgPiAtMSkgPyAxIDogMDtcblxuICAgIC8vIENvbnZlcnQgY2lyY2xlIGNvbGxpc2lvbiBoZWlnaHQgaW50byBwaXhlbHNcbiAgICBpZiAodXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMpXG4gICAgICAgIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyICo9IGxheW91dFRleHRTaXplIC8gT05FX0VNO1xuXG4gICAgaWYgKGJ1Y2tldC5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCA+PSBTeW1ib2xCdWNrZXQuTUFYX0dMWVBIUykgd2Fybk9uY2UoXG4gICAgICAgIFwiVG9vIG1hbnkgZ2x5cGhzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCJcbiAgICApO1xuXG4gICAgaWYgKGZlYXR1cmUuc29ydEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJ1Y2tldC5hZGRUb1NvcnRLZXlSYW5nZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcy5sZW5ndGgsIGZlYXR1cmUuc29ydEtleSk7XG4gICAgfVxuXG4gICAgYnVja2V0LnN5bWJvbEluc3RhbmNlcy5lbXBsYWNlQmFjayhcbiAgICAgICAgYW5jaG9yLngsXG4gICAgICAgIGFuY2hvci55LFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5yaWdodCA+PSAwID8gcGxhY2VkVGV4dFN5bWJvbEluZGljZXMucmlnaHQgOiAtMSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMuY2VudGVyID49IDAgPyBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5jZW50ZXIgOiAtMSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMubGVmdCA+PSAwID8gcGxhY2VkVGV4dFN5bWJvbEluZGljZXMubGVmdCA6IC0xLFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy52ZXJ0aWNhbCB8fCAtMSxcbiAgICAgICAgcGxhY2VkSWNvblN5bWJvbEluZGV4LFxuICAgICAgICB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCxcbiAgICAgICAga2V5LFxuICAgICAgICB0ZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgdGV4dEJveEVuZEluZGV4LFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCxcbiAgICAgICAgaWNvbkJveFN0YXJ0SW5kZXgsXG4gICAgICAgIGljb25Cb3hFbmRJbmRleCxcbiAgICAgICAgdmVydGljYWxJY29uQm94U3RhcnRJbmRleCxcbiAgICAgICAgdmVydGljYWxJY29uQm94RW5kSW5kZXgsXG4gICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMsXG4gICAgICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgbnVtSWNvblZlcnRpY2VzLFxuICAgICAgICBudW1WZXJ0aWNhbEljb25WZXJ0aWNlcyxcbiAgICAgICAgdXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMsXG4gICAgICAgIDAsXG4gICAgICAgIHRleHRCb3hTY2FsZSxcbiAgICAgICAgdGV4dE9mZnNldDAsXG4gICAgICAgIHRleHRPZmZzZXQxLFxuICAgICAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcik7XG59XG5cbmZ1bmN0aW9uIGFuY2hvcklzVG9vQ2xvc2UoYnVja2V0OiBhbnksIHRleHQ6IHN0cmluZywgcmVwZWF0RGlzdGFuY2U6IG51bWJlciwgYW5jaG9yOiBQb2ludCkge1xuICAgIGNvbnN0IGNvbXBhcmVUZXh0ID0gYnVja2V0LmNvbXBhcmVUZXh0O1xuICAgIGlmICghKHRleHQgaW4gY29tcGFyZVRleHQpKSB7XG4gICAgICAgIGNvbXBhcmVUZXh0W3RleHRdID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3RoZXJBbmNob3JzID0gY29tcGFyZVRleHRbdGV4dF07XG4gICAgICAgIGZvciAobGV0IGsgPSBvdGhlckFuY2hvcnMubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcbiAgICAgICAgICAgIGlmIChhbmNob3IuZGlzdChvdGhlckFuY2hvcnNba10pIDwgcmVwZWF0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIHdpdGhpbiByZXBlYXREaXN0YW5jZSBvZiBvbmUgYW5jaG9yLCBzdG9wIGxvb2tpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBhbmNob3IgaXMgbm90IHdpdGhpbiByZXBlYXREaXN0YW5jZSBvZiBhbnkgb3RoZXIgYW5jaG9yLCBhZGQgdG8gYXJyYXlcbiAgICBjb21wYXJlVGV4dFt0ZXh0XS5wdXNoKGFuY2hvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtzeW1ib2xMYXlvdXRBdHRyaWJ1dGVzLFxuICAgIGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXMsXG4gICAgY29sbGlzaW9uQm94TGF5b3V0LFxuICAgIGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzXG59IGZyb20gJy4vc3ltYm9sX2F0dHJpYnV0ZXMnO1xuXG5pbXBvcnQge1N5bWJvbExheW91dEFycmF5LFxuICAgIFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSxcbiAgICBTeW1ib2xPcGFjaXR5QXJyYXksXG4gICAgQ29sbGlzaW9uQm94TGF5b3V0QXJyYXksXG4gICAgQ29sbGlzaW9uVmVydGV4QXJyYXksXG4gICAgUGxhY2VkU3ltYm9sQXJyYXksXG4gICAgU3ltYm9sSW5zdGFuY2VBcnJheSxcbiAgICBHbHlwaE9mZnNldEFycmF5LFxuICAgIFN5bWJvbExpbmVWZXJ0ZXhBcnJheVxufSBmcm9tICcuLi9hcnJheV90eXBlcyc7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL3NlZ21lbnQnO1xuaW1wb3J0IHtQcm9ncmFtQ29uZmlndXJhdGlvblNldH0gZnJvbSAnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheX0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZSc7XG5pbXBvcnQgdHJhbnNmb3JtVGV4dCBmcm9tICcuLi8uLi9zeW1ib2wvdHJhbnNmb3JtX3RleHQnO1xuaW1wb3J0IG1lcmdlTGluZXMgZnJvbSAnLi4vLi4vc3ltYm9sL21lcmdlbGluZXMnO1xuaW1wb3J0IHthbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlLCBzdHJpbmdDb250YWluc1JUTFRleHR9IGZyb20gJy4uLy4uL3V0aWwvc2NyaXB0X2RldGVjdGlvbic7XG5pbXBvcnQge1dyaXRpbmdNb2RlfSBmcm9tICcuLi8uLi9zeW1ib2wvc2hhcGluZyc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnknO1xuaW1wb3J0IG12dCBmcm9tICcuLi8uLi9fL0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuY29uc3QgdmVjdG9yVGlsZUZlYXR1cmVUeXBlcyA9IG12dC5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcztcbmltcG9ydCB7dmVydGljYWxpemVkQ2hhcmFjdGVyTWFwfSBmcm9tICcuLi8uLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uJztcbmltcG9ydCBBbmNob3IgZnJvbSAnLi4vLi4vc3ltYm9sL2FuY2hvcic7XG5pbXBvcnQge2dldFNpemVEYXRhfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUnO1xuaW1wb3J0IHtNQVhfUEFDS0VEX1NJWkV9IGZyb20gJy4uLy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0JztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuaW1wb3J0IHtwbHVnaW4gYXMgZ2xvYmFsUlRMVGV4dFBsdWdpbiwgZ2V0UlRMVGV4dFBsdWdpblN0YXR1c30gZnJvbSAnLi4vLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XG5pbXBvcnQge21hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0UGFyYW1ldGVycyxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0JztcbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheSwgQ29sbGlzaW9uQm94LCBTeW1ib2xJbnN0YW5jZX0gZnJvbSAnLi4vYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5LCBTdHJ1Y3RBcnJheU1lbWJlcn0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXknO1xuaW1wb3J0IFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUge1N5bWJvbFF1YWR9IGZyb20gJy4uLy4uL3N5bWJvbC9xdWFkcyc7XG5pbXBvcnQgdHlwZSB7U2l6ZURhdGF9IGZyb20gJy4uLy4uL3N5bWJvbC9zeW1ib2xfc2l6ZSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcblxuZXhwb3J0IHR5cGUgU2luZ2xlQ29sbGlzaW9uQm94ID0ge1xuICAgIHgxOiBudW1iZXI7XG4gICAgeTE6IG51bWJlcjtcbiAgICB4MjogbnVtYmVyO1xuICAgIHkyOiBudW1iZXI7XG4gICAgYW5jaG9yUG9pbnRYOiBudW1iZXI7XG4gICAgYW5jaG9yUG9pbnRZOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBDb2xsaXNpb25BcnJheXMgPSB7XG4gICAgdGV4dEJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICB2ZXJ0aWNhbFRleHRCb3g/OiBTaW5nbGVDb2xsaXNpb25Cb3g7XG4gICAgaWNvbkJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICB2ZXJ0aWNhbEljb25Cb3g/OiBTaW5nbGVDb2xsaXNpb25Cb3g7XG4gICAgdGV4dEZlYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICB2ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXg/OiBudW1iZXI7XG4gICAgaWNvbkZlYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICB2ZXJ0aWNhbEljb25GZWF0dXJlSW5kZXg/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBTeW1ib2xGZWF0dXJlID0ge3xcbiAgICBzb3J0S2V5OiBudW1iZXIgfCB2b2lkLFxuICAgIHRleHQ6IEZvcm1hdHRlZCB8IHZvaWQsXG4gICAgaWNvbjogP1Jlc29sdmVkSW1hZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgcHJvcGVydGllczogT2JqZWN0LFxuICAgIHR5cGU6ICdQb2ludCcgfCAnTGluZVN0cmluZycgfCAnUG9seWdvbicsXG4gICAgaWQ/OiBhbnlcbnx9O1xuXG5leHBvcnQgdHlwZSBTb3J0S2V5UmFuZ2UgPSB7XG4gICAgc29ydEtleTogbnVtYmVyLFxuICAgIHN5bWJvbEluc3RhbmNlU3RhcnQ6IG51bWJlcixcbiAgICBzeW1ib2xJbnN0YW5jZUVuZDogbnVtYmVyXG59O1xuXG4vLyBPcGFjaXR5IGFycmF5cyBhcmUgZnJlcXVlbnRseSB1cGRhdGVkIGJ1dCBkb24ndCBjb250YWluIGEgbG90IG9mIGluZm9ybWF0aW9uLCBzbyB3ZSBwYWNrIHRoZW1cbi8vIHRpZ2h0LiBFYWNoIFVpbnQzMiBpcyBhY3R1YWxseSBmb3VyIGR1cGxpY2F0ZSBVaW50OHMgZm9yIHRoZSBmb3VyIGNvcm5lcnMgb2YgYSBnbHlwaFxuLy8gNyBiaXRzIGFyZSBmb3IgdGhlIGN1cnJlbnQgb3BhY2l0eSwgYW5kIHRoZSBsb3dlc3QgYml0IGlzIHRoZSB0YXJnZXQgb3BhY2l0eVxuXG4vLyBhY3R1YWxseSBkZWZpbmVkIGluIHN5bWJvbF9hdHRyaWJ1dGVzLmpzXG4vLyBjb25zdCBwbGFjZW1lbnRPcGFjaXR5QXR0cmlidXRlcyA9IFtcbi8vICAgICB7IG5hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MzInIH1cbi8vIF07XG5jb25zdCBzaGFkZXJPcGFjaXR5QXR0cmlidXRlcyA9IFtcbiAgICB7bmFtZTogJ2FfZmFkZV9vcGFjaXR5JywgY29tcG9uZW50czogMSwgdHlwZTogJ1VpbnQ4Jywgb2Zmc2V0OiAwfVxuXTtcblxuZnVuY3Rpb24gYWRkVmVydGV4KGFycmF5LCBhbmNob3JYLCBhbmNob3JZLCBveCwgb3ksIHR4LCB0eSwgc2l6ZVZlcnRleCwgaXNTREY6IGJvb2xlYW4sIHBpeGVsT2Zmc2V0WCwgcGl4ZWxPZmZzZXRZLCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZKSB7XG4gICAgY29uc3QgYVNpemVYID0gc2l6ZVZlcnRleCA/IE1hdGgubWluKE1BWF9QQUNLRURfU0laRSwgTWF0aC5yb3VuZChzaXplVmVydGV4WzBdKSkgOiAwO1xuICAgIGNvbnN0IGFTaXplWSA9IHNpemVWZXJ0ZXggPyBNYXRoLm1pbihNQVhfUEFDS0VEX1NJWkUsIE1hdGgucm91bmQoc2l6ZVZlcnRleFsxXSkpIDogMDtcbiAgICBhcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgLy8gYV9wb3Nfb2Zmc2V0XG4gICAgICAgIGFuY2hvclgsXG4gICAgICAgIGFuY2hvclksXG4gICAgICAgIE1hdGgucm91bmQob3ggKiAzMiksXG4gICAgICAgIE1hdGgucm91bmQob3kgKiAzMiksXG5cbiAgICAgICAgLy8gYV9kYXRhXG4gICAgICAgIHR4LCAvLyB4IGNvb3JkaW5hdGUgb2Ygc3ltYm9sIG9uIGdseXBoIGF0bGFzIHRleHR1cmVcbiAgICAgICAgdHksIC8vIHkgY29vcmRpbmF0ZSBvZiBzeW1ib2wgb24gZ2x5cGggYXRsYXMgdGV4dHVyZVxuICAgICAgICAoYVNpemVYIDw8IDEpICsgKGlzU0RGID8gMSA6IDApLFxuICAgICAgICBhU2l6ZVksXG4gICAgICAgIHBpeGVsT2Zmc2V0WCAqIDE2LFxuICAgICAgICBwaXhlbE9mZnNldFkgKiAxNixcbiAgICAgICAgbWluRm9udFNjYWxlWCAqIDI1NixcbiAgICAgICAgbWluRm9udFNjYWxlWSAqIDI1NlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXksIHA6IFBvaW50LCBhbmdsZTogbnVtYmVyKSB7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHAueCwgcC55LCBhbmdsZSk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHAueCwgcC55LCBhbmdsZSk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHAueCwgcC55LCBhbmdsZSk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHAueCwgcC55LCBhbmdsZSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zUlRMVGV4dChmb3JtYXR0ZWRUZXh0OiBGb3JtYXR0ZWQpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZm9ybWF0dGVkVGV4dC5zZWN0aW9ucykge1xuICAgICAgICBpZiAoc3RyaW5nQ29udGFpbnNSVExUZXh0KHNlY3Rpb24udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFN5bWJvbEJ1ZmZlcnMge1xuICAgIGxheW91dFZlcnRleEFycmF5OiBTeW1ib2xMYXlvdXRBcnJheTtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PFN5bWJvbFN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuXG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5OiBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgb3BhY2l0eVZlcnRleEFycmF5OiBTeW1ib2xPcGFjaXR5QXJyYXk7XG4gICAgb3BhY2l0eVZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXk6IENvbGxpc2lvblZlcnRleEFycmF5O1xuICAgIGNvbGxpc2lvblZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgcGxhY2VkU3ltYm9sQXJyYXk6IFBsYWNlZFN5bWJvbEFycmF5O1xuXG4gICAgY29uc3RydWN0b3IocHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxTeW1ib2xTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IFN5bWJvbExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBwcm9ncmFtQ29uZmlndXJhdGlvbnM7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sT3BhY2l0eUFycmF5KCk7XG4gICAgICAgIHRoaXMucGxhY2VkU3ltYm9sQXJyYXkgPSBuZXcgUGxhY2VkU3ltYm9sQXJyYXkoKTtcbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0LCBkeW5hbWljSW5kZXhCdWZmZXI6IGJvb2xlYW4sIHVwbG9hZD86IGJvb2xlYW4sIHVwZGF0ZT86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBsb2FkKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHN5bWJvbExheW91dEF0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXksIGR5bmFtaWNJbmRleEJ1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dEF0dHJpYnV0ZXMubWVtYmVycywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheSwgc2hhZGVyT3BhY2l0eUF0dHJpYnV0ZXMsIHRydWUpO1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHBlcmZvcm1hbmNlIGhhY2sgc28gdGhhdCB3ZSBjYW4gd3JpdGUgdG8gb3BhY2l0eVZlcnRleEFycmF5IHdpdGggdWludDMyc1xuICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIHNoYWRlcnMgcmVhZCB1aW50OHNcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlci5pdGVtU2l6ZSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwbG9hZCB8fCB1cGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdTeW1ib2xCdWZmZXJzJywgU3ltYm9sQnVmZmVycyk7XG5cbmNsYXNzIENvbGxpc2lvbkJ1ZmZlcnMge1xuICAgIGxheW91dFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheTtcbiAgICBsYXlvdXRBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj47XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBpbmRleEFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcjtcblxuICAgIGNvbGxpc2lvblZlcnRleEFycmF5OiBDb2xsaXNpb25WZXJ0ZXhBcnJheTtcbiAgICBjb2xsaXNpb25WZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGNvbnN0cnVjdG9yKExheW91dEFycmF5OiBDbGFzczxTdHJ1Y3RBcnJheT4sXG4gICAgICAgICAgICAgICAgbGF5b3V0QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+LFxuICAgICAgICAgICAgICAgIEluZGV4QXJyYXk6IENsYXNzPFRyaWFuZ2xlSW5kZXhBcnJheSB8IExpbmVJbmRleEFycmF5Pikge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMubGF5b3V0QXR0cmlidXRlcyA9IGxheW91dEF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblZlcnRleEFycmF5ID0gbmV3IENvbGxpc2lvblZlcnRleEFycmF5KCk7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXksIGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXMubWVtYmVycywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0NvbGxpc2lvbkJ1ZmZlcnMnLCBDb2xsaXNpb25CdWZmZXJzKTtcblxuLyoqXG4gKiBVbmxpa2Ugb3RoZXIgYnVja2V0cywgd2hpY2ggc2ltcGx5IGltcGxlbWVudCAjYWRkRmVhdHVyZSB3aXRoIHR5cGUtc3BlY2lmaWNcbiAqIGxvZ2ljIGZvciAoZXNzZW50aWFsbHkpIHRyaWFuZ3VsYXRpbmcgZmVhdHVyZSBnZW9tZXRyaWVzLCBTeW1ib2xCdWNrZXRcbiAqIHJlcXVpcmVzIHNwZWNpYWxpemVkIGJlaGF2aW9yOlxuICpcbiAqIDEuIFdvcmtlclRpbGUjcGFyc2UoKSwgdGhlIGxvZ2ljYWwgb3duZXIgb2YgdGhlIGJ1Y2tldCBjcmVhdGlvbiBwcm9jZXNzLFxuICogICAgY2FsbHMgU3ltYm9sQnVja2V0I3BvcHVsYXRlKCksIHdoaWNoIHJlc29sdmVzIHRleHQgYW5kIGljb24gdG9rZW5zIG9uXG4gKiAgICBlYWNoIGZlYXR1cmUsIGFkZHMgZWFjaCBnbHlwaHMgYW5kIHN5bWJvbHMgbmVlZGVkIHRvIHRoZSBwYXNzZWQtaW5cbiAqICAgIGNvbGxlY3Rpb25zIG9wdGlvbnMuZ2x5cGhEZXBlbmRlbmNpZXMgYW5kIG9wdGlvbnMuaWNvbkRlcGVuZGVuY2llcywgYW5kXG4gKiAgICBzdG9yZXMgdGhlIGZlYXR1cmUgZGF0YSBmb3IgdXNlIGluIHN1YnNlcXVlbnQgc3RlcCAodGhpcy5mZWF0dXJlcykuXG4gKlxuICogMi4gV29ya2VyVGlsZSBhc3luY2hyb25vdXNseSByZXF1ZXN0cyBmcm9tIHRoZSBtYWluIHRocmVhZCBhbGwgb2YgdGhlIGdseXBoc1xuICogICAgYW5kIGljb25zIG5lZWRlZCAoYnkgdGhpcyBidWNrZXQgYW5kIGFueSBvdGhlcnMpLiBXaGVuIGdseXBocyBhbmQgaWNvbnNcbiAqICAgIGhhdmUgYmVlbiByZWNlaXZlZCwgdGhlIFdvcmtlclRpbGUgY3JlYXRlcyBhIENvbGxpc2lvbkluZGV4IGFuZCBpbnZva2VzOlxuICpcbiAqIDMuIHBlcmZvcm1TeW1ib2xMYXlvdXQoYnVja2V0LCBzdGFja3MsIGljb25zKSBwZXJmb3JtIHRleHRzIHNoYXBpbmcgYW5kXG4gKiAgICBsYXlvdXQgb24gYSBTeW1ib2wgQnVja2V0LiBUaGlzIHN0ZXAgcG9wdWxhdGVzOlxuICogICAgICBgdGhpcy5zeW1ib2xJbnN0YW5jZXNgOiBtZXRhZGF0YSBvbiBnZW5lcmF0ZWQgc3ltYm9sc1xuICogICAgICBgdGhpcy5jb2xsaXNpb25Cb3hBcnJheWA6IGNvbGxpc2lvbiBkYXRhIGZvciB1c2UgYnkgZm9yZWdyb3VuZFxuICogICAgICBgdGhpcy50ZXh0YDogU3ltYm9sQnVmZmVycyBmb3IgdGV4dCBzeW1ib2xzXG4gKiAgICAgIGB0aGlzLmljb25zYDogU3ltYm9sQnVmZmVycyBmb3IgaWNvbnNcbiAqICAgICAgYHRoaXMuaWNvbkNvbGxpc2lvbkJveGA6IERlYnVnIFN5bWJvbEJ1ZmZlcnMgZm9yIGljb24gY29sbGlzaW9uIGJveGVzXG4gKiAgICAgIGB0aGlzLnRleHRDb2xsaXNpb25Cb3hgOiBEZWJ1ZyBTeW1ib2xCdWZmZXJzIGZvciB0ZXh0IGNvbGxpc2lvbiBib3hlc1xuICogICAgVGhlIHJlc3VsdHMgYXJlIHNlbnQgdG8gdGhlIGZvcmVncm91bmQgZm9yIHJlbmRlcmluZ1xuICpcbiAqIDQuIHBlcmZvcm1TeW1ib2xQbGFjZW1lbnQoYnVja2V0LCBjb2xsaXNpb25JbmRleCkgaXMgcnVuIG9uIHRoZSBmb3JlZ3JvdW5kLFxuICogICAgYW5kIHVzZXMgdGhlIENvbGxpc2lvbkluZGV4IGFsb25nIHdpdGggY3VycmVudCBjYW1lcmEgc2V0dGluZ3MgdG8gZGV0ZXJtaW5lXG4gKiAgICB3aGljaCBzeW1ib2xzIGNhbiBhY3R1YWxseSBzaG93IG9uIHRoZSBtYXAuIENvbGxpZGVkIHN5bWJvbHMgYXJlIGhpZGRlblxuICogICAgdXNpbmcgYSBkeW5hbWljIFwiT3BhY2l0eVZlcnRleEFycmF5XCIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3ltYm9sQnVja2V0IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBzdGF0aWMgTUFYX0dMWVBIUzogbnVtYmVyO1xuICAgIHN0YXRpYyBhZGREeW5hbWljQXR0cmlidXRlczogdHlwZW9mIGFkZER5bmFtaWNBdHRyaWJ1dGVzO1xuXG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5O1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8U3ltYm9sU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PFN5bWJvbFN0eWxlTGF5ZXI+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG5cbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHNkZkljb25zOiBib29sZWFuO1xuICAgIGljb25zSW5UZXh0OiBib29sZWFuO1xuICAgIGljb25zTmVlZExpbmVhcjogYm9vbGVhbjtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAganVzdFJlbG9hZGVkOiBib29sZWFuO1xuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG5cbiAgICB0ZXh0U2l6ZURhdGE6IFNpemVEYXRhO1xuICAgIGljb25TaXplRGF0YTogU2l6ZURhdGE7XG5cbiAgICBnbHlwaE9mZnNldEFycmF5OiBHbHlwaE9mZnNldEFycmF5O1xuICAgIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5O1xuICAgIGZlYXR1cmVzOiBBcnJheTxTeW1ib2xGZWF0dXJlPjtcbiAgICBzeW1ib2xJbnN0YW5jZXM6IFN5bWJvbEluc3RhbmNlQXJyYXk7XG4gICAgY29sbGlzaW9uQXJyYXlzOiBBcnJheTxDb2xsaXNpb25BcnJheXM+O1xuICAgIHNvcnRLZXlSYW5nZXM6IEFycmF5PFNvcnRLZXlSYW5nZT47XG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyO1xuICAgIHRpbGVQaXhlbFJhdGlvOiBudW1iZXI7XG4gICAgY29tcGFyZVRleHQ6IHtbXzogc3RyaW5nXTogQXJyYXk8UG9pbnQ+fTtcbiAgICBmYWRlU3RhcnRUaW1lOiBudW1iZXI7XG4gICAgc29ydEZlYXR1cmVzQnlLZXk6IGJvb2xlYW47XG4gICAgc29ydEZlYXR1cmVzQnlZOiBib29sZWFuO1xuICAgIHNvcnRlZEFuZ2xlOiBudW1iZXI7XG4gICAgZmVhdHVyZVNvcnRPcmRlcjogQXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbGxpc2lvbkNpcmNsZUFycmF5OiBBcnJheTxudW1iZXI+O1xuICAgIHBsYWNlbWVudEludlByb2pNYXRyaXg6IG1hdDQ7XG4gICAgcGxhY2VtZW50Vmlld3BvcnRNYXRyaXg6IG1hdDQ7XG5cbiAgICB0ZXh0OiBTeW1ib2xCdWZmZXJzO1xuICAgIGljb246IFN5bWJvbEJ1ZmZlcnM7XG4gICAgdGV4dENvbGxpc2lvbkJveDogQ29sbGlzaW9uQnVmZmVycztcbiAgICBpY29uQ29sbGlzaW9uQm94OiBDb2xsaXNpb25CdWZmZXJzO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VJRDogc3RyaW5nO1xuICAgIHN5bWJvbEluc3RhbmNlSW5kZXhlczogQXJyYXk8bnVtYmVyPjtcbiAgICB3cml0aW5nTW9kZXM6IEFycmF5PG51bWJlcj47XG4gICAgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbjtcbiAgICBoYXNSVExUZXh0OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQnVja2V0UGFyYW1ldGVyczxTeW1ib2xTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gb3B0aW9ucy5jb2xsaXNpb25Cb3hBcnJheTtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW8gPSBvcHRpb25zLnBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuc291cmNlTGF5ZXJJbmRleCA9IG9wdGlvbnMuc291cmNlTGF5ZXJJbmRleDtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzUlRMVGV4dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvcnRLZXlSYW5nZXMgPSBbXTtcblxuICAgICAgICB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5ID0gW107XG4gICAgICAgIHRoaXMucGxhY2VtZW50SW52UHJvak1hdHJpeCA9IG1hdDQuaWRlbnRpdHkoW10pO1xuICAgICAgICB0aGlzLnBsYWNlbWVudFZpZXdwb3J0TWF0cml4ID0gbWF0NC5pZGVudGl0eShbXSk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmxheWVyc1swXTtcbiAgICAgICAgY29uc3QgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXMgPSBsYXllci5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlcztcblxuICAgICAgICB0aGlzLnRleHRTaXplRGF0YSA9IGdldFNpemVEYXRhKHRoaXMuem9vbSwgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddKTtcbiAgICAgICAgdGhpcy5pY29uU2l6ZURhdGEgPSBnZXRTaXplRGF0YSh0aGlzLnpvb20sIHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXSk7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCBzb3J0S2V5ID0gbGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5Jyk7XG4gICAgICAgIGNvbnN0IHpPcmRlciA9IGxheW91dC5nZXQoJ3N5bWJvbC16LW9yZGVyJyk7XG4gICAgICAgIHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgPSB6T3JkZXIgIT09ICd2aWV3cG9ydC15JyAmJiBzb3J0S2V5LmNvbnN0YW50T3IoMSkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgek9yZGVyQnlWaWV3cG9ydFkgPSB6T3JkZXIgPT09ICd2aWV3cG9ydC15JyB8fCAoek9yZGVyID09PSAnYXV0bycgJiYgIXRoaXMuc29ydEZlYXR1cmVzQnlLZXkpO1xuICAgICAgICB0aGlzLnNvcnRGZWF0dXJlc0J5WSA9IHpPcmRlckJ5Vmlld3BvcnRZICYmIChsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKSB8fCBsYXlvdXQuZ2V0KCdpY29uLWFsbG93LW92ZXJsYXAnKSB8fFxuICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JykgfHwgbGF5b3V0LmdldCgnaWNvbi1pZ25vcmUtcGxhY2VtZW50JykpO1xuXG4gICAgICAgIGlmIChsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgPT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGluZ01vZGVzID0gbGF5b3V0LmdldCgndGV4dC13cml0aW5nLW1vZGUnKS5tYXAod20gPT4gV3JpdGluZ01vZGVbd21dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG5cbiAgICAgICAgdGhpcy5zb3VyY2VJRCA9IG9wdGlvbnMuc291cmNlSUQ7XG4gICAgfVxuXG4gICAgY3JlYXRlQXJyYXlzKCkge1xuICAgICAgICB0aGlzLnRleHQgPSBuZXcgU3ltYm9sQnVmZmVycyhuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQodGhpcy5sYXllcnMsIHRoaXMuem9vbSwgcHJvcGVydHkgPT4gL150ZXh0Ly50ZXN0KHByb3BlcnR5KSkpO1xuICAgICAgICB0aGlzLmljb24gPSBuZXcgU3ltYm9sQnVmZmVycyhuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQodGhpcy5sYXllcnMsIHRoaXMuem9vbSwgcHJvcGVydHkgPT4gL15pY29uLy50ZXN0KHByb3BlcnR5KSkpO1xuXG4gICAgICAgIHRoaXMuZ2x5cGhPZmZzZXRBcnJheSA9IG5ldyBHbHlwaE9mZnNldEFycmF5KCk7XG4gICAgICAgIHRoaXMubGluZVZlcnRleEFycmF5ID0gbmV3IFN5bWJvbExpbmVWZXJ0ZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlcyA9IG5ldyBTeW1ib2xJbnN0YW5jZUFycmF5KCk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlR2x5cGhEZXBlbmRlbmNpZXModGV4dDogc3RyaW5nLCBzdGFjazoge1tfOiBudW1iZXJdOiBib29sZWFufSwgdGV4dEFsb25nTGluZTogYm9vbGVhbiwgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbiwgZG9lc0FsbG93VmVydGljYWxXcml0aW5nTW9kZTogYm9vbGVhbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN0YWNrW3RleHQuY2hhckNvZGVBdChpKV0gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCh0ZXh0QWxvbmdMaW5lIHx8IGFsbG93VmVydGljYWxQbGFjZW1lbnQpICYmIGRvZXNBbGxvd1ZlcnRpY2FsV3JpdGluZ01vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbENoYXIgPSB2ZXJ0aWNhbGl6ZWRDaGFyYWN0ZXJNYXBbdGV4dC5jaGFyQXQoaSldO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJ0aWNhbENoYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2tbdmVydGljYWxDaGFyLmNoYXJDb2RlQXQoMCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllcnNbMF07XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGxheWVyLmxheW91dDtcblxuICAgICAgICBjb25zdCB0ZXh0Rm9udCA9IGxheW91dC5nZXQoJ3RleHQtZm9udCcpO1xuICAgICAgICBjb25zdCB0ZXh0RmllbGQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWZpZWxkJyk7XG4gICAgICAgIGNvbnN0IGljb25JbWFnZSA9IGxheW91dC5nZXQoJ2ljb24taW1hZ2UnKTtcbiAgICAgICAgY29uc3QgaGFzVGV4dCA9XG4gICAgICAgICAgICAodGV4dEZpZWxkLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHxcbiAgICAgICAgICAgICAgICAodGV4dEZpZWxkLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkICYmICF0ZXh0RmllbGQudmFsdWUudmFsdWUuaXNFbXB0eSgpKSB8fFxuICAgICAgICAgICAgICAgIHRleHRGaWVsZC52YWx1ZS52YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+IDApICYmXG4gICAgICAgICAgICAodGV4dEZvbnQudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JyB8fCB0ZXh0Rm9udC52YWx1ZS52YWx1ZS5sZW5ndGggPiAwKTtcbiAgICAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyByZXNvbHZlIHRoZSBpY29uLWltYWdlIHZhbHVlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZGVmaW5lZCBpbiB0aGUgc3R5bGVcbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdXMgdG8gZmlyZSB0aGUgc3R5bGVpbWFnZW1pc3NpbmcgZXZlbnQgaWYgaW1hZ2UgZXZhbHVhdGlvbiByZXR1cm5zIG51bGxcbiAgICAgICAgLy8gdGhlIG9ubHkgd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbnVsbCByZXR1cm5lZCBmcm9tIGEgY29hbGVzY2Ugc3RhdGVtZW50IHdpdGggbm8gdmFsaWQgaW1hZ2VzXG4gICAgICAgIC8vIGFuZCBudWxsIHJldHVybmVkIGJlY2F1c2UgaWNvbi1pbWFnZSB3YXNuJ3QgZGVmaW5lZCBpcyB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBpY29uSW1hZ2UucGFyYW1ldGVycyBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgY29uc3QgaGFzSWNvbiA9IGljb25JbWFnZS52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8ICEhaWNvbkltYWdlLnZhbHVlLnZhbHVlIHx8IE9iamVjdC5rZXlzKGljb25JbWFnZS5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBzeW1ib2xTb3J0S2V5ID0gbGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5Jyk7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGlmICghaGFzVGV4dCAmJiAhaGFzSWNvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWNvbnMgPSBvcHRpb25zLmljb25EZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IG9wdGlvbnMuZ2x5cGhEZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZUltYWdlcyA9IG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzO1xuICAgICAgICBjb25zdCBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuXG4gICAgICAgICAgICBjb25zdCBuZWVkR2VvbWV0cnkgPSBsYXllci5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnk7XG4gICAgICAgICAgICBjb25zdCBldmFsdWF0aW9uRmVhdHVyZSA9IHt0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBuZWVkR2VvbWV0cnkgPyBsb2FkR2VvbWV0cnkoZmVhdHVyZSkgOiBbXX07XG5cbiAgICAgICAgICAgIGlmICghbGF5ZXIuX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKGdsb2JhbFByb3BlcnRpZXMsIGV2YWx1YXRpb25GZWF0dXJlLCBjYW5vbmljYWwpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbmVlZEdlb21ldHJ5KSAgZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnkgPSBsb2FkR2VvbWV0cnkoZmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGxldCB0ZXh0OiBGb3JtYXR0ZWQgfCB2b2lkO1xuICAgICAgICAgICAgaWYgKGhhc1RleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHByZXNzaW9uIGV2YWx1YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNvZXJjZSB0byBGb3JtYXR0ZWRcbiAgICAgICAgICAgICAgICAvLyBidXQgcGxhaW4gc3RyaW5nIHRva2VuIGV2YWx1YXRpb24gc2tpcHMgdGhhdCBwYXRod2F5IHNvIGRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gaGVyZS5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFRva2VucyA9IGxheWVyLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucygndGV4dC1maWVsZCcsIGV2YWx1YXRpb25GZWF0dXJlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVGV4dCA9IEZvcm1hdHRlZC5mYWN0b3J5KHJlc29sdmVkVG9rZW5zKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNSVExUZXh0KGZvcm1hdHRlZFRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzUlRMVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaGFzUlRMVGV4dCB8fCAvLyBub24tcnRsIHRleHQgc28gY2FuIHByb2NlZWQgc2FmZWx5XG4gICAgICAgICAgICAgICAgICAgIGdldFJUTFRleHRQbHVnaW5TdGF0dXMoKSA9PT0gJ3VuYXZhaWxhYmxlJyB8fCAvLyBXZSBkb24ndCBpbnRlbmQgdG8gbGF6eS1sb2FkIHRoZSBydGwgdGV4dCBwbHVnaW4sIHNvIHByb2NlZWQgd2l0aCBpbmNvcnJlY3Qgc2hhcGluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1JUTFRleHQgJiYgZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc1BhcnNlZCgpIC8vIFVzZSB0aGUgcnRsVGV4dCBwbHVnaW4gdG8gc2hhcGUgdGV4dFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdHJhbnNmb3JtVGV4dChmb3JtYXR0ZWRUZXh0LCBsYXllciwgZXZhbHVhdGlvbkZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGljb246ID9SZXNvbHZlZEltYWdlO1xuICAgICAgICAgICAgaWYgKGhhc0ljb24pIHtcbiAgICAgICAgICAgICAgICAvLyBFeHByZXNzaW9uIGV2YWx1YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNvZXJjZSB0byBJbWFnZVxuICAgICAgICAgICAgICAgIC8vIGJ1dCBwbGFpbiBzdHJpbmcgdG9rZW4gZXZhbHVhdGlvbiBza2lwcyB0aGF0IHBhdGh3YXkgc28gZG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBoZXJlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVG9rZW5zID0gbGF5ZXIuZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKCdpY29uLWltYWdlJywgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRUb2tlbnMgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGljb24gPSByZXNvbHZlZFRva2VucztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpY29uID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKHJlc29sdmVkVG9rZW5zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGV4dCAmJiAhaWNvbikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc29ydEtleSA9IHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgP1xuICAgICAgICAgICAgICAgIHN5bWJvbFNvcnRLZXkuZXZhbHVhdGUoZXZhbHVhdGlvbkZlYXR1cmUsIHt9LCBjYW5vbmljYWwpIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEZlYXR1cmU6IFN5bWJvbEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBpY29uLFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGxvYWRHZW9tZXRyeShmZWF0dXJlKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdLFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goc3ltYm9sRmVhdHVyZSk7XG5cbiAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbnNbaWNvbi5uYW1lXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udFN0YWNrID0gdGV4dEZvbnQuZXZhbHVhdGUoZXZhbHVhdGlvbkZlYXR1cmUsIHt9LCBjYW5vbmljYWwpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCcgJiYgbGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnO1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCA9IHRoaXMud3JpdGluZ01vZGVzICYmIHRoaXMud3JpdGluZ01vZGVzLmluZGV4T2YoV3JpdGluZ01vZGUudmVydGljYWwpID49IDA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRleHQuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWN0aW9uLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlID0gYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSh0ZXh0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkZvbnQgPSBzZWN0aW9uLmZvbnRTdGFjayB8fCBmb250U3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uU3RhY2sgPSBzdGFja3Nbc2VjdGlvbkZvbnRdID0gc3RhY2tzW3NlY3Rpb25Gb250XSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR2x5cGhEZXBlbmRlbmNpZXMoc2VjdGlvbi50ZXh0LCBzZWN0aW9uU3RhY2ssIHRleHRBbG9uZ0xpbmUsIHRoaXMuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCwgZG9lc0FsbG93VmVydGljYWxXcml0aW5nTW9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgc2VjdGlvbiBpbWFnZSB0byB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uc1tzZWN0aW9uLmltYWdlLm5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgPT09ICdsaW5lJykge1xuICAgICAgICAgICAgLy8gTWVyZ2UgYWRqYWNlbnQgbGluZXMgd2l0aCB0aGUgc2FtZSB0ZXh0IHRvIGltcHJvdmUgbGFiZWxsaW5nLlxuICAgICAgICAgICAgLy8gSXQncyBiZXR0ZXIgdG8gcGxhY2UgbGFiZWxzIG9uIG9uZSBsb25nIGxpbmUgdGhhbiBvbiBtYW55IHNob3J0IHNlZ21lbnRzLlxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlcyA9IG1lcmdlTGluZXModGhpcy5mZWF0dXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb3J0RmVhdHVyZXNCeUtleSkge1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYS5zb3J0S2V5IGlzIGFsd2F5cyBhIG51bWJlciB3aGVuIHNvcnRGZWF0dXJlc0J5S2V5IGlzIHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm4gKChhLnNvcnRLZXk6IGFueSk6IG51bWJlcikgLSAoKGIuc29ydEtleTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLmxheWVycywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5sYXllcnMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICAvLyBXaGVuIHRoZSBidWNrZXQgZW5jb3VudGVycyBvbmx5IHJ0bC10ZXh0IGJ1dCB0aGUgcGx1Z2luIGlzbnQgbG9hZGVkLCBubyBzeW1ib2wgaW5zdGFuY2VzIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAgICAgLy8gSW4gb3JkZXIgZm9yIHRoZSBidWNrZXQgdG8gYmUgc2VyaWFsaXplZCwgYW5kIG5vdCBkaXNjYXJkZWQgYXMgYW4gZW1wdHkgYnVja2V0IGJvdGggY2hlY2tzIGFyZSBuZWNlc3NhcnkuXG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGggPT09IDAgJiYgIXRoaXMuaGFzUlRMVGV4dDtcbiAgICB9XG5cbiAgICB1cGxvYWRQZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCB8fCB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCAmJiB0aGlzLmhhc0RlYnVnRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb2xsaXNpb25Cb3gudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5pY29uQ29sbGlzaW9uQm94LnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHQudXBsb2FkKGNvbnRleHQsIHRoaXMuc29ydEZlYXR1cmVzQnlZLCAhdGhpcy51cGxvYWRlZCwgdGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCk7XG4gICAgICAgIHRoaXMuaWNvbi51cGxvYWQoY29udGV4dCwgdGhpcy5zb3J0RmVhdHVyZXNCeVksICF0aGlzLnVwbG9hZGVkLCB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveURlYnVnRGF0YSgpIHtcbiAgICAgICAgdGhpcy50ZXh0Q29sbGlzaW9uQm94LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pY29uQ29sbGlzaW9uQm94LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRleHQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmljb24uZGVzdHJveSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFRvTGluZVZlcnRleEFycmF5KGFuY2hvcjogQW5jaG9yLCBsaW5lOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0SW5kZXggPSB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIGlmIChhbmNob3Iuc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgc3VtRm9yd2FyZExlbmd0aCA9IGFuY2hvci5kaXN0KGxpbmVbYW5jaG9yLnNlZ21lbnQgKyAxXSk7XG4gICAgICAgICAgICBsZXQgc3VtQmFja3dhcmRMZW5ndGggPSBhbmNob3IuZGlzdChsaW5lW2FuY2hvci5zZWdtZW50XSk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFuY2hvci5zZWdtZW50ICsgMTsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHt4OiBsaW5lW2ldLngsIHk6IGxpbmVbaV0ueSwgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IHN1bUZvcndhcmRMZW5ndGh9O1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bUZvcndhcmRMZW5ndGggKz0gbGluZVtpICsgMV0uZGlzdChsaW5lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYW5jaG9yLnNlZ21lbnQgfHwgMDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHt4OiBsaW5lW2ldLngsIHk6IGxpbmVbaV0ueSwgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IHN1bUJhY2t3YXJkTGVuZ3RofTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtQmFja3dhcmRMZW5ndGggKz0gbGluZVtpIC0gMV0uZGlzdChsaW5lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayh2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC50aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LFxuICAgICAgICAgICAgbGluZUxlbmd0aDogdGhpcy5saW5lVmVydGV4QXJyYXkubGVuZ3RoIC0gbGluZVN0YXJ0SW5kZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhZGRTeW1ib2xzKGFycmF5czogU3ltYm9sQnVmZmVycyxcbiAgICAgICAgICAgICAgIHF1YWRzOiBBcnJheTxTeW1ib2xRdWFkPixcbiAgICAgICAgICAgICAgIHNpemVWZXJ0ZXg6IGFueSxcbiAgICAgICAgICAgICAgIGxpbmVPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICBhbG9uZ0xpbmU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IGFueSxcbiAgICAgICAgICAgICAgIGxhYmVsQW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICBsaW5lU3RhcnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgbGluZUxlbmd0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgYXNzb2NpYXRlZEljb25JbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IGFycmF5cy5pbmRleEFycmF5O1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheTtcblxuICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQgKiBxdWFkcy5sZW5ndGgsIGxheW91dFZlcnRleEFycmF5LCBpbmRleEFycmF5LCBmZWF0dXJlLnNvcnRLZXkpO1xuICAgICAgICBjb25zdCBnbHlwaE9mZnNldEFycmF5U3RhcnQgPSB0aGlzLmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoO1xuICAgICAgICBjb25zdCB2ZXJ0ZXhTdGFydEluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgY29uc3QgYW5nbGUgPSAodGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkgPyBNYXRoLlBJIC8gMiA6IDA7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBmZWF0dXJlLnRleHQgJiYgZmVhdHVyZS50ZXh0LnNlY3Rpb25zO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHt0bCwgdHIsIGJsLCBiciwgdGV4LCBwaXhlbE9mZnNldFRMLCBwaXhlbE9mZnNldEJSLCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZLCBnbHlwaE9mZnNldCwgaXNTREYsIHNlY3Rpb25JbmRleH0gPSBxdWFkc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbnN0IHkgPSBnbHlwaE9mZnNldFsxXTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSwgdGwueCwgeSArIHRsLnksIHRleC54LCB0ZXgueSwgc2l6ZVZlcnRleCwgaXNTREYsIHBpeGVsT2Zmc2V0VEwueCwgcGl4ZWxPZmZzZXRUTC55LCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZKTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSwgdHIueCwgeSArIHRyLnksIHRleC54ICsgdGV4LncsIHRleC55LCBzaXplVmVydGV4LCBpc1NERiwgcGl4ZWxPZmZzZXRCUi54LCBwaXhlbE9mZnNldFRMLnksIG1pbkZvbnRTY2FsZVgsIG1pbkZvbnRTY2FsZVkpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvci54LCBsYWJlbEFuY2hvci55LCBibC54LCB5ICsgYmwueSwgdGV4LngsIHRleC55ICsgdGV4LmgsIHNpemVWZXJ0ZXgsIGlzU0RGLCBwaXhlbE9mZnNldFRMLngsIHBpeGVsT2Zmc2V0QlIueSwgbWluRm9udFNjYWxlWCwgbWluRm9udFNjYWxlWSk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGxhYmVsQW5jaG9yLngsIGxhYmVsQW5jaG9yLnksIGJyLngsIHkgKyBici55LCB0ZXgueCArIHRleC53LCB0ZXgueSArIHRleC5oLCBzaXplVmVydGV4LCBpc1NERiwgcGl4ZWxPZmZzZXRCUi54LCBwaXhlbE9mZnNldEJSLnksIG1pbkZvbnRTY2FsZVgsIG1pbkZvbnRTY2FsZVkpO1xuXG4gICAgICAgICAgICBhZGREeW5hbWljQXR0cmlidXRlcyhhcnJheXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBsYWJlbEFuY2hvciwgYW5nbGUpO1xuXG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMSwgaW5kZXggKyAyLCBpbmRleCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcblxuICAgICAgICAgICAgdGhpcy5nbHlwaE9mZnNldEFycmF5LmVtcGxhY2VCYWNrKGdseXBoT2Zmc2V0WzBdKTtcblxuICAgICAgICAgICAgaWYgKGkgPT09IHF1YWRzLmxlbmd0aCAtIDEgfHwgc2VjdGlvbkluZGV4ICE9PSBxdWFkc1tpICsgMV0uc2VjdGlvbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKGxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSwgZmVhdHVyZS5pbmRleCwge30sIGNhbm9uaWNhbCwgc2VjdGlvbnMgJiYgc2VjdGlvbnNbc2VjdGlvbkluZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheXMucGxhY2VkU3ltYm9sQXJyYXkuZW1wbGFjZUJhY2sobGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSxcbiAgICAgICAgICAgIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCAtIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdmVydGV4U3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lTGVuZ3RoLCAobGFiZWxBbmNob3Iuc2VnbWVudDogYW55KSxcbiAgICAgICAgICAgIHNpemVWZXJ0ZXggPyBzaXplVmVydGV4WzBdIDogMCwgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMV0gOiAwLFxuICAgICAgICAgICAgbGluZU9mZnNldFswXSwgbGluZU9mZnNldFsxXSxcbiAgICAgICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICAgICAgLy8gcGxhY2VkT3JpZW50YXRpb24gaXMgbnVsbCBpbml0aWFsbHk7IHdpbGwgYmUgdXBkYXRlZCB0byBob3Jpem9udGFsKDEpL3ZlcnRpY2FsKDIpIGlmIHBsYWNlZFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIChmYWxzZTogYW55KSxcbiAgICAgICAgICAgIC8vIFRoZSBjcm9zc1RpbGVJRCBpcyBvbmx5IGZpbGxlZC91c2VkIG9uIHRoZSBmb3JlZ3JvdW5kIGZvciBkeW5hbWljIHRleHQgYW5jaG9yc1xuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGFzc29jaWF0ZWRJY29uSW5kZXhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBcnJheTogU3RydWN0QXJyYXksIHBvaW50OiBQb2ludCwgYW5jaG9yWDogbnVtYmVyLCBhbmNob3JZOiBudW1iZXIsIGV4dHJ1ZGU6IFBvaW50KSB7XG4gICAgICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICByZXR1cm4gbGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAvLyBwb3NcbiAgICAgICAgICAgIHBvaW50LngsXG4gICAgICAgICAgICBwb2ludC55LFxuICAgICAgICAgICAgLy8gYV9hbmNob3JfcG9zXG4gICAgICAgICAgICBhbmNob3JYLFxuICAgICAgICAgICAgYW5jaG9yWSxcbiAgICAgICAgICAgIC8vIGV4dHJ1ZGVcbiAgICAgICAgICAgIE1hdGgucm91bmQoZXh0cnVkZS54KSxcbiAgICAgICAgICAgIE1hdGgucm91bmQoZXh0cnVkZS55KSk7XG4gICAgfVxuXG4gICAgYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBhcnJheXM6IENvbGxpc2lvbkJ1ZmZlcnMsIGJveEFuY2hvclBvaW50OiBQb2ludCwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSBhcnJheXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCwgYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBhcnJheXMuaW5kZXhBcnJheSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0VmVydGV4QXJyYXkgPSBhcnJheXMubGF5b3V0VmVydGV4QXJyYXk7XG4gICAgICAgIGNvbnN0IGNvbGxpc2lvblZlcnRleEFycmF5ID0gYXJyYXlzLmNvbGxpc2lvblZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IGFuY2hvclggPSBzeW1ib2xJbnN0YW5jZS5hbmNob3JYO1xuICAgICAgICBjb25zdCBhbmNob3JZID0gc3ltYm9sSW5zdGFuY2UuYW5jaG9yWTtcblxuICAgICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY29sbGlzaW9uVmVydGV4QXJyYXksIGJveEFuY2hvclBvaW50LCBhbmNob3JYLCBhbmNob3JZLCBuZXcgUG9pbnQoeDEsIHkxKSk7XG4gICAgICAgIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBcnJheSwgYm94QW5jaG9yUG9pbnQsIGFuY2hvclgsIGFuY2hvclksIG5ldyBQb2ludCh4MiwgeTEpKTtcbiAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGNvbGxpc2lvblZlcnRleEFycmF5LCBib3hBbmNob3JQb2ludCwgYW5jaG9yWCwgYW5jaG9yWSwgbmV3IFBvaW50KHgyLCB5MikpO1xuICAgICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY29sbGlzaW9uVmVydGV4QXJyYXksIGJveEFuY2hvclBvaW50LCBhbmNob3JYLCBhbmNob3JZLCBuZXcgUG9pbnQoeDEsIHkyKSk7XG5cbiAgICAgICAgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gNDtcblxuICAgICAgICBjb25zdCBpbmRleEFycmF5OiBMaW5lSW5kZXhBcnJheSA9IChhcnJheXMuaW5kZXhBcnJheTogYW55KTtcbiAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxKTtcbiAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAyLCBpbmRleCArIDMpO1xuICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMywgaW5kZXgpO1xuXG4gICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDQ7XG4gICAgfVxuXG4gICAgYWRkRGVidWdDb2xsaXNpb25Cb3hlcyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgaXNUZXh0OiBib29sZWFuKSB7XG4gICAgICAgIGZvciAobGV0IGIgPSBzdGFydEluZGV4OyBiIDwgZW5kSW5kZXg7IGIrKykge1xuICAgICAgICAgICAgY29uc3QgYm94OiBDb2xsaXNpb25Cb3ggPSAodGhpcy5jb2xsaXNpb25Cb3hBcnJheS5nZXQoYik6IGFueSk7XG4gICAgICAgICAgICBjb25zdCB4MSA9IGJveC54MTtcbiAgICAgICAgICAgIGNvbnN0IHkxID0gYm94LnkxO1xuICAgICAgICAgICAgY29uc3QgeDIgPSBib3gueDI7XG4gICAgICAgICAgICBjb25zdCB5MiA9IGJveC55MjtcblxuICAgICAgICAgICAgdGhpcy5hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKHgxLCB5MSwgeDIsIHkyLFxuICAgICAgICAgICAgICAgIGlzVGV4dCA/IHRoaXMudGV4dENvbGxpc2lvbkJveCA6IHRoaXMuaWNvbkNvbGxpc2lvbkJveCxcbiAgICAgICAgICAgICAgICBib3guYW5jaG9yUG9pbnQsIHN5bWJvbEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z0RhdGEoKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95RGVidWdEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRleHRDb2xsaXNpb25Cb3ggPSBuZXcgQ29sbGlzaW9uQnVmZmVycyhDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSwgY29sbGlzaW9uQm94TGF5b3V0Lm1lbWJlcnMsIExpbmVJbmRleEFycmF5KTtcbiAgICAgICAgdGhpcy5pY29uQ29sbGlzaW9uQm94ID0gbmV3IENvbGxpc2lvbkJ1ZmZlcnMoQ29sbGlzaW9uQm94TGF5b3V0QXJyYXksIGNvbGxpc2lvbkJveExheW91dC5tZW1iZXJzLCBMaW5lSW5kZXhBcnJheSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICB0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoc3ltYm9sSW5zdGFuY2UudGV4dEJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLnRleHRCb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5hZGREZWJ1Z0NvbGxpc2lvbkJveGVzKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsVGV4dEJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmFkZERlYnVnQ29sbGlzaW9uQm94ZXMoc3ltYm9sSW5zdGFuY2UuaWNvbkJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLmljb25Cb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRGVidWdDb2xsaXNpb25Cb3hlcyhzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbEljb25Cb3hTdGFydEluZGV4LCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbEljb25Cb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIGZsYXQgYXJyYXlzIGFyZSBtZWFudCB0byBiZSBxdWlja2VyIHRvIGl0ZXJhdGUgb3ZlciB0aGFuIHRoZSBzb3VyY2VcbiAgICAvLyBDb2xsaXNpb25Cb3hBcnJheVxuICAgIF9kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzRm9yU3ltYm9sKGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgdGV4dFN0YXJ0SW5kZXg6IG51bWJlciwgdGV4dEVuZEluZGV4OiBudW1iZXIsXG4gICAgICAgIHZlcnRpY2FsVGV4dFN0YXJ0SW5kZXg6IG51bWJlciwgdmVydGljYWxUZXh0RW5kSW5kZXg6IG51bWJlcixcbiAgICAgICAgaWNvblN0YXJ0SW5kZXg6IG51bWJlciwgaWNvbkVuZEluZGV4OiBudW1iZXIsXG4gICAgICAgIHZlcnRpY2FsSWNvblN0YXJ0SW5kZXg6IG51bWJlciwgdmVydGljYWxJY29uRW5kSW5kZXg6IG51bWJlcik6IENvbGxpc2lvbkFycmF5cyB7XG5cbiAgICAgICAgY29uc3QgY29sbGlzaW9uQXJyYXlzID0ge307XG4gICAgICAgIGZvciAobGV0IGsgPSB0ZXh0U3RhcnRJbmRleDsgayA8IHRleHRFbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoayk6IGFueSk7XG4gICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudGV4dEJveCA9IHt4MTogYm94LngxLCB5MTogYm94LnkxLCB4MjogYm94LngyLCB5MjogYm94LnkyLCBhbmNob3JQb2ludFg6IGJveC5hbmNob3JQb2ludFgsIGFuY2hvclBvaW50WTogYm94LmFuY2hvclBvaW50WX07XG4gICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudGV4dEZlYXR1cmVJbmRleCA9IGJveC5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgayA9IHZlcnRpY2FsVGV4dFN0YXJ0SW5kZXg7IGsgPCB2ZXJ0aWNhbFRleHRFbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoayk6IGFueSk7XG4gICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0Qm94ID0ge3gxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIGFuY2hvclBvaW50WDogYm94LmFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZOiBib3guYW5jaG9yUG9pbnRZfTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXggPSBib3guZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgYnJlYWs7IC8vIE9ubHkgb25lIGJveCBhbGxvd2VkIHBlciBpbnN0YW5jZVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgPSBpY29uU3RhcnRJbmRleDsgayA8IGljb25FbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICAvLyBBbiBpY29uIGNhbiBvbmx5IGhhdmUgb25lIGJveCBub3csIHNvIHRoaXMgaW5kZXhpbmcgaXMgYSBiaXQgdmVzdGlnaWFsLi4uXG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoayk6IGFueSk7XG4gICAgICAgICAgICBjb2xsaXNpb25BcnJheXMuaWNvbkJveCA9IHt4MTogYm94LngxLCB5MTogYm94LnkxLCB4MjogYm94LngyLCB5MjogYm94LnkyLCBhbmNob3JQb2ludFg6IGJveC5hbmNob3JQb2ludFgsIGFuY2hvclBvaW50WTogYm94LmFuY2hvclBvaW50WX07XG4gICAgICAgICAgICBjb2xsaXNpb25BcnJheXMuaWNvbkZlYXR1cmVJbmRleCA9IGJveC5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgayA9IHZlcnRpY2FsSWNvblN0YXJ0SW5kZXg7IGsgPCB2ZXJ0aWNhbEljb25FbmRJbmRleDsgaysrKSB7XG4gICAgICAgICAgICAvLyBBbiBpY29uIGNhbiBvbmx5IGhhdmUgb25lIGJveCBub3csIHNvIHRoaXMgaW5kZXhpbmcgaXMgYSBiaXQgdmVzdGlnaWFsLi4uXG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoayk6IGFueSk7XG4gICAgICAgICAgICBjb2xsaXNpb25BcnJheXMudmVydGljYWxJY29uQm94ID0ge3gxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIGFuY2hvclBvaW50WDogYm94LmFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZOiBib3guYW5jaG9yUG9pbnRZfTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25GZWF0dXJlSW5kZXggPSBib3guZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgYnJlYWs7IC8vIE9ubHkgb25lIGJveCBhbGxvd2VkIHBlciBpbnN0YW5jZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsaXNpb25BcnJheXM7XG4gICAgfVxuXG4gICAgZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25BcnJheXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkFycmF5cy5wdXNoKHRoaXMuX2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2woXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudGV4dEJveFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudmVydGljYWxUZXh0Qm94RW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuaWNvbkJveFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94RW5kSW5kZXhcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzVGV4dERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBoYXNJY29uRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvbi5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGhhc0RlYnVnRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dENvbGxpc2lvbkJveCAmJiB0aGlzLmljb25Db2xsaXNpb25Cb3g7XG4gICAgfVxuXG4gICAgaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0RlYnVnRGF0YSgpICYmIHRoaXMudGV4dENvbGxpc2lvbkJveC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNEZWJ1Z0RhdGEoKSAmJiB0aGlzLmljb25Db2xsaXNpb25Cb3guc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBhZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKGljb25PclRleHQ6IFN5bWJvbEJ1ZmZlcnMsIHBsYWNlZFN5bWJvbEluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sID0gaWNvbk9yVGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQocGxhY2VkU3ltYm9sSW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gcGxhY2VkU3ltYm9sLnZlcnRleFN0YXJ0SW5kZXggKyBwbGFjZWRTeW1ib2wubnVtR2x5cGhzICogNDtcbiAgICAgICAgZm9yIChsZXQgdmVydGV4SW5kZXggPSBwbGFjZWRTeW1ib2wudmVydGV4U3RhcnRJbmRleDsgdmVydGV4SW5kZXggPCBlbmRJbmRleDsgdmVydGV4SW5kZXggKz0gNCkge1xuICAgICAgICAgICAgaWNvbk9yVGV4dC5pbmRleEFycmF5LmVtcGxhY2VCYWNrKHZlcnRleEluZGV4LCB2ZXJ0ZXhJbmRleCArIDEsIHZlcnRleEluZGV4ICsgMik7XG4gICAgICAgICAgICBpY29uT3JUZXh0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXggKyAxLCB2ZXJ0ZXhJbmRleCArIDIsIHZlcnRleEluZGV4ICsgMyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTb3J0ZWRTeW1ib2xJbmRleGVzKGFuZ2xlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuc29ydGVkQW5nbGUgPT09IGFuZ2xlICYmIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgY29uc3Qgcm90YXRlZFlzID0gW107XG4gICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleGVzID0gW107XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICByb3RhdGVkWXMucHVzaChNYXRoLnJvdW5kKHNpbiAqIHN5bWJvbEluc3RhbmNlLmFuY2hvclggKyBjb3MgKiBzeW1ib2xJbnN0YW5jZS5hbmNob3JZKSB8IDApO1xuICAgICAgICAgICAgZmVhdHVyZUluZGV4ZXMucHVzaChzeW1ib2xJbnN0YW5jZS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnNvcnQoKGFJbmRleCwgYkluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHJvdGF0ZWRZc1thSW5kZXhdIC0gcm90YXRlZFlzW2JJbmRleF0pIHx8XG4gICAgICAgICAgICAgICAgICAgKGZlYXR1cmVJbmRleGVzW2JJbmRleF0gLSBmZWF0dXJlSW5kZXhlc1thSW5kZXhdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhZGRUb1NvcnRLZXlSYW5nZXMoc3ltYm9sSW5zdGFuY2VJbmRleDogbnVtYmVyLCBzb3J0S2V5OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMuc29ydEtleVJhbmdlc1t0aGlzLnNvcnRLZXlSYW5nZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3Quc29ydEtleSA9PT0gc29ydEtleSkge1xuICAgICAgICAgICAgbGFzdC5zeW1ib2xJbnN0YW5jZUVuZCA9IHN5bWJvbEluc3RhbmNlSW5kZXggKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb3J0S2V5UmFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNvcnRLZXksXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2VTdGFydDogc3ltYm9sSW5zdGFuY2VJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZUVuZDogc3ltYm9sSW5zdGFuY2VJbmRleCArIDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc29ydEZlYXR1cmVzKGFuZ2xlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNvcnRGZWF0dXJlc0J5WSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5zb3J0ZWRBbmdsZSA9PT0gYW5nbGUpIHJldHVybjtcblxuICAgICAgICAvLyBUaGUgY3VycmVudCBhcHByb2FjaCB0byBzb3J0aW5nIGRvZXNuJ3Qgc29ydCBhY3Jvc3Mgc2VnbWVudHMgc28gZG9uJ3QgdHJ5LlxuICAgICAgICAvLyBTb3J0aW5nIHdpdGhpbiBzZWdtZW50cyBzZXBhcmF0ZWx5IHNlZW1lZCBub3QgdG8gYmUgd29ydGggdGhlIGNvbXBsZXhpdHkuXG4gICAgICAgIGlmICh0aGlzLnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSB8fCB0aGlzLmljb24uc2VnbWVudHMuZ2V0KCkubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSBzeW1ib2xzIGFyZSBhbGxvd2VkIHRvIG92ZXJsYXAgc29ydCB0aGVtIGJ5IHRoZWlyIHZlcnRpY2FsIHNjcmVlbiBwb3NpdGlvbi5cbiAgICAgICAgLy8gVGhlIGluZGV4IGFycmF5IGJ1ZmZlciBpcyByZXdyaXR0ZW4gdG8gcmVmZXJlbmNlIHRoZSAodW5jaGFuZ2VkKSB2ZXJ0aWNlcyBpbiB0aGVcbiAgICAgICAgLy8gc29ydGVkIG9yZGVyLlxuXG4gICAgICAgIC8vIFRvIGF2b2lkIHNvcnRpbmcgdGhlIGFjdHVhbCBzeW1ib2xJbnN0YW5jZSBhcnJheSB3ZSBzb3J0IGFuIGFycmF5IG9mIGluZGV4ZXMuXG4gICAgICAgIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzID0gdGhpcy5nZXRTb3J0ZWRTeW1ib2xJbmRleGVzKGFuZ2xlKTtcbiAgICAgICAgdGhpcy5zb3J0ZWRBbmdsZSA9IGFuZ2xlO1xuXG4gICAgICAgIHRoaXMudGV4dC5pbmRleEFycmF5LmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaWNvbi5pbmRleEFycmF5LmNsZWFyKCk7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlU29ydE9yZGVyID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZVNvcnRPcmRlci5wdXNoKHN5bWJvbEluc3RhbmNlLmZlYXR1cmVJbmRleCk7XG5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICAgICAgXS5mb3JFYWNoKChpbmRleCwgaSwgYXJyYXkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCBhIGdpdmVuIGluZGV4IHRoZSBmaXJzdCB0aW1lIGl0IHNob3dzIHVwLFxuICAgICAgICAgICAgICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0ZSBvcGFjaXR5IGVudHJpZXMgd2hlbiBtdWx0aXBsZSBqdXN0aWZpY2F0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHNoYXJlIHRoZSBzYW1lIGdseXBocy5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBhcnJheS5pbmRleE9mKGluZGV4KSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy50ZXh0LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKHRoaXMudGV4dCwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UucGxhY2VkSWNvblN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLCBzeW1ib2xJbnN0YW5jZS5wbGFjZWRJY29uU3ltYm9sSW5kZXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSW5kaWNlc0ZvclBsYWNlZFN5bWJvbCh0aGlzLmljb24sIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRleHQuaW5kZXhCdWZmZXIpIHRoaXMudGV4dC5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMudGV4dC5pbmRleEFycmF5KTtcbiAgICAgICAgaWYgKHRoaXMuaWNvbi5pbmRleEJ1ZmZlcikgdGhpcy5pY29uLmluZGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy5pY29uLmluZGV4QXJyYXkpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbEJ1Y2tldCcsIFN5bWJvbEJ1Y2tldCwge1xuICAgIG9taXQ6IFsnbGF5ZXJzJywgJ2NvbGxpc2lvbkJveEFycmF5JywgJ2ZlYXR1cmVzJywgJ2NvbXBhcmVUZXh0J11cbn0pO1xuXG4vLyB0aGlzIGNvbnN0YW50IGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mIFN0cnVjdEFycmF5IGluZGV4ZXMgdXNlZCBpbiBhIHN5bWJvbFxuLy8gYnVja2V0LS1uYW1lbHksIGdseXBoT2Zmc2V0QXJyYXlTdGFydFxuLy8gZWcgdGhlIG1heCB2YWxpZCBVSW50MTYgaXMgNjUsNTM1XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5MDcgZm9yIG1vdGl2YXRpb25cbi8vIGxpbmVTdGFydEluZGV4IGFuZCB0ZXh0Qm94U3RhcnRJbmRleCBjb3VsZCBwb3RlbnRpYWxseSBiZSBjb25jZXJuc1xuLy8gYnV0IHdlIGV4cGVjdCB0aGVyZSB0byBiZSBtYW55IGZld2VyIGJveGVzL2xpbmVzIHRoYW4gZ2x5cGhzXG5TeW1ib2xCdWNrZXQuTUFYX0dMWVBIUyA9IDY1NTM1O1xuXG5TeW1ib2xCdWNrZXQuYWRkRHluYW1pY0F0dHJpYnV0ZXMgPSBhZGREeW5hbWljQXR0cmlidXRlcztcblxuZXhwb3J0IGRlZmF1bHQgU3ltYm9sQnVja2V0O1xuZXhwb3J0IHthZGREeW5hbWljQXR0cmlidXRlc307XG4iLCIvLyBAZmxvd1xuZXhwb3J0IGRlZmF1bHQgcmVzb2x2ZVRva2VucztcblxuLyoqXG4gKiBSZXBsYWNlIHRva2VucyBpbiBhIHN0cmluZyB0ZW1wbGF0ZSB3aXRoIHZhbHVlcyBpbiBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcHJvcGVydGllcyBhIGtleS92YWx1ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0b2tlbnMgYW5kIHJlcGxhY2VtZW50c1xuICogQHBhcmFtIHRleHQgdGhlIHRlbXBsYXRlIHN0cmluZ1xuICogQHJldHVybnMgdGhlIHRlbXBsYXRlIHdpdGggdG9rZW5zIHJlcGxhY2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5zKHByb3BlcnRpZXM6IHsrW3N0cmluZ106IG1peGVkfSwgdGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC97KFtee31dKyl9L2csIChtYXRjaCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGtleSBpbiBwcm9wZXJ0aWVzID8gU3RyaW5nKHByb3BlcnRpZXNba2V5XSkgOiAnJztcbiAgICB9KTtcbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZSc7XG5cbmltcG9ydCB7XG4gICAgQ29sb3JUeXBlXG59IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIExheW91dFByb3BzID0ge3xcbiAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJwb2ludFwiIHwgXCJsaW5lXCIgfCBcImxpbmUtY2VudGVyXCI+LFxuICAgIFwic3ltYm9sLXNwYWNpbmdcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInN5bWJvbC1hdm9pZC1lZGdlc1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcInN5bWJvbC1zb3J0LWtleVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInN5bWJvbC16LW9yZGVyXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwiYXV0b1wiIHwgXCJ2aWV3cG9ydC15XCIgfCBcInNvdXJjZVwiPixcbiAgICBcImljb24tYWxsb3ctb3ZlcmxhcFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImljb24taWdub3JlLXBsYWNlbWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImljb24tb3B0aW9uYWxcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiIHwgXCJhdXRvXCI+LFxuICAgIFwiaWNvbi1zaXplXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi10ZXh0LWZpdFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm5vbmVcIiB8IFwid2lkdGhcIiB8IFwiaGVpZ2h0XCIgfCBcImJvdGhcIj4sXG4gICAgXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiaWNvbi1pbWFnZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8UmVzb2x2ZWRJbWFnZT4sXG4gICAgXCJpY29uLXJvdGF0ZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24tcGFkZGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi1rZWVwLXVwcmlnaHRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJpY29uLW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJpY29uLWFuY2hvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJjZW50ZXJcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJ0b3BcIiB8IFwiYm90dG9tXCIgfCBcInRvcC1sZWZ0XCIgfCBcInRvcC1yaWdodFwiIHwgXCJib3R0b20tbGVmdFwiIHwgXCJib3R0b20tcmlnaHRcIj4sXG4gICAgXCJpY29uLXBpdGNoLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiIHwgXCJhdXRvXCI+LFxuICAgIFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIiB8IFwiYXV0b1wiPixcbiAgICBcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJ0ZXh0LWZpZWxkXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxGb3JtYXR0ZWQ+LFxuICAgIFwidGV4dC1mb250XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxBcnJheTxzdHJpbmc+PixcbiAgICBcInRleHQtc2l6ZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtbWF4LXdpZHRoXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1saW5lLWhlaWdodFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1sZXR0ZXItc3BhY2luZ1wiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtanVzdGlmeVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJhdXRvXCIgfCBcImxlZnRcIiB8IFwiY2VudGVyXCIgfCBcInJpZ2h0XCI+LFxuICAgIFwidGV4dC1yYWRpYWwtb2Zmc2V0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8QXJyYXk8XCJjZW50ZXJcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJ0b3BcIiB8IFwiYm90dG9tXCIgfCBcInRvcC1sZWZ0XCIgfCBcInRvcC1yaWdodFwiIHwgXCJib3R0b20tbGVmdFwiIHwgXCJib3R0b20tcmlnaHRcIj4+LFxuICAgIFwidGV4dC1hbmNob3JcIjogRGF0YURyaXZlblByb3BlcnR5PFwiY2VudGVyXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJ0b3AtbGVmdFwiIHwgXCJ0b3AtcmlnaHRcIiB8IFwiYm90dG9tLWxlZnRcIiB8IFwiYm90dG9tLXJpZ2h0XCI+LFxuICAgIFwidGV4dC1tYXgtYW5nbGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtd3JpdGluZy1tb2RlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PEFycmF5PFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiPj4sXG4gICAgXCJ0ZXh0LXJvdGF0ZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtcGFkZGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1rZWVwLXVwcmlnaHRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LXRyYW5zZm9ybVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJub25lXCIgfCBcInVwcGVyY2FzZVwiIHwgXCJsb3dlcmNhc2VcIj4sXG4gICAgXCJ0ZXh0LW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LW9wdGlvbmFsXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXBsYWNlbWVudFwiXSksXG4gICAgXCJzeW1ib2wtc3BhY2luZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1zcGFjaW5nXCJdKSxcbiAgICBcInN5bWJvbC1hdm9pZC1lZGdlc1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXSksXG4gICAgXCJzeW1ib2wtc29ydC1rZXlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXNvcnQta2V5XCJdKSxcbiAgICBcInN5bWJvbC16LW9yZGVyXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXotb3JkZXJcIl0pLFxuICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdKSxcbiAgICBcImljb24taWdub3JlLXBsYWNlbWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24taWdub3JlLXBsYWNlbWVudFwiXSksXG4gICAgXCJpY29uLW9wdGlvbmFsXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1vcHRpb25hbFwiXSksXG4gICAgXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdKSxcbiAgICBcImljb24tc2l6ZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXNpemVcIl0pLFxuICAgIFwiaWNvbi10ZXh0LWZpdFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tdGV4dC1maXRcIl0pLFxuICAgIFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCJdKSxcbiAgICBcImljb24taW1hZ2VcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1pbWFnZVwiXSksXG4gICAgXCJpY29uLXJvdGF0ZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXJvdGF0ZVwiXSksXG4gICAgXCJpY29uLXBhZGRpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXBhZGRpbmdcIl0pLFxuICAgIFwiaWNvbi1rZWVwLXVwcmlnaHRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWtlZXAtdXByaWdodFwiXSksXG4gICAgXCJpY29uLW9mZnNldFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLW9mZnNldFwiXSksXG4gICAgXCJpY29uLWFuY2hvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWFuY2hvclwiXSksXG4gICAgXCJpY29uLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICBcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1waXRjaC1hbGlnbm1lbnRcIl0pLFxuICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXSksXG4gICAgXCJ0ZXh0LWZpZWxkXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtZmllbGRcIl0pLFxuICAgIFwidGV4dC1mb250XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtZm9udFwiXSksXG4gICAgXCJ0ZXh0LXNpemVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1zaXplXCJdKSxcbiAgICBcInRleHQtbWF4LXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbWF4LXdpZHRoXCJdKSxcbiAgICBcInRleHQtbGluZS1oZWlnaHRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWxpbmUtaGVpZ2h0XCJdKSxcbiAgICBcInRleHQtbGV0dGVyLXNwYWNpbmdcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1sZXR0ZXItc3BhY2luZ1wiXSksXG4gICAgXCJ0ZXh0LWp1c3RpZnlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1qdXN0aWZ5XCJdKSxcbiAgICBcInRleHQtcmFkaWFsLW9mZnNldFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIl0pLFxuICAgIFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LWFuY2hvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbWF4LWFuZ2xlXCJdKSxcbiAgICBcInRleHQtd3JpdGluZy1tb2RlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC13cml0aW5nLW1vZGVcIl0pLFxuICAgIFwidGV4dC1yb3RhdGVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1yb3RhdGVcIl0pLFxuICAgIFwidGV4dC1wYWRkaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1wYWRkaW5nXCJdKSxcbiAgICBcInRleHQta2VlcC11cHJpZ2h0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1rZWVwLXVwcmlnaHRcIl0pLFxuICAgIFwidGV4dC10cmFuc2Zvcm1cIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC10cmFuc2Zvcm1cIl0pLFxuICAgIFwidGV4dC1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1vZmZzZXRcIl0pLFxuICAgIFwidGV4dC1hbGxvdy1vdmVybGFwXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1hbGxvdy1vdmVybGFwXCJdKSxcbiAgICBcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXSksXG4gICAgXCJ0ZXh0LW9wdGlvbmFsXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1vcHRpb25hbFwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJpY29uLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJpY29uLWhhbG8tY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImljb24taGFsby13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24taGFsby1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJ0ZXh0LW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJ0ZXh0LWhhbG8tY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcInRleHQtaGFsby13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtaGFsby1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJpY29uLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLW9wYWNpdHlcIl0pLFxuICAgIFwiaWNvbi1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24tY29sb3JcIl0pLFxuICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi1oYWxvLWNvbG9yXCJdKSxcbiAgICBcImljb24taGFsby13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby13aWR0aFwiXSksXG4gICAgXCJpY29uLWhhbG8tYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby1ibHVyXCJdKSxcbiAgICBcImljb24tdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LW9wYWNpdHlcIl0pLFxuICAgIFwidGV4dC1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtY29sb3JcIl0sIHsgcnVudGltZVR5cGU6IENvbG9yVHlwZSwgZ2V0T3ZlcnJpZGU6IChvKSA9PiBvLnRleHRDb2xvciwgaGFzT3ZlcnJpZGU6IChvKSA9PiAhIW8udGV4dENvbG9yIH0pLFxuICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC1oYWxvLWNvbG9yXCJdKSxcbiAgICBcInRleHQtaGFsby13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby13aWR0aFwiXSksXG4gICAgXCJ0ZXh0LWhhbG8tYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby1ibHVyXCJdKSxcbiAgICBcInRleHQtdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LXRyYW5zbGF0ZVwiXSksXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCwgbGF5b3V0IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+LCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2V4cHJlc3Npb24nO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2V2YWx1YXRpb25fY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHtab29tQ29uc3RhbnRFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuaW1wb3J0IHtOdWxsVHlwZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzJztcbmltcG9ydCB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyJztcblxuLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBleHByZXNzaW9uIGNsYXNzLiBJdCBpcyBvbmx5IHVzZWQgaW4gR0wgSlMgYW5kXG4vLyBoYXMgR0wgSlMgZGVwZW5kZW5jaWVzIHdoaWNoIGNhbiBicmVhayB0aGUgc3RhbmRhbG9uZSBzdHlsZS1zcGVjIG1vZHVsZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybWF0U2VjdGlvbk92ZXJyaWRlPFQ+IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBkZWZhdWx0VmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPjtcblxuICAgIGNvbnN0cnVjdG9yKGRlZmF1bHRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+KSB7XG4gICAgICAgIGFzc2VydChkZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzICE9PSB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLnR5cGUgPSBkZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzID8gZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcy5ydW50aW1lVHlwZSA6IE51bGxUeXBlO1xuICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmIChjdHguZm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5kZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlcyAmJiBvdmVycmlkZXMuaGFzT3ZlcnJpZGUoY3R4LmZvcm1hdHRlZFNlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlcy5nZXRPdmVycmlkZShjdHguZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3R4LmZlYXR1cmUgJiYgY3R4LmZlYXR1cmVTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGN0eC5mZWF0dXJlLCBjdHguZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLmRlZmF1bHQ7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFZhbHVlLmlzQ29uc3RhbnQoKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwcjogWm9vbUNvbnN0YW50RXhwcmVzc2lvbjwnc291cmNlJz4gPSAoKHRoaXMuZGVmYXVsdFZhbHVlLnZhbHVlKTogYW55KTtcbiAgICAgICAgICAgIGZuKGV4cHIuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbm5vdCBiZSBzdGF0aWNhbGx5IGV2YWx1YXRlZCwgYXMgdGhlIG91dHB1dCBkZXBlbmRzIG9uIHRoZSBldmFsdWF0aW9uIGNvbnRleHQuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5yZWdpc3RlcignRm9ybWF0U2VjdGlvbk92ZXJyaWRlJywgRm9ybWF0U2VjdGlvbk92ZXJyaWRlLCB7b21pdDogWydkZWZhdWx0VmFsdWUnXX0pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IHJlc29sdmVUb2tlbnMgZnJvbSAnLi4vLi4vdXRpbC9yZXNvbHZlX3Rva2Vucyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHtcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBUcmFuc2l0aW9uaW5nLFxuICAgIExheW91dCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUsXG4gICAgUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHtcbiAgICBpc0V4cHJlc3Npb24sXG4gICAgU3R5bGVFeHByZXNzaW9uLFxuICAgIFpvb21Db25zdGFudEV4cHJlc3Npb24sXG4gICAgWm9vbURlcGVuZGVudEV4cHJlc3Npb25cbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcblxuaW1wb3J0IHR5cGUge0J1Y2tldFBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCB0eXBlIHtMYXlvdXRQcm9wcywgUGFpbnRQcm9wc30gZnJvbSAnLi9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZSwgU291cmNlRXhwcmVzc2lvbiwgQ29tcG9zaXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZXhwcmVzc2lvbic7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQge0Zvcm1hdHRlZFR5cGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcyc7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3ZhbHVlcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQnO1xuaW1wb3J0IEZvcm1hdFNlY3Rpb25PdmVycmlkZSBmcm9tICcuLi9mb3JtYXRfc2VjdGlvbl9vdmVycmlkZSc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvZm9ybWF0JztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9saXRlcmFsJztcblxuY2xhc3MgU3ltYm9sU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF91bmV2YWx1YXRlZExheW91dDogTGF5b3V0PExheW91dFByb3BzPjtcbiAgICBsYXlvdXQ6IFBvc3NpYmx5RXZhbHVhdGVkPExheW91dFByb3BzPjtcblxuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgc3VwZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzKTtcblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ2ljb24tcm90YXRpb24tYWxpZ25tZW50J10gPSAnbWFwJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1snaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICd2aWV3cG9ydCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtcm90YXRpb24tYWxpZ25tZW50J10gPSAnbWFwJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICd2aWV3cG9ydCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB1bnNwZWNpZmllZCwgYCotcGl0Y2gtYWxpZ25tZW50YCBpbmhlcml0cyBgKi1yb3RhdGlvbi1hbGlnbm1lbnRgXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC1waXRjaC1hbGlnbm1lbnQnXSA9IHRoaXMubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdpY29uLXBpdGNoLWFsaWdubWVudCcpID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ2ljb24tcGl0Y2gtYWxpZ25tZW50J10gPSB0aGlzLmxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgPT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRpbmdNb2RlcyA9IHRoaXMubGF5b3V0LmdldCgndGV4dC13cml0aW5nLW1vZGUnKTtcbiAgICAgICAgICAgIGlmICh3cml0aW5nTW9kZXMpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlcywgcHJlc2VydmluZyBvcmRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZHVwZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG0gb2Ygd3JpdGluZ01vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWR1cGVkLmluZGV4T2YobSkgPCAwKSBkZWR1cGVkLnB1c2gobSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtd3JpdGluZy1tb2RlJ10gPSBkZWR1cGVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXdyaXRpbmctbW9kZSddID0gWydob3Jpem9udGFsJ107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXRQYWludE92ZXJyaWRlcygpO1xuICAgIH1cblxuICAgIGdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyhuYW1lOiAqLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5sYXlvdXQuZ2V0KG5hbWUpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIGNvbnN0IHVuZXZhbHVhdGVkID0gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgaWYgKCF1bmV2YWx1YXRlZC5pc0RhdGFEcml2ZW4oKSAmJiAhaXNFeHByZXNzaW9uKHVuZXZhbHVhdGVkLnZhbHVlKSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUb2tlbnMoZmVhdHVyZS5wcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW1ib2xCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZSgpOiBib29sZWFuIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlKTsgLy8gU2hvdWxkIHRha2UgYSBkaWZmZXJlbnQgcGF0aCBpbiBGZWF0dXJlSW5kZXhcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9zZXRQYWludE92ZXJyaWRlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBvdmVycmlkYWJsZSBvZiBwcm9wZXJ0aWVzLnBhaW50Lm92ZXJyaWRhYmxlUHJvcGVydGllcykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2xTdHlsZUxheWVyLmhhc1BhaW50T3ZlcnJpZGUodGhpcy5sYXlvdXQsIG92ZXJyaWRhYmxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVuID0gdGhpcy5wYWludC5nZXQob3ZlcnJpZGFibGUpO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBuZXcgRm9ybWF0U2VjdGlvbk92ZXJyaWRlKG92ZXJyaWRlbik7XG4gICAgICAgICAgICBjb25zdCBzdHlsZUV4cHJlc3Npb24gPSBuZXcgU3R5bGVFeHByZXNzaW9uKG92ZXJyaWRlLCBvdmVycmlkZW4ucHJvcGVydHkuc3BlY2lmaWNhdGlvbik7XG4gICAgICAgICAgICBsZXQgZXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGVuLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcgfHwgb3ZlcnJpZGVuLnZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignc291cmNlJywgc3R5bGVFeHByZXNzaW9uKTogU291cmNlRXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjb21wb3NpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZW4udmFsdWUuem9vbVN0b3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlbi52YWx1ZS5faW50ZXJwb2xhdGlvblR5cGUpOiBDb21wb3NpdGVFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFpbnQuX3ZhbHVlc1tvdmVycmlkYWJsZV0gPSBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKG92ZXJyaWRlbi5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZW4ucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfaGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlPFQsIFI+KG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4sIG5ld1ZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXQgfHwgb2xkVmFsdWUuaXNEYXRhRHJpdmVuKCkgfHwgbmV3VmFsdWUuaXNEYXRhRHJpdmVuKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3ltYm9sU3R5bGVMYXllci5oYXNQYWludE92ZXJyaWRlKHRoaXMubGF5b3V0LCBuYW1lKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaGFzUGFpbnRPdmVycmlkZShsYXlvdXQ6IFBvc3NpYmx5RXZhbHVhdGVkPExheW91dFByb3BzPiwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGV4dEZpZWxkID0gbGF5b3V0LmdldCgndGV4dC1maWVsZCcpO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnRpZXMucGFpbnQucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICBsZXQgaGFzT3ZlcnJpZGVzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY2hlY2tTZWN0aW9ucyA9IChzZWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm92ZXJyaWRlcyAmJiBwcm9wZXJ0eS5vdmVycmlkZXMuaGFzT3ZlcnJpZGUoc2VjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3ZlcnJpZGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGV4dEZpZWxkLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcgJiYgdGV4dEZpZWxkLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgICAgICBjaGVja1NlY3Rpb25zKHRleHRGaWVsZC52YWx1ZS52YWx1ZS5zZWN0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dEZpZWxkLnZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrRXhwcmVzc2lvbiA9IChleHByZXNzaW9uOiBFeHByZXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc092ZXJyaWRlcykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMaXRlcmFsICYmIHR5cGVPZihleHByZXNzaW9uLnZhbHVlKSA9PT0gRm9ybWF0dGVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQ6IEZvcm1hdHRlZCA9ICgoZXhwcmVzc2lvbi52YWx1ZSk6IGFueSk7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU2VjdGlvbnMoZm9ybWF0dGVkLnNlY3Rpb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBGb3JtYXRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU2VjdGlvbnMoZXhwcmVzc2lvbi5zZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoY2hlY2tFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBleHByOiBab29tQ29uc3RhbnRFeHByZXNzaW9uPCdzb3VyY2UnPiA9ICgodGV4dEZpZWxkLnZhbHVlKTogYW55KTtcbiAgICAgICAgICAgIGlmIChleHByLl9zdHlsZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBjaGVja0V4cHJlc3Npb24oZXhwci5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc092ZXJyaWRlcztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbFN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZFByb3BlcnR5PFJlc29sdmVkSW1hZ2U+LFxuICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9iYWNrZ3JvdW5kXCJdW1wiYmFja2dyb3VuZC1jb2xvclwiXSksXG4gICAgXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjogbmV3IENyb3NzRmFkZWRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9iYWNrZ3JvdW5kXCJdW1wiYmFja2dyb3VuZC1wYXR0ZXJuXCJdKSxcbiAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfYmFja2dyb3VuZFwiXVtcImJhY2tncm91bmQtb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcyc7XG5cbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzJztcblxuY2xhc3MgQmFja2dyb3VuZFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tncm91bmRTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZCc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcInJhc3Rlci1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItaHVlLXJvdGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1zYXR1cmF0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItY29udHJhc3RcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1yZXNhbXBsaW5nXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibGluZWFyXCIgfCBcIm5lYXJlc3RcIj4sXG4gICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwicmFzdGVyLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1vcGFjaXR5XCJdKSxcbiAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItaHVlLXJvdGF0ZVwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiXSksXG4gICAgXCJyYXN0ZXItc2F0dXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLXNhdHVyYXRpb25cIl0pLFxuICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItY29udHJhc3RcIl0pLFxuICAgIFwicmFzdGVyLXJlc2FtcGxpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1yZXNhbXBsaW5nXCJdKSxcbiAgICBcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXInO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL3Jhc3Rlcl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzJztcbmltcG9ydCB7VHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNsYXNzIFJhc3RlclN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlclN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vLi4vdWkvbWFwJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxudHlwZSBDdXN0b21SZW5kZXJNZXRob2QgPSAoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgbWF0cml4OiBBcnJheTxudW1iZXI+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY3VzdG9tIHN0eWxlIGxheWVycy4gVGhpcyBpcyBhIHNwZWNpZmljYXRpb24gZm9yXG4gKiBpbXBsZW1lbnRlcnMgdG8gbW9kZWw6IGl0IGlzIG5vdCBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ3VzdG9tIGxheWVycyBhbGxvdyBhIHVzZXIgdG8gcmVuZGVyIGRpcmVjdGx5IGludG8gdGhlIG1hcCdzIEdMIGNvbnRleHQgdXNpbmcgdGhlIG1hcCdzIGNhbWVyYS5cbiAqIFRoZXNlIGxheWVycyBjYW4gYmUgYWRkZWQgYmV0d2VlbiBhbnkgcmVndWxhciBsYXllcnMgdXNpbmcge0BsaW5rIE1hcCNhZGRMYXllcn0uXG4gKlxuICogQ3VzdG9tIGxheWVycyBtdXN0IGhhdmUgYSB1bmlxdWUgYGlkYCBhbmQgbXVzdCBoYXZlIHRoZSBgdHlwZWAgb2YgYFwiY3VzdG9tXCJgLlxuICogVGhleSBtdXN0IGltcGxlbWVudCBgcmVuZGVyYCBhbmQgbWF5IGltcGxlbWVudCBgcHJlcmVuZGVyYCwgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYC5cbiAqIFRoZXkgY2FuIHRyaWdnZXIgcmVuZGVyaW5nIHVzaW5nIHtAbGluayBNYXAjdHJpZ2dlclJlcGFpbnR9XG4gKiBhbmQgdGhleSBzaG91bGQgYXBwcm9wcmlhdGVseSBoYW5kbGUge0BsaW5rIE1hcC5ldmVudDp3ZWJnbGNvbnRleHRsb3N0fSBhbmRcbiAqIHtAbGluayBNYXAuZXZlbnQ6d2ViZ2xjb250ZXh0cmVzdG9yZWR9LlxuICpcbiAqIFRoZSBgcmVuZGVyaW5nTW9kZWAgcHJvcGVydHkgY29udHJvbHMgd2hldGhlciB0aGUgbGF5ZXIgaXMgdHJlYXRlZCBhcyBhIGBcIjJkXCJgIG9yIGBcIjNkXCJgIG1hcCBsYXllci4gVXNlOlxuICogLSBgXCJyZW5kZXJpbmdNb2RlXCI6IFwiM2RcImAgdG8gdXNlIHRoZSBkZXB0aCBidWZmZXIgYW5kIHNoYXJlIGl0IHdpdGggb3RoZXIgbGF5ZXJzXG4gKiAtIGBcInJlbmRlcmluZ01vZGVcIjogXCIyZFwiYCB0byBhZGQgYSBsYXllciB3aXRoIG5vIGRlcHRoLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhlIGRlcHRoIGJ1ZmZlciBmb3IgYSBgXCIyZFwiYCBsYXllciB5b3UgbXVzdCB1c2UgYW4gb2Zmc2NyZWVuXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB7QGxpbmsgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UjcHJlcmVuZGVyfVxuICpcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBBIHVuaXF1ZSBsYXllciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSBsYXllcidzIHR5cGUuIE11c3QgYmUgYFwiY3VzdG9tXCJgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbmRlcmluZ01vZGUgRWl0aGVyIGBcIjJkXCJgIG9yIGBcIjNkXCJgLiBEZWZhdWx0cyB0byBgXCIyZFwiYC5cbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gbGF5ZXIgaW1wbGVtZW50ZWQgYXMgRVM2IGNsYXNzXG4gKiBjbGFzcyBOdWxsSXNsYW5kTGF5ZXIge1xuICogICAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgICAgICB0aGlzLmlkID0gJ251bGwtaXNsYW5kJztcbiAqICAgICAgICAgdGhpcy50eXBlID0gJ2N1c3RvbSc7XG4gKiAgICAgICAgIHRoaXMucmVuZGVyaW5nTW9kZSA9ICcyZCc7XG4gKiAgICAgfVxuICpcbiAqICAgICBvbkFkZChtYXAsIGdsKSB7XG4gKiAgICAgICAgIGNvbnN0IHZlcnRleFNvdXJjZSA9IGBcbiAqICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xuICogICAgICAgICB2b2lkIG1haW4oKSB7XG4gKiAgICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNCgwLjUsIDAuNSwgMC4wLCAxLjApO1xuICogICAgICAgICAgICAgZ2xfUG9pbnRTaXplID0gMjAuMDtcbiAqICAgICAgICAgfWA7XG4gKlxuICogICAgICAgICBjb25zdCBmcmFnbWVudFNvdXJjZSA9IGBcbiAqICAgICAgICAgdm9pZCBtYWluKCkge1xuICogICAgICAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjAsIDAuMCwgMC4wLCAxLjApO1xuICogICAgICAgICB9YDtcbiAqXG4gKiAgICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTtcbiAqICAgICAgICAgZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlciwgdmVydGV4U291cmNlKTtcbiAqICAgICAgICAgZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICogICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpO1xuICogICAgICAgICBnbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U291cmNlKTtcbiAqICAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG4gKlxuICogICAgICAgICB0aGlzLnByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gKiAgICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gKiAgICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAqICAgICAgICAgZ2wubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAqICAgICB9XG4gKlxuICogICAgIHJlbmRlcihnbCwgbWF0cml4KSB7XG4gKiAgICAgICAgIGdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAqICAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDRmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBcInVfbWF0cml4XCIpLCBmYWxzZSwgbWF0cml4KTtcbiAqICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5QT0lOVFMsIDAsIDEpO1xuICogICAgIH1cbiAqIH1cbiAqXG4gKiBtYXAub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAqICAgICBtYXAuYWRkTGF5ZXIobmV3IE51bGxJc2xhbmRMYXllcigpKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNhZGRMYXllcn0uIFRoaXNcbiAqIGdpdmVzIHRoZSBsYXllciBhIGNoYW5jZSB0byBpbml0aWFsaXplIGdsIHJlc291cmNlcyBhbmQgcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIEN1c3RvbUxheWVySW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uQWRkXG4gKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXAgdGhpcyBjdXN0b20gbGF5ZXIgd2FzIGp1c3QgYWRkZWQgdG8uXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIGdsIGNvbnRleHQgZm9yIHRoZSBtYXAuXG4gKi9cblxuLyoqXG4gKiBPcHRpb25hbCBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGxheWVyIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNyZW1vdmVMYXllcn0uIFRoaXNcbiAqIGdpdmVzIHRoZSBsYXllciBhIGNoYW5jZSB0byBjbGVhbiB1cCBnbCByZXNvdXJjZXMgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBnbCBjb250ZXh0IGZvciB0aGUgbWFwLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCBkdXJpbmcgYSByZW5kZXIgZnJhbWUgdG8gYWxsb3cgYSBsYXllciB0byBwcmVwYXJlIHJlc291cmNlcyBvciByZW5kZXIgaW50byBhIHRleHR1cmUuXG4gKlxuICogVGhlIGxheWVyIGNhbm5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY3VycmVudCBHTCBzdGF0ZSBhbmQgbXVzdCBiaW5kIGEgZnJhbWVidWZmZXIgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBwcmVyZW5kZXJcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgbWFwJ3MgZ2wgY29udGV4dC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbWF0cml4IFRoZSBtYXAncyBjYW1lcmEgbWF0cml4LiBJdCBwcm9qZWN0cyBzcGhlcmljYWwgbWVyY2F0b3JcbiAqIGNvb3JkaW5hdGVzIHRvIGdsIGNvb3JkaW5hdGVzLiBUaGUgbWVyY2F0b3IgY29vcmRpbmF0ZSBgWzAsIDBdYCByZXByZXNlbnRzIHRoZVxuICogdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBtZXJjYXRvciB3b3JsZCBhbmQgYFsxLCAxXWAgcmVwcmVzZW50cyB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lci4gV2hlblxuICogdGhlIGByZW5kZXJpbmdNb2RlYCBpcyBgXCIzZFwiYCwgdGhlIHogY29vcmRpbmF0ZSBpcyBjb25mb3JtYWwuIEEgYm94IHdpdGggaWRlbnRpY2FsIHgsIHksIGFuZCB6XG4gKiBsZW5ndGhzIGluIG1lcmNhdG9yIHVuaXRzIHdvdWxkIGJlIHJlbmRlcmVkIGFzIGEgY3ViZS4ge0BsaW5rIE1lcmNhdG9yQ29vcmRpbmF0ZX0uZnJvbUxuZ0xhdFxuICogY2FuIGJlIHVzZWQgdG8gcHJvamVjdCBhIGBMbmdMYXRgIHRvIGEgbWVyY2F0b3IgY29vcmRpbmF0ZS5cbiAqL1xuXG4vKipcbiAqIENhbGxlZCBkdXJpbmcgYSByZW5kZXIgZnJhbWUgYWxsb3dpbmcgdGhlIGxheWVyIHRvIGRyYXcgaW50byB0aGUgR0wgY29udGV4dC5cbiAqXG4gKiBUaGUgbGF5ZXIgY2FuIGFzc3VtZSBibGVuZGluZyBhbmQgZGVwdGggc3RhdGUgaXMgc2V0IHRvIGFsbG93IHRoZSBsYXllciB0byBwcm9wZXJseVxuICogYmxlbmQgYW5kIGNsaXAgb3RoZXIgbGF5ZXJzLiBUaGUgbGF5ZXIgY2Fubm90IG1ha2UgYW55IG90aGVyIGFzc3VtcHRpb25zIGFib3V0IHRoZVxuICogY3VycmVudCBHTCBzdGF0ZS5cbiAqXG4gKiBJZiB0aGUgbGF5ZXIgbmVlZHMgdG8gcmVuZGVyIHRvIGEgdGV4dHVyZSwgaXQgc2hvdWxkIGltcGxlbWVudCB0aGUgYHByZXJlbmRlcmAgbWV0aG9kXG4gKiB0byBkbyB0aGlzIGFuZCBvbmx5IHVzZSB0aGUgYHJlbmRlcmAgbWV0aG9kIGZvciBkcmF3aW5nIGRpcmVjdGx5IGludG8gdGhlIG1haW4gZnJhbWVidWZmZXIuXG4gKlxuICogVGhlIGJsZW5kIGZ1bmN0aW9uIGlzIHNldCB0byBgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSlgLiBUaGlzIGV4cGVjdHNcbiAqIGNvbG9ycyB0byBiZSBwcm92aWRlZCBpbiBwcmVtdWx0aXBsaWVkIGFscGhhIGZvcm0gd2hlcmUgdGhlIGByYCwgYGdgIGFuZCBgYmAgdmFsdWVzIGFyZSBhbHJlYWR5XG4gKiBtdWx0aXBsaWVkIGJ5IHRoZSBgYWAgdmFsdWUuIElmIHlvdSBhcmUgdW5hYmxlIHRvIHByb3ZpZGUgY29sb3JzIGluIHByZW11bHRpcGxpZWQgZm9ybSB5b3VcbiAqIG1heSB3YW50IHRvIGNoYW5nZSB0aGUgYmxlbmQgZnVuY3Rpb24gdG9cbiAqIGBnbC5ibGVuZEZ1bmNTZXBhcmF0ZShnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSlgLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIEN1c3RvbUxheWVySW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHJlbmRlclxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBtYXAncyBnbCBjb250ZXh0LlxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBtYXRyaXggVGhlIG1hcCdzIGNhbWVyYSBtYXRyaXguIEl0IHByb2plY3RzIHNwaGVyaWNhbCBtZXJjYXRvclxuICogY29vcmRpbmF0ZXMgdG8gZ2wgY29vcmRpbmF0ZXMuIFRoZSBzcGhlcmljYWwgbWVyY2F0b3IgY29vcmRpbmF0ZSBgWzAsIDBdYCByZXByZXNlbnRzIHRoZVxuICogdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBtZXJjYXRvciB3b3JsZCBhbmQgYFsxLCAxXWAgcmVwcmVzZW50cyB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lci4gV2hlblxuICogdGhlIGByZW5kZXJpbmdNb2RlYCBpcyBgXCIzZFwiYCwgdGhlIHogY29vcmRpbmF0ZSBpcyBjb25mb3JtYWwuIEEgYm94IHdpdGggaWRlbnRpY2FsIHgsIHksIGFuZCB6XG4gKiBsZW5ndGhzIGluIG1lcmNhdG9yIHVuaXRzIHdvdWxkIGJlIHJlbmRlcmVkIGFzIGEgY3ViZS4ge0BsaW5rIE1lcmNhdG9yQ29vcmRpbmF0ZX0uZnJvbUxuZ0xhdFxuICogY2FuIGJlIHVzZWQgdG8gcHJvamVjdCBhIGBMbmdMYXRgIHRvIGEgbWVyY2F0b3IgY29vcmRpbmF0ZS5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UgPSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgIHJlbmRlcmluZ01vZGU6IFwiMmRcIiB8IFwiM2RcIixcbiAgICByZW5kZXI6IEN1c3RvbVJlbmRlck1ldGhvZCxcbiAgICBwcmVyZW5kZXI6ID9DdXN0b21SZW5kZXJNZXRob2QsXG4gICAgb25BZGQ6ID8obWFwOiBNYXAsIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpID0+IHZvaWQsXG4gICAgb25SZW1vdmU6ID8obWFwOiBNYXAsIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpID0+IHZvaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tU3R5bGVMYXllcihsYXllck9iamVjdDogQ3VzdG9tTGF5ZXJJbnRlcmZhY2UpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBjb25zdCBpZCA9IGxheWVyT2JqZWN0LmlkO1xuXG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgbWVzc2FnZTogYGxheWVycy4ke2lkfTogbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImlkXCJgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChsYXllck9iamVjdC5yZW5kZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgbGF5ZXJzLiR7aWR9OiBtaXNzaW5nIHJlcXVpcmVkIG1ldGhvZCBcInJlbmRlclwiYFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXJPYmplY3QucmVuZGVyaW5nTW9kZSAmJlxuICAgICAgICBsYXllck9iamVjdC5yZW5kZXJpbmdNb2RlICE9PSAnMmQnICYmXG4gICAgICAgIGxheWVyT2JqZWN0LnJlbmRlcmluZ01vZGUgIT09ICczZCcpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgbWVzc2FnZTogYGxheWVycy4ke2lkfTogcHJvcGVydHkgXCJyZW5kZXJpbmdNb2RlXCIgbXVzdCBiZSBlaXRoZXIgXCIyZFwiIG9yIFwiM2RcImBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuY2xhc3MgQ3VzdG9tU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgaW1wbGVtZW50YXRpb246IEN1c3RvbUxheWVySW50ZXJmYWNlO1xuXG4gICAgY29uc3RydWN0b3IoaW1wbGVtZW50YXRpb246IEN1c3RvbUxheWVySW50ZXJmYWNlKSB7XG4gICAgICAgIHN1cGVyKGltcGxlbWVudGF0aW9uLCB7fSk7XG4gICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjtcbiAgICB9XG5cbiAgICBpczNEKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBsZW1lbnRhdGlvbi5yZW5kZXJpbmdNb2RlID09PSAnM2QnO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltcGxlbWVudGF0aW9uLnByZXJlbmRlciAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKCkge31cbiAgICB1cGRhdGVUcmFuc2l0aW9ucygpIHt9XG4gICAgaGFzVHJhbnNpdGlvbigpIHt9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSwgXCJDdXN0b20gbGF5ZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLmltcGxlbWVudGF0aW9uLm9uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uLm9uQWRkKG1hcCwgbWFwLnBhaW50ZXIuY29udGV4dC5nbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblJlbW92ZShtYXA6IE1hcCkge1xuICAgICAgICBpZiAodGhpcy5pbXBsZW1lbnRhdGlvbi5vblJlbW92ZSkge1xuICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvbi5vblJlbW92ZShtYXAsIG1hcC5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21TdHlsZUxheWVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGNpcmNsZSBmcm9tICcuL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgaGVhdG1hcCBmcm9tICcuL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGhpbGxzaGFkZSBmcm9tICcuL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgZmlsbCBmcm9tICcuL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IGZpbGxFeHRydXNpb24gZnJvbSAnLi9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcic7XG5pbXBvcnQgbGluZSBmcm9tICcuL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHN5bWJvbCBmcm9tICcuL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgYmFja2dyb3VuZCBmcm9tICcuL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHJhc3RlciBmcm9tICcuL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllcic7XG5pbXBvcnQgQ3VzdG9tU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4vc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyJztcblxuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmNvbnN0IHN1YmNsYXNzZXMgPSB7XG4gICAgY2lyY2xlLFxuICAgIGhlYXRtYXAsXG4gICAgaGlsbHNoYWRlLFxuICAgIGZpbGwsXG4gICAgJ2ZpbGwtZXh0cnVzaW9uJzogZmlsbEV4dHJ1c2lvbixcbiAgICBsaW5lLFxuICAgIHN5bWJvbCxcbiAgICBiYWNrZ3JvdW5kLFxuICAgIHJhc3RlclxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlU3R5bGVMYXllcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UpIHtcbiAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21TdHlsZUxheWVyKGxheWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IHN1YmNsYXNzZXNbbGF5ZXIudHlwZV0obGF5ZXIpO1xuICAgIH1cbn1cblxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XG5jb25zdCB7SFRNTEltYWdlRWxlbWVudCwgSFRNTENhbnZhc0VsZW1lbnQsIEhUTUxWaWRlb0VsZW1lbnQsIEltYWdlRGF0YSwgSW1hZ2VCaXRtYXB9ID0gd2luZG93O1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1JHQkFJbWFnZSwgQWxwaGFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5cbmV4cG9ydCB0eXBlIFRleHR1cmVGb3JtYXQgPVxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdSR0JBJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnQUxQSEEnPjtcbmV4cG9ydCB0eXBlIFRleHR1cmVGaWx0ZXIgPVxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdMSU5FQVInPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdMSU5FQVJfTUlQTUFQX05FQVJFU1QnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdORUFSRVNUJz47XG5leHBvcnQgdHlwZSBUZXh0dXJlV3JhcCA9XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ1JFUEVBVCc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0NMQU1QX1RPX0VER0UnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdNSVJST1JFRF9SRVBFQVQnPjtcblxudHlwZSBFbXB0eUltYWdlID0ge1xuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGF0YTogbnVsbFxufVxuXG5leHBvcnQgdHlwZSBUZXh0dXJlSW1hZ2UgPVxuICAgIHwgUkdCQUltYWdlXG4gICAgfCBBbHBoYUltYWdlXG4gICAgfCBIVE1MSW1hZ2VFbGVtZW50XG4gICAgfCBIVE1MQ2FudmFzRWxlbWVudFxuICAgIHwgSFRNTFZpZGVvRWxlbWVudFxuICAgIHwgSW1hZ2VEYXRhXG4gICAgfCBFbXB0eUltYWdlXG4gICAgfCBJbWFnZUJpdG1hcDtcblxuY2xhc3MgVGV4dHVyZSB7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgICBzaXplOiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZTtcbiAgICBmb3JtYXQ6IFRleHR1cmVGb3JtYXQ7XG4gICAgZmlsdGVyOiA/VGV4dHVyZUZpbHRlcjtcbiAgICB3cmFwOiA/VGV4dHVyZVdyYXA7XG4gICAgdXNlTWlwbWFwOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgaW1hZ2U6IFRleHR1cmVJbWFnZSwgZm9ybWF0OiBUZXh0dXJlRm9ybWF0LCBvcHRpb25zOiA/eyBwcmVtdWx0aXBseT86IGJvb2xlYW4sIHVzZU1pcG1hcD86IGJvb2xlYW4gfSkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gY29udGV4dC5nbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlKGltYWdlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoaW1hZ2U6IFRleHR1cmVJbWFnZSwgb3B0aW9uczogP3twcmVtdWx0aXBseT86IGJvb2xlYW4sIHVzZU1pcG1hcD86IGJvb2xlYW59LCBwb3NpdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSkge1xuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBpbWFnZTtcbiAgICAgICAgY29uc3QgcmVzaXplID0gKCF0aGlzLnNpemUgfHwgdGhpcy5zaXplWzBdICE9PSB3aWR0aCB8fCB0aGlzLnNpemVbMV0gIT09IGhlaWdodCkgJiYgIXBvc2l0aW9uO1xuICAgICAgICBjb25zdCB7Y29udGV4dH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7Z2x9ID0gY29udGV4dDtcblxuICAgICAgICB0aGlzLnVzZU1pcG1hcCA9IEJvb2xlYW4ob3B0aW9ucyAmJiBvcHRpb25zLnVzZU1pcG1hcCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0KGZhbHNlKTtcbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldCgxKTtcbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQodGhpcy5mb3JtYXQgPT09IGdsLlJHQkEgJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMucHJlbXVsdGlwbHkgIT09IGZhbHNlKSk7XG5cbiAgICAgICAgaWYgKHJlc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gW3dpZHRoLCBoZWlnaHRdO1xuXG4gICAgICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhIHx8IChJbWFnZUJpdG1hcCAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSkge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gcG9zaXRpb24gfHwge3g6IDAsIHk6IDB9O1xuICAgICAgICAgICAgaWYgKGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSB8fCAoSW1hZ2VCaXRtYXAgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkpIHtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIHgsIHksIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnVzZU1pcG1hcCAmJiB0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSkge1xuICAgICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKGZpbHRlcjogVGV4dHVyZUZpbHRlciwgd3JhcDogVGV4dHVyZVdyYXAsIG1pbkZpbHRlcjogP1RleHR1cmVGaWx0ZXIpIHtcbiAgICAgICAgY29uc3Qge2NvbnRleHR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge2dsfSA9IGNvbnRleHQ7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKG1pbkZpbHRlciA9PT0gZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUICYmICF0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSkge1xuICAgICAgICAgICAgbWluRmlsdGVyID0gZ2wuTElORUFSO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdGhpcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIG1pbkZpbHRlciB8fCBmaWx0ZXIpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod3JhcCAhPT0gdGhpcy53cmFwKSB7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCB3cmFwKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIHdyYXApO1xuICAgICAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzU2l6ZVBvd2VyT2ZUd28oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemVbMF0gPT09IHRoaXMuc2l6ZVsxXSAmJiAoTWF0aC5sb2codGhpcy5zaXplWzBdKSAvIE1hdGguTE4yKSAlIDEgPT09IDA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3Qge2dsfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSAobnVsbDogYW55KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRleHR1cmU7XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIEludm9rZXMgdGhlIHdyYXBwZWQgZnVuY3Rpb24gaW4gYSBub24tYmxvY2tpbmcgd2F5IHdoZW4gdHJpZ2dlcigpIGlzIGNhbGxlZC4gSW52b2NhdGlvbiByZXF1ZXN0c1xuICogYXJlIGlnbm9yZWQgdW50aWwgdGhlIGZ1bmN0aW9uIHdhcyBhY3R1YWxseSBpbnZva2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRocm90dGxlZEludm9rZXIge1xuICAgIF9jaGFubmVsOiBNZXNzYWdlQ2hhbm5lbDtcbiAgICBfdHJpZ2dlcmVkOiBib29sZWFuO1xuICAgIF9jYWxsYmFjazogRnVuY3Rpb25cblxuICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDIub25tZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJpZ2dlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmlnZ2VyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UodHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NoYW5uZWw7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gKCkgPT4ge307XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUaHJvdHRsZWRJbnZva2VyO1xuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7YmluZEFsbCwgaXNXb3JrZXIsIGlzU2FmYXJpfSBmcm9tICcuL3V0aWwnO1xyXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93JztcclxuaW1wb3J0IHtzZXJpYWxpemUsIGRlc2VyaWFsaXplfSBmcm9tICcuL3dlYl93b3JrZXJfdHJhbnNmZXInO1xyXG5pbXBvcnQgVGhyb3R0bGVkSW52b2tlciBmcm9tICcuL3Rocm90dGxlZF9pbnZva2VyJztcclxuXHJcbmltcG9ydCB0eXBlIHtUcmFuc2ZlcmFibGV9IGZyb20gJy4uL3R5cGVzL3RyYW5zZmVyYWJsZSc7XHJcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcclxuXHJcbi8qKlxyXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0FjdG9yIGRlc2lnbiBwYXR0ZXJuXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FjdG9yX21vZGVsKVxyXG4gKiB0aGF0IG1haW50YWlucyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYXN5bmNocm9ub3VzIHRhc2tzIGFuZCB0aGUgb2JqZWN0c1xyXG4gKiB0aGF0IHNwaW4gdGhlbSBvZmYgLSBpbiB0aGlzIGNhc2UsIHRhc2tzIGxpa2UgcGFyc2luZyBwYXJ0cyBvZiBzdHlsZXMsXHJcbiAqIG93bmVkIGJ5IHRoZSBzdHlsZXNcclxuICpcclxuICogQHBhcmFtIHtXZWJXb3JrZXJ9IHRhcmdldFxyXG4gKiBAcGFyYW0ge1dlYldvcmtlcn0gcGFyZW50XHJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbWFwSWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE1hcCBpbnN0YW5jZSB1c2luZyB0aGlzIEFjdG9yLlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgQWN0b3Ige1xyXG4gICAgdGFyZ2V0OiBhbnk7XHJcbiAgICBwYXJlbnQ6IGFueTtcclxuICAgIG1hcElkOiA/bnVtYmVyO1xyXG4gICAgY2FsbGJhY2tzOiB7IG51bWJlcjogYW55IH07XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB0YXNrczogeyBudW1iZXI6IGFueSB9O1xyXG4gICAgdGFza1F1ZXVlOiBBcnJheTxudW1iZXI+O1xyXG4gICAgY2FuY2VsQ2FsbGJhY2tzOiB7IG51bWJlcjogQ2FuY2VsYWJsZSB9O1xyXG4gICAgaW52b2tlcjogVGhyb3R0bGVkSW52b2tlcjtcclxuICAgIGdsb2JhbFNjb3BlOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IodGFyZ2V0OiBhbnksIHBhcmVudDogYW55LCBtYXBJZDogP251bWJlcikge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgIHRoaXMubWFwSWQgPSBtYXBJZDtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IHt9O1xyXG4gICAgICAgIHRoaXMudGFza3MgPSB7fTtcclxuICAgICAgICB0aGlzLnRhc2tRdWV1ZSA9IFtdO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsQ2FsbGJhY2tzID0ge307XHJcbiAgICAgICAgYmluZEFsbChbJ3JlY2VpdmUnLCAncHJvY2VzcyddLCB0aGlzKTtcclxuICAgICAgICB0aGlzLmludm9rZXIgPSBuZXcgVGhyb3R0bGVkSW52b2tlcih0aGlzLnByb2Nlc3MpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLmdsb2JhbFNjb3BlID0gaXNXb3JrZXIoKSA/IHRhcmdldCA6IHdpbmRvdztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlbmRzIGEgbWVzc2FnZSBmcm9tIGEgbWFpbi10aHJlYWQgbWFwIHRvIGEgV29ya2VyIG9yIGZyb20gYSBXb3JrZXIgYmFjayB0b1xyXG4gICAgICogYSBtYWluLXRocmVhZCBtYXAgaW5zdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG5hbWUgb2YgdGhlIHRhcmdldCBtZXRob2QgdG8gaW52b2tlIG9yICdbc291cmNlLXR5cGVdLltzb3VyY2UtbmFtZV0ubmFtZScgZm9yIGEgbWV0aG9kIG9uIGEgV29ya2VyU291cmNlLlxyXG4gICAgICogQHBhcmFtIHRhcmdldE1hcElkIEEgcGFydGljdWxhciBtYXBJZCB0byB3aGljaCB0byBzZW5kIHRoaXMgbWVzc2FnZS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHNlbmQodHlwZTogc3RyaW5nLCBkYXRhOiBtaXhlZCwgY2FsbGJhY2s6ID9GdW5jdGlvbiwgdGFyZ2V0TWFwSWQ6ID9zdHJpbmcsIG11c3RRdWV1ZTogYm9vbGVhbiA9IGZhbHNlLCBzb3VyY2VJZDogP3N0cmluZyk6ID9DYW5jZWxhYmxlIHtcclxuICAgICAgICAvLyBXZSdyZSB1c2luZyBhIHN0cmluZyBJRCBpbnN0ZWFkIG9mIG51bWJlcnMgYmVjYXVzZSB0aGV5IGFyZSBiZWluZyB1c2VkIGFzIG9iamVjdCBrZXlzXHJcbiAgICAgICAgLy8gYW55d2F5LCBhbmQgdGh1cyBzdHJpbmdpZmllZCBpbXBsaWNpdGx5LiBXZSB1c2UgcmFuZG9tIElEcyBiZWNhdXNlIGFuIGFjdG9yIG1heSByZWNlaXZlXHJcbiAgICAgICAgLy8gbWVzc2FnZSBmcm9tIG11bHRpcGxlIG90aGVyIGFjdG9ycyB3aGljaCBjb3VsZCBydW4gaW4gZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0LiBBXHJcbiAgICAgICAgLy8gbGluZWFybHkgaW5jcmVhc2luZyBJRCBjb3VsZCBwcm9kdWNlIGNvbGxpc2lvbnMuXHJcbiAgICAgICAgY29uc3QgaWQgPSBNYXRoLnJvdW5kKChNYXRoLnJhbmRvbSgpICogMWUxOCkpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMCwgMTApO1xyXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tpZF0gPSBjYWxsYmFjaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYnVmZmVyczogP0FycmF5PFRyYW5zZmVyYWJsZT4gPSBpc1NhZmFyaSh0aGlzLmdsb2JhbFNjb3BlKSA/IHVuZGVmaW5lZCA6IFtdO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgc291cmNlSWQsXHJcbiAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICBoYXNDYWxsYmFjazogISFjYWxsYmFjayxcclxuICAgICAgICAgICAgdGFyZ2V0TWFwSWQsXHJcbiAgICAgICAgICAgIG11c3RRdWV1ZSxcclxuICAgICAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWQsXHJcbiAgICAgICAgICAgIGRhdGE6IHNlcmlhbGl6ZShkYXRhLCBidWZmZXJzKVxyXG4gICAgICAgIH0sIGJ1ZmZlcnMpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjYWxsYmFjayB0byBudWxsIHNvIHRoYXQgaXQgbmV2ZXIgZmlyZXMgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgYWJvcnRlZC5cclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbaWRdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICc8Y2FuY2VsPicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWFwSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZWNlaXZlKG1lc3NhZ2U6IE9iamVjdCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBtZXNzYWdlLmRhdGEsXHJcbiAgICAgICAgICAgIGlkID0gZGF0YS5pZDtcclxuXHJcbiAgICAgICAgaWYgKCFpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YS50YXJnZXRNYXBJZCAmJiB0aGlzLm1hcElkICE9PSBkYXRhLnRhcmdldE1hcElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICc8Y2FuY2VsPicpIHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgaXRcclxuICAgICAgICAgICAgLy8gaGFzbid0IGJlZW4ga2lja2VkIG9mZiB5ZXQuIFRoZSBpZCB3aWxsIHJlbWFpbiBpbiB0aGUgcXVldWUsIGJ1dCBiZWNhdXNlXHJcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgdGFzaywgaXQgd2lsbCBiZSBkcm9wcGVkIG9uY2UgaXQncyB0aW1lIHRvIGV4ZWN1dGUgaXQuXHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhc2tzW2lkXTtcclxuICAgICAgICAgICAgY29uc3QgY2FuY2VsID0gdGhpcy5jYW5jZWxDYWxsYmFja3NbaWRdO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYW5jZWxDYWxsYmFja3NbaWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FuY2VsKSB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpc1dvcmtlcigpIHx8IGRhdGEubXVzdFF1ZXVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbiB3b3JrZXJzLCBzdG9yZSB0aGUgdGFza3MgdGhhdCB3ZSBuZWVkIHRvIHByb2Nlc3MgYmVmb3JlIGFjdHVhbGx5IHByb2Nlc3NpbmcgdGhlbS4gVGhpc1xyXG4gICAgICAgICAgICAgICAgLy8gaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2Ugd2FudCB0byBrZWVwIHJlY2VpdmluZyBtZXNzYWdlcywgYW5kIGluIHBhcnRpY3VsYXIsXHJcbiAgICAgICAgICAgICAgICAvLyA8Y2FuY2VsPiBtZXNzYWdlcy4gU29tZSB0YXNrcyBtYXkgdGFrZSBhIHdoaWxlIGluIHRoZSB3b3JrZXIgdGhyZWFkLCBzbyBiZWZvcmVcclxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGluZyB0aGUgbmV4dCB0YXNrIGluIG91ciBxdWV1ZSwgcG9zdE1lc3NhZ2UgcHJlZW1wdHMgdGhpcyBhbmQgPGNhbmNlbD5cclxuICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIGNhbiBiZSBwcm9jZXNzZWQuIFdlJ3JlIHVzaW5nIGEgTWVzc2FnZUNoYW5uZWwgb2JqZWN0IHRvIGdldCB0aHJvdHRsZSB0aGVcclxuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MoKSBmbG93IHRvIG9uZSBhdCBhIHRpbWUuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tzW2lkXSA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tRdWV1ZS5wdXNoKGlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlci50cmlnZ2VyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgbWFpbiB0aHJlYWQsIHByb2Nlc3MgbWVzc2FnZXMgaW1tZWRpYXRlbHkgc28gdGhhdCBvdGhlciB3b3JrIGRvZXMgbm90IHNsaXAgaW5cclxuICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gZ2V0dGluZyBwYXJ0aWFsIGRhdGEgYmFjayBmcm9tIHdvcmtlcnMuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NUYXNrKGlkLCBkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy50YXNrUXVldWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRhc2tRdWV1ZS5zaGlmdCgpO1xyXG4gICAgICAgIGNvbnN0IHRhc2sgPSB0aGlzLnRhc2tzW2lkXTtcclxuICAgICAgICBkZWxldGUgdGhpcy50YXNrc1tpZF07XHJcbiAgICAgICAgLy8gU2NoZWR1bGUgYW5vdGhlciBwcm9jZXNzIGNhbGwgaWYgd2Uga25vdyB0aGVyZSdzIG1vcmUgdG8gcHJvY2VzcyBfYmVmb3JlXyBpbnZva2luZyB0aGVcclxuICAgICAgICAvLyBjdXJyZW50IHRhc2suIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgcHJvY2Vzc2luZyBjb250aW51ZXMgZXZlbiBpZiB0aGUgY3VycmVudCB0YXNrXHJcbiAgICAgICAgLy8gZG9lc24ndCBleGVjdXRlIHN1Y2Nlc3NmdWxseS5cclxuICAgICAgICBpZiAodGhpcy50YXNrUXVldWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW52b2tlci50cmlnZ2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGFzaykge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgdGFzayBJRCBkb2Vzbid0IGhhdmUgYXNzb2NpYXRlZCB0YXNrIGRhdGEgYW55bW9yZSwgaXQgd2FzIGNhbmNlbGVkLlxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByb2Nlc3NUYXNrKGlkLCB0YXNrKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzVGFzayhpZDogbnVtYmVyLCB0YXNrOiBhbnkpIHtcclxuICAgICAgICBpZiAodGFzay50eXBlID09PSAnPHJlc3BvbnNlPicpIHtcclxuICAgICAgICAgICAgLy8gVGhlIGRvbmUoKSBmdW5jdGlvbiBpbiB0aGUgY291bnRlcnBhcnQgaGFzIGJlZW4gY2FsbGVkLCBhbmQgd2UgYXJlIG5vd1xyXG4gICAgICAgICAgICAvLyBmaXJpbmcgdGhlIGNhbGxiYWNrIGluIHRoZSBvcmlnaW5hdGluZyBhY3RvciwgaWYgdGhlcmUgaXMgb25lLlxyXG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2lkXTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2lkXTtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgYSByZXNwb25zZSwgYnV0IGRvbid0IGhhdmUgYSBjYWxsYmFjaywgdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRhc2suZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkZXNlcmlhbGl6ZSh0YXNrLmVycm9yKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRlc2VyaWFsaXplKHRhc2suZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGNvbXBsZXRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBidWZmZXJzOiA/QXJyYXk8VHJhbnNmZXJhYmxlPiA9IGlzU2FmYXJpKHRoaXMuZ2xvYmFsU2NvcGUpID8gdW5kZWZpbmVkIDogW107XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbmUgPSB0YXNrLmhhc0NhbGxiYWNrID8gKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29tcGxldGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbmNlbENhbGxiYWNrc1tpZF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJzxyZXNwb25zZT4nLFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkLFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPyBzZXJpYWxpemUoZXJyKSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc2VyaWFsaXplKGRhdGEsIGJ1ZmZlcnMpXHJcbiAgICAgICAgICAgICAgICB9LCBidWZmZXJzKTtcclxuICAgICAgICAgICAgfSA6IChfKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gKGRlc2VyaWFsaXplKHRhc2suZGF0YSk6IGFueSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFt0YXNrLnR5cGVdKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0YXNrLnR5cGUgPT0gJ2xvYWRUaWxlJywgJ3JlbW92ZVRpbGUnLCBldGMuXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHRoaXMucGFyZW50W3Rhc2sudHlwZV0odGFzay5zb3VyY2VNYXBJZCwgcGFyYW1zLCBkb25lLCB0YXNrLnNvdXJjZUlkKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBhcmVudC5nZXRXb3JrZXJTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRhc2sudHlwZSA9PSBzb3VyY2V0eXBlLm1ldGhvZFxyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IHRhc2sudHlwZS5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSAodGhpcy5wYXJlbnQ6IGFueSkuZ2V0V29ya2VyU291cmNlKHRhc2suc291cmNlTWFwSWQsIGtleXNbMF0sIHBhcmFtcy5zb3VyY2UsIHBhcmFtcy5jcnMpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzY29wZVtrZXlzWzFdXShwYXJhbXMsIGRvbmUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTm8gZnVuY3Rpb24gd2FzIGZvdW5kLlxyXG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uICR7dGFzay50eXBlfWApKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFjb21wbGV0ZWQgJiYgY2FsbGJhY2sgJiYgY2FsbGJhY2suY2FuY2VsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBbGxvd3MgY2FuY2VsaW5nIHRoZSB0YXNrIGFzIGxvbmcgYXMgaXQgaGFzbid0IGJlZW4gY29tcGxldGVkIHlldC5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsQ2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrLmNhbmNlbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUoKSB7XHJcbiAgICAgICAgdGhpcy5pbnZva2VyLnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQWN0b3I7XHJcbiIsImV4cG9ydCB7IGdldFVSTCwgZ2V0VGlsZUJCb3gsIGdldE1lcmNDb29yZHMgfTtcblxuXG4vKipcbiAqIGdldFVSTFxuICpcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgYmFzZVVybCAgQmFzZSB1cmwgb2YgdGhlIFdNUyBzZXJ2ZXJcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgbGF5ZXIgICAgTGF5ZXIgbmFtZVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICAgICAgICBUaWxlIHpvb21cbiAqIEBwYXJhbSAgICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLmZvcm1hdD0naW1hZ2UvcG5nJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuc2VydmljZT0nV01TJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMudmVyc2lvbj0nMS4xLjEnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5yZXF1ZXN0PSdHZXRNYXAnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zcnM9J0VQU0c6Mzg1NyddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLndpZHRoPScyNTYnXVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICBbb3B0aW9ucy5oZWlnaHQ9JzI1NiddXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIHVybFxuICogQGV4YW1wbGVcbiAqIHZhciBiYXNlVXJsID0gJ2h0dHA6Ly9nZW9kYXRhLnN0YXRlLm5qLnVzL2ltYWdlcnl3bXMvTmF0dXJhbDIwMTUnO1xuICogdmFyIGxheWVyID0gJ05hdHVyYWwyMDE1JztcbiAqIHZhciB1cmwgPSB3aG9vdHMuZ2V0VVJMKGJhc2VVcmwsIGxheWVyLCAxNTQzMDgsIDE5NzE2NywgMTkpO1xuICovXG5mdW5jdGlvbiBnZXRVUkwoYmFzZVVybCwgbGF5ZXIsIHgsIHksIHosIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciB1cmwgPSBiYXNlVXJsICsgJz8nICsgW1xuICAgICAgICAnYmJveD0nICAgICsgZ2V0VGlsZUJCb3goeCwgeSwgeiksXG4gICAgICAgICdmb3JtYXQ9JyAgKyAob3B0aW9ucy5mb3JtYXQgfHwgJ2ltYWdlL3BuZycpLFxuICAgICAgICAnc2VydmljZT0nICsgKG9wdGlvbnMuc2VydmljZSB8fCAnV01TJyksXG4gICAgICAgICd2ZXJzaW9uPScgKyAob3B0aW9ucy52ZXJzaW9uIHx8ICcxLjEuMScpLFxuICAgICAgICAncmVxdWVzdD0nICsgKG9wdGlvbnMucmVxdWVzdCB8fCAnR2V0TWFwJyksXG4gICAgICAgICdzcnM9JyAgICAgKyAob3B0aW9ucy5zcnMgfHwgJ0VQU0c6Mzg1NycpLFxuICAgICAgICAnd2lkdGg9JyAgICsgKG9wdGlvbnMud2lkdGggfHwgMjU2KSxcbiAgICAgICAgJ2hlaWdodD0nICArIChvcHRpb25zLmhlaWdodCB8fCAyNTYpLFxuICAgICAgICAnbGF5ZXJzPScgICsgbGF5ZXJcbiAgICBdLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB1cmw7XG59XG5cblxuLyoqXG4gKiBnZXRUaWxlQkJveFxuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgVGlsZSBjb29yZGluYXRlIHhcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeSAgVGlsZSBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIFN0cmluZyBvZiB0aGUgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGdldFRpbGVCQm94KHgsIHksIHopIHtcbiAgICAvLyBmb3IgR29vZ2xlL09TTSB0aWxlIHNjaGVtZSB3ZSBuZWVkIHRvIGFsdGVyIHRoZSB5XG4gICAgeSA9IChNYXRoLnBvdygyLCB6KSAtIHkgLSAxKTtcblxuICAgIHZhciBtaW4gPSBnZXRNZXJjQ29vcmRzKHggKiAyNTYsIHkgKiAyNTYsIHopLFxuICAgICAgICBtYXggPSBnZXRNZXJjQ29vcmRzKCh4ICsgMSkgKiAyNTYsICh5ICsgMSkgKiAyNTYsIHopO1xuXG4gICAgcmV0dXJuIG1pblswXSArICcsJyArIG1pblsxXSArICcsJyArIG1heFswXSArICcsJyArIG1heFsxXTtcbn1cblxuXG4vKipcbiAqIGdldE1lcmNDb29yZHNcbiAqXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggIFBpeGVsIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBQaXhlbCBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge0FycmF5fSAgIFt4LCB5XVxuICovXG5mdW5jdGlvbiBnZXRNZXJjQ29vcmRzKHgsIHksIHopIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYpIC8gTWF0aC5wb3coMiwgeiksXG4gICAgICAgIG1lcmNfeCA9ICh4ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApLFxuICAgICAgICBtZXJjX3kgPSAoeSAqIHJlc29sdXRpb24gLSAyICogTWF0aC5QSSAgKiA2Mzc4MTM3IC8gMi4wKTtcblxuICAgIHJldHVybiBbbWVyY194LCBtZXJjX3ldO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCBmcm9tICcuL2xuZ19sYXQnO1xuXG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi9sbmdfbGF0JztcblxuLyoqXG4gKiBBIGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRzIGEgZ2VvZ3JhcGhpY2FsIGJvdW5kaW5nIGJveCxcbiAqIGRlZmluZWQgYnkgaXRzIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IHBvaW50cyBpbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICpcbiAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBhIGBudWxsYCBib3VuZGluZyBib3ggaXMgY3JlYXRlZC5cbiAqXG4gKiBOb3RlIHRoYXQgYW55IE1hcGJveCBHTCBtZXRob2QgdGhhdCBhY2NlcHRzIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IGFzIGFuIGFyZ3VtZW50IG9yIG9wdGlvblxuICogY2FuIGFsc28gYWNjZXB0IGFuIGBBcnJheWAgb2YgdHdvIHtAbGluayBMbmdMYXRMaWtlfSBjb25zdHJ1Y3RzIGFuZCB3aWxsIHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbi5cbiAqIFRoaXMgZmxleGlibGUgdHlwZSBpcyBkb2N1bWVudGVkIGFzIHtAbGluayBMbmdMYXRCb3VuZHNMaWtlfS5cbiAqXG4gKiBAcGFyYW0ge0xuZ0xhdExpa2V9IFtzd10gVGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gW25lXSBUaGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICogQGV4YW1wbGVcbiAqIHZhciBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICogdmFyIG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gKiB2YXIgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhzdywgbmUpO1xuICovXG5jbGFzcyBMbmdMYXRCb3VuZHMge1xuICAgIF9uZTogTG5nTGF0O1xuICAgIF9zdzogTG5nTGF0O1xuXG4gICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB0b28gZmxleGlibGUgdG8gdHlwZS4gSXQgc2hvdWxkIG5vdCBiZSBzbyBmbGV4aWJsZS5cbiAgICBjb25zdHJ1Y3RvcihzdzogYW55LCBuZTogYW55KSB7XG4gICAgICAgIGlmICghc3cpIHtcbiAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgfSBlbHNlIGlmIChuZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTb3V0aFdlc3Qoc3cpLnNldE5vcnRoRWFzdChuZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3cubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXRoV2VzdChbc3dbMF0sIHN3WzFdXSkuc2V0Tm9ydGhFYXN0KFtzd1syXSwgc3dbM11dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U291dGhXZXN0KHN3WzBdKS5zZXROb3J0aEVhc3Qoc3dbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbmUgYSB7QGxpbmsgTG5nTGF0TGlrZX0gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXROb3J0aEVhc3QobmU6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fbmUgPSBuZSBpbnN0YW5jZW9mIExuZ0xhdCA/IG5ldyBMbmdMYXQobmUubG5nLCBuZS5sYXQpIDogTG5nTGF0LmNvbnZlcnQobmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBzdyBhIHtAbGluayBMbmdMYXRMaWtlfSBvYmplY3QgZGVzY3JpYmluZyB0aGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFNvdXRoV2VzdChzdzogTG5nTGF0TGlrZSkge1xuICAgICAgICB0aGlzLl9zdyA9IHN3IGluc3RhbmNlb2YgTG5nTGF0ID8gbmV3IExuZ0xhdChzdy5sbmcsIHN3LmxhdCkgOiBMbmdMYXQuY29udmVydChzdyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dGVuZCB0aGUgYm91bmRzIHRvIGluY2x1ZGUgYSBnaXZlbiBMbmdMYXRMaWtlIG9yIExuZ0xhdEJvdW5kc0xpa2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V8TG5nTGF0Qm91bmRzTGlrZX0gb2JqIG9iamVjdCB0byBleHRlbmQgdG9cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBgdGhpc2BcbiAgICAgKi9cbiAgICBleHRlbmQob2JqOiBMbmdMYXRMaWtlIHwgTG5nTGF0Qm91bmRzTGlrZSkge1xuICAgICAgICBjb25zdCBzdyA9IHRoaXMuX3N3LFxuICAgICAgICAgICAgbmUgPSB0aGlzLl9uZTtcbiAgICAgICAgbGV0IHN3MiwgbmUyO1xuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMbmdMYXQpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iajtcbiAgICAgICAgICAgIG5lMiA9IG9iajtcblxuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcykge1xuICAgICAgICAgICAgc3cyID0gb2JqLl9zdztcbiAgICAgICAgICAgIG5lMiA9IG9iai5fbmU7XG5cbiAgICAgICAgICAgIGlmICghc3cyIHx8ICFuZTIpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5sZW5ndGggPT09IDQgfHwgb2JqLmV2ZXJ5KEFycmF5LmlzQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxuZ0xhdEJvdW5kc09iaiA9ICgob2JqOiBhbnkpOiBMbmdMYXRCb3VuZHNMaWtlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKExuZ0xhdEJvdW5kcy5jb252ZXJ0KGxuZ0xhdEJvdW5kc09iaikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxuZ0xhdE9iaiA9ICgob2JqOiBhbnkpOiBMbmdMYXRMaWtlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKExuZ0xhdC5jb252ZXJ0KGxuZ0xhdE9iaikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdyAmJiAhbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N3ID0gbmV3IExuZ0xhdChzdzIubG5nLCBzdzIubGF0KTtcbiAgICAgICAgICAgIHRoaXMuX25lID0gbmV3IExuZ0xhdChuZTIubG5nLCBuZTIubGF0KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3cubG5nID0gTWF0aC5taW4oc3cyLmxuZywgc3cubG5nKTtcbiAgICAgICAgICAgIHN3LmxhdCA9IE1hdGgubWluKHN3Mi5sYXQsIHN3LmxhdCk7XG4gICAgICAgICAgICBuZS5sbmcgPSBNYXRoLm1heChuZTIubG5nLCBuZS5sbmcpO1xuICAgICAgICAgICAgbmUubGF0ID0gTWF0aC5tYXgobmUyLmxhdCwgbmUubGF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlIGVxdWlkaXN0YW50IGZyb20gdGhlIGJvdW5kaW5nIGJveCdzIGNvcm5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgYm91bmRpbmcgYm94J3MgY2VudGVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldENlbnRlcigpOyAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTYzNjUsIGxhdDogNDAuNzgzMTV9XG4gICAgICovXG4gICAgZ2V0Q2VudGVyKCk6IExuZ0xhdCB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KCh0aGlzLl9zdy5sbmcgKyB0aGlzLl9uZS5sbmcpIC8gMiwgKHRoaXMuX3N3LmxhdCArIHRoaXMuX25lLmxhdCkgLyAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldFNvdXRoV2VzdCgpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fc3c7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0Tm9ydGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiB0aGlzLl9uZTsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBub3J0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIG5vcnRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXROb3J0aFdlc3QoKTogTG5nTGF0IHsgcmV0dXJuIG5ldyBMbmdMYXQodGhpcy5nZXRXZXN0KCksIHRoaXMuZ2V0Tm9ydGgoKSk7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgc291dGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBzb3V0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLCB0aGlzLmdldFNvdXRoKCkpOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHdlc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB3ZXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXRXZXN0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdy5sbmc7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgc291dGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzb3V0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N3LmxhdDsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBlYXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZWFzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0RWFzdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbmUubG5nOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIG5vcnRoIGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbm9ydGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldE5vcnRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9uZS5sYXQ7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gVGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheSwgY29uc2lzdGluZyBvZiB0aGVcbiAgICAgKiAgIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IGNvb3JkaW5hdGVzIG9mIHRoZSBib3VuZGluZyByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbnVtYmVycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b0FycmF5KCk7IC8vID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dXG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLl9zdy50b0FycmF5KCksIHRoaXMuX25lLnRvQXJyYXkoKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYm91bmRpbmcgYm94IHJlcHJlc2VudHMgYXMgYSBzdHJpbmcgb2YgdGhlIGZvcm1hdFxuICAgICAqICAgYCdMbmdMYXRCb3VuZHMoTG5nTGF0KGxuZywgbGF0KSwgTG5nTGF0KGxuZywgbGF0KSknYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b1N0cmluZygpOyAvLyA9IFwiTG5nTGF0Qm91bmRzKExuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSksIExuZ0xhdCgtNzMuOTM5NywgNDAuODAwMikpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBMbmdMYXRCb3VuZHMoJHt0aGlzLl9zdy50b1N0cmluZygpfSwgJHt0aGlzLl9uZS50b1N0cmluZygpfSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBib3VuZGluZyBib3ggaXMgYW4gZW1wdHkvYG51bGxgLXR5cGUgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYm91bmRzIGhhdmUgYmVlbiBkZWZpbmVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICovXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICEodGhpcy5fc3cgJiYgdGhpcy5fbmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQ2hlY2sgaWYgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nbGF0IGdlb2dyYXBoaWMgcG9pbnQgdG8gY2hlY2sgYWdhaW5zdC5cbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqIEBleGFtcGxlXG4gICAgKiB2YXIgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhcbiAgICAqICAgbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSksXG4gICAgKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpXG4gICAgKiApO1xuICAgICpcbiAgICAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk1NjcsIDQwLjc3ODkpO1xuICAgICpcbiAgICAqIGNvbnNvbGUubG9nKGxsYi5jb250YWlucyhsbCkpOyAvLyA9IHRydWVcbiAgICAqL1xuICAgIGNvbnRhaW5zKGxuZ2xhdDogTG5nTGF0TGlrZSkge1xuICAgICAgICBjb25zdCB7bG5nLCBsYXR9ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcblxuICAgICAgICBjb25zdCBjb250YWluc0xhdGl0dWRlID0gdGhpcy5fc3cubGF0IDw9IGxhdCAmJiBsYXQgPD0gdGhpcy5fbmUubGF0O1xuICAgICAgICBsZXQgY29udGFpbnNMb25naXR1ZGUgPSB0aGlzLl9zdy5sbmcgPD0gbG5nICYmIGxuZyA8PSB0aGlzLl9uZS5sbmc7XG4gICAgICAgIGlmICh0aGlzLl9zdy5sbmcgPiB0aGlzLl9uZS5sbmcpIHsgLy8gd3JhcHBlZCBjb29yZGluYXRlc1xuICAgICAgICAgICAgY29udGFpbnNMb25naXR1ZGUgPSB0aGlzLl9zdy5sbmcgPj0gbG5nICYmIGxuZyA+PSB0aGlzLl9uZS5sbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbnNMYXRpdHVkZSAmJiBjb250YWluc0xvbmdpdHVkZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBhcnJheSB0byBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIElmIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogSW50ZXJuYWxseSwgdGhlIGZ1bmN0aW9uIGNhbGxzIGBMbmdMYXQjY29udmVydGAgdG8gY29udmVydCBhcnJheXMgdG8gYExuZ0xhdGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlfSBpbnB1dCBBbiBhcnJheSBvZiB0d28gY29vcmRpbmF0ZXMgdG8gY29udmVydCwgb3IgYSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IEEgbmV3IGBMbmdMYXRCb3VuZHNgIG9iamVjdCwgaWYgYSBjb252ZXJzaW9uIG9jY3VycmVkLCBvciB0aGUgb3JpZ2luYWwgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFyciA9IFtbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdXTtcbiAgICAgKiB2YXIgbGxiID0gbWFwYm94Z2wuTG5nTGF0Qm91bmRzLmNvbnZlcnQoYXJyKTtcbiAgICAgKiBsbGI7ICAgLy8gPSBMbmdMYXRCb3VuZHMge19zdzogTG5nTGF0IHtsbmc6IC03My45ODc2LCBsYXQ6IDQwLjc2NjF9LCBfbmU6IExuZ0xhdCB7bG5nOiAtNzMuOTM5NywgbGF0OiA0MC44MDAyfX1cbiAgICAgKi9cbiAgICBzdGF0aWMgY29udmVydChpbnB1dDogTG5nTGF0Qm91bmRzTGlrZSk6IExuZ0xhdEJvdW5kcyB7XG4gICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBMbmdMYXRCb3VuZHMpIHJldHVybiBpbnB1dDtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXRCb3VuZHMoaW5wdXQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHtAbGluayBMbmdMYXRCb3VuZHN9IG9iamVjdCwgYW4gYXJyYXkgb2Yge0BsaW5rIExuZ0xhdExpa2V9IG9iamVjdHMgaW4gW3N3LCBuZV0gb3JkZXIsXG4gKiBvciBhbiBhcnJheSBvZiBudW1iZXJzIGluIFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdIG9yZGVyLlxuICpcbiAqIEB0eXBlZGVmIHtMbmdMYXRCb3VuZHMgfCBbTG5nTGF0TGlrZSwgTG5nTGF0TGlrZV0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXX0gTG5nTGF0Qm91bmRzTGlrZVxuICogQGV4YW1wbGVcbiAqIHZhciB2MSA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoXG4gKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpLFxuICogICBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45Mzk3LCA0MC44MDAyKVxuICogKTtcbiAqIHZhciB2MiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSlcbiAqIHZhciB2MyA9IFtbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdXTtcbiAqL1xuZXhwb3J0IHR5cGUgTG5nTGF0Qm91bmRzTGlrZSA9IExuZ0xhdEJvdW5kcyB8IFtMbmdMYXRMaWtlLCBMbmdMYXRMaWtlXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgZGVmYXVsdCBMbmdMYXRCb3VuZHM7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3dyYXB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vbG5nX2xhdF9ib3VuZHMnO1xuXG4vKlxuKiBBcHByb3hpbWF0ZSByYWRpdXMgb2YgdGhlIGVhcnRoIGluIG1ldGVycy5cbiogVXNlcyB0aGUgV0dTLTg0IGFwcHJveGltYXRpb24uIFRoZSByYWRpdXMgYXQgdGhlIGVxdWF0b3IgaXMgfjYzNzgxMzcgYW5kIGF0IHRoZSBwb2xlcyBpcyB+NjM1Njc1Mi4gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV29ybGRfR2VvZGV0aWNfU3lzdGVtI1dHUzg0XG4qIDYzNzEwMDguOCBpcyBvbmUgcHVibGlzaGVkIFwiYXZlcmFnZSByYWRpdXNcIiBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRWFydGhfcmFkaXVzI01lYW5fcmFkaXVzLCBvciBmdHA6Ly9hdGhlbmEuZnN2LmN2dXQuY3ovWkZHL2dyczgwLU1vcml0ei5wZGYgcC40XG4qL1xuZXhwb3J0IGNvbnN0IGVhcnRoUmFkaXVzID0gNjM3MTAwOC44O1xuXG4vKipcbiAqIEEgYExuZ0xhdGAgb2JqZWN0IHJlcHJlc2VudHMgYSBnaXZlbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGNvb3JkaW5hdGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBUaGVzZSBjb29yZGluYXRlcyBhcmUgYmFzZWQgb24gdGhlIFtXR1M4NCAoRVBTRzo0MzI2KSBzdGFuZGFyZF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV29ybGRfR2VvZGV0aWNfU3lzdGVtI1dHUzg0KS5cbiAqXG4gKiBNYXBib3ggR0wgdXNlcyBsb25naXR1ZGUsIGxhdGl0dWRlIGNvb3JkaW5hdGUgb3JkZXIgKGFzIG9wcG9zZWQgdG8gbGF0aXR1ZGUsIGxvbmdpdHVkZSkgdG8gbWF0Y2ggdGhlXG4gKiBbR2VvSlNPTiBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NikuXG4gKlxuICogTm90ZSB0aGF0IGFueSBNYXBib3ggR0wgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIGBMbmdMYXRgIG9iamVjdCBhcyBhbiBhcmd1bWVudCBvciBvcHRpb25cbiAqIGNhbiBhbHNvIGFjY2VwdCBhbiBgQXJyYXlgIG9mIHR3byBudW1iZXJzIGFuZCB3aWxsIHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbi5cbiAqIFRoaXMgZmxleGlibGUgdHlwZSBpcyBkb2N1bWVudGVkIGFzIHtAbGluayBMbmdMYXRMaWtlfS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbG5nIExvbmdpdHVkZSwgbWVhc3VyZWQgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsYXQgTGF0aXR1ZGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBAZXhhbXBsZVxuICogdmFyIGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtMTIzLjk3NDksIDQwLjc3MzYpO1xuICogbGwubG5nOyAvLyA9IC0xMjMuOTc0OVxuICogQHNlZSBbR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICogQHNlZSBbQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gKi9cbmNsYXNzIExuZ0xhdCB7XG4gICAgbG5nOiBudW1iZXI7XG4gICAgbGF0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGlzTmFOKGxuZykgfHwgaXNOYU4obGF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIExuZ0xhdCBvYmplY3Q6ICgke2xuZ30sICR7bGF0fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxuZyA9ICtsbmc7XG4gICAgICAgIHRoaXMubGF0ID0gK2xhdDtcbiAgICAgICAgLy8gaWYgKHRoaXMubGF0ID4gOTAgfHwgdGhpcy5sYXQgPCAtOTApIHtcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBMbmdMYXQgbGF0aXR1ZGUgdmFsdWU6IG11c3QgYmUgYmV0d2VlbiAtOTAgYW5kIDkwJyk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IGBMbmdMYXRgIG9iamVjdCB3aG9zZSBsb25naXR1ZGUgaXMgd3JhcHBlZCB0byB0aGUgcmFuZ2UgKC0xODAsIDE4MCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgd3JhcHBlZCBgTG5nTGF0YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KDI4Ni4wMjUxLCA0MC43NzM2KTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IGxsLndyYXAoKTtcbiAgICAgKiB3cmFwcGVkLmxuZzsgLy8gPSAtNzMuOTc0OVxuICAgICAqL1xuICAgIHdyYXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsIC0xODAsIDE4MCksIHRoaXMubGF0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBUaGUgY29vcmRpbmF0ZXMgcmVwcmVzZXRlZCBhcyBhbiBhcnJheSBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9BcnJheSgpOyAvLyA9IFstNzMuOTc0OSwgNDAuNzczNl1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMubG5nLCB0aGlzLmxhdF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50IGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvb3JkaW5hdGVzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgYCdMbmdMYXQobG5nLCBsYXQpJ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KTtcbiAgICAgKiBsbC50b1N0cmluZygpOyAvLyA9IFwiTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgTG5nTGF0KCR7dGhpcy5sbmd9LCAke3RoaXMubGF0fSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFwcHJveGltYXRlIGRpc3RhbmNlIGJldHdlZW4gYSBwYWlyIG9mIGNvb3JkaW5hdGVzIGluIG1ldGVyc1xuICAgICAqIFVzZXMgdGhlIEhhdmVyc2luZSBGb3JtdWxhIChmcm9tIFIuVy4gU2lubm90dCwgXCJWaXJ0dWVzIG9mIHRoZSBIYXZlcnNpbmVcIiwgU2t5IGFuZCBUZWxlc2NvcGUsIHZvbC4gNjgsIG5vLiAyLCAxOTg0LCBwLiAxNTkpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nTGF0IGNvb3JkaW5hdGVzIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvXG4gICAgICogQHJldHVybnMge251bWJlcn0gRGlzdGFuY2UgaW4gbWV0ZXJzIGJldHdlZW4gdGhlIHR3byBjb29yZGluYXRlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBuZXdfeW9yayA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTc0LjAwNjAsIDQwLjcxMjgpO1xuICAgICAqIHZhciBsb3NfYW5nZWxlcyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTExOC4yNDM3LCAzNC4wNTIyKTtcbiAgICAgKiBuZXdfeW9yay5kaXN0YW5jZVRvKGxvc19hbmdlbGVzKTsgLy8gPSAzOTM1NzUxLjY5MDg5Mzk4NywgXCJ0cnVlIGRpc3RhbmNlXCIgdXNpbmcgYSBub24tc3BoZXJpY2FsIGFwcHJveGltYXRpb24gaXMgfjM5NjZrbVxuICAgICAqL1xuICAgIGRpc3RhbmNlVG8obG5nTGF0OiBMbmdMYXQpIHtcbiAgICAgICAgY29uc3QgcmFkID0gTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgY29uc3QgbGF0MSA9IHRoaXMubGF0ICogcmFkO1xuICAgICAgICBjb25zdCBsYXQyID0gbG5nTGF0LmxhdCAqIHJhZDtcbiAgICAgICAgY29uc3QgYSA9IE1hdGguc2luKGxhdDEpICogTWF0aC5zaW4obGF0MikgKyBNYXRoLmNvcyhsYXQxKSAqIE1hdGguY29zKGxhdDIpICogTWF0aC5jb3MoKGxuZ0xhdC5sbmcgLSB0aGlzLmxuZykgKiByYWQpO1xuXG4gICAgICAgIGNvbnN0IG1heE1ldGVycyA9IGVhcnRoUmFkaXVzICogTWF0aC5hY29zKE1hdGgubWluKGEsIDEpKTtcbiAgICAgICAgcmV0dXJuIG1heE1ldGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYExuZ0xhdEJvdW5kc2AgZnJvbSB0aGUgY29vcmRpbmF0ZXMgZXh0ZW5kZWQgYnkgYSBnaXZlbiBgcmFkaXVzYC4gVGhlIHJldHVybmVkIGBMbmdMYXRCb3VuZHNgIGNvbXBsZXRlbHkgY29udGFpbnMgdGhlIGByYWRpdXNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MF0gRGlzdGFuY2UgaW4gbWV0ZXJzIGZyb20gdGhlIGNvb3JkaW5hdGVzIHRvIGV4dGVuZCB0aGUgYm91bmRzLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IEEgbmV3IGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvb3JkaW5hdGVzIGV4dGVuZGVkIGJ5IHRoZSBgcmFkaXVzYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICAgICAqIGxsLnRvQm91bmRzKDEwMCkudG9BcnJheSgpOyAvLyA9IFtbLTczLjk3NTAxODYyMTQxMzI4LCA0MC43NzM1MTAxNjg0NzIyOV0sIFstNzMuOTc0NzgxMzc4NTg2NzMsIDQwLjc3MzY4OTgzMTUyNzcxXV1cbiAgICAgKi9cbiAgICB0b0JvdW5kcyhyYWRpdXM/OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGNvbnN0IGVhcnRoQ2lyY3VtZmVyZW5jZUluTWV0ZXJzQXRFcXVhdG9yID0gNDAwNzUwMTc7XG4gICAgICAgIGNvbnN0IGxhdEFjY3VyYWN5ID0gMzYwICogcmFkaXVzIC8gZWFydGhDaXJjdW1mZXJlbmNlSW5NZXRlcnNBdEVxdWF0b3IsXG4gICAgICAgICAgICBsbmdBY2N1cmFjeSA9IGxhdEFjY3VyYWN5IC8gTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5sYXQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKG5ldyBMbmdMYXQodGhpcy5sbmcgLSBsbmdBY2N1cmFjeSwgdGhpcy5sYXQgLSBsYXRBY2N1cmFjeSksXG4gICAgICAgICAgICBuZXcgTG5nTGF0KHRoaXMubG5nICsgbG5nQWNjdXJhY3ksIHRoaXMubGF0ICsgbGF0QWNjdXJhY3kpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBhbiBvYmplY3Qgd2l0aCBgbG5nYCBhbmQgYGxhdGAgb3IgYGxvbmAgYW5kIGBsYXRgIHByb3BlcnRpZXNcbiAgICAgKiB0byBhIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIElmIGEgYExuZ0xhdGAgb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBpbnB1dCBBbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBvYmplY3QgdG8gY29udmVydCwgb3IgYSBgTG5nTGF0YCBvYmplY3QgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IEEgbmV3IGBMbmdMYXRgIG9iamVjdCwgaWYgYSBjb252ZXJzaW9uIG9jY3VycmVkLCBvciB0aGUgb3JpZ2luYWwgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFyciA9IFstNzMuOTc0OSwgNDAuNzczNl07XG4gICAgICogdmFyIGxsID0gbWFwYm94Z2wuTG5nTGF0LmNvbnZlcnQoYXJyKTtcbiAgICAgKiBsbDsgICAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTc0OSwgbGF0OiA0MC43NzM2fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0KGlucHV0OiBMbmdMYXRMaWtlKTogTG5nTGF0IHtcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTG5nTGF0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIChpbnB1dC5sZW5ndGggPT09IDIgfHwgaW5wdXQubGVuZ3RoID09PSAzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoTnVtYmVyKGlucHV0WzBdKSwgTnVtYmVyKGlucHV0WzFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgICAgICAvLyBmbG93IGNhbid0IHJlZmluZSB0aGlzIHRvIGhhdmUgb25lIG9mIGxuZyBvciBsYXQsIHNvIHdlIGhhdmUgdG8gY2FzdCB0byBhbnlcbiAgICAgICAgICAgICAgICBOdW1iZXIoJ2xuZycgaW4gaW5wdXQgPyAoaW5wdXQ6IGFueSkubG5nIDogKGlucHV0OiBhbnkpLmxvbiksXG4gICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0LmxhdClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYExuZ0xhdExpa2VgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgTG5nTGF0IGluc3RhbmNlLCBhbiBvYmplY3Qge2xuZzogPGxuZz4sIGxhdDogPGxhdD59LCBhbiBvYmplY3Qge2xvbjogPGxuZz4sIGxhdDogPGxhdD59LCBvciBhbiBhcnJheSBvZiBbPGxuZz4sIDxsYXQ+XVwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTG5nTGF0fSBvYmplY3QsIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLFxuICogb3IgYW4gb2JqZWN0IHdpdGggYGxuZ2AgYW5kIGBsYXRgIG9yIGBsb25gIGFuZCBgbGF0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlZGVmIHtMbmdMYXQgfCB7bG5nOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IHtsb246IG51bWJlciwgbGF0OiBudW1iZXJ9IHwgW251bWJlciwgbnVtYmVyXX0gTG5nTGF0TGlrZVxuICogQGV4YW1wbGVcbiAqIHZhciB2MSA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTEyMi40MjA2NzksIDM3Ljc3MjUzNyk7XG4gKiB2YXIgdjIgPSBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN107XG4gKiB2YXIgdjMgPSB7bG9uOiAtMTIyLjQyMDY3OSwgbGF0OiAzNy43NzI1Mzd9O1xuICovXG5leHBvcnQgdHlwZSBMbmdMYXRMaWtlID0gTG5nTGF0IHwge2xuZzogbnVtYmVyLCBsYXQ6IG51bWJlcn0gfCB7bG9uOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IFtudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBkZWZhdWx0IExuZ0xhdDtcbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQgTG5nTGF0LCB7ZWFydGhSYWRpdXN9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcclxuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcclxuXHJcbi8qXHJcbiAqIFRoZSBhdmVyYWdlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIHdvcmxkIGluIG1ldGVycy5cclxuICovXHJcbmNvbnN0IGVhcnRoQ2lyY3VtZnJlbmNlID0gMiAqIE1hdGguUEkgKiBlYXJ0aFJhZGl1czsgLy8gbWV0ZXJzXHJcblxyXG4vKlxyXG4gKiBUaGUgY2lyY3VtZmVyZW5jZSBhdCBhIGxpbmUgb2YgbGF0aXR1ZGUgaW4gbWV0ZXJzLlxyXG4gKi9cclxuZnVuY3Rpb24gY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUobGF0aXR1ZGU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGVhcnRoQ2lyY3VtZnJlbmNlICogTWF0aC5jb3MobGF0aXR1ZGUgKiBNYXRoLlBJIC8gMTgwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yWGZyb21MbmcobG5nOiBudW1iZXIpIHtcclxuICAgIHJldHVybiAoMTgwICsgbG5nKSAvIDM2MDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yWWZyb21MYXQobGF0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiAoMTgwIC0gKDE4MCAvIE1hdGguUEkgKiBNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJIC8gNCArIGxhdCAqIE1hdGguUEkgLyAzNjApKSkpIC8gMzYwO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKGFsdGl0dWRlOiBudW1iZXIsIGxhdDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gYWx0aXR1ZGUgLyBjaXJjdW1mZXJlbmNlQXRMYXRpdHVkZShsYXQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG5nRnJvbU1lcmNhdG9yWCh4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB4ICogMzYwIC0gMTgwO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbGF0RnJvbU1lcmNhdG9yWSh5OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHkyID0gMTgwIC0geSAqIDM2MDtcclxuICAgIHJldHVybiAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhbHRpdHVkZUZyb21NZXJjYXRvclooejogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB6ICogY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUobGF0RnJvbU1lcmNhdG9yWSh5KSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgdGhlIE1lcmNhdG9yIHNjYWxlIGZhY3RvciBmb3IgYSBnaXZlbiBsYXRpdHVkZSwgc2VlXHJcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01lcmNhdG9yX3Byb2plY3Rpb24jU2NhbGVfZmFjdG9yXHJcbiAqXHJcbiAqIEF0IHRoZSBlcXVhdG9yIHRoZSBzY2FsZSBmYWN0b3Igd2lsbCBiZSAxLCB3aGljaCBpbmNyZWFzZXMgYXQgaGlnaGVyIGxhdGl0dWRlcy5cclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGxhdCBMYXRpdHVkZVxyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBzY2FsZSBmYWN0b3JcclxuICogQHByaXZhdGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvclNjYWxlKGxhdDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gMSAvIE1hdGguY29zKGxhdCAqIE1hdGguUEkgLyAxODApO1xyXG59XHJcblxyXG4vKipcclxuICogQSBgTWVyY2F0b3JDb29yZGluYXRlYCBvYmplY3QgcmVwcmVzZW50cyBhIHByb2plY3RlZCB0aHJlZSBkaW1lbnNpb25hbCBwb3NpdGlvbi5cclxuICpcclxuICogYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdXNlcyB0aGUgd2ViIG1lcmNhdG9yIHByb2plY3Rpb24gKFtFUFNHOjM4NTddKGh0dHBzOi8vZXBzZy5pby8zODU3KSkgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgdW5pdHM6XHJcbiAqIC0gdGhlIHNpemUgb2YgMSB1bml0IGlzIHRoZSB3aWR0aCBvZiB0aGUgcHJvamVjdGVkIHdvcmxkIGluc3RlYWQgb2YgdGhlIFwibWVyY2F0b3IgbWV0ZXJcIlxyXG4gKiAtIHRoZSBvcmlnaW4gb2YgdGhlIGNvb3JkaW5hdGUgc3BhY2UgaXMgYXQgdGhlIG5vcnRoLXdlc3QgY29ybmVyIGluc3RlYWQgb2YgdGhlIG1pZGRsZVxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSwgYE1lcmNhdG9yQ29vcmRpbmF0ZSgwLCAwLCAwKWAgaXMgdGhlIG5vcnRoLXdlc3QgY29ybmVyIG9mIHRoZSBtZXJjYXRvciB3b3JsZCBhbmRcclxuICogYE1lcmNhdG9yQ29vcmRpbmF0ZSgxLCAxLCAwKWAgaXMgdGhlIHNvdXRoLWVhc3QgY29ybmVyLiBJZiB5b3UgYXJlIGZhbWlsaWFyIHdpdGhcclxuICogW3ZlY3RvciB0aWxlc10oaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC92ZWN0b3ItdGlsZS1zcGVjKSBpdCBtYXkgYmUgaGVscGZ1bCB0byB0aGlua1xyXG4gKiBvZiB0aGUgY29vcmRpbmF0ZSBzcGFjZSBhcyB0aGUgYDAvMC8wYCB0aWxlIHdpdGggYW4gZXh0ZW50IG9mIGAxYC5cclxuICpcclxuICogVGhlIGB6YCBkaW1lbnNpb24gb2YgYE1lcmNhdG9yQ29vcmRpbmF0ZWAgaXMgY29uZm9ybWFsLiBBIGN1YmUgaW4gdGhlIG1lcmNhdG9yIGNvb3JkaW5hdGUgc3BhY2Ugd291bGQgYmUgcmVuZGVyZWQgYXMgYSBjdWJlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb21wb25lbnQgb2YgdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeSBjb21wb25lbnQgb2YgdGhlIHBvc2l0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0geiBUaGUgeiBjb21wb25lbnQgb2YgdGhlIHBvc2l0aW9uLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgbnVsbElzbGFuZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoMC41LCAwLjUsIDApO1xyXG4gKlxyXG4gKiBAc2VlIFtBZGQgYSBjdXN0b20gc3R5bGUgbGF5ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY3VzdG9tLXN0eWxlLWxheWVyLylcclxuICovXHJcbmNsYXNzIE1lcmNhdG9yQ29vcmRpbmF0ZSB7XHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICB5OiBudW1iZXI7XHJcbiAgICB6OiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciA9IDApIHtcclxuICAgICAgICB0aGlzLnggPSAreDtcclxuICAgICAgICB0aGlzLnkgPSAreTtcclxuICAgICAgICB0aGlzLnogPSArejtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2plY3QgYSBgTG5nTGF0YCB0byBhIGBNZXJjYXRvckNvb3JkaW5hdGVgLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nTGF0TGlrZSBUaGUgbG9jYXRpb24gdG8gcHJvamVjdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhbHRpdHVkZSBUaGUgYWx0aXR1ZGUgaW4gbWV0ZXJzIG9mIHRoZSBwb3NpdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtNZXJjYXRvckNvb3JkaW5hdGV9IFRoZSBwcm9qZWN0ZWQgbWVyY2F0b3IgY29vcmRpbmF0ZS5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgY29vcmQgPSBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCh7IGxuZzogMCwgbGF0OiAwfSwgMCk7XHJcbiAgICAgKiBjb29yZDsgLy8gTWVyY2F0b3JDb29yZGluYXRlKDAuNSwgMC41LCAwKVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbUxuZ0xhdChsbmdMYXRMaWtlOiBMbmdMYXRMaWtlLCBhbHRpdHVkZTogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIGNvbnN0IGxuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ0xhdExpa2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcclxuICAgICAgICAgICAgICAgIG1lcmNhdG9yWGZyb21MbmcobG5nTGF0LmxuZyksXHJcbiAgICAgICAgICAgICAgICBtZXJjYXRvcllmcm9tTGF0KGxuZ0xhdC5sYXQpLFxyXG4gICAgICAgICAgICAgICAgbWVyY2F0b3JaZnJvbUFsdGl0dWRlKGFsdGl0dWRlLCBsbmdMYXQubGF0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBgTG5nTGF0YCBmb3IgdGhlIGNvb3JkaW5hdGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGBMbmdMYXRgIG9iamVjdC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgY29vcmQgPSBuZXcgbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlKDAuNSwgMC41LCAwKTtcclxuICAgICAqIHZhciBsbmdMYXQgPSBjb29yZC50b0xuZ0xhdCgpOyAvLyBMbmdMYXQoMCwgMClcclxuICAgICAqL1xyXG4gICAgdG9MbmdMYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoXHJcbiAgICAgICAgICAgICAgICBsbmdGcm9tTWVyY2F0b3JYKHRoaXMueCksXHJcbiAgICAgICAgICAgICAgICBsYXRGcm9tTWVyY2F0b3JZKHRoaXMueSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzIG9mIHRoZSBjb29yZGluYXRlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBhbHRpdHVkZSBpbiBtZXRlcnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIGNvb3JkID0gbmV3IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZSgwLCAwLCAwLjAyKTtcclxuICAgICAqIGNvb3JkLnRvQWx0aXR1ZGUoKTsgLy8gNjkxNC4yODE5NTYyOTUzMzlcclxuICAgICAqL1xyXG4gICAgdG9BbHRpdHVkZSgpIHtcclxuICAgICAgICByZXR1cm4gYWx0aXR1ZGVGcm9tTWVyY2F0b3JaKHRoaXMueiwgdGhpcy55KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIG9mIDEgbWV0ZXIgaW4gYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdW5pdHMgYXQgdGhpcyBsYXRpdHVkZS5cclxuICAgICAqXHJcbiAgICAgKiBGb3IgY29vcmRpbmF0ZXMgaW4gcmVhbCB3b3JsZCB1bml0cyB1c2luZyBtZXRlcnMsIHRoaXMgbmF0dXJhbGx5IHByb3ZpZGVzIHRoZSBzY2FsZVxyXG4gICAgICogdG8gdHJhbnNmb3JtIGludG8gYE1lcmNhdG9yQ29vcmRpbmF0ZWBzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IERpc3RhbmNlIG9mIDEgbWV0ZXIgaW4gYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdW5pdHMuXHJcbiAgICAgKi9cclxuICAgIG1ldGVySW5NZXJjYXRvckNvb3JkaW5hdGVVbml0cygpIHtcclxuICAgICAgICAvLyAxIG1ldGVyIC8gY2lyY3VtZmVyZW5jZSBhdCBlcXVhdG9yIGluIG1ldGVycyAqIE1lcmNhdG9yIHByb2plY3Rpb24gc2NhbGUgZmFjdG9yIGF0IHRoaXMgbGF0aXR1ZGVcclxuICAgICAgICByZXR1cm4gMSAvIGVhcnRoQ2lyY3VtZnJlbmNlICogbWVyY2F0b3JTY2FsZShsYXRGcm9tTWVyY2F0b3JZKHRoaXMueSkpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVyY2F0b3JDb29yZGluYXRlO1xyXG4iLCIvLyBAZmxvd1xyXG5cclxuaW1wb3J0IHtnZXRNZXJjQ29vcmRzfSBmcm9tICdAbWFwYm94L3dob290cy1qcyc7XHJcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xyXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XHJcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xyXG5cclxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xyXG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIENhbm9uaWNhbFRpbGVJRCB7XHJcbiAgICB6OiBudW1iZXI7XHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICB5OiBudW1iZXI7XHJcbiAgICBrZXk6IHN0cmluZztcclxuICAgIGluZGV4RXh0ZW50OiBBcnJheTxudW1iZXI+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGluZGV4RXh0ZW50OiBBcnJheTxudW1iZXI+KSB7XHJcbiAgICAgICAgYXNzZXJ0KHogPj0gMCAmJiB6IDw9IDI1KTtcclxuICAgICAgICBhc3NlcnQoeCA+PSAwICYmIHggPCBNYXRoLnBvdygyLCB6KSk7XHJcbiAgICAgICAgYXNzZXJ0KHkgPj0gMCAmJiB5IDwgTWF0aC5wb3coMiwgeikpO1xyXG4gICAgICAgIHRoaXMueiA9IHo7XHJcbiAgICAgICAgdGhpcy54ID0geDtcclxuICAgICAgICB0aGlzLnkgPSB5O1xyXG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KDAsIHosIHosIHgsIHkpO1xyXG4gICAgICAgIGlmKGluZGV4RXh0ZW50KXtcclxuICAgICAgICAgICAgdGhpcy5pbmRleEV4dGVudCA9IGluZGV4RXh0ZW50O1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkV2lkdGggPSBpbmRleEV4dGVudFsyXSAtIGluZGV4RXh0ZW50WzBdO1xyXG4gICAgICAgICAgICB0aGlzLndvcmxkSGVpZ2h0ID0gaW5kZXhFeHRlbnRbM10gLSBpbmRleEV4dGVudFsxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgZXF1YWxzKGlkOiBDYW5vbmljYWxUaWxlSUQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy56ID09PSBpZC56ICYmIHRoaXMueCA9PT0gaWQueCAmJiB0aGlzLnkgPT09IGlkLnk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGlsZUJCb3goKSB7XHJcbiAgICAgICAgY29uc3QgYSA9IE1hdGgucG93KDIsIHRoaXMueik7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuaW5kZXhFeHRlbnRbMF0gKyAodGhpcy53b3JsZFdpZHRoICogdGhpcy54KSAvIGF9LCR7dGhpcy5pbmRleEV4dGVudFszXSAtICh0aGlzLndvcmxkSGVpZ2h0ICogKHRoaXMueSArIDEpKSAvIGF9LCR7dGhpcy5pbmRleEV4dGVudFswXSArICh0aGlzLndvcmxkV2lkdGggKiAodGhpcy54ICsgMSkpIC8gYX0sJHt0aGlzLmluZGV4RXh0ZW50WzNdIC0gKHRoaXMud29ybGRIZWlnaHQgKiB0aGlzLnkpIC8gYX1gO1xyXG4gICAgfVxyXG4gICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIHVybHMsIGNob29zZSBhIHVybCB0ZW1wbGF0ZSBhbmQgcmV0dXJuIGEgdGlsZSBVUkxcclxuICAgIHVybCh1cmxzOiBBcnJheTxzdHJpbmc+LCBzY2hlbWU6ID9zdHJpbmcsIHIgOiA/bnVtYmVyLCB0aWxlU2l6ZTogP251bWJlciwgc2NhbGU6ID9udW1iZXIpIHtcclxuICAgICAgICBjb25zdCBiYm94ID0gdGhpcy5nZXRUaWxlQkJveCgpO1xyXG4gICAgICAgIGNvbnN0IHF1YWRrZXkgPSBnZXRRdWFka2V5KHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xyXG4gICAgICAgIHIgPSByIHx8IDA7XHJcbiAgICAgICAgdmFyIHUgPSB1cmxzWyh0aGlzLnggKyB0aGlzLnkpICUgdXJscy5sZW5ndGhdXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgXCJ7cHJlZml4fVwiLFxyXG4gICAgICAgICAgICAgICAgKHRoaXMueCAlIDE2KS50b1N0cmluZygxNikgKyAodGhpcy55ICUgMTYpLnRvU3RyaW5nKDE2KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3p9XCIsIFN0cmluZyh0aGlzLnogLSByKSkgLy9pY2xpZW50XHJcbiAgICAgICAgICAgIC5yZXBsYWNlKFwie3h9XCIsIFN0cmluZyh0aGlzLngpKVxyXG4gICAgICAgICAgICAucmVwbGFjZShcclxuICAgICAgICAgICAgICAgIFwie3l9XCIsXHJcbiAgICAgICAgICAgICAgICBTdHJpbmcoXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1lID09PSBcInRtc1wiID8gTWF0aC5wb3coMiwgdGhpcy56KSAtIHRoaXMueSAtIDEgOiB0aGlzLnlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAucmVwbGFjZShcIntxdWFka2V5fVwiLCBxdWFka2V5KVxyXG4gICAgICAgICAgICAucmVwbGFjZShcIntiYm94LWVwc2ctMzg1N31cIiwgYmJveClcclxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7YmJveH1cIiwgYmJveClcclxuICAgICAgICAgICAgLnJlcGxhY2UoXCJ7d2lkdGh9XCIsIHRpbGVTaXplKVxyXG4gICAgICAgICAgICAucmVwbGFjZShcIntoZWlnaHR9XCIsIHRpbGVTaXplKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRWaWV3Qm91bmRzKSB7XHJcbiAgICAgICAgICAgIHZhciBiID0gdGhpcy5nZXRWaWV3Qm91bmRzKCk7XHJcbiAgICAgICAgICAgIGlmIChiKSB7XHJcbiAgICAgICAgICAgICAgICB1ID0gdS5yZXBsYWNlKFwie3ZpZXdCb3VuZHN9XCIsIGIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdldFRpbGVCQm94UmV2ZXJzZVhZKXtcclxuICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmdldFRpbGVCQm94UmV2ZXJzZVhZKCk7XHJcbiAgICAgICAgICAgIGlmKHQpe1xyXG4gICAgICAgICAgICAgICAgdSA9IHUucmVwbGFjZShcIntiYm94LXdtcy0xLjMuMH1cIiwgdClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjYWxlKSB7XHJcbiAgICAgICAgICAgIHUgPSB1LnJlcGxhY2UoXCJ7c2NhbGV9XCIsIHNjYWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGlsZVBvaW50KGNvb3JkOiBNZXJjYXRvckNvb3JkaW5hdGUpIHtcclxuICAgICAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIHRoaXMueik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChcclxuICAgICAgICAgICAgKGNvb3JkLnggKiB0aWxlc0F0Wm9vbSAtIHRoaXMueCkgKiBFWFRFTlQsXHJcbiAgICAgICAgICAgIChjb29yZC55ICogdGlsZXNBdFpvb20gLSB0aGlzLnkpICogRVhURU5UXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0b1N0cmluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy56fS8ke3RoaXMueH0vJHt0aGlzLnl9YDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUaWxlQkJveFJldmVyc2VYWSgpIHtcclxuICAgICAgICBjb25zdCBhID0gTWF0aC5wb3coMiwgdGhpcy56KTtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5pbmRleEV4dGVudFszXSAtICh0aGlzLndvcmxkSGVpZ2h0ICogKHRoaXMueSArIDEpKSAvIGF9LCR7dGhpcy5pbmRleEV4dGVudFswXSArICh0aGlzLndvcmxkV2lkdGggKiB0aGlzLngpIC8gYX0sJHt0aGlzLmluZGV4RXh0ZW50WzNdIC0gKHRoaXMud29ybGRIZWlnaHQgKiB0aGlzLnkpIC8gYX0sJHt0aGlzLmluZGV4RXh0ZW50WzBdICsgKHRoaXMud29ybGRXaWR0aCAqICh0aGlzLnggKyAxKSkgLyBhfWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Vmlld0JvdW5kcygpIHtcclxuICAgICAgICBjb25zdCBhID0gTWF0aC5wb3coMiwgdGhpcy56KTtcclxuICAgICAgICByZXR1cm4gYHtcImxlZnRCb3R0b21cIjp7XCJ4XCI6JHtcclxuICAgICAgICAgICAgdGhpcy5pbmRleEV4dGVudFswXSArICh0aGlzLndvcmxkV2lkdGggKiB0aGlzLngpIC8gYVxyXG4gICAgICAgIH0sXCJ5XCI6JHtcclxuICAgICAgICAgICAgdGhpcy5pbmRleEV4dGVudFszXSAtICh0aGlzLndvcmxkSGVpZ2h0ICogKHRoaXMueSArIDEpKSAvIGFcclxuICAgICAgICB9fSxcInJpZ2h0VG9wXCI6e1wieFwiOiR7XHJcbiAgICAgICAgICAgIHRoaXMuaW5kZXhFeHRlbnRbMF0gKyAodGhpcy53b3JsZFdpZHRoICogKHRoaXMueCArIDEpKSAvIGFcclxuICAgICAgICB9LFwieVwiOiAke3RoaXMuaW5kZXhFeHRlbnRbM10gLSAodGhpcy53b3JsZEhlaWdodCAqIHRoaXMueSkgLyBhfX19YDtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVud3JhcHBlZFRpbGVJRCB7XHJcbiAgICB3cmFwOiBudW1iZXI7XHJcbiAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRDtcclxuICAgIGtleTogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHdyYXA6IG51bWJlciwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcclxuICAgICAgICB0aGlzLndyYXAgPSB3cmFwO1xyXG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsO1xyXG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KHdyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE92ZXJzY2FsZWRUaWxlSUQge1xyXG4gICAgb3ZlcnNjYWxlZFo6IG51bWJlcjtcclxuICAgIHdyYXA6IG51bWJlcjtcclxuICAgIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEO1xyXG4gICAga2V5OiBzdHJpbmc7XHJcbiAgICBwb3NNYXRyaXg6IEZsb2F0MzJBcnJheTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvdmVyc2NhbGVkWjogbnVtYmVyLCB3cmFwOiBudW1iZXIsIHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGluZGV4RXh0ZW50OiBBcnJheTxudW1iZXI+KSB7XHJcbiAgICAgICAgYXNzZXJ0KG92ZXJzY2FsZWRaID49IHopO1xyXG4gICAgICAgIHRoaXMub3ZlcnNjYWxlZFogPSBvdmVyc2NhbGVkWjtcclxuICAgICAgICB0aGlzLndyYXAgPSB3cmFwO1xyXG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gbmV3IENhbm9uaWNhbFRpbGVJRCh6LCAreCwgK3ksIGluZGV4RXh0ZW50KTtcclxuICAgICAgICB0aGlzLmtleSA9IGNhbGN1bGF0ZUtleSh3cmFwLCBvdmVyc2NhbGVkWiwgeiwgeCwgeSk7XHJcbiAgICB9XHJcblxyXG4gICAgZXF1YWxzKGlkOiBPdmVyc2NhbGVkVGlsZUlEKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcnNjYWxlZFogPT09IGlkLm92ZXJzY2FsZWRaICYmIHRoaXMud3JhcCA9PT0gaWQud3JhcCAmJiB0aGlzLmNhbm9uaWNhbC5lcXVhbHMoaWQuY2Fub25pY2FsKTtcclxuICAgIH1cclxuXHJcbiAgICBzY2FsZWRUbyh0YXJnZXRaOiBudW1iZXIpIHtcclxuICAgICAgICBhc3NlcnQodGFyZ2V0WiA8PSB0aGlzLm92ZXJzY2FsZWRaKTtcclxuICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IHRoaXMuY2Fub25pY2FsLnogLSB0YXJnZXRaO1xyXG4gICAgICAgIGlmICh0YXJnZXRaID4gdGhpcy5jYW5vbmljYWwueikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGFyZ2V0WiwgdGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55LCB0aGlzLmNhbm9uaWNhbC5pbmRleEV4dGVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRhcmdldFosIHRoaXMud3JhcCwgdGFyZ2V0WiwgdGhpcy5jYW5vbmljYWwueCA+PiB6RGlmZmVyZW5jZSwgdGhpcy5jYW5vbmljYWwueSA+PiB6RGlmZmVyZW5jZSwgdGhpcy5jYW5vbmljYWwuaW5kZXhFeHRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogY2FsY3VsYXRlU2NhbGVkS2V5IGlzIGFuIG9wdGltaXphdGlvbjpcclxuICAgICAqIHdoZW4gd2l0aFdyYXAgPT0gdHJ1ZSwgaW1wbGVtZW50cyB0aGUgc2FtZSBhcyB0aGlzLnNjYWxlZFRvKHopLmtleSxcclxuICAgICAqIHdoZW4gd2l0aFdyYXAgPT0gZmFsc2UsIGltcGxlbWVudHMgdGhlIHNhbWUgYXMgdGhpcy5zY2FsZWRUbyh6KS53cmFwcGVkKCkua2V5LlxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVTY2FsZWRLZXkodGFyZ2V0WjogbnVtYmVyLCB3aXRoV3JhcDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICAgICAgYXNzZXJ0KHRhcmdldFogPD0gdGhpcy5vdmVyc2NhbGVkWik7XHJcbiAgICAgICAgY29uc3QgekRpZmZlcmVuY2UgPSB0aGlzLmNhbm9uaWNhbC56IC0gdGFyZ2V0WjtcclxuICAgICAgICBpZiAodGFyZ2V0WiA+IHRoaXMuY2Fub25pY2FsLnopIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUtleSh0aGlzLndyYXAgKiArd2l0aFdyYXAsIHRhcmdldFosIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVLZXkodGhpcy53cmFwICogK3dpdGhXcmFwLCB0YXJnZXRaLCB0YXJnZXRaLCB0aGlzLmNhbm9uaWNhbC54ID4+IHpEaWZmZXJlbmNlLCB0aGlzLmNhbm9uaWNhbC55ID4+IHpEaWZmZXJlbmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNDaGlsZE9mKHBhcmVudDogT3ZlcnNjYWxlZFRpbGVJRCkge1xyXG4gICAgICAgIGlmIChwYXJlbnQud3JhcCAhPT0gdGhpcy53cmFwKSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGNhbid0IGJlIGEgY2hpbGQgaWYgd2UncmUgaW4gYSBkaWZmZXJlbnQgd29ybGQgY29weVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHpEaWZmZXJlbmNlID0gdGhpcy5jYW5vbmljYWwueiAtIHBhcmVudC5jYW5vbmljYWwuejtcclxuICAgICAgICAvLyBXZSdyZSBmaXJzdCB0ZXN0aW5nIGZvciB6ID09IDAsIHRvIGF2b2lkIGEgMzIgYml0IHNoaWZ0LCB3aGljaCBpcyB1bmRlZmluZWQuXHJcbiAgICAgICAgcmV0dXJuIHBhcmVudC5vdmVyc2NhbGVkWiA9PT0gMCB8fCAoXHJcbiAgICAgICAgICAgIHBhcmVudC5vdmVyc2NhbGVkWiA8IHRoaXMub3ZlcnNjYWxlZFogJiZcclxuICAgICAgICAgICAgICAgIHBhcmVudC5jYW5vbmljYWwueCA9PT0gKHRoaXMuY2Fub25pY2FsLnggPj4gekRpZmZlcmVuY2UpICYmXHJcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2Fub25pY2FsLnkgPT09ICh0aGlzLmNhbm9uaWNhbC55ID4+IHpEaWZmZXJlbmNlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hpbGRyZW4oc291cmNlTWF4Wm9vbTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPj0gc291cmNlTWF4Wm9vbSkge1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gYSBzaW5nbGUgdGlsZSBjb29yZCByZXByZXNlbnRpbmcgYSBhbiBvdmVyc2NhbGVkIHRpbGVcclxuICAgICAgICAgICAgcmV0dXJuIFtuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aGlzLm92ZXJzY2FsZWRaICsgMSwgdGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55LCB0aGlzLmNhbm9uaWNhbC5pbmRleEV4dGVudCldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuY2Fub25pY2FsLnogKyAxO1xyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmNhbm9uaWNhbC54ICogMjtcclxuICAgICAgICBjb25zdCB5ID0gdGhpcy5jYW5vbmljYWwueSAqIDI7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4LCB5LCB0aGlzLmNhbm9uaWNhbC5pbmRleEV4dGVudCksXHJcbiAgICAgICAgICAgIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRoaXMud3JhcCwgeiwgeCArIDEsIHksIHRoaXMuY2Fub25pY2FsLmluZGV4RXh0ZW50KSxcclxuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4LCB5ICsgMSwgdGhpcy5jYW5vbmljYWwuaW5kZXhFeHRlbnQpLFxyXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHggKyAxLCB5ICsgMSwgdGhpcy5jYW5vbmljYWwuaW5kZXhFeHRlbnQpXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBpc0xlc3NUaGFuKHJoczogT3ZlcnNjYWxlZFRpbGVJRCkge1xyXG4gICAgICAgIGlmICh0aGlzLndyYXAgPCByaHMud3JhcCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMud3JhcCA+IHJocy53cmFwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm92ZXJzY2FsZWRaIDwgcmhzLm92ZXJzY2FsZWRaKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5vdmVyc2NhbGVkWiA+IHJocy5vdmVyc2NhbGVkWikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jYW5vbmljYWwueCA8IHJocy5jYW5vbmljYWwueCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsLnggPiByaHMuY2Fub25pY2FsLngpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsLnkgPCByaHMuY2Fub25pY2FsLnkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB3cmFwcGVkKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aGlzLm92ZXJzY2FsZWRaLCAwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55LCB0aGlzLmNhbm9uaWNhbC5pbmRleEV4dGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgdW53cmFwVG8od3JhcDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFosIHdyYXAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnksIHRoaXMuY2Fub25pY2FsLmluZGV4RXh0ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVyc2NhbGVGYWN0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIHRoaXMub3ZlcnNjYWxlZFogLSB0aGlzLmNhbm9uaWNhbC56KTtcclxuICAgIH1cclxuXHJcbiAgICB0b1Vud3JhcHBlZCgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFVud3JhcHBlZFRpbGVJRCh0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsKTtcclxuICAgIH1cclxuXHJcbiAgICB0b1N0cmluZygpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5vdmVyc2NhbGVkWn0vJHt0aGlzLmNhbm9uaWNhbC54fS8ke3RoaXMuY2Fub25pY2FsLnl9YDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUaWxlUG9pbnQoY29vcmQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbm9uaWNhbC5nZXRUaWxlUG9pbnQobmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShjb29yZC54IC0gdGhpcy53cmFwLCBjb29yZC55KSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGF0ZUtleSh3cmFwOiBudW1iZXIsIG92ZXJzY2FsZWRaOiBudW1iZXIsIHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgd3JhcCAqPSAyO1xyXG4gICAgaWYgKHdyYXAgPCAwKSB3cmFwID0gd3JhcCAqIC0xIC0gMTtcclxuICAgIGNvbnN0IGRpbSA9IDEgPDwgejtcclxuICAgIHJldHVybiAoZGltICogZGltICogd3JhcCArIGRpbSAqIHkgKyB4KS50b1N0cmluZygzNikgKyB6LnRvU3RyaW5nKDM2KSArIG92ZXJzY2FsZWRaLnRvU3RyaW5nKDM2KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UXVhZGtleSh6LCB4LCB5KSB7XHJcbiAgICBsZXQgcXVhZGtleSA9ICcnLCBtYXNrO1xyXG4gICAgZm9yIChsZXQgaSA9IHo7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICBtYXNrID0gMSA8PCAoaSAtIDEpO1xyXG4gICAgICAgIHF1YWRrZXkgKz0gKCh4ICYgbWFzayA/IDEgOiAwKSArICh5ICYgbWFzayA/IDIgOiAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcXVhZGtleTtcclxufVxyXG5cclxucmVnaXN0ZXIoJ0Nhbm9uaWNhbFRpbGVJRCcsIENhbm9uaWNhbFRpbGVJRCk7XHJcbnJlZ2lzdGVyKCdPdmVyc2NhbGVkVGlsZUlEJywgT3ZlcnNjYWxlZFRpbGVJRCwge29taXQ6IFsncG9zTWF0cml4J119KTtcclxuIiwiLy8gQGZsb3dcbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuaW1wb3J0IHt3YXJuT25jZX0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5cbi8vIERFTURhdGEgaXMgYSBkYXRhIHN0cnVjdHVyZSBmb3IgZGVjb2RpbmcsIGJhY2tmaWxsaW5nLCBhbmQgc3RvcmluZyBlbGV2YXRpb24gZGF0YSBmb3IgcHJvY2Vzc2luZyBpbiB0aGUgaGlsbHNoYWRlIHNoYWRlcnNcbi8vIGRhdGEgY2FuIGJlIHBvcHVsYXRlZCBlaXRoZXIgZnJvbSBhIHBuZ3JhdyBpbWFnZSB0aWxlIG9yIGZyb20gc2VybGlhemVkIGRhdGEgc2VudCBiYWNrIGZyb20gYSB3b3JrZXIuIFdoZW4gZGF0YSBpcyBpbml0aWFsbHlcbi8vIGxvYWRlZCBmcm9tIGEgaW1hZ2UgdGlsZSwgd2UgZGVjb2RlIHRoZSBwaXhlbCB2YWx1ZXMgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGRlY29kaW5nIGZvcm11bGEsIGJ1dCB3ZSBzdG9yZSB0aGVcbi8vIGVsZXZhdGlvbiBkYXRhIGFzIGFuIEludDMyIHZhbHVlLiB3ZSBhZGQgNjU1MzYgKDJeMTYpIHRvIGVsaW1pbmF0ZSBuZWdhdGl2ZSB2YWx1ZXMgYW5kIGVuYWJsZSB0aGUgdXNlIG9mXG4vLyBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gY3JlYXRpbmcgdGhlIHRleHR1cmUgdXNlZCBpbiB0aGUgaGlsbHNoYWRlUHJlcGFyZSBzdGVwLlxuXG4vLyBERU1EYXRhIGFsc28gaGFuZGxlcyB0aGUgYmFja2ZpbGxpbmcgb2YgZGF0YSBmcm9tIGEgdGlsZSdzIG5laWdoYm9yaW5nIHRpbGVzLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSBhIHBpeGVsJ3MgOFxuLy8gc3Vycm91bmRpbmcgcGl4ZWwgdmFsdWVzIHRvIGNvbXB1dGUgdGhlIHNsb3BlIGF0IHRoYXQgcGl4ZWwsIGFuZCB3ZSBjYW5ub3QgYWNjdXJhdGVseSBjYWxjdWxhdGUgdGhlIHNsb3BlIGF0IHBpeGVscyBvbiBhXG4vLyB0aWxlJ3MgZWRnZSB3aXRob3V0IGJhY2tmaWxsaW5nIGZyb20gbmVpZ2hib3JpbmcgdGlsZXMuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERFTURhdGEge1xuICAgIHVpZDogc3RyaW5nO1xuICAgIGRhdGE6IFVpbnQzMkFycmF5O1xuICAgIHN0cmlkZTogbnVtYmVyO1xuICAgIGRpbTogbnVtYmVyO1xuICAgIGVuY29kaW5nOiBcIm1hcGJveFwiIHwgXCJ0ZXJyYXJpdW1cIjtcblxuICAgIC8vIFJHQkFJbWFnZSBkYXRhIGhhcyB1bmlmb3JtIDFweCBwYWRkaW5nIG9uIGFsbCBzaWRlczogc3F1YXJlIHRpbGUgZWRnZSBzaXplIGRlZmluZXMgc3RyaWRlXG4gICAgLy8gYW5kIGRpbSBpcyBjYWxjdWxhdGVkIGFzIHN0cmlkZSAtIDIuXG4gICAgY29uc3RydWN0b3IodWlkOiBzdHJpbmcsIGRhdGE6IFJHQkFJbWFnZSwgZW5jb2Rpbmc6IFwibWFwYm94XCIgfCBcInRlcnJhcml1bVwiKSB7XG4gICAgICAgIHRoaXMudWlkID0gdWlkO1xuICAgICAgICBpZiAoZGF0YS5oZWlnaHQgIT09IGRhdGEud2lkdGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdERU0gdGlsZXMgbXVzdCBiZSBzcXVhcmUnKTtcbiAgICAgICAgaWYgKGVuY29kaW5nICYmIGVuY29kaW5nICE9PSBcIm1hcGJveFwiICYmIGVuY29kaW5nICE9PSBcInRlcnJhcml1bVwiKSByZXR1cm4gd2Fybk9uY2UoXG4gICAgICAgICAgICBgXCIke2VuY29kaW5nfVwiIGlzIG5vdCBhIHZhbGlkIGVuY29kaW5nIHR5cGUuIFZhbGlkIHR5cGVzIGluY2x1ZGUgXCJtYXBib3hcIiBhbmQgXCJ0ZXJyYXJpdW1cIi5gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RyaWRlID0gZGF0YS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbSA9IHRoaXMuZGltID0gZGF0YS5oZWlnaHQgLSAyO1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5kYXRhLmJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAnbWFwYm94JztcblxuICAgICAgICAvLyBpbiBvcmRlciB0byBhdm9pZCBmbGFzaGluZyBzZWFtcyBiZXR3ZWVuIHRpbGVzLCBoZXJlIHdlIGFyZSBpbml0aWFsbHkgcG9wdWxhdGluZyBhIDFweCBib3JkZXIgb2YgcGl4ZWxzIGFyb3VuZCB0aGUgaW1hZ2VcbiAgICAgICAgLy8gd2l0aCB0aGUgZGF0YSBvZiB0aGUgbmVhcmVzdCBwaXhlbCBmcm9tIHRoZSBpbWFnZS4gdGhpcyBkYXRhIGlzIGV2ZW50dWFsbHkgcmVwbGFjZWQgd2hlbiB0aGUgdGlsZSdzIG5laWdoYm9yaW5nXG4gICAgICAgIC8vIHRpbGVzIGFyZSBsb2FkZWQgYW5kIHRoZSBhY2N1cmF0ZSBkYXRhIGNhbiBiZSBiYWNrZmlsbGVkIHVzaW5nIERFTURhdGEjYmFja2ZpbGxCb3JkZXJcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBkaW07IHgrKykge1xuICAgICAgICAgICAgLy8gbGVmdCB2ZXJ0aWNhbCBib3JkZXJcbiAgICAgICAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoLTEsIHgpXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoMCwgeCldO1xuICAgICAgICAgICAgLy8gcmlnaHQgdmVydGljYWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KGRpbSwgeCldID0gdGhpcy5kYXRhW3RoaXMuX2lkeChkaW0gLSAxLCB4KV07XG4gICAgICAgICAgICAvLyBsZWZ0IGhvcml6b250YWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KHgsIC0xKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KHgsIDApXTtcbiAgICAgICAgICAgIC8vIHJpZ2h0IGhvcml6b250YWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KHgsIGRpbSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeCh4LCBkaW0gLSAxKV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29ybmVyc1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KC0xLCAtMSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeCgwLCAwKV07XG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoZGltLCAtMSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeChkaW0gLSAxLCAwKV07XG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoLTEsIGRpbSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeCgwLCBkaW0gLSAxKV07XG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLl9pZHgoZGltLCBkaW0pXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoZGltIC0gMSwgZGltIC0gMSldO1xuICAgIH1cblxuICAgIGdldCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pZHgoeCwgeSkgKiA0O1xuICAgICAgICBjb25zdCB1bnBhY2sgPSB0aGlzLmVuY29kaW5nID09PSBcInRlcnJhcml1bVwiID8gdGhpcy5fdW5wYWNrVGVycmFyaXVtIDogdGhpcy5fdW5wYWNrTWFwYm94O1xuICAgICAgICByZXR1cm4gdW5wYWNrKHBpeGVsc1tpbmRleF0sIHBpeGVsc1tpbmRleCArIDFdLCBwaXhlbHNbaW5kZXggKyAyXSk7XG4gICAgfVxuXG4gICAgZ2V0VW5wYWNrVmVjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGluZyA9PT0gXCJ0ZXJyYXJpdW1cIiA/IFsyNTYuMCwgMS4wLCAxLjAgLyAyNTYuMCwgMzI3NjguMF0gOiBbNjU1My42LCAyNS42LCAwLjEsIDEwMDAwLjBdO1xuICAgIH1cblxuICAgIF9pZHgoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHggPCAtMSB8fCB4ID49IHRoaXMuZGltICsgMSB8fCAgeSA8IC0xIHx8IHkgPj0gdGhpcy5kaW0gKyAxKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgREVNIGRhdGEnKTtcbiAgICAgICAgcmV0dXJuICh5ICsgMSkgKiB0aGlzLnN0cmlkZSArICh4ICsgMSk7XG4gICAgfVxuXG4gICAgX3VucGFja01hcGJveChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgICAgIC8vIHVucGFja2luZyBmb3JtdWxhIGZvciBtYXBib3gudGVycmFpbi1yZ2I6XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9hY2Nlc3MtZWxldmF0aW9uLWRhdGEvI21hcGJveC10ZXJyYWluLXJnYlxuICAgICAgICByZXR1cm4gKChyICogMjU2ICogMjU2ICsgZyAqIDI1Ni4wICsgYikgLyAxMC4wIC0gMTAwMDAuMCk7XG4gICAgfVxuXG4gICAgX3VucGFja1RlcnJhcml1bShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgICAgIC8vIHVucGFja2luZyBmb3JtdWxhIGZvciBtYXB6ZW4gdGVycmFyaXVtOlxuICAgICAgICAvLyBodHRwczovL2F3cy5hbWF6b24uY29tL3B1YmxpYy1kYXRhc2V0cy90ZXJyYWluL1xuICAgICAgICByZXR1cm4gKChyICogMjU2ICsgZyArIGIgLyAyNTYpIC0gMzI3NjguMCk7XG4gICAgfVxuXG4gICAgZ2V0UGl4ZWxzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IHRoaXMuc3RyaWRlLCBoZWlnaHQ6IHRoaXMuc3RyaWRlfSwgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikpO1xuICAgIH1cblxuICAgIGJhY2tmaWxsQm9yZGVyKGJvcmRlclRpbGU6IERFTURhdGEsIGR4OiBudW1iZXIsIGR5OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZGltICE9PSBib3JkZXJUaWxlLmRpbSkgdGhyb3cgbmV3IEVycm9yKCdkZW0gZGltZW5zaW9uIG1pc21hdGNoJyk7XG5cbiAgICAgICAgbGV0IHhNaW4gPSBkeCAqIHRoaXMuZGltLFxuICAgICAgICAgICAgeE1heCA9IGR4ICogdGhpcy5kaW0gKyB0aGlzLmRpbSxcbiAgICAgICAgICAgIHlNaW4gPSBkeSAqIHRoaXMuZGltLFxuICAgICAgICAgICAgeU1heCA9IGR5ICogdGhpcy5kaW0gKyB0aGlzLmRpbTtcblxuICAgICAgICBzd2l0Y2ggKGR4KSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICB4TWluID0geE1heCAtIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgeE1heCA9IHhNaW4gKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGR5KSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICB5TWluID0geU1heCAtIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgeU1heCA9IHlNaW4gKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBveCA9IC1keCAqIHRoaXMuZGltO1xuICAgICAgICBjb25zdCBveSA9IC1keSAqIHRoaXMuZGltO1xuICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPCB4TWF4OyB4KyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KHgsIHkpXSA9IGJvcmRlclRpbGUuZGF0YVt0aGlzLl9pZHgoeCArIG94LCB5ICsgb3kpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0RFTURhdGEnLCBERU1EYXRhKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheX0gZnJvbSAnLi9hcnJheV90eXBlcyc7XG5pbXBvcnQgdHlwZSBTdHlsZSBmcm9tICcuLi9zdHlsZS9zdHlsZSc7XG5pbXBvcnQgdHlwZSB7VHlwZWRTdHlsZUxheWVyfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci90eXBlZF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBGZWF0dXJlSW5kZXggZnJvbSAnLi9mZWF0dXJlX2luZGV4JztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IHR5cGUgQnVja2V0UGFyYW1ldGVyczxMYXllcjogVHlwZWRTdHlsZUxheWVyPiA9IHtcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGxheWVyczogQXJyYXk8TGF5ZXI+LFxuICAgIHpvb206IG51bWJlcixcbiAgICBwaXhlbFJhdGlvOiBudW1iZXIsXG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcixcbiAgICBjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksXG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUlEOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgUG9wdWxhdGVQYXJhbWV0ZXJzID0ge1xuICAgIGZlYXR1cmVJbmRleDogRmVhdHVyZUluZGV4LFxuICAgIGljb25EZXBlbmRlbmNpZXM6IHt9LFxuICAgIHBhdHRlcm5EZXBlbmRlbmNpZXM6IHt9LFxuICAgIGdseXBoRGVwZW5kZW5jaWVzOiB7fSxcbiAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz5cbn1cblxuZXhwb3J0IHR5cGUgSW5kZXhlZEZlYXR1cmUgPSB7XG4gICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgaWQ6IG51bWJlciB8IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbn1cblxuZXhwb3J0IHR5cGUgQnVja2V0RmVhdHVyZSA9IHt8XG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgcHJvcGVydGllczogT2JqZWN0LFxuICAgIHR5cGU6IDEgfCAyIHwgMyxcbiAgICBpZD86IGFueSxcbiAgICArcGF0dGVybnM6IHtbXzogc3RyaW5nXToge1wibWluXCI6IHN0cmluZywgXCJtaWRcIjogc3RyaW5nLCBcIm1heFwiOiBzdHJpbmd9fSxcbiAgICBzb3J0S2V5PzogbnVtYmVyXG58fTtcblxuLyoqXG4gKiBUaGUgYEJ1Y2tldGAgaW50ZXJmYWNlIGlzIHRoZSBzaW5nbGUgcG9pbnQgb2Yga25vd2xlZGdlIGFib3V0IHR1cm5pbmcgdmVjdG9yXG4gKiB0aWxlcyBpbnRvIFdlYkdMIGJ1ZmZlcnMuXG4gKlxuICogYEJ1Y2tldGAgaXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlLiBBbiBpbXBsZW1lbnRhdGlvbiBleGlzdHMgZm9yIGVhY2ggc3R5bGUgbGF5ZXIgdHlwZS5cbiAqIENyZWF0ZSBhIGJ1Y2tldCB2aWEgdGhlIGBTdHlsZUxheWVyI2NyZWF0ZUJ1Y2tldGAgbWV0aG9kLlxuICpcbiAqIFRoZSBjb25jcmV0ZSBidWNrZXQgdHlwZXMsIHVzaW5nIGxheW91dCBvcHRpb25zIGZyb20gdGhlIHN0eWxlIGxheWVyLFxuICogdHJhbnNmb3JtIGZlYXR1cmUgZ2VvbWV0cmllcyBpbnRvIHZlcnRleCBhbmQgaW5kZXggZGF0YSBmb3IgdXNlIGJ5IHRoZVxuICogdmVydGV4IHNoYWRlci4gIFRoZXkgYWxzbyAodmlhIGBQcm9ncmFtQ29uZmlndXJhdGlvbmApIHVzZSBmZWF0dXJlXG4gKiBwcm9wZXJ0aWVzIGFuZCB0aGUgem9vbSBsZXZlbCB0byBwb3B1bGF0ZSB0aGUgYXR0cmlidXRlcyBuZWVkZWQgZm9yXG4gKiBkYXRhLWRyaXZlbiBzdHlsaW5nLlxuICpcbiAqIEJ1Y2tldHMgYXJlIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IG9uIGEgd29ya2VyIHRocmVhZCBhbmQgdGhlbiBzZXJpYWxpemVkIGFuZFxuICogdHJhbnNmZXJyZWQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgZm9yIHJlbmRlcmluZy4gIE9uIHRoZSB3b3JrZXIgc2lkZSwgYVxuICogYnVja2V0J3MgdmVydGV4LCBpbmRleCwgYW5kIGF0dHJpYnV0ZSBkYXRhIGlzIHN0b3JlZCBpbiBgYnVja2V0LmFycmF5czpcbiAqIEFycmF5R3JvdXBgLiAgV2hlbiBhIGJ1Y2tldCdzIGRhdGEgaXMgc2VyaWFsaXplZCBhbmQgc2VudCBiYWNrIHRvIHRoZSBtYWluXG4gKiB0aHJlYWQsIGlzIGdldHMgZGVzZXJpYWxpemVkICh1c2luZyBgbmV3IEJ1Y2tldChzZXJpYWxpemVkQnVja2V0RGF0YSlgLCB3aXRoXG4gKiB0aGUgYXJyYXkgZGF0YSBub3cgc3RvcmVkIGluIGBidWNrZXQuYnVmZmVyczogQnVmZmVyR3JvdXBgLiAgQnVmZmVyR3JvdXBzXG4gKiBob2xkIHRoZSBzYW1lIGRhdGEgYXMgQXJyYXlHcm91cHMsIGJ1dCBhcmUgdHVuZWQgZm9yIGNvbnN1bXB0aW9uIGJ5IFdlYkdMLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0IHtcbiAgICBsYXllcklkczogQXJyYXk8c3RyaW5nPjtcbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgICtsYXllcnM6IEFycmF5PGFueT47XG4gICAgK3N0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxhbnk+O1xuICAgICtzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpOiB2b2lkO1xuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pOiB2b2lkO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KTogdm9pZDtcbiAgICB1cGxvYWRQZW5kaW5nKCk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIHRoZSBXZWJHTCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXJzLiBOb3RlIHRoYXQgYmVjYXVzZVxuICAgICAqIGJ1Y2tldHMgYXJlIHNoYXJlZCBiZXR3ZWVuIGxheWVycyBoYXZpbmcgdGhlIHNhbWUgbGF5b3V0IHByb3BlcnRpZXMsIHRoZXlcbiAgICAgKiBtdXN0IGJlIGRlc3Ryb3llZCBpbiBncm91cHMgKGFsbCBidWNrZXRzIGZvciBhIHRpbGUsIG9yIGFsbCBzeW1ib2wgYnVja2V0cykuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGRlc3Ryb3koKTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKGlucHV0OiBBcnJheTxCdWNrZXQ+LCBzdHlsZTogU3R5bGUpOiB7W186IHN0cmluZ106IEJ1Y2tldH0ge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuXG4gICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWFwJ3Mgc3R5bGUgaGFzIGJlZW4gc2V0IHRvIG51bGwgd2hpbGVcbiAgICAvLyB0aGlzIGJ1Y2tldCBoYXMgYmVlbiBwYXJzaW5nLlxuICAgIGlmICghc3R5bGUpIHJldHVybiBvdXRwdXQ7XG5cbiAgICBmb3IgKGNvbnN0IGJ1Y2tldCBvZiBpbnB1dCkge1xuICAgICAgICBjb25zdCBsYXllcnMgPSBidWNrZXQubGF5ZXJJZHNcbiAgICAgICAgICAgIC5tYXAoKGlkKSA9PiBzdHlsZS5nZXRMYXllcihpZCkpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIGlmIChsYXllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxvb2sgdXAgU3R5bGVMYXllciBvYmplY3RzIGZyb20gbGF5ZXIgaWRzIChzaW5jZSB3ZSBkb24ndFxuICAgICAgICAvLyB3YW50IHRvIHdhc3RlIHRpbWUgc2VyaWFsaXppbmcvY29weWluZyB0aGVtIGZyb20gdGhlIHdvcmtlcilcbiAgICAgICAgKGJ1Y2tldDogYW55KS5sYXllcnMgPSBsYXllcnM7XG4gICAgICAgIGlmICgoYnVja2V0OiBhbnkpLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMpIHtcbiAgICAgICAgICAgIChidWNrZXQ6IGFueSkuc3RhdGVEZXBlbmRlbnRMYXllcnMgPSAoYnVja2V0OiBhbnkpLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMubWFwKChsSWQpID0+IGxheWVycy5maWx0ZXIoKGwpID0+IGwuaWQgPT09IGxJZClbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgICAgICBvdXRwdXRbbGF5ZXIuaWRdID0gYnVja2V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiIsIi8vIEBmbG93IHN0cmljdFxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNsYXNzIERpY3Rpb25hcnlDb2RlciB7XG4gICAgX3N0cmluZ1RvTnVtYmVyOiB7W186IHN0cmluZ106IG51bWJlciB9O1xuICAgIF9udW1iZXJUb1N0cmluZzogQXJyYXk8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKHN0cmluZ3M6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5fc3RyaW5nVG9OdW1iZXIgPSB7fTtcbiAgICAgICAgdGhpcy5fbnVtYmVyVG9TdHJpbmcgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmcgPSBzdHJpbmdzW2ldO1xuICAgICAgICAgICAgdGhpcy5fc3RyaW5nVG9OdW1iZXJbc3RyaW5nXSA9IGk7XG4gICAgICAgICAgICB0aGlzLl9udW1iZXJUb1N0cmluZ1tpXSA9IHN0cmluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuY29kZShzdHJpbmc6IHN0cmluZykge1xuICAgICAgICBhc3NlcnQoc3RyaW5nIGluIHRoaXMuX3N0cmluZ1RvTnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ1RvTnVtYmVyW3N0cmluZ107XG4gICAgfVxuXG4gICAgZGVjb2RlKG46IG51bWJlcikge1xuICAgICAgICBhc3NlcnQobiA8IHRoaXMuX251bWJlclRvU3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJUb1N0cmluZ1tuXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpY3Rpb25hcnlDb2RlcjtcbiIsIi8vIEBmbG93XHJcbmltcG9ydCB0eXBlIHtHZW9KU09OR2VvbWV0cnl9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XHJcblxyXG5jbGFzcyBGZWF0dXJlIHtcclxuICAgIHR5cGU6ICdGZWF0dXJlJztcclxuICAgIF9nZW9tZXRyeTogP0dlb0pTT05HZW9tZXRyeTtcclxuICAgIHByb3BlcnRpZXM6IHt9O1xyXG4gICAgaWQ6IG51bWJlciB8IHN0cmluZyB8IHZvaWQ7XHJcblxyXG4gICAgX3ZlY3RvclRpbGVGZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2ZWN0b3JUaWxlRmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGlkOiBzdHJpbmcgfCBudW1iZXIgfCB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gJ0ZlYXR1cmUnO1xyXG5cclxuICAgICAgICB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZSA9IHZlY3RvclRpbGVGZWF0dXJlO1xyXG4gICAgICAgICh2ZWN0b3JUaWxlRmVhdHVyZTogYW55KS5feiA9IHo7XHJcbiAgICAgICAgKHZlY3RvclRpbGVGZWF0dXJlOiBhbnkpLl94ID0geDtcclxuICAgICAgICAodmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3kgPSB5O1xyXG5cclxuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB2ZWN0b3JUaWxlRmVhdHVyZS5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2VvbWV0cnkoKTogP0dlb0pTT05HZW9tZXRyeSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dlb21ldHJ5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZ2VvbWV0cnkgPSB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS50b0dlb0pTT04oXHJcbiAgICAgICAgICAgICAgICAodGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3gsXHJcbiAgICAgICAgICAgICAgICAodGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3ksXHJcbiAgICAgICAgICAgICAgICAodGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3osIEZlYXR1cmUudG9MbmdMYXQpLmdlb21ldHJ5O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2VvbWV0cnk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGdlb21ldHJ5KGc6ID9HZW9KU09OR2VvbWV0cnkpIHtcclxuICAgICAgICB0aGlzLl9nZW9tZXRyeSA9IGc7XHJcbiAgICB9XHJcblxyXG4gICAgdG9KU09OKCkge1xyXG4gICAgICAgIGNvbnN0IGpzb24gPSB7XHJcbiAgICAgICAgICAgIGdlb21ldHJ5OiB0aGlzLmdlb21ldHJ5XHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcykge1xyXG4gICAgICAgICAgICBpZiAoaSA9PT0gJ19nZW9tZXRyeScgfHwgaSA9PT0gJ192ZWN0b3JUaWxlRmVhdHVyZScpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBqc29uW2ldID0gKHRoaXM6IGFueSlbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqc29uO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlO1xyXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24nO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdGVzID0ge1tmZWF0dXJlX2lkOiBzdHJpbmddOiBGZWF0dXJlU3RhdGV9O1xuZXhwb3J0IHR5cGUgTGF5ZXJGZWF0dXJlU3RhdGVzID0ge1tsYXllcjogc3RyaW5nXTogRmVhdHVyZVN0YXRlc307XG5cbi8qKlxuICogU291cmNlRmVhdHVyZVN0YXRlIG1hbmFnZXMgdGhlIHN0YXRlIGFuZCBwZW5kaW5nIGNoYW5nZXNcbiAqIHRvIGZlYXR1cmVzIGluIGEgc291cmNlLCBzZXBhcmF0ZWQgYnkgc291cmNlIGxheWVyLlxuICogc3RhdGVDaGFuZ2VzIGFuZCBkZWxldGVkU3RhdGVzIGJhdGNoIGFsbCBjaGFuZ2VzIHRvIHRoZSB0aWxlICh1cGRhdGVzIGFuZCByZW1vdmVzLCByZXNwZWN0aXZlbHkpXG4gKiBiZXR3ZWVuIGNvYWxlc2NlKCkgZXZlbnRzLiBhZGRGZWF0dXJlU3RhdGUoKSBhbmQgcmVtb3ZlRmVhdHVyZVN0YXRlKCkgYWxzbyB1cGRhdGUgdGhlaXIgY291bnRlcnBhcnQnc1xuICogbGlzdCBvZiBjaGFuZ2VzLCBzdWNoIHRoYXQgY29hbGVzY2UoKSBjYW4gYXBwbHkgdGhlIHByb3BlciBzdGF0ZSBjaGFuZ2VzIHdoaWxlIGFnbm9zdGljIHRvIHRoZSBvcmRlciBvZiBvcGVyYXRpb25zLlxuICogSW4gZGVsZXRlZFN0YXRlcywgYWxsIG51bGwncyBkZW5vdGUgY29tcGxldGUgcmVtb3ZhbCBvZiBzdGF0ZSBhdCB0aGF0IHNjb3BlXG4gKiBAcHJpdmF0ZVxuKi9cbmNsYXNzIFNvdXJjZUZlYXR1cmVTdGF0ZSB7XG4gICAgc3RhdGU6IExheWVyRmVhdHVyZVN0YXRlcztcbiAgICBzdGF0ZUNoYW5nZXM6IExheWVyRmVhdHVyZVN0YXRlcztcbiAgICBkZWxldGVkU3RhdGVzOiB7fTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge307XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzID0ge307XG4gICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlcyA9IHt9O1xuICAgIH1cblxuICAgIHVwZGF0ZVN0YXRlKHNvdXJjZUxheWVyOiBzdHJpbmcsIGZlYXR1cmVJZDogbnVtYmVyIHwgc3RyaW5nLCBuZXdTdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBTdHJpbmcoZmVhdHVyZUlkKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdID0gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gfHwge307XG4gICAgICAgIGV4dGVuZCh0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0sIG5ld1N0YXRlKTtcblxuICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmdCBpbiB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgIGlmIChmdCAhPT0gZmVhdHVyZSkgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmdF0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZURlbGV0aW9uUXVldWVkID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSAmJiB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID09PSBudWxsO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVEZWxldGlvblF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdTdGF0ZVtwcm9wXSkgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtwcm9wXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGlvbkluUXVldWUgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdICYmIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gJiYgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldID09PSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRpb25JblF1ZXVlKSBkZWxldGUgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUZlYXR1cmVTdGF0ZShzb3VyY2VMYXllcjogc3RyaW5nLCBmZWF0dXJlSWQ/OiBudW1iZXIgfCBzdHJpbmcsIGtleT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllckRlbGV0ZWQgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID09PSBudWxsO1xuICAgICAgICBpZiAoc291cmNlTGF5ZXJEZWxldGVkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IFN0cmluZyhmZWF0dXJlSWQpO1xuXG4gICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdIHx8IHt9O1xuXG4gICAgICAgIGlmIChrZXkgJiYgZmVhdHVyZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gfHwge307XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlSW5RdWV1ZSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSAmJiB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICBpZiAodXBkYXRlSW5RdWV1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0pIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgZ2V0U3RhdGUoc291cmNlTGF5ZXI6IHN0cmluZywgZmVhdHVyZUlkOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IFN0cmluZyhmZWF0dXJlSWQpO1xuICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl0gfHwge307XG5cbiAgICAgICAgY29uc3QgcmVjb25jaWxlZFN0YXRlID0gZXh0ZW5kKHt9LCBiYXNlW2ZlYXR1cmVdLCBjaGFuZ2VzW2ZlYXR1cmVdKTtcblxuICAgICAgICAvL3JldHVybiBlbXB0eSBvYmplY3QgaWYgdGhlIHdob2xlIHNvdXJjZSBsYXllciBpcyBhd2FpdGluZyBkZWxldGlvblxuICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgICAgICBlbHNlIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdKSB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlRGVsZXRpb25zID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlSWRdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVEZWxldGlvbnMgPT09IG51bGwpIHJldHVybiB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBmZWF0dXJlRGVsZXRpb25zKSBkZWxldGUgcmVjb25jaWxlZFN0YXRlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVkU3RhdGU7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVRpbGVTdGF0ZSh0aWxlOiBUaWxlLCBwYWludGVyOiBhbnkpIHtcbiAgICAgICAgdGlsZS5zZXRGZWF0dXJlU3RhdGUodGhpcy5zdGF0ZSwgcGFpbnRlcik7XG4gICAgfVxuXG4gICAgY29hbGVzY2VDaGFuZ2VzKHRpbGVzOiB7W186IGFueV06IFRpbGV9LCBwYWludGVyOiBhbnkpIHtcbiAgICAgICAgLy90cmFjayBjaGFuZ2VzIHdpdGggZnVsbCBzdGF0ZSBvYmplY3RzLCBidXQgb25seSBmb3IgZmVhdHVyZXMgdGhhdCBnb3QgbW9kaWZpZWRcbiAgICAgICAgY29uc3QgZmVhdHVyZXNDaGFuZ2VkOiBMYXllckZlYXR1cmVTdGF0ZXMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVyIGluIHRoaXMuc3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSAgPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3RhdGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXSkgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBleHRlbmQodGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0sIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSk7XG4gICAgICAgICAgICAgICAgbGF5ZXJTdGF0ZXNbZmVhdHVyZV0gPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVzQ2hhbmdlZFtzb3VyY2VMYXllcl0gPSBsYXllclN0YXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlTGF5ZXIgaW4gdGhpcy5kZWxldGVkU3RhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSAgPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3RhdGVzID0ge307XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmdCBpbiB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgICAgICBsYXllclN0YXRlc1tmdF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZnRdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVXaG9sZUZlYXR1cmVTdGF0ZSA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPT09IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVXaG9sZUZlYXR1cmVTdGF0ZSkgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxheWVyU3RhdGVzW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdID0gZmVhdHVyZXNDaGFuZ2VkW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGV4dGVuZChmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdLCBsYXllclN0YXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcyA9IHt9O1xuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXMgPSB7fTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmVhdHVyZXNDaGFuZ2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbaWRdO1xuICAgICAgICAgICAgdGlsZS5zZXRGZWF0dXJlU3RhdGUoZmVhdHVyZXNDaGFuZ2VkLCBwYWludGVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU291cmNlRmVhdHVyZVN0YXRlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4vbG9hZF9nZW9tZXRyeSc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4vZXh0ZW50JztcbmltcG9ydCBmZWF0dXJlRmlsdGVyIGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXInO1xuaW1wb3J0IEdyaWQgZnJvbSAnZ3JpZC1pbmRleCc7XG5pbXBvcnQgRGljdGlvbmFyeUNvZGVyIGZyb20gJy4uL3V0aWwvZGljdGlvbmFyeV9jb2Rlcic7XG5pbXBvcnQgdnQgZnJvbSAnLi4vXy9AbWFwYm94L3ZlY3Rvci10aWxlJztcbmltcG9ydCBQcm90b2J1ZiBmcm9tICdwYmYnO1xuaW1wb3J0IEdlb0pTT05GZWF0dXJlIGZyb20gJy4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uJztcbmltcG9ydCB7YXJyYXlzSW50ZXJzZWN0LCBtYXBPYmplY3R9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCBTb3VyY2VGZWF0dXJlU3RhdGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzQm94fSBmcm9tICcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5pbXBvcnQge1Bvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZUZpbHRlcn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlcic7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyU3BlY2lmaWNhdGlvbiwgUHJvbW90ZUlkU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmltcG9ydCB7RmVhdHVyZUluZGV4QXJyYXl9IGZyb20gJy4vYXJyYXlfdHlwZXMnO1xuXG50eXBlIFF1ZXJ5UGFyYW1ldGVycyA9IHtcbiAgICBzY2FsZTogbnVtYmVyLFxuICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgdGlsZVNpemU6IG51bWJlcixcbiAgICBxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgY2FtZXJhUXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgIHF1ZXJ5UGFkZGluZzogbnVtYmVyLFxuICAgIHBhcmFtczoge1xuICAgICAgICBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgICAgIGxheWVyczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+XG4gICAgfVxufVxuXG5jbGFzcyBGZWF0dXJlSW5kZXgge1xuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRDtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHo6IG51bWJlcjtcbiAgICBncmlkOiBHcmlkO1xuICAgIGdyaWQzRDogR3JpZDtcbiAgICBmZWF0dXJlSW5kZXhBcnJheTogRmVhdHVyZUluZGV4QXJyYXk7XG4gICAgcHJvbW90ZUlkOiA/UHJvbW90ZUlkU3BlY2lmaWNhdGlvbjtcblxuICAgIHJhd1RpbGVEYXRhOiBBcnJheUJ1ZmZlcjtcbiAgICBidWNrZXRMYXllcklEczogQXJyYXk8QXJyYXk8c3RyaW5nPj47XG5cbiAgICB2dExheWVyczoge1tfOiBzdHJpbmddOiBWZWN0b3JUaWxlTGF5ZXJ9O1xuICAgIHNvdXJjZUxheWVyQ29kZXI6IERpY3Rpb25hcnlDb2RlcjtcblxuICAgIGNvbnN0cnVjdG9yKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgcHJvbW90ZUlkPzogP1Byb21vdGVJZFNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy50aWxlSUQgPSB0aWxlSUQ7XG4gICAgICAgIHRoaXMueCA9IHRpbGVJRC5jYW5vbmljYWwueDtcbiAgICAgICAgdGhpcy55ID0gdGlsZUlELmNhbm9uaWNhbC55O1xuICAgICAgICB0aGlzLnogPSB0aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIHRoaXMuZ3JpZCA9IG5ldyBHcmlkKEVYVEVOVCwgMTYsIDApO1xuICAgICAgICB0aGlzLmdyaWQzRCA9IG5ldyBHcmlkKEVYVEVOVCwgMTYsIDApO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleEFycmF5ID0gbmV3IEZlYXR1cmVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMucHJvbW90ZUlkID0gcHJvbW90ZUlkO1xuICAgIH1cblxuICAgIGluc2VydChmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGZlYXR1cmVJbmRleDogbnVtYmVyLCBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsIGJ1Y2tldEluZGV4OiBudW1iZXIsIGlzM0Q/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZmVhdHVyZUluZGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleEFycmF5LmVtcGxhY2VCYWNrKGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgpO1xuXG4gICAgICAgIGNvbnN0IGdyaWQgPSBpczNEID8gdGhpcy5ncmlkM0QgOiB0aGlzLmdyaWQ7XG5cbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBnZW9tZXRyeS5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgY29uc3QgcmluZyA9IGdlb21ldHJ5W3JdO1xuXG4gICAgICAgICAgICBjb25zdCBiYm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHJpbmdbaV07XG4gICAgICAgICAgICAgICAgYmJveFswXSA9IE1hdGgubWluKGJib3hbMF0sIHAueCk7XG4gICAgICAgICAgICAgICAgYmJveFsxXSA9IE1hdGgubWluKGJib3hbMV0sIHAueSk7XG4gICAgICAgICAgICAgICAgYmJveFsyXSA9IE1hdGgubWF4KGJib3hbMl0sIHAueCk7XG4gICAgICAgICAgICAgICAgYmJveFszXSA9IE1hdGgubWF4KGJib3hbM10sIHAueSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChiYm94WzBdIDwgRVhURU5UICYmXG4gICAgICAgICAgICAgICAgYmJveFsxXSA8IEVYVEVOVCAmJlxuICAgICAgICAgICAgICAgIGJib3hbMl0gPj0gMCAmJlxuICAgICAgICAgICAgICAgIGJib3hbM10gPj0gMCkge1xuICAgICAgICAgICAgICAgIGdyaWQuaW5zZXJ0KGtleSwgYmJveFswXSwgYmJveFsxXSwgYmJveFsyXSwgYmJveFszXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkVlRMYXllcnMoKToge1tfOiBzdHJpbmddOiBWZWN0b3JUaWxlTGF5ZXJ9IHtcbiAgICAgICAgaWYgKCF0aGlzLnZ0TGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnZ0TGF5ZXJzID0gbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKHRoaXMucmF3VGlsZURhdGEpKS5sYXllcnM7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxheWVyQ29kZXIgPSBuZXcgRGljdGlvbmFyeUNvZGVyKHRoaXMudnRMYXllcnMgPyBPYmplY3Qua2V5cyh0aGlzLnZ0TGF5ZXJzKS5zb3J0KCkgOiBbJ19nZW9qc29uVGlsZUxheWVyJ10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZ0TGF5ZXJzO1xuICAgIH1cblxuICAgIC8vIEZpbmRzIG5vbi1zeW1ib2wgZmVhdHVyZXMgaW4gdGhpcyB0aWxlIGF0IGEgcGFydGljdWxhciBwb3NpdGlvbi5cbiAgICBxdWVyeShhcmdzOiBRdWVyeVBhcmFtZXRlcnMsIHN0eWxlTGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9LCBzZXJpYWxpemVkTGF5ZXJzOiB7W186IHN0cmluZ106IE9iamVjdH0sIHNvdXJjZUZlYXR1cmVTdGF0ZTogU291cmNlRmVhdHVyZVN0YXRlKToge1tfOiBzdHJpbmddOiBBcnJheTx7IGZlYXR1cmVJbmRleDogbnVtYmVyLCBmZWF0dXJlOiBHZW9KU09ORmVhdHVyZSB9Pn0ge1xuICAgICAgICB0aGlzLmxvYWRWVExheWVycygpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3MucGFyYW1zIHx8IHt9LFxuICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHMgPSBFWFRFTlQgLyBhcmdzLnRpbGVTaXplIC8gYXJncy5zY2FsZSxcbiAgICAgICAgICAgIGZpbHRlciA9IGZlYXR1cmVGaWx0ZXIocGFyYW1zLmZpbHRlcik7XG5cbiAgICAgICAgY29uc3QgcXVlcnlHZW9tZXRyeSA9IGFyZ3MucXVlcnlHZW9tZXRyeTtcbiAgICAgICAgY29uc3QgcXVlcnlQYWRkaW5nID0gYXJncy5xdWVyeVBhZGRpbmcgKiBwaXhlbHNUb1RpbGVVbml0cztcblxuICAgICAgICBjb25zdCBib3VuZHMgPSBnZXRCb3VuZHMocXVlcnlHZW9tZXRyeSk7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nID0gdGhpcy5ncmlkLnF1ZXJ5KGJvdW5kcy5taW5YIC0gcXVlcnlQYWRkaW5nLCBib3VuZHMubWluWSAtIHF1ZXJ5UGFkZGluZywgYm91bmRzLm1heFggKyBxdWVyeVBhZGRpbmcsIGJvdW5kcy5tYXhZICsgcXVlcnlQYWRkaW5nKTtcblxuICAgICAgICBjb25zdCBjYW1lcmFCb3VuZHMgPSBnZXRCb3VuZHMoYXJncy5jYW1lcmFRdWVyeUdlb21ldHJ5KTtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmczRCA9IHRoaXMuZ3JpZDNELnF1ZXJ5KFxuICAgICAgICAgICAgICAgIGNhbWVyYUJvdW5kcy5taW5YIC0gcXVlcnlQYWRkaW5nLCBjYW1lcmFCb3VuZHMubWluWSAtIHF1ZXJ5UGFkZGluZywgY2FtZXJhQm91bmRzLm1heFggKyBxdWVyeVBhZGRpbmcsIGNhbWVyYUJvdW5kcy5tYXhZICsgcXVlcnlQYWRkaW5nLFxuICAgICAgICAgICAgICAgIChieDEsIGJ5MSwgYngyLCBieTIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RzQm94KGFyZ3MuY2FtZXJhUXVlcnlHZW9tZXRyeSwgYngxIC0gcXVlcnlQYWRkaW5nLCBieTEgLSBxdWVyeVBhZGRpbmcsIGJ4MiArIHF1ZXJ5UGFkZGluZywgYnkyICsgcXVlcnlQYWRkaW5nKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBtYXRjaGluZzNEKSB7XG4gICAgICAgICAgICBtYXRjaGluZy5wdXNoKGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaGluZy5zb3J0KHRvcERvd25GZWF0dXJlQ29tcGFyYXRvcik7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGxldCBwcmV2aW91c0luZGV4O1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1hdGNoaW5nLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IG1hdGNoaW5nW2tdO1xuXG4gICAgICAgICAgICAvLyBkb24ndCBjaGVjayB0aGUgc2FtZSBmZWF0dXJlIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHByZXZpb3VzSW5kZXgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcHJldmlvdXNJbmRleCA9IGluZGV4O1xuXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZmVhdHVyZUluZGV4QXJyYXkuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlR2VvbWV0cnkgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBtYXRjaC5idWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBtYXRjaC5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIG1hdGNoLmZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgcGFyYW1zLmxheWVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXMuYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnMsXG4gICAgICAgICAgICAgICAgc291cmNlRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgIChmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgc3R5bGVMYXllcjogU3R5bGVMYXllciwgZmVhdHVyZVN0YXRlOiBPYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmZWF0dXJlR2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVHZW9tZXRyeSA9IGxvYWRHZW9tZXRyeShmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZUxheWVyLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBmZWF0dXJlR2VvbWV0cnksIHRoaXMueiwgYXJncy50cmFuc2Zvcm0sIHBpeGVsc1RvVGlsZVVuaXRzLCBhcmdzLnBpeGVsUG9zTWF0cml4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICByZXN1bHQ6IHtbXzogc3RyaW5nXTogQXJyYXk8eyBmZWF0dXJlSW5kZXg6IG51bWJlciwgZmVhdHVyZTogR2VvSlNPTkZlYXR1cmUgfT59LFxuICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICBmaWx0ZXI6IEZlYXR1cmVGaWx0ZXIsXG4gICAgICAgIGZpbHRlckxheWVySURzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgIHN0eWxlTGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9LFxuICAgICAgICBzZXJpYWxpemVkTGF5ZXJzOiB7W186IHN0cmluZ106IE9iamVjdH0sXG4gICAgICAgIHNvdXJjZUZlYXR1cmVTdGF0ZT86IFNvdXJjZUZlYXR1cmVTdGF0ZSxcbiAgICAgICAgaW50ZXJzZWN0aW9uVGVzdD86IChmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgc3R5bGVMYXllcjogU3R5bGVMYXllciwgZmVhdHVyZVN0YXRlOiBPYmplY3QsIGlkOiBzdHJpbmcgfCBudW1iZXIgfCB2b2lkKSA9PiBib29sZWFuIHwgbnVtYmVyKSB7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJJRHMgPSB0aGlzLmJ1Y2tldExheWVySURzW2J1Y2tldEluZGV4XTtcbiAgICAgICAgaWYgKGZpbHRlckxheWVySURzICYmICFhcnJheXNJbnRlcnNlY3QoZmlsdGVyTGF5ZXJJRHMsIGxheWVySURzKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBzb3VyY2VMYXllck5hbWUgPSB0aGlzLnNvdXJjZUxheWVyQ29kZXIuZGVjb2RlKHNvdXJjZUxheWVySW5kZXgpO1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IHRoaXMudnRMYXllcnNbc291cmNlTGF5ZXJOYW1lXTtcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IHNvdXJjZUxheWVyLmZlYXR1cmUoZmVhdHVyZUluZGV4KTtcblxuICAgICAgICBpZiAoIWZpbHRlci5maWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgZmVhdHVyZSkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldElkKGZlYXR1cmUsIHNvdXJjZUxheWVyTmFtZSk7XG5cbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsYXllcklEcy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJRCA9IGxheWVySURzW2xdO1xuXG4gICAgICAgICAgICBpZiAoZmlsdGVyTGF5ZXJJRHMgJiYgZmlsdGVyTGF5ZXJJRHMuaW5kZXhPZihsYXllcklEKSA8IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHN0eWxlTGF5ZXJzW2xheWVySURdO1xuXG4gICAgICAgICAgICBpZiAoIXN0eWxlTGF5ZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZmVhdHVyZVN0YXRlID0ge307XG4gICAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2VGZWF0dXJlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBgZmVhdHVyZS1zdGF0ZWAgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHJlcXVpcmVzIGZlYXR1cmUgc3RhdGUgdG8gYmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlID0gc291cmNlRmVhdHVyZVN0YXRlLmdldFN0YXRlKHN0eWxlTGF5ZXIuc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJywgaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkTGF5ZXIgPSBzZXJpYWxpemVkTGF5ZXJzW2xheWVySURdO1xuXG4gICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXIucGFpbnQgPSBldmFsdWF0ZVByb3BlcnRpZXMoc2VyaWFsaXplZExheWVyLnBhaW50LCBzdHlsZUxheWVyLnBhaW50LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXIubGF5b3V0ID0gZXZhbHVhdGVQcm9wZXJ0aWVzKHNlcmlhbGl6ZWRMYXllci5sYXlvdXQsIHN0eWxlTGF5ZXIubGF5b3V0LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvblogPSAhaW50ZXJzZWN0aW9uVGVzdCB8fCBpbnRlcnNlY3Rpb25UZXN0KGZlYXR1cmUsIHN0eWxlTGF5ZXIsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgICAgICBpZiAoIWludGVyc2VjdGlvblopIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFwcGxpZWQgZm9yIG5vbi1zeW1ib2wgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZ2VvanNvbkZlYXR1cmUgPSBuZXcgR2VvSlNPTkZlYXR1cmUoZmVhdHVyZSwgdGhpcy56LCB0aGlzLngsIHRoaXMueSwgaWQpO1xuICAgICAgICAgICAgKGdlb2pzb25GZWF0dXJlOiBhbnkpLmxheWVyID0gc2VyaWFsaXplZExheWVyO1xuICAgICAgICAgICAgbGV0IGxheWVyUmVzdWx0ID0gcmVzdWx0W2xheWVySURdO1xuICAgICAgICAgICAgaWYgKGxheWVyUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsYXllclJlc3VsdCA9IHJlc3VsdFtsYXllcklEXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5ZXJSZXN1bHQucHVzaCh7ZmVhdHVyZUluZGV4LCBmZWF0dXJlOiBnZW9qc29uRmVhdHVyZSwgaW50ZXJzZWN0aW9uWn0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzZXQgb2Ygc3ltYm9sIGluZGV4ZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb29rZWQgdXAsXG4gICAgLy8gcmV0dXJuIGEgbWF0Y2hpbmcgc2V0IG9mIEdlb0pTT05GZWF0dXJlc1xuICAgIGxvb2t1cFN5bWJvbEZlYXR1cmVzKHN5bWJvbEZlYXR1cmVJbmRleGVzOiBBcnJheTxudW1iZXI+LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnM6IHtbc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyU3BlYzogRmlsdGVyU3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJMYXllcklEczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVMYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn0pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHRoaXMubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihmaWx0ZXJTcGVjKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEZlYXR1cmVJbmRleCBvZiBzeW1ib2xGZWF0dXJlSW5kZXhlcykge1xuICAgICAgICAgICAgdGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgZmlsdGVyTGF5ZXJJRHMsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGhhc0xheWVyKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEcyBvZiB0aGlzLmJ1Y2tldExheWVySURzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySUQgb2YgbGF5ZXJJRHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQgPT09IGxheWVySUQpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldElkKGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLCBzb3VyY2VMYXllcklkOiBzdHJpbmcpOiBzdHJpbmcgfCBudW1iZXIgfCB2b2lkIHtcbiAgICAgICAgbGV0IGlkID0gZmVhdHVyZS5pZDtcbiAgICAgICAgaWYgKHRoaXMucHJvbW90ZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVvZiB0aGlzLnByb21vdGVJZCA9PT0gJ3N0cmluZycgPyB0aGlzLnByb21vdGVJZCA6IHRoaXMucHJvbW90ZUlkW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWQgPSBmZWF0dXJlLnByb3BlcnRpZXNbcHJvcE5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ2Jvb2xlYW4nKSBpZCA9ICBOdW1iZXIoaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKFxuICAgICdGZWF0dXJlSW5kZXgnLFxuICAgIEZlYXR1cmVJbmRleCxcbiAgICB7b21pdDogWydyYXdUaWxlRGF0YScsICdzb3VyY2VMYXllckNvZGVyJ119XG4pO1xuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlSW5kZXg7XG5cbmZ1bmN0aW9uIGV2YWx1YXRlUHJvcGVydGllcyhzZXJpYWxpemVkUHJvcGVydGllcywgc3R5bGVMYXllclByb3BlcnRpZXMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgYXZhaWxhYmxlSW1hZ2VzKSB7XG4gICAgcmV0dXJuIG1hcE9iamVjdChzZXJpYWxpemVkUHJvcGVydGllcywgKHByb3BlcnR5LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcCA9IHN0eWxlTGF5ZXJQcm9wZXJ0aWVzIGluc3RhbmNlb2YgUG9zc2libHlFdmFsdWF0ZWQgPyBzdHlsZUxheWVyUHJvcGVydGllcy5nZXQoa2V5KSA6IG51bGw7XG4gICAgICAgIHJldHVybiBwcm9wICYmIHByb3AuZXZhbHVhdGUgPyBwcm9wLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgYXZhaWxhYmxlSW1hZ2VzKSA6IHByb3A7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEJvdW5kcyhnZW9tZXRyeTogQXJyYXk8UG9pbnQ+KSB7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgcCBvZiBnZW9tZXRyeSkge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHAueSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLngpO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcbiAgICB9XG4gICAgcmV0dXJuIHttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZfTtcbn1cblxuZnVuY3Rpb24gdG9wRG93bkZlYXR1cmVDb21wYXJhdG9yKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGE7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3VuaXF1ZUlkLCBwYXJzZUNhY2hlQ29udHJvbH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7ZGVzZXJpYWxpemUgYXMgZGVzZXJpYWxpemVCdWNrZXR9IGZyb20gJy4uL2RhdGEvYnVja2V0JztcbmltcG9ydCBGZWF0dXJlSW5kZXggZnJvbSAnLi4vZGF0YS9mZWF0dXJlX2luZGV4JztcbmltcG9ydCBHZW9KU09ORmVhdHVyZSBmcm9tICcuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbic7XG5pbXBvcnQgZmVhdHVyZUZpbHRlciBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyJztcbmltcG9ydCBTeW1ib2xCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQge0NvbGxpc2lvbkJveEFycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCBTb3VyY2VGZWF0dXJlU3RhdGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQge2xhenlMb2FkUlRMVGV4dFBsdWdpbn0gZnJvbSAnLi9ydGxfdGV4dF9wbHVnaW4nO1xuXG5jb25zdCBDTE9DS19TS0VXX1JFVFJZX1RJTUVPVVQgPSAzMDAwMDtcblxuaW1wb3J0IHR5cGUge0J1Y2tldH0gZnJvbSAnLi4vZGF0YS9idWNrZXQnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSB7V29ya2VyVGlsZVJlc3VsdH0gZnJvbSAnLi93b3JrZXJfc291cmNlJztcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhJztcbmltcG9ydCB0eXBlIHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcbmltcG9ydCB0eXBlIEltYWdlQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfbWFuYWdlcic7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBGcmFtZWJ1ZmZlciBmcm9tICcuLi9nbC9mcmFtZWJ1ZmZlcic7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJGZWF0dXJlU3RhdGVzfSBmcm9tICcuL3NvdXJjZV9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFRpbGVTdGF0ZSA9XG4gICAgfCAnbG9hZGluZycgICAvLyBUaWxlIGRhdGEgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGluZy5cbiAgICB8ICdsb2FkZWQnICAgIC8vIFRpbGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQuIFRpbGUgY2FuIGJlIHJlbmRlcmVkLlxuICAgIHwgJ3JlbG9hZGluZycgLy8gVGlsZSBkYXRhIGhhcyBiZWVuIGxvYWRlZCBhbmQgaXMgYmVpbmcgdXBkYXRlZC4gVGlsZSBjYW4gYmUgcmVuZGVyZWQuXG4gICAgfCAndW5sb2FkZWQnICAvLyBUaWxlIGRhdGEgaGFzIGJlZW4gZGVsZXRlZC5cbiAgICB8ICdlcnJvcmVkJyAgIC8vIFRpbGUgZGF0YSB3YXMgbm90IGxvYWRlZCBiZWNhdXNlIG9mIGFuIGVycm9yLlxuICAgIHwgJ2V4cGlyZWQnOyAgLyogVGlsZSBkYXRhIHdhcyBwcmV2aW91c2x5IGxvYWRlZCwgYnV0IGhhcyBleHBpcmVkIHBlciBpdHNcbiAgICAgICAgICAgICAgICAgICAqIEhUVFAgaGVhZGVycyBhbmQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgcmVmcmVzaGluZy4gKi9cblxuLyoqXG4gKiBBIHRpbGUgb2JqZWN0IGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhIENvb3JkaW5hdGUsIHdoaWNoIGRlZmluZXNcbiAqIGl0cyBwbGFjZSwgYXMgd2VsbCBhcyBhIHVuaXF1ZSBJRCBhbmQgZGF0YSB0cmFja2luZyBmb3IgaXRzIGNvbnRlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUaWxlIHtcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQ7XG4gICAgdWlkOiBudW1iZXI7XG4gICAgdXNlczogbnVtYmVyO1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG4gICAgYnVja2V0czoge1tfOiBzdHJpbmddOiBCdWNrZXR9O1xuICAgIGxhdGVzdEZlYXR1cmVJbmRleDogP0ZlYXR1cmVJbmRleDtcbiAgICBsYXRlc3RSYXdUaWxlRGF0YTogP0FycmF5QnVmZmVyO1xuICAgIGltYWdlQXRsYXM6ID9JbWFnZUF0bGFzO1xuICAgIGltYWdlQXRsYXNUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGdseXBoQXRsYXNJbWFnZTogP0FscGhhSW1hZ2U7XG4gICAgZ2x5cGhBdGxhc1RleHR1cmU6IFRleHR1cmU7XG4gICAgZXhwaXJhdGlvblRpbWU6IGFueTtcbiAgICBleHBpcmVkUmVxdWVzdENvdW50OiBudW1iZXI7XG4gICAgc3RhdGU6IFRpbGVTdGF0ZTtcbiAgICB0aW1lQWRkZWQ6IGFueTtcbiAgICBmYWRlRW5kVGltZTogYW55O1xuICAgIGNvbGxpc2lvbkJveEFycmF5OiA/Q29sbGlzaW9uQm94QXJyYXk7XG4gICAgcmVkb1doZW5Eb25lOiBib29sZWFuO1xuICAgIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbjtcbiAgICBwbGFjZW1lbnRTb3VyY2U6IGFueTtcbiAgICBhY3RvcjogP0FjdG9yO1xuICAgIHZ0TGF5ZXJzOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG5cbiAgICBuZWlnaGJvcmluZ1RpbGVzOiA/T2JqZWN0O1xuICAgIGRlbTogP0RFTURhdGE7XG4gICAgYWJvcnRlZDogP2Jvb2xlYW47XG4gICAgbmVlZHNIaWxsc2hhZGVQcmVwYXJlOiA/Ym9vbGVhbjtcbiAgICByZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcbiAgICB0ZXh0dXJlOiBhbnk7XG4gICAgZmJvOiA/RnJhbWVidWZmZXI7XG4gICAgZGVtVGV4dHVyZTogP1RleHR1cmU7XG4gICAgcmVmcmVzaGVkVXBvbkV4cGlyYXRpb246IGJvb2xlYW47XG4gICAgcmVsb2FkQ2FsbGJhY2s6IGFueTtcbiAgICByZXNvdXJjZVRpbWluZzogP0FycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+O1xuICAgIHF1ZXJ5UGFkZGluZzogbnVtYmVyO1xuXG4gICAgc3ltYm9sRmFkZUhvbGRVbnRpbDogP251bWJlcjtcbiAgICBoYXNTeW1ib2xCdWNrZXRzOiBib29sZWFuO1xuICAgIGhhc1JUTFRleHQ6IGJvb2xlYW47XG4gICAgZGVwZW5kZW5jaWVzOiBPYmplY3Q7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRFxuICAgICAqIEBwYXJhbSBzaXplXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgdGhpcy51aWQgPSB1bmlxdWVJZCgpO1xuICAgICAgICB0aGlzLnVzZXMgPSAwO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5idWNrZXRzID0ge307XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBudWxsO1xuICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IDA7XG4gICAgICAgIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc1JUTFRleHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSB7fTtcblxuICAgICAgICAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHJlc3BvbnNlIHdhcyBhbHJlYWR5IGV4cGlyZWQgd2hlblxuICAgICAgICAvLyByZWNlaXZlZC4gV2UncmUgdXNpbmcgdGhpcyB0byBhZGQgYSBkZWxheSB3aGVuIG1ha2luZyBhIG5ldyByZXF1ZXN0XG4gICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCByZXRyeWluZyBpbW1lZGlhdGVseSBpbiBjYXNlIG9mIGEgc2VydmVyXG4gICAgICAgIC8vIHNlcnZpbmcgZXhwaXJlZCB0aWxlcy5cbiAgICAgICAgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRpbmcnO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRmFkZUR1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmFkZUVuZFRpbWUgPSBkdXJhdGlvbiArIHRoaXMudGltZUFkZGVkO1xuICAgICAgICBpZiAoZmFkZUVuZFRpbWUgPCBicm93c2VyLm5vdygpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmZhZGVFbmRUaW1lICYmIGZhZGVFbmRUaW1lIDwgdGhpcy5mYWRlRW5kVGltZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZmFkZUVuZFRpbWUgPSBmYWRlRW5kVGltZTtcbiAgICB9XG5cbiAgICB3YXNSZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnZXJyb3JlZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ2xvYWRlZCcgfHwgdGhpcy5zdGF0ZSA9PT0gJ3JlbG9hZGluZyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBkYXRhIG9iamVjdCB3aXRoIGEgJ2J1ZmZlcnMnIHByb3BlcnR5LCBsb2FkIGl0IGludG9cbiAgICAgKiB0aGlzIHRpbGUncyBlbGVtZW50R3JvdXBzIGFuZCBidWZmZXJzIHByb3BlcnRpZXMgYW5kIHNldCBsb2FkZWRcbiAgICAgKiB0byB0cnVlLiBJZiB0aGUgZGF0YSBpcyBudWxsLCBsaWtlIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5XG4gICAgICogR2VvSlNPTiB0aWxlLCBuby1vcCBidXQgc3RpbGwgc2V0IGxvYWRlZCB0byB0cnVlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICogQHBhcmFtIHBhaW50ZXJcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZFZlY3RvckRhdGEoZGF0YTogV29ya2VyVGlsZVJlc3VsdCwgcGFpbnRlcjogYW55LCBqdXN0UmVsb2FkZWQ6ID9ib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgdGhpcy51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRlZCc7XG5cbiAgICAgICAgLy8gZW1wdHkgR2VvSlNPTiB0aWxlXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG5ldyBDb2xsaXNpb25Cb3hBcnJheSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEuZmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCA9IGRhdGEuZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgaWYgKGRhdGEucmF3VGlsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHZlY3RvciB0aWxlcyBoYXZlIHJhd1RpbGVEYXRhLCBhbmQgdGhleSB3b24ndCB1cGRhdGUgaXQgZm9yXG4gICAgICAgICAgICAgICAgLy8gJ3JlbG9hZFRpbGUnXG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RSYXdUaWxlRGF0YSA9IGRhdGEucmF3VGlsZURhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgPSBkYXRhLnJhd1RpbGVEYXRhO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhdGVzdFJhd1RpbGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgcmF3VGlsZURhdGEgaGFzbid0IHVwZGF0ZWQsIGhvbGQgb250byBhIHBvaW50ZXIgdG8gdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAvLyBvbmUgd2UgcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSA9IHRoaXMubGF0ZXN0UmF3VGlsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IGRhdGEuY29sbGlzaW9uQm94QXJyYXk7XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IGRlc2VyaWFsaXplQnVja2V0KGRhdGEuYnVja2V0cywgcGFpbnRlci5zdHlsZSk7XG5cbiAgICAgICAgdGhpcy5oYXNTeW1ib2xCdWNrZXRzID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGp1c3RSZWxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuanVzdFJlbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhc1JUTFRleHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ltYm9sQnVja2V0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChidWNrZXQgaW5zdGFuY2VvZiBTeW1ib2xCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5oYXNSVExUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1JUTFRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUxvYWRSVExUZXh0UGx1Z2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVlcnlQYWRkaW5nID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IE1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLCBwYWludGVyLnN0eWxlLmdldExheWVyKGlkKS5xdWVyeVJhZGl1cyhidWNrZXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcyA9IGRhdGEuaW1hZ2VBdGxhcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5nbHlwaEF0bGFzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc0ltYWdlID0gZGF0YS5nbHlwaEF0bGFzSW1hZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIGFueSBkYXRhIG9yIFdlYkdMIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgdGlsZS5cbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdW5sb2FkVmVjdG9yRGF0YSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVja2V0c1tpZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmltYWdlQXRsYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXNUZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nbHlwaEF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgIH1cblxuICAgIGdldEJ1Y2tldChsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICByZXR1cm4gdGhpcy5idWNrZXRzW2xheWVyLmlkXTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5idWNrZXRzW2lkXTtcbiAgICAgICAgICAgIGlmIChidWNrZXQudXBsb2FkUGVuZGluZygpKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0LnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VBdGxhcyAmJiAhdGhpcy5pbWFnZUF0bGFzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5pbWFnZUF0bGFzLmltYWdlLCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcy51cGxvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nbHlwaEF0bGFzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmdseXBoQXRsYXNJbWFnZSwgZ2wuQUxQSEEpO1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzSW1hZ2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlcGFyZShpbWFnZU1hbmFnZXI6IEltYWdlTWFuYWdlcikge1xuICAgICAgICBpZiAodGhpcy5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXMucGF0Y2hVcGRhdGVkSW1hZ2VzKGltYWdlTWFuYWdlciwgdGhpcy5pbWFnZUF0bGFzVGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBRdWVyaWVzIG5vbi1zeW1ib2wgZmVhdHVyZXMgcmVuZGVyZWQgZm9yIHRoaXMgdGlsZS5cbiAgICAvLyBTeW1ib2wgZmVhdHVyZXMgYXJlIHF1ZXJpZWQgZ2xvYmFsbHlcbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMobGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzOiB7W3N0cmluZ106IE9iamVjdH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZlYXR1cmVTdGF0ZTogU291cmNlRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbiwgbGF5ZXJzOiBBcnJheTxzdHJpbmc+LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBpdGNoU2NhbGVGYWN0b3I6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSk6IHtbXzogc3RyaW5nXTogQXJyYXk8eyBmZWF0dXJlSW5kZXg6IG51bWJlciwgZmVhdHVyZTogR2VvSlNPTkZlYXR1cmUgfT59IHtcbiAgICAgICAgaWYgKCF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCB8fCAhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEpXG4gICAgICAgICAgICByZXR1cm4ge307XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnF1ZXJ5KHtcbiAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICBjYW1lcmFRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICB0aWxlU2l6ZTogdGhpcy50aWxlU2l6ZSxcbiAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4LFxuICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgcXVlcnlQYWRkaW5nOiB0aGlzLnF1ZXJ5UGFkZGluZyAqIG1heFBpdGNoU2NhbGVGYWN0b3JcbiAgICAgICAgfSwgbGF5ZXJzLCBzZXJpYWxpemVkTGF5ZXJzLCBzb3VyY2VGZWF0dXJlU3RhdGUpO1xuICAgIH1cblxuICAgIHF1ZXJ5U291cmNlRmVhdHVyZXMocmVzdWx0OiBBcnJheTxHZW9KU09ORmVhdHVyZT4sIHBhcmFtczogYW55KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4O1xuICAgICAgICBpZiAoIWZlYXR1cmVJbmRleCB8fCAhZmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdnRMYXllcnMgPSBmZWF0dXJlSW5kZXgubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBwYXJhbXMgPyBwYXJhbXMuc291cmNlTGF5ZXIgOiAnJztcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB2dExheWVycy5fZ2VvanNvblRpbGVMYXllciB8fCB2dExheWVyc1tzb3VyY2VMYXllcl07XG5cbiAgICAgICAgaWYgKCFsYXllcikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGZlYXR1cmVGaWx0ZXIocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICBjb25zdCB7eiwgeCwgeX0gPSB0aGlzLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGNvb3JkID0ge3osIHgsIHl9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBsYXllci5mZWF0dXJlKGkpO1xuICAgICAgICAgICAgaWYgKGZpbHRlci5maWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGZlYXR1cmVJbmRleC5nZXRJZChmZWF0dXJlLCBzb3VyY2VMYXllcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VvanNvbkZlYXR1cmUgPSBuZXcgR2VvSlNPTkZlYXR1cmUoZmVhdHVyZSwgeiwgeCwgeSwgaWQpO1xuICAgICAgICAgICAgICAgIChnZW9qc29uRmVhdHVyZTogYW55KS50aWxlID0gY29vcmQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VvanNvbkZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdsb2FkZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdyZWxvYWRpbmcnIHx8IHRoaXMuc3RhdGUgPT09ICdleHBpcmVkJztcbiAgICB9XG5cbiAgICBwYXR0ZXJuc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VBdGxhcyAmJiAhIU9iamVjdC5rZXlzKHRoaXMuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgc2V0RXhwaXJ5RGF0YShkYXRhOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcHJpb3IgPSB0aGlzLmV4cGlyYXRpb25UaW1lO1xuXG4gICAgICAgIGlmIChkYXRhLmNhY2hlQ29udHJvbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQ0MgPSBwYXJzZUNhY2hlQ29udHJvbChkYXRhLmNhY2hlQ29udHJvbCk7XG4gICAgICAgICAgICBpZiAocGFyc2VkQ0NbJ21heC1hZ2UnXSkgdGhpcy5leHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyBwYXJzZWRDQ1snbWF4LWFnZSddICogMTAwMDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV4cGlyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBuZXcgRGF0ZShkYXRhLmV4cGlyZXMpLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgbGV0IGlzRXhwaXJlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSA+IG5vdykge1xuICAgICAgICAgICAgICAgIGlzRXhwaXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghcHJpb3IpIHtcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lIDwgcHJpb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHBpcmluZyBkYXRlIGlzIGdvaW5nIGJhY2t3YXJkczpcbiAgICAgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgICAgICAgIGlzRXhwaXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLmV4cGlyYXRpb25UaW1lIC0gcHJpb3I7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWRlbHRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBpcyBzZXJ2aW5nIHRoZSBzYW1lIGV4cGlyZWQgcmVzb3VyY2Ugb3ZlciBhbmQgb3ZlcjogZmFsbFxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwaXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBlaXRoZXIgdGhlIGNsaWVudCBvciB0aGUgc2VydmVyIGNsb2NrIGlzIHdyb25nIGFuZFxuICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gaW50ZXJwb2xhdGUgYSB2YWxpZCBleHBpcmF0aW9uIGRhdGUgKGZyb20gdGhlIGNsaWVudCBQT1YpXG4gICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmluZyBhIG1pbmltdW0gdGltZW91dC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5vdyArIE1hdGgubWF4KGRlbHRhLCBDTE9DS19TS0VXX1JFVFJZX1RJTUVPVVQpO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNFeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50Kys7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdleHBpcmVkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEV4cGlyeVRpbWVvdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leHBpcmVkUmVxdWVzdENvdW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAgKiAoMSA8PCBNYXRoLm1pbih0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgLSAxLCAzMSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYXggdmFsdWUgZm9yIGBzZXRUaW1lb3V0YCBpbXBsZW1lbnRhdGlvbnMgaXMgYSAzMiBiaXQgaW50ZWdlcjsgY2FwIHRoaXMgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5leHBpcmF0aW9uVGltZSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBNYXRoLnBvdygyLCAzMSkgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZlYXR1cmVTdGF0ZShzdGF0ZXM6IExheWVyRmVhdHVyZVN0YXRlcywgcGFpbnRlcjogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggfHxcbiAgICAgICAgICAgICF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZ0TGF5ZXJzID0gdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGlmICghcGFpbnRlci5zdHlsZS5oYXNMYXllcihpZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgLy8gQnVja2V0cyBhcmUgZ3JvdXBlZCBieSBjb21tb24gc291cmNlLWxheWVyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllcklkID0gYnVja2V0LmxheWVyc1swXVsnc291cmNlTGF5ZXInXSB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB2dExheWVyc1tzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVyU3RhdGVzID0gc3RhdGVzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllciB8fCAhc291cmNlTGF5ZXJTdGF0ZXMgfHwgT2JqZWN0LmtleXMoc291cmNlTGF5ZXJTdGF0ZXMpLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGJ1Y2tldC51cGRhdGUoc291cmNlTGF5ZXJTdGF0ZXMsIHNvdXJjZUxheWVyLCB0aGlzLmltYWdlQXRsYXMgJiYgdGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMgfHwge30pO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBwYWludGVyICYmIHBhaW50ZXIuc3R5bGUgJiYgcGFpbnRlci5zdHlsZS5nZXRMYXllcihpZCk7XG4gICAgICAgICAgICBpZiAobGF5ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IE1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLCBsYXllci5xdWVyeVJhZGl1cyhidWNrZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvbGRpbmdGb3JGYWRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc3ltYm9sRmFkZUZpbmlzaGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCB8fCB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgPCBicm93c2VyLm5vdygpO1xuICAgIH1cblxuICAgIGNsZWFyRmFkZUhvbGQoKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzZXRIb2xkRHVyYXRpb24oZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgPSBicm93c2VyLm5vdygpICsgZHVyYXRpb247XG4gICAgfVxuXG4gICAgc2V0RGVwZW5kZW5jaWVzKG5hbWVzcGFjZTogc3RyaW5nLCBkZXBlbmRlbmNpZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBpbmRleFtkZXBdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llc1tuYW1lc3BhY2VdID0gaW5kZXg7XG4gICAgfVxuXG4gICAgaGFzRGVwZW5kZW5jeShuYW1lc3BhY2VzOiBBcnJheTxzdHJpbmc+LCBrZXlzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIG9mIG5hbWVzcGFjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHRoaXMuZGVwZW5kZW5jaWVzW25hbWVzcGFjZV07XG4gICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpbGU7XG4iLCJcbmV4cG9ydCBkZWZhdWx0IFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLCAnbGF5b3V0J107XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93JztcbmltcG9ydCB0eXBlIHtSZXF1ZXN0UGFyYW1ldGVyc30gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuY29uc3QgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG5cbmV4cG9ydCB0eXBlIFBlcmZvcm1hbmNlTWV0cmljcyA9IHtcbiAgICBsb2FkVGltZTogbnVtYmVyLFxuICAgIGZ1bGxMb2FkVGltZTogbnVtYmVyLFxuICAgIGZwczogbnVtYmVyLFxuICAgIHBlcmNlbnREcm9wcGVkRnJhbWVzOiBudW1iZXJcbn1cblxuZXhwb3J0IGNvbnN0IFBlcmZvcm1hbmNlTWFya2VycyA9IHtcbiAgICBjcmVhdGU6ICdjcmVhdGUnLFxuICAgIGxvYWQ6ICdsb2FkJyxcbiAgICBmdWxsTG9hZDogJ2Z1bGxMb2FkJ1xufTtcblxubGV0IGxhc3RGcmFtZVRpbWUgPSBudWxsO1xubGV0IGZyYW1lVGltZXMgPSBbXTtcblxuY29uc3QgbWluRnJhbWVyYXRlVGFyZ2V0ID0gMzA7XG5jb25zdCBmcmFtZVRpbWVUYXJnZXQgPSAxMDAwIC8gbWluRnJhbWVyYXRlVGFyZ2V0O1xuXG5leHBvcnQgY29uc3QgUGVyZm9ybWFuY2VVdGlscyA9IHtcbiAgICBtYXJrKG1hcmtlcjogJEtleXM8dHlwZW9mIFBlcmZvcm1hbmNlTWFya2Vycz4pIHtcbiAgICAgICAgcGVyZm9ybWFuY2UubWFyayhtYXJrZXIpO1xuICAgIH0sXG4gICAgZnJhbWUodGltZXN0YW1wOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY3VyclRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgICAgaWYgKGxhc3RGcmFtZVRpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVUaW1lID0gY3VyclRpbWVzdGFtcCAtIGxhc3RGcmFtZVRpbWU7XG4gICAgICAgICAgICBmcmFtZVRpbWVzLnB1c2goZnJhbWVUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0RnJhbWVUaW1lID0gY3VyclRpbWVzdGFtcDtcbiAgICB9LFxuICAgIGNsZWFyTWV0cmljcygpIHtcbiAgICAgICAgbGFzdEZyYW1lVGltZSA9IG51bGw7XG4gICAgICAgIGZyYW1lVGltZXMgPSBbXTtcbiAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcygnbG9hZFRpbWUnKTtcbiAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcygnZnVsbExvYWRUaW1lJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtYXJrZXIgaW4gUGVyZm9ybWFuY2VNYXJrZXJzKSB7XG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1hcmtzKFBlcmZvcm1hbmNlTWFya2Vyc1ttYXJrZXJdKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk6IFBlcmZvcm1hbmNlTWV0cmljcyB7XG4gICAgICAgIGNvbnN0IGxvYWRUaW1lID0gcGVyZm9ybWFuY2UubWVhc3VyZSgnbG9hZFRpbWUnLCBQZXJmb3JtYW5jZU1hcmtlcnMuY3JlYXRlLCBQZXJmb3JtYW5jZU1hcmtlcnMubG9hZCkuZHVyYXRpb247XG4gICAgICAgIGNvbnN0IGZ1bGxMb2FkVGltZSA9IHBlcmZvcm1hbmNlLm1lYXN1cmUoJ2Z1bGxMb2FkVGltZScsIFBlcmZvcm1hbmNlTWFya2Vycy5jcmVhdGUsIFBlcmZvcm1hbmNlTWFya2Vycy5mdWxsTG9hZCkuZHVyYXRpb247XG4gICAgICAgIGNvbnN0IHRvdGFsRnJhbWVzID0gZnJhbWVUaW1lcy5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgYXZnRnJhbWVUaW1lID0gZnJhbWVUaW1lcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLCAwKSAvIHRvdGFsRnJhbWVzIC8gMTAwMDtcbiAgICAgICAgY29uc3QgZnBzID0gMSAvIGF2Z0ZyYW1lVGltZTtcblxuICAgICAgICAvLyBjb3VudCBmcmFtZXMgdGhhdCBtaXNzZWQgb3VyIGZyYW1lcmF0ZSB0YXJnZXRcbiAgICAgICAgY29uc3QgZHJvcHBlZEZyYW1lcyA9IGZyYW1lVGltZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGZyYW1lVGltZSkgPT4gZnJhbWVUaW1lID4gZnJhbWVUaW1lVGFyZ2V0KVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYyArIChjdXJyIC0gIGZyYW1lVGltZVRhcmdldCkgLyBmcmFtZVRpbWVUYXJnZXQ7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgY29uc3QgcGVyY2VudERyb3BwZWRGcmFtZXMgPSAoZHJvcHBlZEZyYW1lcyAvICh0b3RhbEZyYW1lcyArIGRyb3BwZWRGcmFtZXMpKSAqIDEwMDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9hZFRpbWUsXG4gICAgICAgICAgICBmdWxsTG9hZFRpbWUsXG4gICAgICAgICAgICBmcHMsXG4gICAgICAgICAgICBwZXJjZW50RHJvcHBlZEZyYW1lc1xuICAgICAgICB9O1xuICAgIH1cbn07XG5cbi8qKlxuICogU2FmZSB3cmFwcGVyIGZvciB0aGUgcGVyZm9ybWFuY2UgcmVzb3VyY2UgdGltaW5nIEFQSSBpbiB3ZWIgd29ya2VycyB3aXRoIGdyYWNlZnVsIGRlZ3JhZGF0aW9uXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0UGFyYW1ldGVyc30gcmVxdWVzdFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVlc3RQZXJmb3JtYW5jZSB7XG4gICAgX21hcmtzOiB7c3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIG1lYXN1cmU6IHN0cmluZ307XG5cbiAgICBjb25zdHJ1Y3RvciAocmVxdWVzdDogUmVxdWVzdFBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5fbWFya3MgPSB7XG4gICAgICAgICAgICBzdGFydDogW3JlcXVlc3QudXJsLCAnc3RhcnQnXS5qb2luKCcjJyksXG4gICAgICAgICAgICBlbmQ6IFtyZXF1ZXN0LnVybCwgJ2VuZCddLmpvaW4oJyMnKSxcbiAgICAgICAgICAgIG1lYXN1cmU6IHJlcXVlc3QudXJsLnRvU3RyaW5nKClcbiAgICAgICAgfTtcblxuICAgICAgICBwZXJmb3JtYW5jZS5tYXJrKHRoaXMuX21hcmtzLnN0YXJ0KTtcbiAgICB9XG5cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHBlcmZvcm1hbmNlLm1hcmsodGhpcy5fbWFya3MuZW5kKTtcbiAgICAgICAgbGV0IHJlc291cmNlVGltaW5nRGF0YSA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUodGhpcy5fbWFya3MubWVhc3VyZSk7XG5cbiAgICAgICAgLy8gZmFsbGJhY2sgaWYgd2ViIHdvcmtlciBpbXBsZW1lbnRhdGlvbiBvZiBwZXJmLmdldEVudHJpZXNCeU5hbWUgcmV0dXJucyBlbXB0eVxuICAgICAgICBpZiAocmVzb3VyY2VUaW1pbmdEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcGVyZm9ybWFuY2UubWVhc3VyZSh0aGlzLl9tYXJrcy5tZWFzdXJlLCB0aGlzLl9tYXJrcy5zdGFydCwgdGhpcy5fbWFya3MuZW5kKTtcbiAgICAgICAgICAgIHJlc291cmNlVGltaW5nRGF0YSA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUodGhpcy5fbWFya3MubWVhc3VyZSk7XG5cbiAgICAgICAgICAgIC8vIGNsZWFudXBcbiAgICAgICAgICAgIHBlcmZvcm1hbmNlLmNsZWFyTWFya3ModGhpcy5fbWFya3Muc3RhcnQpO1xuICAgICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyh0aGlzLl9tYXJrcy5lbmQpO1xuICAgICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyh0aGlzLl9tYXJrcy5tZWFzdXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvdXJjZVRpbWluZ0RhdGE7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBwZXJmb3JtYW5jZTtcbiIsIlxuaW1wb3J0IHJlZlByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3JlZl9wcm9wZXJ0aWVzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgbGV0IHN0ciA9ICdbJztcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2Ygb2JqKSB7XG4gICAgICAgICAgICBzdHIgKz0gYCR7c3RyaW5naWZ5KHZhbCl9LGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3N0cn1dYDtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KCk7XG5cbiAgICBsZXQgc3RyID0gJ3snO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdHIgKz0gYCR7SlNPTi5zdHJpbmdpZnkoa2V5c1tpXSl9OiR7c3RyaW5naWZ5KG9ialtrZXlzW2ldXSl9LGA7XG4gICAgfVxuICAgIHJldHVybiBgJHtzdHJ9fWA7XG59XG5cbmZ1bmN0aW9uIGdldEtleShsYXllcikge1xuICAgIGxldCBrZXkgPSAnJztcbiAgICBmb3IgKGNvbnN0IGsgb2YgcmVmUHJvcGVydGllcykge1xuICAgICAgICBrZXkgKz0gYC8ke3N0cmluZ2lmeShsYXllcltrXSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ3JvdXBCeUxheW91dDtcblxuLyoqXG4gKiBHaXZlbiBhbiBhcnJheSBvZiBsYXllcnMsIHJldHVybiBhbiBhcnJheSBvZiBhcnJheXMgb2YgbGF5ZXJzIHdoZXJlIGFsbFxuICogbGF5ZXJzIGluIGVhY2ggZ3JvdXAgaGF2ZSBpZGVudGljYWwgbGF5b3V0LWFmZmVjdGluZyBwcm9wZXJ0aWVzLiBUaGVzZVxuICogYXJlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBmb3JtZXJseSB1c2VkIGJ5IGV4cGxpY2l0IGByZWZgIG1lY2hhbmlzbVxuICogZm9yIGxheWVyczogJ3R5cGUnLCAnc291cmNlJywgJ3NvdXJjZS1sYXllcicsICdtaW56b29tJywgJ21heHpvb20nLFxuICogJ2ZpbHRlcicsIGFuZCAnbGF5b3V0Jy5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IGxheWVycyBhcmUgcmVmZXJlbmNlcyB0byB0aGVcbiAqIGlucHV0IGxheWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHBhcmFtIHtPYmplY3R9IFtjYWNoZWRLZXlzXSAtIGFuIG9iamVjdCB0byBrZWVwIGFscmVhZHkgY2FsY3VsYXRlZCBrZXlzLlxuICogQHJldHVybnMge0FycmF5PEFycmF5PExheWVyPj59XG4gKi9cbmZ1bmN0aW9uIGdyb3VwQnlMYXlvdXQobGF5ZXJzLCBjYWNoZWRLZXlzKSB7XG4gICAgY29uc3QgZ3JvdXBzID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGsgPSAoY2FjaGVkS2V5cyAmJiBjYWNoZWRLZXlzW2xheWVyc1tpXS5pZF0pIHx8IGdldEtleShsYXllcnNbaV0pO1xuICAgICAgICAvLyB1cGRhdGUgdGhlIGNhY2hlIGlmIHRoZXJlIGlzIG9uZVxuICAgICAgICBpZiAoY2FjaGVkS2V5cylcbiAgICAgICAgICAgIGNhY2hlZEtleXNbbGF5ZXJzW2ldLmlkXSA9IGs7XG5cbiAgICAgICAgbGV0IGdyb3VwID0gZ3JvdXBzW2tdO1xuICAgICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgICAgICBncm91cCA9IGdyb3Vwc1trXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLnB1c2gobGF5ZXJzW2ldKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgayBpbiBncm91cHMpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZ3JvdXBzW2tdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgY3JlYXRlU3R5bGVMYXllciBmcm9tICcuL2NyZWF0ZV9zdHlsZV9sYXllcic7XG5cbmltcG9ydCB7dmFsdWVzfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IGZlYXR1cmVGaWx0ZXIgZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlcic7XG5pbXBvcnQgZ3JvdXBCeUxheW91dCBmcm9tICcuLi9zdHlsZS1zcGVjL2dyb3VwX2J5X2xheW91dCc7XG5cbmltcG9ydCB0eXBlIHtUeXBlZFN0eWxlTGF5ZXJ9IGZyb20gJy4vc3R5bGVfbGF5ZXIvdHlwZWRfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIExheWVyQ29uZmlncyA9IHtbXzogc3RyaW5nXTogTGF5ZXJTcGVjaWZpY2F0aW9uIH07XG5leHBvcnQgdHlwZSBGYW1pbHk8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4gPSBBcnJheTxMYXllcj47XG5cbmNsYXNzIFN0eWxlTGF5ZXJJbmRleCB7XG4gICAgZmFtaWxpZXNCeVNvdXJjZTogeyBbc291cmNlOiBzdHJpbmddOiB7IFtzb3VyY2VMYXllcjogc3RyaW5nXTogQXJyYXk8RmFtaWx5PCo+PiB9IH07XG4gICAga2V5Q2FjaGU6IHsgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICBfbGF5ZXJDb25maWdzOiBMYXllckNvbmZpZ3M7XG4gICAgX2xheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyIH07XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllckNvbmZpZ3M6ID9BcnJheTxMYXllclNwZWNpZmljYXRpb24+KSB7XG4gICAgICAgIHRoaXMua2V5Q2FjaGUgPSB7fTtcbiAgICAgICAgaWYgKGxheWVyQ29uZmlncykge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKGxheWVyQ29uZmlncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXBsYWNlKGxheWVyQ29uZmlnczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPikge1xuICAgICAgICB0aGlzLl9sYXllckNvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMudXBkYXRlKGxheWVyQ29uZmlncywgW10pO1xuICAgIH1cblxuICAgIHVwZGF0ZShsYXllckNvbmZpZ3M6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllckNvbmZpZyBvZiBsYXllckNvbmZpZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyQ29uZmlnc1tsYXllckNvbmZpZy5pZF0gPSBsYXllckNvbmZpZztcblxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJDb25maWcuaWRdID0gY3JlYXRlU3R5bGVMYXllcihsYXllckNvbmZpZyk7XG4gICAgICAgICAgICBsYXllci5fZmVhdHVyZUZpbHRlciA9IGZlYXR1cmVGaWx0ZXIobGF5ZXIuZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmtleUNhY2hlW2xheWVyQ29uZmlnLmlkXSlcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5rZXlDYWNoZVtsYXllckNvbmZpZy5pZF07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiByZW1vdmVkSWRzKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5rZXlDYWNoZVtpZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbGF5ZXJDb25maWdzW2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mYW1pbGllc0J5U291cmNlID0ge307XG5cbiAgICAgICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBCeUxheW91dCh2YWx1ZXModGhpcy5fbGF5ZXJDb25maWdzKSwgdGhpcy5rZXlDYWNoZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllckNvbmZpZ3Mgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcnMgPSBsYXllckNvbmZpZ3MubWFwKChsYXllckNvbmZpZykgPT4gdGhpcy5fbGF5ZXJzW2xheWVyQ29uZmlnLmlkXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzWzBdO1xuICAgICAgICAgICAgaWYgKGxheWVyLnZpc2liaWxpdHkgPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGxheWVyLnNvdXJjZSB8fCAnJztcbiAgICAgICAgICAgIGxldCBzb3VyY2VHcm91cCA9IHRoaXMuZmFtaWxpZXNCeVNvdXJjZVtzb3VyY2VJZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUdyb3VwKSB7XG4gICAgICAgICAgICAgICAgc291cmNlR3JvdXAgPSB0aGlzLmZhbWlsaWVzQnlTb3VyY2Vbc291cmNlSWRdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySWQgPSBsYXllci5zb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICAgICAgbGV0IHNvdXJjZUxheWVyRmFtaWxpZXMgPSBzb3VyY2VHcm91cFtzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlTGF5ZXJGYW1pbGllcykge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVyRmFtaWxpZXMgPSBzb3VyY2VHcm91cFtzb3VyY2VMYXllcklkXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb3VyY2VMYXllckZhbWlsaWVzLnB1c2gobGF5ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3R5bGVMYXllckluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlcic7XG5pbXBvcnQgcG90cGFjayBmcm9tICdwb3RwYWNrJztcblxuaW1wb3J0IHR5cGUge0dseXBoTWV0cmljcywgU3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGgnO1xuXG5jb25zdCBwYWRkaW5nID0gMTtcblxuZXhwb3J0IHR5cGUgUmVjdCA9IHtcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHc6IG51bWJlcixcbiAgICBoOiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIEdseXBoUG9zaXRpb24gPSB7XG4gICAgcmVjdDogUmVjdCxcbiAgICBtZXRyaWNzOiBHbHlwaE1ldHJpY3Ncbn07XG5cbmV4cG9ydCB0eXBlIEdseXBoUG9zaXRpb25zID0ge1tfOiBzdHJpbmddOiB7W186IG51bWJlcl06IEdseXBoUG9zaXRpb24gfSB9XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdseXBoQXRsYXMge1xuICAgIGltYWdlOiBBbHBoYUltYWdlO1xuICAgIHBvc2l0aW9uczogR2x5cGhQb3NpdGlvbnM7XG5cbiAgICBjb25zdHJ1Y3RvcihzdGFja3M6IHtbXzogc3RyaW5nXToge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaCB9IH0pIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0ge307XG4gICAgICAgIGNvbnN0IGJpbnMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0YWNrIGluIHN0YWNrcykge1xuICAgICAgICAgICAgY29uc3QgZ2x5cGhzID0gc3RhY2tzW3N0YWNrXTtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrUG9zaXRpb25zID0gcG9zaXRpb25zW3N0YWNrXSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGdseXBocykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGdseXBoc1sraWRdO1xuICAgICAgICAgICAgICAgIGlmICghc3JjIHx8IHNyYy5iaXRtYXAud2lkdGggPT09IDAgfHwgc3JjLmJpdG1hcC5oZWlnaHQgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYmluID0ge1xuICAgICAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgICAgICB3OiBzcmMuYml0bWFwLndpZHRoICsgMiAqIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIGg6IHNyYy5iaXRtYXAuaGVpZ2h0ICsgMiAqIHBhZGRpbmdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJpbnMucHVzaChiaW4pO1xuICAgICAgICAgICAgICAgIHN0YWNrUG9zaXRpb25zW2lkXSA9IHtyZWN0OiBiaW4sIG1ldHJpY3M6IHNyYy5tZXRyaWNzfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiB3IHx8IDEsIGhlaWdodDogaCB8fCAxfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBzdGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBocyA9IHN0YWNrc1tzdGFja107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gZ2x5cGhzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gZ2x5cGhzWytpZF07XG4gICAgICAgICAgICAgICAgaWYgKCFzcmMgfHwgc3JjLmJpdG1hcC53aWR0aCA9PT0gMCB8fCBzcmMuYml0bWFwLmhlaWdodCA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgYmluID0gcG9zaXRpb25zW3N0YWNrXVtpZF0ucmVjdDtcbiAgICAgICAgICAgICAgICBBbHBoYUltYWdlLmNvcHkoc3JjLmJpdG1hcCwgaW1hZ2UsIHt4OiAwLCB5OiAwfSwge3g6IGJpbi54ICsgcGFkZGluZywgeTogYmluLnkgKyBwYWRkaW5nfSwgc3JjLmJpdG1hcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0dseXBoQXRsYXMnLCBHbHlwaEF0bGFzKTtcbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQgRmVhdHVyZUluZGV4IGZyb20gJy4uL2RhdGEvZmVhdHVyZV9pbmRleCc7XHJcblxyXG5pbXBvcnQge3BlcmZvcm1TeW1ib2xMYXlvdXR9IGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0JztcclxuaW1wb3J0IHtDb2xsaXNpb25Cb3hBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XHJcbmltcG9ydCBEaWN0aW9uYXJ5Q29kZXIgZnJvbSAnLi4vdXRpbC9kaWN0aW9uYXJ5X2NvZGVyJztcclxuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcclxuaW1wb3J0IExpbmVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXQnO1xyXG5pbXBvcnQgRmlsbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9maWxsX2J1Y2tldCc7XHJcbmltcG9ydCBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldCc7XHJcbmltcG9ydCB7d2Fybk9uY2UsIG1hcE9iamVjdCwgdmFsdWVzfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XHJcbmltcG9ydCBJbWFnZUF0bGFzIGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcyc7XHJcbmltcG9ydCBHbHlwaEF0bGFzIGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcyc7XHJcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xyXG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XHJcblxyXG5pbXBvcnQgdHlwZSB7QnVja2V0fSBmcm9tICcuLi9kYXRhL2J1Y2tldCc7XHJcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xyXG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcclxuaW1wb3J0IHR5cGUgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4JztcclxuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlJztcclxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2dseXBoJztcclxuaW1wb3J0IHR5cGUge1xyXG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXHJcbiAgICBXb3JrZXJUaWxlQ2FsbGJhY2ssXHJcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UnO1xyXG5pbXBvcnQgdHlwZSB7UHJvbW90ZUlkU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XHJcblxyXG5jbGFzcyBXb3JrZXJUaWxlIHtcclxuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRDtcclxuICAgIHVpZDogc3RyaW5nO1xyXG4gICAgem9vbTogbnVtYmVyO1xyXG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyO1xyXG4gICAgdGlsZVNpemU6IG51bWJlcjtcclxuICAgIHNvdXJjZTogc3RyaW5nO1xyXG4gICAgcHJvbW90ZUlkOiA/UHJvbW90ZUlkU3BlY2lmaWNhdGlvbjtcclxuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XHJcbiAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XHJcbiAgICBjb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XHJcbiAgICByZXR1cm5EZXBlbmRlbmNpZXM6IGJvb2xlYW47XHJcblxyXG4gICAgc3RhdHVzOiAncGFyc2luZycgfCAnZG9uZSc7XHJcbiAgICBkYXRhOiBWZWN0b3JUaWxlO1xyXG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5O1xyXG5cclxuICAgIGFib3J0OiA/KCkgPT4gdm9pZDtcclxuICAgIHJlbG9hZENhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2s7XHJcbiAgICB2ZWN0b3JUaWxlOiBWZWN0b3JUaWxlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMpIHtcclxuICAgICAgICB0aGlzLnRpbGVJRCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKHBhcmFtcy50aWxlSUQub3ZlcnNjYWxlZFosIHBhcmFtcy50aWxlSUQud3JhcCwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueiwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueCwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueSwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwuaW5kZXhFeHRlbnQpO1xyXG4gICAgICAgIHRoaXMudWlkID0gcGFyYW1zLnVpZDtcclxuICAgICAgICB0aGlzLnpvb20gPSBwYXJhbXMuem9vbTtcclxuICAgICAgICB0aGlzLnBpeGVsUmF0aW8gPSBwYXJhbXMucGl4ZWxSYXRpbztcclxuICAgICAgICB0aGlzLnRpbGVTaXplID0gcGFyYW1zLnRpbGVTaXplO1xyXG4gICAgICAgIHRoaXMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcclxuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gdGhpcy50aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCk7XHJcbiAgICAgICAgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMgPSBwYXJhbXMuc2hvd0NvbGxpc2lvbkJveGVzO1xyXG4gICAgICAgIHRoaXMuY29sbGVjdFJlc291cmNlVGltaW5nID0gISFwYXJhbXMuY29sbGVjdFJlc291cmNlVGltaW5nO1xyXG4gICAgICAgIHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID0gISFwYXJhbXMucmV0dXJuRGVwZW5kZW5jaWVzO1xyXG4gICAgICAgIHRoaXMucHJvbW90ZUlkID0gcGFyYW1zLnByb21vdGVJZDtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZShkYXRhOiBWZWN0b3JUaWxlLCBsYXllckluZGV4OiBTdHlsZUxheWVySW5kZXgsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgYWN0b3I6IEFjdG9yLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAncGFyc2luZyc7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuXHJcbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG5ldyBDb2xsaXNpb25Cb3hBcnJheSgpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyQ29kZXIgPSBuZXcgRGljdGlvbmFyeUNvZGVyKE9iamVjdC5rZXlzKGRhdGEubGF5ZXJzKS5zb3J0KCkpO1xyXG5cclxuICAgICAgICBjb25zdCBmZWF0dXJlSW5kZXggPSBuZXcgRmVhdHVyZUluZGV4KHRoaXMudGlsZUlELCB0aGlzLnByb21vdGVJZCk7XHJcbiAgICAgICAgZmVhdHVyZUluZGV4LmJ1Y2tldExheWVySURzID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1Y2tldHM6IHtbXzogc3RyaW5nXTogQnVja2V0fSA9IHt9O1xyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBmZWF0dXJlSW5kZXgsXHJcbiAgICAgICAgICAgIGljb25EZXBlbmRlbmNpZXM6IHt9LFxyXG4gICAgICAgICAgICBwYXR0ZXJuRGVwZW5kZW5jaWVzOiB7fSxcclxuICAgICAgICAgICAgZ2x5cGhEZXBlbmRlbmNpZXM6IHt9LFxyXG4gICAgICAgICAgICBhdmFpbGFibGVJbWFnZXNcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBsYXllckZhbWlsaWVzID0gbGF5ZXJJbmRleC5mYW1pbGllc0J5U291cmNlW3RoaXMuc291cmNlXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVySWQgaW4gbGF5ZXJGYW1pbGllcykge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGRhdGEubGF5ZXJzW3NvdXJjZUxheWVySWRdO1xyXG4gICAgICAgICAgICBpZiAoIXNvdXJjZUxheWVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNvdXJjZUxheWVyLnZlcnNpb24gPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGBWZWN0b3IgdGlsZSBzb3VyY2UgXCIke3RoaXMuc291cmNlfVwiIGxheWVyIFwiJHtzb3VyY2VMYXllcklkfVwiIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgIGBkb2VzIG5vdCB1c2UgdmVjdG9yIHRpbGUgc3BlYyB2MiBhbmQgdGhlcmVmb3JlIG1heSBoYXZlIHNvbWUgcmVuZGVyaW5nIGVycm9ycy5gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJJbmRleCA9IHNvdXJjZUxheWVyQ29kZXIuZW5jb2RlKHNvdXJjZUxheWVySWQpO1xyXG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlTGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gc291cmNlTGF5ZXIuZmVhdHVyZShpbmRleCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGZlYXR1cmVJbmRleC5nZXRJZChmZWF0dXJlLCBzb3VyY2VMYXllcklkKTtcclxuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goe2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZhbWlseSBvZiBsYXllckZhbWlsaWVzW3NvdXJjZUxheWVySWRdKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IGZhbWlseVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICBhc3NlcnQobGF5ZXIuc291cmNlID09PSB0aGlzLnNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIubWluem9vbSAmJiB0aGlzLnpvb20gPCBNYXRoLmZsb29yKGxheWVyLm1pbnpvb20pKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXllci5tYXh6b29tICYmIHRoaXMuem9vbSA+PSBsYXllci5tYXh6b29tKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGlmIChsYXllci52aXNpYmlsaXR5ID09PSAnbm9uZScpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGZhbWlseSwgdGhpcy56b29tLCBhdmFpbGFibGVJbWFnZXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHNbbGF5ZXIuaWRdID0gbGF5ZXIuY3JlYXRlQnVja2V0KHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleDogZmVhdHVyZUluZGV4LmJ1Y2tldExheWVySURzLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICBsYXllcnM6IGZhbWlseSxcclxuICAgICAgICAgICAgICAgICAgICB6b29tOiB0aGlzLnpvb20sXHJcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxSYXRpbzogdGhpcy5waXhlbFJhdGlvLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiB0aGlzLm92ZXJzY2FsaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5LFxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSUQ6IHRoaXMuc291cmNlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBidWNrZXQucG9wdWxhdGUoZmVhdHVyZXMsIG9wdGlvbnMsIHRoaXMudGlsZUlELmNhbm9uaWNhbCk7XHJcbiAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXguYnVja2V0TGF5ZXJJRHMucHVzaChmYW1pbHkubWFwKChsKSA9PiBsLmlkKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlcnJvcjogP0Vycm9yO1xyXG4gICAgICAgIGxldCBnbHlwaE1hcDogP3tbXzogc3RyaW5nXToge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaH19O1xyXG4gICAgICAgIGxldCBpY29uTWFwOiA/e1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfTtcclxuICAgICAgICBsZXQgcGF0dGVybk1hcDogP3tbXzogc3RyaW5nXTogU3R5bGVJbWFnZX07XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IG1hcE9iamVjdChvcHRpb25zLmdseXBoRGVwZW5kZW5jaWVzLCAoZ2x5cGhzKSA9PiBPYmplY3Qua2V5cyhnbHlwaHMpLm1hcChOdW1iZXIpKTtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3RhY2tzKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0R2x5cGhzJywge3VpZDogdGhpcy51aWQsIHN0YWNrc30sIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoTWFwID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBmYWxzZSwgdGhpcy5zb3VyY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdseXBoTWFwID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpY29ucyA9IE9iamVjdC5rZXlzKG9wdGlvbnMuaWNvbkRlcGVuZGVuY2llcyk7XHJcbiAgICAgICAgaWYgKGljb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBhY3Rvci5zZW5kKCdnZXRJbWFnZXMnLCB7aWNvbnMsIHNvdXJjZTogdGhpcy5zb3VyY2UsIHRpbGVJRDogdGhpcy50aWxlSUQsIHR5cGU6ICdpY29ucyd9LCAoZXJyLCByZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcclxuICAgICAgICAgICAgICAgICAgICBpY29uTWFwID0gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBmYWxzZSwgIHRoaXMuc291cmNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpY29uTWFwID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IE9iamVjdC5rZXlzKG9wdGlvbnMucGF0dGVybkRlcGVuZGVuY2llcyk7XHJcbiAgICAgICAgaWYgKHBhdHRlcm5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBhY3Rvci5zZW5kKCdnZXRJbWFnZXMnLCB7aWNvbnM6IHBhdHRlcm5zLCBzb3VyY2U6IHRoaXMuc291cmNlLCB0aWxlSUQ6IHRoaXMudGlsZUlELCB0eXBlOiAncGF0dGVybnMnfSwgKGVyciwgcmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybk1hcCA9IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICBtYXliZVByZXBhcmUuY2FsbCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgZmFsc2UsICB0aGlzLnNvdXJjZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF0dGVybk1hcCA9IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG1heWJlUHJlcGFyZSgpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdseXBoTWFwICYmIGljb25NYXAgJiYgcGF0dGVybk1hcCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhBdGxhcyA9IG5ldyBHbHlwaEF0bGFzKGdseXBoTWFwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlQXRsYXMgPSBuZXcgSW1hZ2VBdGxhcyhpY29uTWFwLCBwYXR0ZXJuTWFwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBidWNrZXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gYnVja2V0c1trZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQgaW5zdGFuY2VvZiBTeW1ib2xCdWNrZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVMYXllcnMoYnVja2V0LmxheWVycywgdGhpcy56b29tLCBhdmFpbGFibGVJbWFnZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3ltYm9sTGF5b3V0KGJ1Y2tldCwgZ2x5cGhNYXAsIGdseXBoQXRsYXMucG9zaXRpb25zLCBpY29uTWFwLCBpbWFnZUF0bGFzLmljb25Qb3NpdGlvbnMsIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVja2V0Lmhhc1BhdHRlcm4gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Y2tldCBpbnN0YW5jZW9mIExpbmVCdWNrZXQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBpbnN0YW5jZW9mIEZpbGxCdWNrZXQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBpbnN0YW5jZW9mIEZpbGxFeHRydXNpb25CdWNrZXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGJ1Y2tldC5sYXllcnMsIHRoaXMuem9vbSwgYXZhaWxhYmxlSW1hZ2VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmFkZEZlYXR1cmVzKG9wdGlvbnMsIHRoaXMudGlsZUlELmNhbm9uaWNhbCwgaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnZG9uZSc7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0czogdmFsdWVzKGJ1Y2tldHMpLmZpbHRlcihiID0+ICFiLmlzRW1wdHkoKSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5LFxyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoQXRsYXNJbWFnZTogZ2x5cGhBdGxhcy5pbWFnZSxcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZUF0bGFzLFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXNlZCBmb3IgYmVuY2htYXJraW5nOlxyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IGdseXBoTWFwIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBpY29uTWFwOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IGljb25NYXAgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IGdseXBoQXRsYXMucG9zaXRpb25zIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXRlTGF5ZXJzKGxheWVyczogJFJlYWRPbmx5QXJyYXk8U3R5bGVMYXllcj4sIHpvb206IG51bWJlciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAvLyBMYXllcnMgYXJlIHNoYXJlZCBhbmQgbWF5IGhhdmUgYmVlbiB1c2VkIGJ5IGEgV29ya2VyVGlsZSB3aXRoIGEgZGlmZmVyZW50IHpvb20uXHJcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHpvb20pO1xyXG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcclxuICAgICAgICBsYXllci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBXb3JrZXJUaWxlO1xyXG4iLCIvLyBAZmxvd1xyXG5cclxuaW1wb3J0IHtnZXRBcnJheUJ1ZmZlcn0gZnJvbSAnLi4vdXRpbC9hamF4JztcclxuXHJcbmltcG9ydCB2dCBmcm9tICcuLi9fL0BtYXBib3gvdmVjdG9yLXRpbGUnO1xyXG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcclxuaW1wb3J0IFdvcmtlclRpbGUgZnJvbSAnLi93b3JrZXJfdGlsZSc7XHJcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5pbXBvcnQge1JlcXVlc3RQZXJmb3JtYW5jZX0gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZSc7XHJcblxyXG5pbXBvcnQgdHlwZSB7XHJcbiAgICBXb3JrZXJTb3VyY2UsXHJcbiAgICBXb3JrZXJUaWxlUGFyYW1ldGVycyxcclxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcclxuICAgIFRpbGVQYXJhbWV0ZXJzXHJcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UnO1xyXG5cclxuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvcic7XHJcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXJJbmRleCBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcl9pbmRleCc7XHJcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xyXG5cclxuZXhwb3J0IHR5cGUgTG9hZFZlY3RvclRpbGVSZXN1bHQgPSB7XHJcbiAgICB2ZWN0b3JUaWxlOiBWZWN0b3JUaWxlO1xyXG4gICAgcmF3RGF0YTogQXJyYXlCdWZmZXI7XHJcbiAgICBleHBpcmVzPzogYW55O1xyXG4gICAgY2FjaGVDb250cm9sPzogYW55O1xyXG4gICAgcmVzb3VyY2VUaW1pbmc/OiBBcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAY2FsbGJhY2sgTG9hZFZlY3RvckRhdGFDYWxsYmFja1xyXG4gKiBAcGFyYW0gZXJyb3JcclxuICogQHBhcmFtIHZlY3RvclRpbGVcclxuICogQHByaXZhdGVcclxuICovXHJcbmV4cG9ydCB0eXBlIExvYWRWZWN0b3JEYXRhQ2FsbGJhY2sgPSBDYWxsYmFjazw/TG9hZFZlY3RvclRpbGVSZXN1bHQ+O1xyXG5cclxuZXhwb3J0IHR5cGUgQWJvcnRWZWN0b3JEYXRhID0gKCkgPT4gdm9pZDtcclxuZXhwb3J0IHR5cGUgTG9hZFZlY3RvckRhdGEgPSAocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IExvYWRWZWN0b3JEYXRhQ2FsbGJhY2spID0+ID9BYm9ydFZlY3RvckRhdGE7XHJcblxyXG4vKipcclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGxvYWRWZWN0b3JUaWxlKHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBMb2FkVmVjdG9yRGF0YUNhbGxiYWNrKSB7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gZ2V0QXJyYXlCdWZmZXIocGFyYW1zLnJlcXVlc3QsIChlcnI6ID9FcnJvciwgZGF0YTogP0FycmF5QnVmZmVyLCBjYWNoZUNvbnRyb2w6ID9zdHJpbmcsIGV4cGlyZXM6ID9zdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcclxuICAgICAgICAgICAgICAgIHZlY3RvclRpbGU6IG5ldyB2dC5WZWN0b3JUaWxlKG5ldyBQcm90b2J1ZihkYXRhKSksXHJcbiAgICAgICAgICAgICAgICByYXdEYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sLFxyXG4gICAgICAgICAgICAgICAgZXhwaXJlc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcclxuICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSB7QGxpbmsgV29ya2VyU291cmNlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN1cHBvcnRzIHtAbGluayBWZWN0b3JUaWxlU291cmNlfS5cclxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkgcmV1c2VkIHRvIHN1cHBvcnQgY3VzdG9tIHNvdXJjZSB0eXBlc1xyXG4gKiBmb3IgZGF0YSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC9jb252ZXJ0ZWQgaW50byBhbiBpbi1tZW1vcnkgVmVjdG9yVGlsZVxyXG4gKiByZXByZXNlbnRhdGlvbi4gIFRvIGRvIHNvLCBjcmVhdGUgaXQgd2l0aFxyXG4gKiBgbmV3IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UoYWN0b3IsIHN0eWxlTGF5ZXJzLCBjdXN0b21Mb2FkVmVjdG9yRGF0YUZ1bmN0aW9uKWAuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBWZWN0b3JUaWxlV29ya2VyU291cmNlIGltcGxlbWVudHMgV29ya2VyU291cmNlIHtcclxuICAgIGFjdG9yOiBBY3RvcjtcclxuICAgIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleDtcclxuICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPjtcclxuICAgIGxvYWRWZWN0b3JEYXRhOiBMb2FkVmVjdG9yRGF0YTtcclxuICAgIGxvYWRpbmc6IHtbXzogc3RyaW5nXTogV29ya2VyVGlsZSB9O1xyXG4gICAgbG9hZGVkOiB7W186IHN0cmluZ106IFdvcmtlclRpbGUgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBbbG9hZFZlY3RvckRhdGFdIE9wdGlvbmFsIG1ldGhvZCBmb3IgY3VzdG9tIGxvYWRpbmcgb2YgYSBWZWN0b3JUaWxlXHJcbiAgICAgKiBvYmplY3QgYmFzZWQgb24gcGFyYW1ldGVycyBwYXNzZWQgZnJvbSB0aGUgbWFpbi10aHJlYWQgU291cmNlLiBTZWVcclxuICAgICAqIHtAbGluayBWZWN0b3JUaWxlV29ya2VyU291cmNlI2xvYWRUaWxlfS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5XHJcbiAgICAgKiBsb2FkcyB0aGUgcGJmIGF0IGBwYXJhbXMudXJsYC5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGFjdG9yOiBBY3RvciwgbGF5ZXJJbmRleDogU3R5bGVMYXllckluZGV4LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGxvYWRWZWN0b3JEYXRhOiA/TG9hZFZlY3RvckRhdGEpIHtcclxuICAgICAgICB0aGlzLmFjdG9yID0gYWN0b3I7XHJcbiAgICAgICAgdGhpcy5sYXllckluZGV4ID0gbGF5ZXJJbmRleDtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZUltYWdlcyA9IGF2YWlsYWJsZUltYWdlcztcclxuICAgICAgICB0aGlzLmxvYWRWZWN0b3JEYXRhID0gbG9hZFZlY3RvckRhdGEgfHwgbG9hZFZlY3RvclRpbGU7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0ge307XHJcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNsb2FkVGlsZX0uIERlbGVnYXRlcyB0b1xyXG4gICAgICoge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFZlY3RvckRhdGF9ICh3aGljaCBieSBkZWZhdWx0IGV4cGVjdHNcclxuICAgICAqIGEgYHBhcmFtcy51cmxgIHByb3BlcnR5KSBmb3IgZmV0Y2hpbmcgYW5kIHByb2R1Y2luZyBhIFZlY3RvclRpbGUgb2JqZWN0LlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgbG9hZFRpbGUocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IHVpZCA9IHBhcmFtcy51aWQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5sb2FkaW5nKVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcclxuXHJcbiAgICAgICAgY29uc3QgcGVyZiA9IChwYXJhbXMgJiYgcGFyYW1zLnJlcXVlc3QgJiYgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nKSA/XHJcbiAgICAgICAgICAgIG5ldyBSZXF1ZXN0UGVyZm9ybWFuY2UocGFyYW1zLnJlcXVlc3QpIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHdvcmtlclRpbGUgPSB0aGlzLmxvYWRpbmdbdWlkXSA9IG5ldyBXb3JrZXJUaWxlKHBhcmFtcyk7XHJcbiAgICAgICAgd29ya2VyVGlsZS5hYm9ydCA9IHRoaXMubG9hZFZlY3RvckRhdGEocGFyYW1zLCAoZXJyLCByZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3VpZF07XHJcblxyXG4gICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgd29ya2VyVGlsZS5zdGF0dXMgPSAnZG9uZSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZFt1aWRdID0gd29ya2VyVGlsZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYXdUaWxlRGF0YSA9IHJlc3BvbnNlLnJhd0RhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHt9O1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXhwaXJlcykgY2FjaGVDb250cm9sLmV4cGlyZXMgPSByZXNwb25zZS5leHBpcmVzO1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuY2FjaGVDb250cm9sKSBjYWNoZUNvbnRyb2wuY2FjaGVDb250cm9sID0gcmVzcG9uc2UuY2FjaGVDb250cm9sO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUaW1pbmcgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBlcmYpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nRGF0YSA9IHBlcmYuZmluaXNoKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpdCdzIG5lY2Vzc2FyeSB0byBldmFsIHRoZSByZXN1bHQgb2YgZ2V0RW50cmllc0J5TmFtZSgpIGhlcmUgdmlhIHBhcnNlL3N0cmluZ2lmeVxyXG4gICAgICAgICAgICAgICAgLy8gbGF0ZSBldmFsdWF0aW9uIGluIHRoZSBtYWluIHRocmVhZCBjYXVzZXMgVHlwZUVycm9yOiBpbGxlZ2FsIGludm9jYXRpb25cclxuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVRpbWluZ0RhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUaW1pbmcucmVzb3VyY2VUaW1pbmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc291cmNlVGltaW5nRGF0YSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB3b3JrZXJUaWxlLnZlY3RvclRpbGUgPSByZXNwb25zZS52ZWN0b3JUaWxlO1xyXG4gICAgICAgICAgICB3b3JrZXJUaWxlLnBhcnNlKHJlc3BvbnNlLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hdmFpbGFibGVJbWFnZXMsIHRoaXMuYWN0b3IsIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyciB8fCAhcmVzdWx0KSByZXR1cm4gY2FsbGJhY2soZXJyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBUcmFuc2ZlcnJpbmcgYSBjb3B5IG9mIHJhd1RpbGVEYXRhIGJlY2F1c2UgdGhlIHdvcmtlciBuZWVkcyB0byByZXRhaW4gaXRzIGNvcHkuXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBleHRlbmQoe3Jhd1RpbGVEYXRhOiByYXdUaWxlRGF0YS5zbGljZSgwKX0sIHJlc3VsdCwgY2FjaGVDb250cm9sLCByZXNvdXJjZVRpbWluZykpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdGhpcy5sb2FkZWQgfHwge307XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVkW3VpZF0gPSB3b3JrZXJUaWxlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI3JlbG9hZFRpbGV9LlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcmVsb2FkVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXHJcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQsXHJcbiAgICAgICAgICAgIHZ0U291cmNlID0gdGhpcztcclxuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlclRpbGUgPSBsb2FkZWRbdWlkXTtcclxuICAgICAgICAgICAgd29ya2VyVGlsZS5zaG93Q29sbGlzaW9uQm94ZXMgPSBwYXJhbXMuc2hvd0NvbGxpc2lvbkJveGVzO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZG9uZSA9IChlcnIsIGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZENhbGxiYWNrID0gd29ya2VyVGlsZS5yZWxvYWRDYWxsYmFjaztcclxuICAgICAgICAgICAgICAgIGlmIChyZWxvYWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXJUaWxlLnJlbG9hZENhbGxiYWNrO1xyXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlclRpbGUucGFyc2Uod29ya2VyVGlsZS52ZWN0b3JUaWxlLCB2dFNvdXJjZS5sYXllckluZGV4LCB0aGlzLmF2YWlsYWJsZUltYWdlcywgdnRTb3VyY2UuYWN0b3IsIHJlbG9hZENhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAod29ya2VyVGlsZS5zdGF0dXMgPT09ICdwYXJzaW5nJykge1xyXG4gICAgICAgICAgICAgICAgd29ya2VyVGlsZS5yZWxvYWRDYWxsYmFjayA9IGRvbmU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod29ya2VyVGlsZS5zdGF0dXMgPT09ICdkb25lJykge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vIHZlY3RvciB0aWxlIGRhdGEgb24gdGhlIGluaXRpYWwgbG9hZCwgZG9uJ3QgdHJ5IGFuZCByZS1wYXJzZSB0aWxlXHJcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyVGlsZS52ZWN0b3JUaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyVGlsZS5wYXJzZSh3b3JrZXJUaWxlLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hdmFpbGFibGVJbWFnZXMsIHRoaXMuYWN0b3IsIGRvbmUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkb25lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjYWJvcnRUaWxlfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zLnVpZCBUaGUgVUlEIGZvciB0aGlzIHRpbGUuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBhYm9ydFRpbGUocGFyYW1zOiBUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmxvYWRpbmcsXHJcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XHJcbiAgICAgICAgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdICYmIGxvYWRpbmdbdWlkXS5hYm9ydCkge1xyXG4gICAgICAgICAgICBsb2FkaW5nW3VpZF0uYWJvcnQoKTtcclxuICAgICAgICAgICAgZGVsZXRlIGxvYWRpbmdbdWlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNyZW1vdmVUaWxlfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zLnVpZCBUaGUgVUlEIGZvciB0aGlzIHRpbGUuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICByZW1vdmVUaWxlKHBhcmFtczogVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZCxcclxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcclxuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBsb2FkZWRbdWlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmVjdG9yVGlsZVdvcmtlclNvdXJjZTtcclxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERFTURhdGEgZnJvbSAnLi4vZGF0YS9kZW1fZGF0YSc7XG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93JztcblxuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvcic7XG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyREVNVGlsZUNhbGxiYWNrLFxuICAgIFRpbGVQYXJhbWV0ZXJzXG59IGZyb20gJy4vd29ya2VyX3NvdXJjZSc7XG5jb25zdCB7SW1hZ2VCaXRtYXB9ID0gd2luZG93O1xuXG5jbGFzcyBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlIHtcbiAgICBhY3RvcjogQWN0b3I7XG4gICAgbG9hZGVkOiB7W186IHN0cmluZ106IERFTURhdGF9O1xuICAgIG9mZnNjcmVlbkNhbnZhczogT2Zmc2NyZWVuQ2FudmFzO1xuICAgIG9mZnNjcmVlbkNhbnZhc0NvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxvYWRlZCA9IHt9O1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHBhcmFtczogV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJERU1UaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qge3VpZCwgZW5jb2RpbmcsIHJhd0ltYWdlRGF0YX0gPSBwYXJhbXM7XG4gICAgICAgIC8vIE1haW4gdGhyZWFkIHdpbGwgdHJhbnNmZXIgSW1hZ2VCaXRtYXAgaWYgb2Zmc2NyZWVuIGRlY29kZSB3aXRoIE9mZnNjcmVlbkNhbnZhcyBpcyBzdXBwb3J0ZWQsIGVsc2UgaXQgd2lsbCB0cmFuc2ZlciBhbiBhbHJlYWR5IGRlY29kZWQgaW1hZ2UuXG4gICAgICAgIGNvbnN0IGltYWdlUGl4ZWxzID0gKEltYWdlQml0bWFwICYmIHJhd0ltYWdlRGF0YSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSA/IHRoaXMuZ2V0SW1hZ2VEYXRhKHJhd0ltYWdlRGF0YSkgOiByYXdJbWFnZURhdGE7XG4gICAgICAgIGNvbnN0IGRlbSA9IG5ldyBERU1EYXRhKHVpZCwgaW1hZ2VQaXhlbHMsIGVuY29kaW5nKTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0aGlzLmxvYWRlZCB8fCB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWRbdWlkXSA9IGRlbTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVtKTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZURhdGEoaW1nQml0bWFwOiBJbWFnZUJpdG1hcCk6IFJHQkFJbWFnZSB7XG4gICAgICAgIC8vIExhemlseSBpbml0aWFsaXplIE9mZnNjcmVlbkNhbnZhc1xuICAgICAgICBpZiAoIXRoaXMub2Zmc2NyZWVuQ2FudmFzIHx8ICF0aGlzLm9mZnNjcmVlbkNhbnZhc0NvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIERlbSB0aWxlcyBhcmUgdHlwaWNhbGx5IDI1NngyNTZcbiAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhpbWdCaXRtYXAud2lkdGgsIGltZ0JpdG1hcC5oZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0ID0gdGhpcy5vZmZzY3JlZW5DYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzLndpZHRoID0gaW1nQml0bWFwLndpZHRoO1xuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy5oZWlnaHQgPSBpbWdCaXRtYXAuaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dC5kcmF3SW1hZ2UoaW1nQml0bWFwLCAwLCAwLCBpbWdCaXRtYXAud2lkdGgsIGltZ0JpdG1hcC5oZWlnaHQpO1xuICAgICAgICAvLyBJbnNlcnQgYW4gYWRkaXRpb25hbCAxcHggcGFkZGluZyBhcm91bmQgdGhlIGltYWdlIHRvIGFsbG93IGJhY2tmaWxsaW5nIGZvciBuZWlnaGJvcmluZyBkYXRhLlxuICAgICAgICBjb25zdCBpbWdEYXRhID0gdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0LmdldEltYWdlRGF0YSgtMSwgLTEsIGltZ0JpdG1hcC53aWR0aCArIDIsIGltZ0JpdG1hcC5oZWlnaHQgKyAyKTtcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLm9mZnNjcmVlbkNhbnZhcy53aWR0aCwgdGhpcy5vZmZzY3JlZW5DYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiBpbWdEYXRhLndpZHRoLCBoZWlnaHQ6IGltZ0RhdGEuaGVpZ2h0fSwgaW1nRGF0YS5kYXRhKTtcbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKHBhcmFtczogVGlsZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9hZGVkW3VpZF07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2U7XG4iLCJcbm1vZHVsZS5leHBvcnRzID0gcmV3aW5kO1xuXG5mdW5jdGlvbiByZXdpbmQoZ2osIG91dGVyKSB7XG4gICAgdmFyIHR5cGUgPSBnaiAmJiBnai50eXBlLCBpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdqLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSByZXdpbmQoZ2ouZmVhdHVyZXNbaV0sIG91dGVyKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdqLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHJld2luZChnai5nZW9tZXRyaWVzW2ldLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICByZXdpbmQoZ2ouZ2VvbWV0cnksIG91dGVyKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJld2luZFJpbmdzKGdqLmNvb3JkaW5hdGVzLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnai5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgcmV3aW5kUmluZ3MoZ2ouY29vcmRpbmF0ZXNbaV0sIG91dGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2o7XG59XG5cbmZ1bmN0aW9uIHJld2luZFJpbmdzKHJpbmdzLCBvdXRlcikge1xuICAgIGlmIChyaW5ncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHJld2luZFJpbmcocmluZ3NbMF0sIG91dGVyKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJld2luZFJpbmcocmluZ3NbaV0sICFvdXRlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZXdpbmRSaW5nKHJpbmcsIGRpcikge1xuICAgIHZhciBhcmVhID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIGFyZWEgKz0gKHJpbmdbaV1bMF0gLSByaW5nW2pdWzBdKSAqIChyaW5nW2pdWzFdICsgcmluZ1tpXVsxXSk7XG4gICAgfVxuICAgIGlmIChhcmVhID49IDAgIT09ICEhZGlyKSByaW5nLnJldmVyc2UoKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IG12dCBmcm9tICcuLi9fL0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuY29uc3QgdG9HZW9KU09OID0gbXZ0LlZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT047XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcblxuLy8gVGhlIGZlYXR1cmUgdHlwZSB1c2VkIGJ5IGdlb2pzb24tdnQgYW5kIHN1cGVyY2x1c3Rlci4gU2hvdWxkIGJlIGV4dHJhY3RlZCB0b1xuLy8gZ2xvYmFsIHR5cGUgYW5kIHVzZWQgaW4gbW9kdWxlIGRlZmluaXRpb25zIGZvciB0aG9zZSB0d28gbW9kdWxlcy5cbnR5cGUgRmVhdHVyZSA9IHtcbiAgICB0eXBlOiAxLFxuICAgIGlkOiBtaXhlZCxcbiAgICB0YWdzOiB7W186IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW59LFxuICAgIGdlb21ldHJ5OiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbn0gfCB7XG4gICAgdHlwZTogMiB8IDMsXG4gICAgaWQ6IG1peGVkLFxuICAgIHRhZ3M6IHtbXzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn0sXG4gICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFtudW1iZXIsIG51bWJlcl0+Pixcbn1cblxuY2xhc3MgRmVhdHVyZVdyYXBwZXIgaW1wbGVtZW50cyBWZWN0b3JUaWxlRmVhdHVyZSB7XG4gICAgX2ZlYXR1cmU6IEZlYXR1cmU7XG5cbiAgICBleHRlbnQ6IG51bWJlcjtcbiAgICB0eXBlOiAxIHwgMiB8IDM7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBwcm9wZXJ0aWVzOiB7W186IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW59O1xuXG4gICAgY29uc3RydWN0b3IoZmVhdHVyZTogRmVhdHVyZSkge1xuICAgICAgICB0aGlzLl9mZWF0dXJlID0gZmVhdHVyZTtcblxuICAgICAgICB0aGlzLmV4dGVudCA9IEVYVEVOVDtcbiAgICAgICAgdGhpcy50eXBlID0gZmVhdHVyZS50eXBlO1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3M7XG5cbiAgICAgICAgLy8gSWYgdGhlIGZlYXR1cmUgaGFzIGEgdG9wLWxldmVsIGBpZGAgcHJvcGVydHksIGNvcHkgaXQgb3ZlciwgYnV0IG9ubHlcbiAgICAgICAgLy8gaWYgaXQgY2FuIGJlIGNvZXJjZWQgdG8gYW4gaW50ZWdlciwgYmVjYXVzZSB0aGlzIHdyYXBwZXIgaXMgdXNlZCBmb3JcbiAgICAgICAgLy8gc2VyaWFsaXppbmcgZ2VvanNvbiBmZWF0dXJlIGRhdGEgaW50byB2ZWN0b3IgdGlsZSBQQkYgZGF0YSwgYW5kIHRoZVxuICAgICAgICAvLyB2ZWN0b3IgdGlsZSBzcGVjIG9ubHkgc3VwcG9ydHMgaW50ZWdlciB2YWx1ZXMgZm9yIGZlYXR1cmUgaWRzIC0tXG4gICAgICAgIC8vIGFsbG93aW5nIG5vbi1pbnRlZ2VyIHZhbHVlcyBoZXJlIHJlc3VsdHMgaW4gYSBub24tY29tcGxpYW50IFBCRlxuICAgICAgICAvLyB0aGF0IGNhdXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBpcyBwYXJzZWQgd2l0aCB2ZWN0b3ItdGlsZS1qc1xuICAgICAgICBpZiAoJ2lkJyBpbiBmZWF0dXJlICYmICFpc05hTihmZWF0dXJlLmlkKSkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHBhcnNlSW50KGZlYXR1cmUuaWQsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRHZW9tZXRyeSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZlYXR1cmUudHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgdGhpcy5fZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnB1c2goW25ldyBQb2ludChwb2ludFswXSwgcG9pbnRbMV0pXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHRoaXMuX2ZlYXR1cmUuZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSaW5nID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiByaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1JpbmcucHVzaChuZXcgUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnB1c2gobmV3UmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b0dlb0pTT04oeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdG9HZW9KU09OLmNhbGwodGhpcywgeCwgeSwgeik7XG4gICAgfVxufVxuXG5jbGFzcyBHZW9KU09OV3JhcHBlciBpbXBsZW1lbnRzIFZlY3RvclRpbGUsIFZlY3RvclRpbGVMYXllciB7XG4gICAgbGF5ZXJzOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGV4dGVudDogbnVtYmVyO1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIF9mZWF0dXJlczogQXJyYXk8RmVhdHVyZT47XG5cbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlczogQXJyYXk8RmVhdHVyZT4pIHtcbiAgICAgICAgdGhpcy5sYXllcnMgPSB7J19nZW9qc29uVGlsZUxheWVyJzogdGhpc307XG4gICAgICAgIHRoaXMubmFtZSA9ICdfZ2VvanNvblRpbGVMYXllcic7XG4gICAgICAgIHRoaXMuZXh0ZW50ID0gRVhURU5UO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fZmVhdHVyZXMgPSBmZWF0dXJlcztcbiAgICB9XG5cbiAgICBmZWF0dXJlKGk6IG51bWJlcik6IFZlY3RvclRpbGVGZWF0dXJlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLl9mZWF0dXJlc1tpXSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHZW9KU09OV3JhcHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDIpIHJlYWRUYWcocGJmLCBmZWF0dXJlKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMykgZmVhdHVyZS50eXBlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gNCkgZmVhdHVyZS5fZ2VvbWV0cnkgPSBwYmYucG9zO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnKHBiZiwgZmVhdHVyZSkge1xuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciBrZXkgPSBmZWF0dXJlLl9rZXlzW3BiZi5yZWFkVmFyaW50KCldLFxuICAgICAgICAgICAgdmFsdWUgPSBmZWF0dXJlLl92YWx1ZXNbcGJmLnJlYWRWYXJpbnQoKV07XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgfVxufVxuXG5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGxpbmVzID0gW10sXG4gICAgICAgIGxpbmU7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXSxcbiAgICAgICAgaSwgajtcblxuICAgIGZ1bmN0aW9uIHByb2plY3QobGluZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIHZhciB5VGVtcCA9IHlMYXQgJiYgeUxhdChwLnkgKyB5MCxzaXplKTsvL2ljbGllbnRcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgeVRlbXA/IHlUZW1wIDogMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwIC8vaWNsaWVudFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSAxOlxuICAgICAgICB2YXIgcG9pbnRzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBvaW50c1tpXSA9IGNvb3Jkc1tpXVswXTtcbiAgICAgICAgfVxuICAgICAgICBjb29yZHMgPSBwb2ludHM7XG4gICAgICAgIHByb2plY3QoY29vcmRzKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHByb2plY3QoY29vcmRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgMzpcbiAgICAgICAgY29vcmRzID0gY2xhc3NpZnlSaW5ncyhjb29yZHMpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdChjb29yZHNbaV1bal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gJ011bHRpJyArIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xuXG4gICAgaWYgKCdpZCcgaW4gdGhpcykge1xuICAgICAgICByZXN1bHQuaWQgPSB0aGlzLmlkO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBjbGFzc2lmaWVzIGFuIGFycmF5IG9mIHJpbmdzIGludG8gcG9seWdvbnMgd2l0aCBvdXRlciByaW5ncyBhbmQgaG9sZXNcblxuZnVuY3Rpb24gY2xhc3NpZnlSaW5ncyhyaW5ncykge1xuICAgIHZhciBsZW4gPSByaW5ncy5sZW5ndGg7XG5cbiAgICBpZiAobGVuIDw9IDEpIHJldHVybiBbcmluZ3NdO1xuXG4gICAgdmFyIHBvbHlnb25zID0gW10sXG4gICAgICAgIHBvbHlnb24sXG4gICAgICAgIGNjdztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGFyZWEgPSBzaWduZWRBcmVhKHJpbmdzW2ldKTtcbiAgICAgICAgaWYgKGFyZWEgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkgY2N3ID0gYXJlYSA8IDA7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG5cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEocmluZykge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxLCBwMjsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgc3VtICs9IChwMi54IC0gcDEueCkgKiAocDEueSArIHAyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlbGF5ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XG4gICAgdGhpcy5sYXllcnMgPSBwYmYucmVhZEZpZWxkcyhyZWFkVGlsZSwge30sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHRhZywgbGF5ZXJzLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XG4gICAgICAgIGlmIChsYXllci5sZW5ndGgpIGxheWVyc1tsYXllci5uYW1lXSA9IGxheWVyO1xuICAgIH1cbn1cblxuIiwibW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVsYXllci5qcycpO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKVxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlXG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXJcblxuLy8gY29uZm9ybSB0byB2ZWN0b3J0aWxlIGFwaVxuZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIgKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzXG4gIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoXG59XG5cbkdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldLCB0aGlzLm9wdGlvbnMuZXh0ZW50KVxufVxuXG5mdW5jdGlvbiBGZWF0dXJlV3JhcHBlciAoZmVhdHVyZSwgZXh0ZW50KSB7XG4gIHRoaXMuaWQgPSB0eXBlb2YgZmVhdHVyZS5pZCA9PT0gJ251bWJlcicgPyBmZWF0dXJlLmlkIDogdW5kZWZpbmVkXG4gIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZVxuICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeVxuICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3NcbiAgdGhpcy5leHRlbnQgPSBleHRlbnQgfHwgNDA5NlxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmluZ3MgPSB0aGlzLnJhd0dlb21ldHJ5XG4gIHRoaXMuZ2VvbWV0cnkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG4gICAgdmFyIG5ld1JpbmcgPSBbXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSlcbiAgICB9XG4gICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZ2VvbWV0cnlcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKVxuXG4gIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnlcbiAgdmFyIHgxID0gSW5maW5pdHlcbiAgdmFyIHgyID0gLUluZmluaXR5XG4gIHZhciB5MSA9IEluZmluaXR5XG4gIHZhciB5MiA9IC1JbmZpbml0eVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb29yZCA9IHJpbmdbal1cblxuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueClcbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpXG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KVxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTlxuIiwidmFyIFBiZiA9IHJlcXVpcmUoJ3BiZicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgd3JpdGVUaWxlKHRpbGUsIG91dClcbiAgcmV0dXJuIG91dC5maW5pc2goKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYSBnZW9qc29uLXZ0LWNyZWF0ZWQgdGlsZSB0byBwYmYuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxheWVycyAtIEFuIG9iamVjdCBtYXBwaW5nIGxheWVyIG5hbWVzIHRvIGdlb2pzb24tdnQtY3JlYXRlZCB2ZWN0b3IgdGlsZSBvYmplY3RzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHZlY3Rvci10aWxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBhbmQgZXh0ZW50IHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSBgbGF5ZXJzYC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52ZXJzaW9uPTFdIC0gVmVyc2lvbiBvZiB2ZWN0b3ItdGlsZSBzcGVjIHVzZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHRlbnQ9NDA5Nl0gLSBFeHRlbnQgb2YgdGhlIHZlY3RvciB0aWxlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21HZW9qc29uVnQgKGxheWVycywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgbCA9IHt9XG4gIGZvciAodmFyIGsgaW4gbGF5ZXJzKSB7XG4gICAgbFtrXSA9IG5ldyBHZW9KU09OV3JhcHBlcihsYXllcnNba10uZmVhdHVyZXMsIG9wdGlvbnMpXG4gICAgbFtrXS5uYW1lID0ga1xuICAgIGxba10udmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvblxuICAgIGxba10uZXh0ZW50ID0gb3B0aW9ucy5leHRlbnRcbiAgfVxuICByZXR1cm4gZnJvbVZlY3RvclRpbGVKcyh7bGF5ZXJzOiBsfSlcbn1cblxuZnVuY3Rpb24gd3JpdGVUaWxlICh0aWxlLCBwYmYpIHtcbiAgZm9yICh2YXIga2V5IGluIHRpbGUubGF5ZXJzKSB7XG4gICAgcGJmLndyaXRlTWVzc2FnZSgzLCB3cml0ZUxheWVyLCB0aWxlLmxheWVyc1trZXldKVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlTGF5ZXIgKGxheWVyLCBwYmYpIHtcbiAgcGJmLndyaXRlVmFyaW50RmllbGQoMTUsIGxheWVyLnZlcnNpb24gfHwgMSlcbiAgcGJmLndyaXRlU3RyaW5nRmllbGQoMSwgbGF5ZXIubmFtZSB8fCAnJylcbiAgcGJmLndyaXRlVmFyaW50RmllbGQoNSwgbGF5ZXIuZXh0ZW50IHx8IDQwOTYpXG5cbiAgdmFyIGlcbiAgdmFyIGNvbnRleHQgPSB7XG4gICAga2V5czogW10sXG4gICAgdmFsdWVzOiBbXSxcbiAgICBrZXljYWNoZToge30sXG4gICAgdmFsdWVjYWNoZToge31cbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCBsYXllci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnRleHQuZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoaSlcbiAgICBwYmYud3JpdGVNZXNzYWdlKDIsIHdyaXRlRmVhdHVyZSwgY29udGV4dClcbiAgfVxuXG4gIHZhciBrZXlzID0gY29udGV4dC5rZXlzXG4gIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGJmLndyaXRlU3RyaW5nRmllbGQoMywga2V5c1tpXSlcbiAgfVxuXG4gIHZhciB2YWx1ZXMgPSBjb250ZXh0LnZhbHVlc1xuICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZVZhbHVlLCB2YWx1ZXNbaV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGZWF0dXJlIChjb250ZXh0LCBwYmYpIHtcbiAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmVcblxuICBpZiAoZmVhdHVyZS5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcGJmLndyaXRlVmFyaW50RmllbGQoMSwgZmVhdHVyZS5pZClcbiAgfVxuXG4gIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVQcm9wZXJ0aWVzLCBjb250ZXh0KVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgzLCBmZWF0dXJlLnR5cGUpXG4gIHBiZi53cml0ZU1lc3NhZ2UoNCwgd3JpdGVHZW9tZXRyeSwgZmVhdHVyZSlcbn1cblxuZnVuY3Rpb24gd3JpdGVQcm9wZXJ0aWVzIChjb250ZXh0LCBwYmYpIHtcbiAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmVcbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIHZhciBrZXljYWNoZSA9IGNvbnRleHQua2V5Y2FjaGVcbiAgdmFyIHZhbHVlY2FjaGUgPSBjb250ZXh0LnZhbHVlY2FjaGVcblxuICBmb3IgKHZhciBrZXkgaW4gZmVhdHVyZS5wcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGtleUluZGV4ID0ga2V5Y2FjaGVba2V5XVxuICAgIGlmICh0eXBlb2Yga2V5SW5kZXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBrZXlzLnB1c2goa2V5KVxuICAgICAga2V5SW5kZXggPSBrZXlzLmxlbmd0aCAtIDFcbiAgICAgIGtleWNhY2hlW2tleV0gPSBrZXlJbmRleFxuICAgIH1cbiAgICBwYmYud3JpdGVWYXJpbnQoa2V5SW5kZXgpXG5cbiAgICB2YXIgdmFsdWUgPSBmZWF0dXJlLnByb3BlcnRpZXNba2V5XVxuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICB9XG4gICAgdmFyIHZhbHVlS2V5ID0gdHlwZSArICc6JyArIHZhbHVlXG4gICAgdmFyIHZhbHVlSW5kZXggPSB2YWx1ZWNhY2hlW3ZhbHVlS2V5XVxuICAgIGlmICh0eXBlb2YgdmFsdWVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgdmFsdWVJbmRleCA9IHZhbHVlcy5sZW5ndGggLSAxXG4gICAgICB2YWx1ZWNhY2hlW3ZhbHVlS2V5XSA9IHZhbHVlSW5kZXhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KHZhbHVlSW5kZXgpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZCAoY21kLCBsZW5ndGgpIHtcbiAgcmV0dXJuIChsZW5ndGggPDwgMykgKyAoY21kICYgMHg3KVxufVxuXG5mdW5jdGlvbiB6aWd6YWcgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSBeIChudW0gPj4gMzEpXG59XG5cbmZ1bmN0aW9uIHdyaXRlR2VvbWV0cnkgKGZlYXR1cmUsIHBiZikge1xuICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpXG4gIHZhciB0eXBlID0gZmVhdHVyZS50eXBlXG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgdmFyIHJpbmdzID0gZ2VvbWV0cnkubGVuZ3RoXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3M7IHIrKykge1xuICAgIHZhciByaW5nID0gZ2VvbWV0cnlbcl1cbiAgICB2YXIgY291bnQgPSAxXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgIGNvdW50ID0gcmluZy5sZW5ndGhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMSwgY291bnQpKSAvLyBtb3ZldG9cbiAgICAvLyBkbyBub3Qgd3JpdGUgcG9seWdvbiBjbG9zaW5nIHBhdGggYXMgbGluZXRvXG4gICAgdmFyIGxpbmVDb3VudCA9IHR5cGUgPT09IDMgPyByaW5nLmxlbmd0aCAtIDEgOiByaW5nLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHtcbiAgICAgIGlmIChpID09PSAxICYmIHR5cGUgIT09IDEpIHtcbiAgICAgICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMiwgbGluZUNvdW50IC0gMSkpIC8vIGxpbmV0b1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gcmluZ1tpXS54IC0geFxuICAgICAgdmFyIGR5ID0gcmluZ1tpXS55IC0geVxuICAgICAgcGJmLndyaXRlVmFyaW50KHppZ3phZyhkeCkpXG4gICAgICBwYmYud3JpdGVWYXJpbnQoemlnemFnKGR5KSlcbiAgICAgIHggKz0gZHhcbiAgICAgIHkgKz0gZHlcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgIHBiZi53cml0ZVZhcmludChjb21tYW5kKDcsIDEpKSAvLyBjbG9zZXBhdGhcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVWYWx1ZSAodmFsdWUsIHBiZikge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCB2YWx1ZSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBwYmYud3JpdGVCb29sZWFuRmllbGQoNywgdmFsdWUpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodmFsdWUgJSAxICE9PSAwKSB7XG4gICAgICBwYmYud3JpdGVEb3VibGVGaWVsZCgzLCB2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgcGJmLndyaXRlU1ZhcmludEZpZWxkKDYsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgcmlnaHQsIGRlcHRoKSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbSA9IChsZWZ0ICsgcmlnaHQpID4+IDE7XG5cbiAgICBzZWxlY3QoaWRzLCBjb29yZHMsIG0sIGxlZnQsIHJpZ2h0LCBkZXB0aCAlIDIpO1xuXG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgbSAtIDEsIGRlcHRoICsgMSk7XG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbSArIDEsIHJpZ2h0LCBkZXB0aCArIDEpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3QoaWRzLCBjb29yZHMsIGssIGxlZnQsIHJpZ2h0LCBpbmMpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGluYyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ID0gY29vcmRzWzIgKiBrICsgaW5jXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvb3Jkc1syICogcmlnaHQgKyBpbmNdID4gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGkgKyBpbmNdIDwgdCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaiArIGluY10gPiB0KSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzWzIgKiBsZWZ0ICsgaW5jXSA9PT0gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaikge1xuICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGksIDIgKiBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGkgKyAxLCAyICogaiArIDEpO1xufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIGNvbnN0IHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShpZHMsIGNvb3JkcywgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbm9kZVNpemUpIHtcbiAgICBjb25zdCBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHgsIHk7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB4ID0gY29vcmRzWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB5ID0gY29vcmRzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmICh4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkpIHJlc3VsdC5wdXNoKGlkc1ttXSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1pblggPD0geCA6IG1pblkgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBtYXhYID49IHggOiBtYXhZID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdpdGhpbihpZHMsIGNvb3JkcywgcXgsIHF5LCByLCBub2RlU2l6ZSkge1xuICAgIGNvbnN0IHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCByMiA9IHIgKiByO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBheGlzID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICBjb25zdCB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmIChzcURpc3QoeCwgeSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICBjb25zdCBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gcXggLSByIDw9IHggOiBxeSAtIHIgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCArIHIgPj0geCA6IHF5ICsgciA+PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG0gKyAxKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gocmlnaHQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzcURpc3QoYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIlxuaW1wb3J0IHNvcnQgZnJvbSAnLi9zb3J0JztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcbmltcG9ydCB3aXRoaW4gZnJvbSAnLi93aXRoaW4nO1xuXG5jb25zdCBkZWZhdWx0R2V0WCA9IHAgPT4gcFswXTtcbmNvbnN0IGRlZmF1bHRHZXRZID0gcCA9PiBwWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBLREJ1c2gge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgZ2V0WCA9IGRlZmF1bHRHZXRYLCBnZXRZID0gZGVmYXVsdEdldFksIG5vZGVTaXplID0gNjQsIEFycmF5VHlwZSA9IEZsb2F0NjRBcnJheSkge1xuICAgICAgICB0aGlzLm5vZGVTaXplID0gbm9kZVNpemU7XG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICAgIGNvbnN0IEluZGV4QXJyYXlUeXBlID0gcG9pbnRzLmxlbmd0aCA8IDY1NTM2ID8gVWludDE2QXJyYXkgOiBVaW50MzJBcnJheTtcblxuICAgICAgICBjb25zdCBpZHMgPSB0aGlzLmlkcyA9IG5ldyBJbmRleEFycmF5VHlwZShwb2ludHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGggKiAyKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWRzW2ldID0gaTtcbiAgICAgICAgICAgIGNvb3Jkc1syICogaV0gPSBnZXRYKHBvaW50c1tpXSk7XG4gICAgICAgICAgICBjb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocG9pbnRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvcnQoaWRzLCBjb29yZHMsIG5vZGVTaXplLCAwLCBpZHMubGVuZ3RoIC0gMSwgMCk7XG4gICAgfVxuXG4gICAgcmFuZ2UobWluWCwgbWluWSwgbWF4WCwgbWF4WSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UodGhpcy5pZHMsIHRoaXMuY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG5cbiAgICB3aXRoaW4oeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gd2l0aGluKHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgeCwgeSwgciwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfVxufVxuIiwiXHJcbmltcG9ydCBLREJ1c2ggZnJvbSAna2RidXNoJztcclxuXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xyXG4gICAgbWluWm9vbTogMCwgICAvLyBtaW4gem9vbSB0byBnZW5lcmF0ZSBjbHVzdGVycyBvblxyXG4gICAgbWF4Wm9vbTogMTYsICAvLyBtYXggem9vbSBsZXZlbCB0byBjbHVzdGVyIHRoZSBwb2ludHMgb25cclxuICAgIG1pblBvaW50czogMiwgLy8gbWluaW11bSBwb2ludHMgdG8gZm9ybSBhIGNsdXN0ZXJcclxuICAgIHJhZGl1czogNDAsICAgLy8gY2x1c3RlciByYWRpdXMgaW4gcGl4ZWxzXHJcbiAgICBleHRlbnQ6IDUxMiwgIC8vIHRpbGUgZXh0ZW50IChyYWRpdXMgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBpdClcclxuICAgIG5vZGVTaXplOiA2NCwgLy8gc2l6ZSBvZiB0aGUgS0QtdHJlZSBsZWFmIG5vZGUsIGFmZmVjdHMgcGVyZm9ybWFuY2VcclxuICAgIGxvZzogZmFsc2UsICAgLy8gd2hldGhlciB0byBsb2cgdGltaW5nIGluZm9cclxuXHJcbiAgICAvLyB3aGV0aGVyIHRvIGdlbmVyYXRlIG51bWVyaWMgaWRzIGZvciBpbnB1dCBmZWF0dXJlcyAoaW4gdmVjdG9yIHRpbGVzKVxyXG4gICAgZ2VuZXJhdGVJZDogZmFsc2UsXHJcblxyXG4gICAgLy8gYSByZWR1Y2UgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIGN1c3RvbSBjbHVzdGVyIHByb3BlcnRpZXNcclxuICAgIHJlZHVjZTogbnVsbCwgLy8gKGFjY3VtdWxhdGVkLCBwcm9wcykgPT4geyBhY2N1bXVsYXRlZC5zdW0gKz0gcHJvcHMuc3VtOyB9XHJcblxyXG4gICAgLy8gcHJvcGVydGllcyB0byB1c2UgZm9yIGluZGl2aWR1YWwgcG9pbnRzIHdoZW4gcnVubmluZyB0aGUgcmVkdWNlclxyXG4gICAgbWFwOiBwcm9wcyA9PiBwcm9wcyAvLyBwcm9wcyA9PiAoe3N1bTogcHJvcHMubXlfdmFsdWV9KVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3VwZXJjbHVzdGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZShkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMudHJlZXMgPSBuZXcgQXJyYXkodGhpcy5vcHRpb25zLm1heFpvb20gKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKHBvaW50cykge1xyXG4gICAgICAgIGNvbnN0IHtsb2csIG1pblpvb20sIG1heFpvb20sIG5vZGVTaXplfSA9IHRoaXMub3B0aW9ucztcclxuXHJcbiAgICAgICAgaWYgKGxvZykgY29uc29sZS50aW1lKCd0b3RhbCB0aW1lJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBgcHJlcGFyZSAkeyAgcG9pbnRzLmxlbmd0aCAgfSBwb2ludHNgO1xyXG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZSh0aW1lcklkKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XHJcblxyXG4gICAgICAgIC8vIGdlbmVyYXRlIGEgY2x1c3RlciBvYmplY3QgZm9yIGVhY2ggcG9pbnQgYW5kIGluZGV4IGlucHV0IHBvaW50cyBpbnRvIGEgS0QtdHJlZVxyXG4gICAgICAgIGxldCBjbHVzdGVycyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghcG9pbnRzW2ldLmdlb21ldHJ5KSBjb250aW51ZTtcclxuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVQb2ludENsdXN0ZXIocG9pbnRzW2ldLCBpLCB0aGlzLm9wdGlvbnMucHJvajRQcm9qZWN0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGNsdXN0ZXJzKTtcclxuICAgICAgICB0aGlzLnRyZWVzW21heFpvb20gKyAxXSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xyXG5cclxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQodGltZXJJZCk7XHJcblxyXG4gICAgICAgIC8vIGNsdXN0ZXIgcG9pbnRzIG9uIG1heCB6b29tLCB0aGVuIGNsdXN0ZXIgdGhlIHJlc3VsdHMgb24gcHJldmlvdXMgem9vbSwgZXRjLjtcclxuICAgICAgICAvLyByZXN1bHRzIGluIGEgY2x1c3RlciBoaWVyYXJjaHkgYWNyb3NzIHpvb20gbGV2ZWxzXHJcbiAgICAgICAgZm9yIChsZXQgeiA9IG1heFpvb207IHogPj0gbWluWm9vbTsgei0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9ICtEYXRlLm5vdygpO1xyXG5cclxuICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHNldCBvZiBjbHVzdGVycyBmb3IgdGhlIHpvb20gYW5kIGluZGV4IHRoZW0gd2l0aCBhIEtELXRyZWVcclxuICAgICAgICAgICAgY2x1c3RlcnMgPSB0aGlzLl9jbHVzdGVyKGNsdXN0ZXJzLCB6KTtcclxuICAgICAgICAgICAgdGhpcy50cmVlc1t6XSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZykgY29uc29sZS5sb2coJ3olZDogJWQgY2x1c3RlcnMgaW4gJWRtcycsIHosIGNsdXN0ZXJzLmxlbmd0aCwgK0RhdGUubm93KCkgLSBub3cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxvZykgY29uc29sZS50aW1lRW5kKCd0b3RhbCB0aW1lJyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENsdXN0ZXJzKGJib3gsIHpvb20pIHtcclxuICAgICAgICBsZXQgbWluTG5nID0gKChiYm94WzBdICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XHJcbiAgICAgICAgY29uc3QgbWluTGF0ID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgYmJveFsxXSkpO1xyXG4gICAgICAgIGxldCBtYXhMbmcgPSBiYm94WzJdID09PSAxODAgPyAxODAgOiAoKGJib3hbMl0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcclxuICAgICAgICBjb25zdCBtYXhMYXQgPSBNYXRoLm1heCgtOTAsIE1hdGgubWluKDkwLCBiYm94WzNdKSk7XHJcblxyXG4gICAgICAgIGlmIChiYm94WzJdIC0gYmJveFswXSA+PSAzNjApIHtcclxuICAgICAgICAgICAgbWluTG5nID0gLTE4MDtcclxuICAgICAgICAgICAgbWF4TG5nID0gMTgwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluTG5nID4gbWF4TG5nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVhc3Rlcm5IZW0gPSB0aGlzLmdldENsdXN0ZXJzKFttaW5MbmcsIG1pbkxhdCwgMTgwLCBtYXhMYXRdLCB6b29tKTtcclxuICAgICAgICAgICAgY29uc3Qgd2VzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsIG1pbkxhdCwgbWF4TG5nLCBtYXhMYXRdLCB6b29tKTtcclxuICAgICAgICAgICAgcmV0dXJuIGVhc3Rlcm5IZW0uY29uY2F0KHdlc3Rlcm5IZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHpvb20pXTtcclxuICAgICAgICBjb25zdCBtaW54eSA9IGxuZ0xhdFhZKG1pbkxuZywgbWluTGF0KTtcclxuICAgICAgICBjb25zdCBtYXh4eSA9IGxuZ0xhdFhZKG1pbkxuZywgbWF4TG5nKTtcclxuICAgICAgICBjb25zdCBpZHMgPSB0cmVlLnJhbmdlKG1pbnh5WzBdLCBtYXh4eVsxXSwgbWF4eHlbMF0sIG1pbnh5WzFdKTtcclxuICAgICAgICBjb25zdCBjbHVzdGVycyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0cmVlLnBvaW50c1tpZF07XHJcbiAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2goYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVySlNPTihjLCB0aGlzLm9wdGlvbnMucHJvajRQcm9qZWN0aW9uKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoaWxkcmVuKGNsdXN0ZXJJZCkge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbklkID0gdGhpcy5fZ2V0T3JpZ2luSWQoY2x1c3RlcklkKTtcclxuICAgICAgICBjb25zdCBvcmlnaW5ab29tID0gdGhpcy5fZ2V0T3JpZ2luWm9vbShjbHVzdGVySWQpO1xyXG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ05vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLic7XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmVlc1tvcmlnaW5ab29tXTtcclxuICAgICAgICBpZiAoIWluZGV4KSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW4gPSBpbmRleC5wb2ludHNbb3JpZ2luSWRdO1xyXG4gICAgICAgIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xyXG5cclxuICAgICAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLnJhZGl1cyAvICh0aGlzLm9wdGlvbnMuZXh0ZW50ICogTWF0aC5wb3coMiwgb3JpZ2luWm9vbSAtIDEpKTtcclxuICAgICAgICBjb25zdCBpZHMgPSBpbmRleC53aXRoaW4ob3JpZ2luLngsIG9yaWdpbi55LCByKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbmRleC5wb2ludHNbaWRdO1xyXG4gICAgICAgICAgICBpZiAoYy5wYXJlbnRJZCA9PT0gY2x1c3RlcklkKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYywgdGhpcy5vcHRpb25zLnByb2o0UHJvamVjdGlvbikgOiB0aGlzLnBvaW50c1tjLmluZGV4XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMZWF2ZXMoY2x1c3RlcklkLCBsaW1pdCwgb2Zmc2V0KSB7XHJcbiAgICAgICAgbGltaXQgPSBsaW1pdCB8fCAxMDtcclxuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcclxuXHJcbiAgICAgICAgY29uc3QgbGVhdmVzID0gW107XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kTGVhdmVzKGxlYXZlcywgY2x1c3RlcklkLCBsaW1pdCwgb2Zmc2V0LCAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxlYXZlcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRUaWxlKHosIHgsIHkpIHtcclxuICAgICAgICBjb25zdCB0cmVlID0gdGhpcy50cmVlc1t0aGlzLl9saW1pdFpvb20oeildO1xyXG4gICAgICAgIGNvbnN0IHoyID0gTWF0aC5wb3coMiwgeik7XHJcbiAgICAgICAgY29uc3Qge2V4dGVudCwgcmFkaXVzfSA9IHRoaXMub3B0aW9ucztcclxuICAgICAgICBjb25zdCBwID0gcmFkaXVzIC8gZXh0ZW50O1xyXG4gICAgICAgIGNvbnN0IHRvcCA9ICh5IC0gcCkgLyB6MjtcclxuICAgICAgICBjb25zdCBib3R0b20gPSAoeSArIDEgKyBwKSAvIHoyO1xyXG5cclxuICAgICAgICBjb25zdCB0aWxlID0ge1xyXG4gICAgICAgICAgICBmZWF0dXJlczogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXHJcbiAgICAgICAgICAgIHRyZWUucmFuZ2UoKHggLSBwKSAvIHoyLCB0b3AsICh4ICsgMSArIHApIC8gejIsIGJvdHRvbSksXHJcbiAgICAgICAgICAgIHRyZWUucG9pbnRzLCB4LCB5LCB6MiwgdGlsZSk7XHJcblxyXG4gICAgICAgIGlmICh4ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcclxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxyXG4gICAgICAgICAgICAgICAgdHJlZS5wb2ludHMsIHoyLCB5LCB6MiwgdGlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxyXG4gICAgICAgICAgICAgICAgdHJlZS5yYW5nZSgwLCB0b3AsIHAgLyB6MiwgYm90dG9tKSxcclxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkKSB7XHJcbiAgICAgICAgbGV0IGV4cGFuc2lvblpvb20gPSB0aGlzLl9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCkgLSAxO1xyXG4gICAgICAgIHdoaWxlIChleHBhbnNpb25ab29tIDw9IHRoaXMub3B0aW9ucy5tYXhab29tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQpO1xyXG4gICAgICAgICAgICBleHBhbnNpb25ab29tKys7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT09IDEpIGJyZWFrO1xyXG4gICAgICAgICAgICBjbHVzdGVySWQgPSBjaGlsZHJlblswXS5wcm9wZXJ0aWVzLmNsdXN0ZXJfaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBleHBhbnNpb25ab29tO1xyXG4gICAgfVxyXG5cclxuICAgIF9hcHBlbmRMZWF2ZXMocmVzdWx0LCBjbHVzdGVySWQsIGxpbWl0LCBvZmZzZXQsIHNraXBwZWQpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2x1c3RlcklkKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNoaWxkLnByb3BlcnRpZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvcHMgJiYgcHJvcHMuY2x1c3Rlcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgKyBwcm9wcy5wb2ludF9jb3VudCA8PSBvZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSB3aG9sZSBjbHVzdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSBwcm9wcy5wb2ludF9jb3VudDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZW50ZXIgdGhlIGNsdXN0ZXJcclxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkID0gdGhpcy5fYXBwZW5kTGVhdmVzKHJlc3VsdCwgcHJvcHMuY2x1c3Rlcl9pZCwgbGltaXQsIG9mZnNldCwgc2tpcHBlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCB0aGUgY2x1c3RlclxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNraXBwZWQgPCBvZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgIC8vIHNraXAgYSBzaW5nbGUgcG9pbnRcclxuICAgICAgICAgICAgICAgIHNraXBwZWQrKztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNpbmdsZSBwb2ludFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSBsaW1pdCkgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2tpcHBlZDtcclxuICAgIH1cclxuXHJcbiAgICBfYWRkVGlsZUZlYXR1cmVzKGlkcywgcG9pbnRzLCB4LCB5LCB6MiwgdGlsZSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBpZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgYyA9IHBvaW50c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXNDbHVzdGVyID0gYy5udW1Qb2ludHM7XHJcbiAgICAgICAgICAgIGNvbnN0IGYgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAxLFxyXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IFtbXHJcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50ICogKGMueCAqIHoyIC0geCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChjLnkgKiB6MiAtIHkpKVxyXG4gICAgICAgICAgICAgICAgXV0sXHJcbiAgICAgICAgICAgICAgICB0YWdzOiBpc0NsdXN0ZXIgPyBnZXRDbHVzdGVyUHJvcGVydGllcyhjKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdLnByb3BlcnRpZXNcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIGFzc2lnbiBpZFxyXG4gICAgICAgICAgICBsZXQgaWQ7XHJcbiAgICAgICAgICAgIGlmIChpc0NsdXN0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGlkID0gYy5pZDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZ2VuZXJhdGVJZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBnZW5lcmF0ZSBpZFxyXG4gICAgICAgICAgICAgICAgaWQgPSBjLmluZGV4O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucG9pbnRzW2MuaW5kZXhdLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBrZWVwIGlkIGlmIGFscmVhZHkgYXNzaWduZWRcclxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5wb2ludHNbYy5pbmRleF0uaWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBmLmlkID0gaWQ7XHJcblxyXG4gICAgICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goZik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9saW1pdFpvb20oeikge1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluWm9vbSwgTWF0aC5taW4oK3osIHRoaXMub3B0aW9ucy5tYXhab29tICsgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jbHVzdGVyKHBvaW50cywgem9vbSkge1xyXG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gW107XHJcbiAgICAgICAgY29uc3Qge3JhZGl1cywgZXh0ZW50LCByZWR1Y2UsIG1pblBvaW50c30gPSB0aGlzLm9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgciA9IHJhZGl1cyAvIChleHRlbnQgKiBNYXRoLnBvdygyLCB6b29tKSk7XHJcblxyXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBvaW50XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcCA9IHBvaW50c1tpXTtcclxuICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRoZSBwb2ludCBhdCB0aGlzIHpvb20gbGV2ZWwsIHNraXAgaXRcclxuICAgICAgICAgICAgaWYgKHAuem9vbSA8PSB6b29tKSBjb250aW51ZTtcclxuICAgICAgICAgICAgcC56b29tID0gem9vbTtcclxuXHJcbiAgICAgICAgICAgIC8vIGZpbmQgYWxsIG5lYXJieSBwb2ludHNcclxuICAgICAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbem9vbSArIDFdO1xyXG4gICAgICAgICAgICBjb25zdCBuZWlnaGJvcklkcyA9IHRyZWUud2l0aGluKHAueCwgcC55LCByKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG51bVBvaW50c09yaWdpbiA9IHAubnVtUG9pbnRzIHx8IDE7XHJcbiAgICAgICAgICAgIGxldCBudW1Qb2ludHMgPSBudW1Qb2ludHNPcmlnaW47XHJcblxyXG4gICAgICAgICAgICAvLyBjb3VudCB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiBhIHBvdGVudGlhbCBjbHVzdGVyXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmVpZ2hib3JJZCBvZiBuZWlnaGJvcklkcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYiA9IHRyZWUucG9pbnRzW25laWdoYm9ySWRdO1xyXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBuZWlnaGJvcnMgdGhhdCBhcmUgYWxyZWFkeSBwcm9jZXNzZWRcclxuICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPiB6b29tKSBudW1Qb2ludHMgKz0gYi5udW1Qb2ludHMgfHwgMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG51bVBvaW50cyA+PSBtaW5Qb2ludHMpIHsgLy8gZW5vdWdoIHBvaW50cyB0byBmb3JtIGEgY2x1c3RlclxyXG4gICAgICAgICAgICAgICAgbGV0IHd4ID0gcC54ICogbnVtUG9pbnRzT3JpZ2luO1xyXG4gICAgICAgICAgICAgICAgbGV0IHd5ID0gcC55ICogbnVtUG9pbnRzT3JpZ2luO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjbHVzdGVyUHJvcGVydGllcyA9IHJlZHVjZSAmJiBudW1Qb2ludHNPcmlnaW4gPiAxID8gdGhpcy5fbWFwKHAsIHRydWUpIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBlbmNvZGUgYm90aCB6b29tIGFuZCBwb2ludCBpbmRleCBvbiB3aGljaCB0aGUgY2x1c3RlciBvcmlnaW5hdGVkIC0tIG9mZnNldCBieSB0b3RhbCBsZW5ndGggb2YgZmVhdHVyZXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpICsgdGhpcy5wb2ludHMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmVpZ2hib3JJZCBvZiBuZWlnaGJvcklkcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIuem9vbSA8PSB6b29tKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tOyAvLyBzYXZlIHRoZSB6b29tIChzbyBpdCBkb2Vzbid0IGdldCBwcm9jZXNzZWQgdHdpY2UpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVBvaW50czIgPSBiLm51bVBvaW50cyB8fCAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHd4ICs9IGIueCAqIG51bVBvaW50czI7IC8vIGFjY3VtdWxhdGUgY29vcmRpbmF0ZXMgZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGNlbnRlclxyXG4gICAgICAgICAgICAgICAgICAgIHd5ICs9IGIueSAqIG51bVBvaW50czI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGIucGFyZW50SWQgPSBpZDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZHVjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzKSBjbHVzdGVyUHJvcGVydGllcyA9IHRoaXMuX21hcChwLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlKGNsdXN0ZXJQcm9wZXJ0aWVzLCB0aGlzLl9tYXAoYikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwLnBhcmVudElkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKGNyZWF0ZUNsdXN0ZXIod3ggLyBudW1Qb2ludHMsIHd5IC8gbnVtUG9pbnRzLCBpZCwgbnVtUG9pbnRzLCBjbHVzdGVyUHJvcGVydGllcykpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gbGVmdCBwb2ludHMgYXMgdW5jbHVzdGVyZWRcclxuICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG51bVBvaW50cyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5laWdoYm9ySWQgb2YgbmVpZ2hib3JJZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IHRyZWUucG9pbnRzW25laWdoYm9ySWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi56b29tIDw9IHpvb20pIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKGIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBpbmRleCBvZiB0aGUgcG9pbnQgZnJvbSB3aGljaCB0aGUgY2x1c3RlciBvcmlnaW5hdGVkXHJcbiAgICBfZ2V0T3JpZ2luSWQoY2x1c3RlcklkKSB7XHJcbiAgICAgICAgcmV0dXJuIChjbHVzdGVySWQgLSB0aGlzLnBvaW50cy5sZW5ndGgpID4+IDU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IHpvb20gb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxyXG4gICAgX2dldE9yaWdpblpvb20oY2x1c3RlcklkKSB7XHJcbiAgICAgICAgcmV0dXJuIChjbHVzdGVySWQgLSB0aGlzLnBvaW50cy5sZW5ndGgpICUgMzI7XHJcbiAgICB9XHJcblxyXG4gICAgX21hcChwb2ludCwgY2xvbmUpIHtcclxuICAgICAgICBpZiAocG9pbnQubnVtUG9pbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbG9uZSA/IGV4dGVuZCh7fSwgcG9pbnQucHJvcGVydGllcykgOiBwb2ludC5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucG9pbnRzW3BvaW50LmluZGV4XS5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMub3B0aW9ucy5tYXAob3JpZ2luYWwpO1xyXG4gICAgICAgIHJldHVybiBjbG9uZSAmJiByZXN1bHQgPT09IG9yaWdpbmFsID8gZXh0ZW5kKHt9LCByZXN1bHQpIDogcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKHgsIHksIGlkLCBudW1Qb2ludHMsIHByb3BlcnRpZXMpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgeCwgLy8gd2VpZ2h0ZWQgY2x1c3RlciBjZW50ZXJcclxuICAgICAgICB5LFxyXG4gICAgICAgIHpvb206IEluZmluaXR5LCAvLyB0aGUgbGFzdCB6b29tIHRoZSBjbHVzdGVyIHdhcyBwcm9jZXNzZWQgYXRcclxuICAgICAgICBpZCwgLy8gZW5jb2RlcyBpbmRleCBvZiB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGNsdXN0ZXIgYW5kIGl0cyB6b29tIGxldmVsXHJcbiAgICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxyXG4gICAgICAgIG51bVBvaW50cyxcclxuICAgICAgICBwcm9wZXJ0aWVzXHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQb2ludENsdXN0ZXIocCwgaWQsIHByb2o0UHJvamVjdGlvbikge1xyXG4gICAgY29uc3QgW3gsIHldID0gcC5nZW9tZXRyeS5jb29yZGluYXRlcztcclxuICAgIGxldCByZXN1bHQgPSBbeCwgeV07XHJcbiAgICBpZih0eXBlb2YgY3VzdG9tQ29udmVydFBvaW50ID09PSAnb2JqZWN0JyApe1xyXG4gICAgICAgIHJlc3VsdCA9IGN1c3RvbUNvbnZlcnRQb2ludC5wcm9qZWN0WFkoeCwgeSwgcHJvajRQcm9qZWN0aW9uKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgcmVzdWx0ID0gW2xuZ1goeCksbGF0WSh5KV1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgeDogcmVzdWx0WzBdLCAvLyBwcm9qZWN0ZWQgcG9pbnQgY29vcmRpbmF0ZXNcclxuICAgICAgICB5OiByZXN1bHRbMV0sXHJcbiAgICAgICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIHBvaW50IHdhcyBwcm9jZXNzZWQgYXRcclxuICAgICAgICBpbmRleDogaWQsIC8vIGluZGV4IG9mIHRoZSBzb3VyY2UgZmVhdHVyZSBpbiB0aGUgb3JpZ2luYWwgaW5wdXQgYXJyYXksXHJcbiAgICAgICAgcGFyZW50SWQ6IC0xIC8vIHBhcmVudCBjbHVzdGVyIGlkXHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDbHVzdGVySlNPTihjbHVzdGVyLCBwcm9qNFByb2plY3Rpb24pIHtcclxuICAgIGxldCByZXN1bHQgPSBbY2x1c3Rlci54LCBjbHVzdGVyLnldO1xyXG4gICAgaWYodHlwZW9mIGN1c3RvbUNvbnZlcnRQb2ludCA9PT0gJ29iamVjdCcgKXtcclxuICAgICAgICByZXN1bHQgPSBjdXN0b21Db252ZXJ0UG9pbnQudG9MbmdMYXQoY2x1c3Rlci54LCBjbHVzdGVyLnksIHByb2o0UHJvamVjdGlvbilcclxuICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3VsdCA9IFt4TG5nKHgpLHlMYXQoeSldXHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcclxuICAgICAgICBpZDogY2x1c3Rlci5pZCxcclxuICAgICAgICBwcm9wZXJ0aWVzOiBnZXRDbHVzdGVyUHJvcGVydGllcyhjbHVzdGVyKSxcclxuICAgICAgICBnZW9tZXRyeToge1xyXG4gICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxyXG4gICAgICAgICAgICBjb29yZGluYXRlczogcmVzdWx0XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3Rlcikge1xyXG4gICAgY29uc3QgY291bnQgPSBjbHVzdGVyLm51bVBvaW50cztcclxuICAgIGNvbnN0IGFiYnJldiA9XHJcbiAgICAgICAgY291bnQgPj0gMTAwMDAgPyBgJHtNYXRoLnJvdW5kKGNvdW50IC8gMTAwMCkgIH1rYCA6XHJcbiAgICAgICAgY291bnQgPj0gMTAwMCA/IGAke01hdGgucm91bmQoY291bnQgLyAxMDApIC8gMTAgIH1rYCA6IGNvdW50O1xyXG4gICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIGNsdXN0ZXIucHJvcGVydGllcyksIHtcclxuICAgICAgICBjbHVzdGVyOiB0cnVlLFxyXG4gICAgICAgIGNsdXN0ZXJfaWQ6IGNsdXN0ZXIuaWQsXHJcbiAgICAgICAgcG9pbnRfY291bnQ6IGNvdW50LFxyXG4gICAgICAgIHBvaW50X2NvdW50X2FiYnJldmlhdGVkOiBhYmJyZXZcclxuICAgIH0pO1xyXG59XHJcblxyXG4vLyBsb25naXR1ZGUvbGF0aXR1ZGUgdG8gc3BoZXJpY2FsIG1lcmNhdG9yIGluIFswLi4xXSByYW5nZVxyXG5mdW5jdGlvbiBsbmdYKGxuZykge1xyXG4gICAgcmV0dXJuIGxuZyAvIDM2MCArIDAuNTtcclxufVxyXG5mdW5jdGlvbiBsYXRZKGxhdCkge1xyXG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4obGF0ICogTWF0aC5QSSAvIDE4MCk7XHJcbiAgICBjb25zdCB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XHJcbiAgICByZXR1cm4geSA8IDAgPyAwIDogeSA+IDEgPyAxIDogeTtcclxufVxyXG5cclxuLy8gc3BoZXJpY2FsIG1lcmNhdG9yIHRvIGxvbmdpdHVkZS9sYXRpdHVkZVxyXG5mdW5jdGlvbiB4TG5nKHgpIHtcclxuICAgIHJldHVybiAoeCAtIDAuNSkgKiAzNjA7XHJcbn1cclxuZnVuY3Rpb24geUxhdCh5KSB7XHJcbiAgICBjb25zdCB5MiA9ICgxODAgLSB5ICogMzYwKSAqIE1hdGguUEkgLyAxODA7XHJcbiAgICByZXR1cm4gMzYwICogTWF0aC5hdGFuKE1hdGguZXhwKHkyKSkgLyBNYXRoLlBJIC0gOTA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcclxuICAgIGZvciAoY29uc3QgaWQgaW4gc3JjKSBkZXN0W2lkXSA9IHNyY1tpZF07XHJcbiAgICByZXR1cm4gZGVzdDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0WChwKSB7XHJcbiAgICByZXR1cm4gcC54O1xyXG59XHJcbmZ1bmN0aW9uIGdldFkocCkge1xyXG4gICAgcmV0dXJuIHAueTtcclxufVxyXG4iLCJcclxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNpbXBsaWZ5KGNvb3JkcywgZmlyc3QsIGxhc3QsIHNxVG9sZXJhbmNlKSB7XHJcbiAgICB2YXIgbWF4U3FEaXN0ID0gc3FUb2xlcmFuY2U7XHJcbiAgICB2YXIgbWlkID0gKGxhc3QgLSBmaXJzdCkgPj4gMTtcclxuICAgIHZhciBtaW5Qb3NUb01pZCA9IGxhc3QgLSBmaXJzdDtcclxuICAgIHZhciBpbmRleDtcclxuXHJcbiAgICB2YXIgYXggPSBjb29yZHNbZmlyc3RdO1xyXG4gICAgdmFyIGF5ID0gY29vcmRzW2ZpcnN0ICsgMV07XHJcbiAgICB2YXIgYnggPSBjb29yZHNbbGFzdF07XHJcbiAgICB2YXIgYnkgPSBjb29yZHNbbGFzdCArIDFdO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSBmaXJzdCArIDM7IGkgPCBsYXN0OyBpICs9IDMpIHtcclxuICAgICAgICB2YXIgZCA9IGdldFNxU2VnRGlzdChjb29yZHNbaV0sIGNvb3Jkc1tpICsgMV0sIGF4LCBheSwgYngsIGJ5KTtcclxuXHJcbiAgICAgICAgaWYgKGQgPiBtYXhTcURpc3QpIHtcclxuICAgICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgICBtYXhTcURpc3QgPSBkO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKGQgPT09IG1heFNxRGlzdCkge1xyXG4gICAgICAgICAgICAvLyBhIHdvcmthcm91bmQgdG8gZW5zdXJlIHdlIGNob29zZSBhIHBpdm90IGNsb3NlIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QsXHJcbiAgICAgICAgICAgIC8vIHJlZHVjaW5nIHJlY3Vyc2lvbiBkZXB0aCwgZm9yIGNlcnRhaW4gZGVnZW5lcmF0ZSBpbnB1dHNcclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9nZW9qc29uLXZ0L2lzc3Vlcy8xMDRcclxuICAgICAgICAgICAgdmFyIHBvc1RvTWlkID0gTWF0aC5hYnMoaSAtIG1pZCk7XHJcbiAgICAgICAgICAgIGlmIChwb3NUb01pZCA8IG1pblBvc1RvTWlkKSB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICBtaW5Qb3NUb01pZCA9IHBvc1RvTWlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtYXhTcURpc3QgPiBzcVRvbGVyYW5jZSkge1xyXG4gICAgICAgIGlmIChpbmRleCAtIGZpcnN0ID4gMykgc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgaW5kZXgsIHNxVG9sZXJhbmNlKTtcclxuICAgICAgICBjb29yZHNbaW5kZXggKyAyXSA9IG1heFNxRGlzdDtcclxuICAgICAgICBpZiAobGFzdCAtIGluZGV4ID4gMykgc2ltcGxpZnkoY29vcmRzLCBpbmRleCwgbGFzdCwgc3FUb2xlcmFuY2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxyXG5mdW5jdGlvbiBnZXRTcVNlZ0Rpc3QocHgsIHB5LCB4LCB5LCBieCwgYnkpIHtcclxuXHJcbiAgICB2YXIgZHggPSBieCAtIHg7XHJcbiAgICB2YXIgZHkgPSBieSAtIHk7XHJcblxyXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XHJcblxyXG4gICAgICAgIHZhciB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XHJcblxyXG4gICAgICAgIGlmICh0ID4gMSkge1xyXG4gICAgICAgICAgICB4ID0gYng7XHJcbiAgICAgICAgICAgIHkgPSBieTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0ID4gMCkge1xyXG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcclxuICAgICAgICAgICAgeSArPSBkeSAqIHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGR4ID0gcHggLSB4O1xyXG4gICAgZHkgPSBweSAtIHk7XHJcblxyXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xyXG59XHJcbiIsIlxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVGZWF0dXJlKGlkLCB0eXBlLCBnZW9tLCB0YWdzKSB7XHJcbiAgICB2YXIgZmVhdHVyZSA9IHtcclxuICAgICAgICBpZDogdHlwZW9mIGlkID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBpZCxcclxuICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgIGdlb21ldHJ5OiBnZW9tLFxyXG4gICAgICAgIHRhZ3M6IHRhZ3MsXHJcbiAgICAgICAgbWluWDogSW5maW5pdHksXHJcbiAgICAgICAgbWluWTogSW5maW5pdHksXHJcbiAgICAgICAgbWF4WDogLUluZmluaXR5LFxyXG4gICAgICAgIG1heFk6IC1JbmZpbml0eVxyXG4gICAgfTtcclxuICAgIGNhbGNCQm94KGZlYXR1cmUpO1xyXG4gICAgcmV0dXJuIGZlYXR1cmU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcclxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeTtcclxuICAgIHZhciB0eXBlID0gZmVhdHVyZS50eXBlO1xyXG5cclxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcclxuICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbSk7XHJcblxyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb21baV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnZW9tW2ldLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbVtpXVtqXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcclxuICAgICAgICBmZWF0dXJlLm1pblggPSBNYXRoLm1pbihmZWF0dXJlLm1pblgsIGdlb21baV0pO1xyXG4gICAgICAgIGZlYXR1cmUubWluWSA9IE1hdGgubWluKGZlYXR1cmUubWluWSwgZ2VvbVtpICsgMV0pO1xyXG4gICAgICAgIGZlYXR1cmUubWF4WCA9IE1hdGgubWF4KGZlYXR1cmUubWF4WCwgZ2VvbVtpXSk7XHJcbiAgICAgICAgZmVhdHVyZS5tYXhZID0gTWF0aC5tYXgoZmVhdHVyZS5tYXhZLCBnZW9tW2kgKyAxXSk7XHJcbiAgICB9XHJcbn1cclxuIiwiXHJcbmltcG9ydCBzaW1wbGlmeSBmcm9tICcuL3NpbXBsaWZ5JztcclxuaW1wb3J0IGNyZWF0ZUZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcclxuY29uc3QgbWF4VmFsaWRMYXRpdHVkZSA9IDg1LjA1MTEyOVxyXG4vLyBjb252ZXJ0cyBHZW9KU09OIGZlYXR1cmUgaW50byBhbiBpbnRlcm1lZGlhdGUgcHJvamVjdGVkIEpTT04gdmVjdG9yIGZvcm1hdCB3aXRoIHNpbXBsaWZpY2F0aW9uIGRhdGFcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgb3B0aW9ucykge1xyXG4gICAgLy8gaW1wb3J0U2NyaXB0cygnaHR0cHM6Ly9pY2xpZW50LnN1cGVybWFwLmlvL3dlYi9saWJzL3Byb2o0LzIuOC4wL3Byb2o0LmpzJyk7XHJcbiAgICAvLyBwcm9qNC5kZWZzKCdFUFNHOjQ1NDcnLCAnUFJPSkNTW1wiQ0dDUzIwMDAgLyAzLWRlZ3JlZSBHYXVzcy1LcnVnZXIgQ00gMTE0RVwiLEdFT0dDU1tcIkNoaW5hIEdlb2RldGljIENvb3JkaW5hdGUgU3lzdGVtIDIwMDBcIixEQVRVTVtcIkNoaW5hXzIwMDBcIixTUEhFUk9JRFtcIkNHQ1MyMDAwXCIsNjM3ODEzNywyOTguMjU3MjIyMTAxLEFVVEhPUklUWVtcIkVQU0dcIixcIjEwMjRcIl1dLEFVVEhPUklUWVtcIkVQU0dcIixcIjEwNDNcIl1dLFBSSU1FTVtcIkdyZWVud2ljaFwiLDAsQVVUSE9SSVRZW1wiRVBTR1wiLFwiODkwMVwiXV0sVU5JVFtcImRlZ3JlZVwiLDAuMDE3NDUzMjkyNTE5OTQzMyxBVVRIT1JJVFlbXCJFUFNHXCIsXCI5MTIyXCJdXSxBVVRIT1JJVFlbXCJFUFNHXCIsXCI0NDkwXCJdXSxQUk9KRUNUSU9OW1wiVHJhbnN2ZXJzZV9NZXJjYXRvclwiXSxQQVJBTUVURVJbXCJsYXRpdHVkZV9vZl9vcmlnaW5cIiwwXSxQQVJBTUVURVJbXCJjZW50cmFsX21lcmlkaWFuXCIsMTE0XSxQQVJBTUVURVJbXCJzY2FsZV9mYWN0b3JcIiwxXSxQQVJBTUVURVJbXCJmYWxzZV9lYXN0aW5nXCIsNTAwMDAwXSxQQVJBTUVURVJbXCJmYWxzZV9ub3J0aGluZ1wiLDBdLFVOSVRbXCJtZXRyZVwiLDEsQVVUSE9SSVRZW1wiRVBTR1wiLFwiOTAwMVwiXV0sQVVUSE9SSVRZW1wiRVBTR1wiLFwiNDU0N1wiXV0nKTtcclxuICAgIC8vIGNvbnN0IHByb2o0UHJvamVjdGlvbiA9IHByb2o0KCdFUFNHOjQ1NDcnKTtcclxuICAgIC8vIG9wdGlvbnMucHJvajRQcm9qZWN0aW9uID0gcHJvajRQcm9qZWN0aW9uO1xyXG4gICAgaWYgKG9wdGlvbnMuY3VzdG9tcHJqICYmIHR5cGVvZiBjdXN0b21Db252ZXJ0UG9pbnQgPT09ICd1bmRlZmluZWQnKXtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpbXBvcnRTY3JpcHRzKG9wdGlvbnMuY3VzdG9tcHJqKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXHJcbiAgICAgICAgfVxyXG4gICAgfSBcclxuICAgIGlmICghb3B0aW9ucy5jdXN0b21wcmogJiYgdHlwZW9mIGN1c3RvbUNvbnZlcnRQb2ludCAhPT0gJ3VuZGVmaW5lZCcpe1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGN1c3RvbUNvbnZlcnRQb2ludCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXHJcbiAgICAgICAgfVxyXG4gICAgfSBcclxuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xyXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgb3B0aW9ucywgaSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcclxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YSwgb3B0aW9ucyk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBzaW5nbGUgZ2VvbWV0cnkgb3IgYSBnZW9tZXRyeSBjb2xsZWN0aW9uXHJcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtnZW9tZXRyeTogZGF0YX0sIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmZWF0dXJlcztcclxufVxyXG5cclxuZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGdlb2pzb24sIG9wdGlvbnMsIGluZGV4KSB7XHJcbiAgICBpZiAoIWdlb2pzb24uZ2VvbWV0cnkpIHJldHVybjtcclxuXHJcbiAgICB2YXIgY29vcmRzID0gZ2VvanNvbi5nZW9tZXRyeS5jb29yZGluYXRlcztcclxuICAgIHZhciB0eXBlID0gZ2VvanNvbi5nZW9tZXRyeS50eXBlO1xyXG4gICAgdmFyIHRvbGVyYW5jZSA9IE1hdGgucG93KG9wdGlvbnMudG9sZXJhbmNlIC8gKCgxIDw8IG9wdGlvbnMubWF4Wm9vbSkgKiBvcHRpb25zLmV4dGVudCksIDIpO1xyXG4gICAgdmFyIGdlb21ldHJ5ID0gW107XHJcbiAgICB2YXIgaWQgPSBnZW9qc29uLmlkO1xyXG4gICAgaWYgKG9wdGlvbnMucHJvbW90ZUlkKSB7XHJcbiAgICAgICAgaWQgPSBnZW9qc29uLnByb3BlcnRpZXNbb3B0aW9ucy5wcm9tb3RlSWRdO1xyXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmdlbmVyYXRlSWQpIHtcclxuICAgICAgICBpZCA9IGluZGV4IHx8IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xyXG4gICAgICAgIGNvbnZlcnRQb2ludChjb29yZHMsIGdlb21ldHJ5LCBvcHRpb25zLnByb2o0UHJvamVjdGlvbik7XHJcblxyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb252ZXJ0UG9pbnQoY29vcmRzW2ldLCBnZW9tZXRyeSwgb3B0aW9ucy5wcm9qNFByb2plY3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xyXG4gICAgICAgIGNvbnZlcnRMaW5lKGNvb3JkcywgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2UsIG9wdGlvbnMucHJvajRQcm9qZWN0aW9uKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMubGluZU1ldHJpY3MpIHtcclxuICAgICAgICAgICAgLy8gZXhwbG9kZSBpbnRvIGxpbmVzdHJpbmdzIHRvIGJlIGFibGUgdG8gdHJhY2sgbWV0cmljc1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29udmVydExpbmUoY29vcmRzW2ldLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCBmYWxzZSwgb3B0aW9ucy5wcm9qNFByb2plY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGlkLCAnTGluZVN0cmluZycsIGdlb21ldHJ5LCBnZW9qc29uLnByb3BlcnRpZXMpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29udmVydExpbmVzKGNvb3JkcywgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2Usb3B0aW9ucy5wcm9qNFByb2plY3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJykge1xyXG4gICAgICAgIGNvbnZlcnRMaW5lcyhjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIHRydWUsIG9wdGlvbnMucHJvajRQcm9qZWN0aW9uKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IFtdO1xyXG4gICAgICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzW2ldLCBwb2x5Z29uLCB0b2xlcmFuY2UsIHRydWUsIG9wdGlvbnMucHJvajRQcm9qZWN0aW9uKTtcclxuICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChwb2x5Z29uKTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb2pzb24uZ2VvbWV0cnkuZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxyXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGdlb2pzb24uZ2VvbWV0cnkuZ2VvbWV0cmllc1tpXSxcclxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGdlb2pzb24ucHJvcGVydGllc1xyXG4gICAgICAgICAgICB9LCBvcHRpb25zLCBpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xyXG4gICAgfVxyXG5cclxuICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShpZCwgdHlwZSwgZ2VvbWV0cnksIGdlb2pzb24ucHJvcGVydGllcykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0UG9pbnQoY29vcmRzLCBvdXQsIHByb2o0UHJvamVjdGlvbikge1xyXG4gICAgY29uc3QgbGF0ICA9IE1hdGgubWluKG1heFZhbGlkTGF0aXR1ZGUsIE1hdGgubWF4KC1tYXhWYWxpZExhdGl0dWRlLCBjb29yZHNbMV0pKTtcclxuICAgIGNvbnN0IHh5ID0gIHR5cGVvZiBjdXN0b21Db252ZXJ0UG9pbnQgPT09IFwib2JqZWN0XCI/Y3VzdG9tQ29udmVydFBvaW50LnByb2plY3RYWShjb29yZHNbMF0sIGxhdCwgcHJvajRQcm9qZWN0aW9uKTpjb29yZHNcclxuICAgIG91dC5wdXNoKHh5WzBdKTtcclxuICAgIG91dC5wdXNoKHh5WzFdKTtcclxuICAgIG91dC5wdXNoKDApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0TGluZShyaW5nLCBvdXQsIHRvbGVyYW5jZSwgaXNQb2x5Z29uLCBwcm9qNFByb2plY3Rpb24pIHtcclxuICAgIHZhciB4MCwgeTA7XHJcbiAgICB2YXIgc2l6ZSA9IDA7XHJcblxyXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgY29uc3Qgb3V0MSA9IFtdO1xyXG4gICAgICAgIGNvbnZlcnRQb2ludChyaW5nW2pdLCBvdXQxLCBwcm9qNFByb2plY3Rpb24pO1xyXG4gICAgICAgIHZhciB4ID0gb3V0MVswXTtcclxuICAgICAgICB2YXIgeSA9IG91dDFbMV07XHJcblxyXG4gICAgICAgIG91dC5wdXNoKHgpO1xyXG4gICAgICAgIG91dC5wdXNoKHkpO1xyXG4gICAgICAgIG91dC5wdXNoKDApO1xyXG5cclxuICAgICAgICBpZiAoaiA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGlzUG9seWdvbikge1xyXG4gICAgICAgICAgICAgICAgc2l6ZSArPSAoeDAgKiB5IC0geCAqIHkwKSAvIDI7IC8vIGFyZWFcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNpemUgKz0gTWF0aC5zcXJ0KE1hdGgucG93KHggLSB4MCwgMikgKyBNYXRoLnBvdyh5IC0geTAsIDIpKTsgLy8gbGVuZ3RoXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgeDAgPSB4O1xyXG4gICAgICAgIHkwID0geTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgbGFzdCA9IG91dC5sZW5ndGggLSAzO1xyXG4gICAgb3V0WzJdID0gMTtcclxuICAgIHNpbXBsaWZ5KG91dCwgMCwgbGFzdCwgdG9sZXJhbmNlKTtcclxuICAgIG91dFtsYXN0ICsgMl0gPSAxO1xyXG5cclxuICAgIG91dC5zaXplID0gTWF0aC5hYnMoc2l6ZSk7XHJcbiAgICBvdXQuc3RhcnQgPSAwO1xyXG4gICAgb3V0LmVuZCA9IG91dC5zaXplO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb252ZXJ0TGluZXMocmluZ3MsIG91dCwgdG9sZXJhbmNlLCBpc1BvbHlnb24sIHByb2o0UHJvamVjdGlvbikge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBnZW9tID0gW107XHJcbiAgICAgICAgY29udmVydExpbmUocmluZ3NbaV0sIGdlb20sIHRvbGVyYW5jZSwgaXNQb2x5Z29uLCBwcm9qNFByb2plY3Rpb24pO1xyXG4gICAgICAgIG91dC5wdXNoKGdlb20pO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9qZWN0WCh4KSB7XHJcbiAgICByZXR1cm4geCAvIDM2MCArIDAuNTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvamVjdFkoeSkge1xyXG4gICAgdmFyIHNpbiA9IE1hdGguc2luKHkgKiBNYXRoLlBJIC8gMTgwKTtcclxuICAgIHZhciB5MiA9IDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSTtcclxuICAgIHJldHVybiB5MiA8IDAgPyAwIDogeTIgPiAxID8gMSA6IHkyO1xyXG59XHJcbiIsIlxyXG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xyXG5cclxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxyXG4gKiAgICAgfCAgICAgICAgfFxyXG4gKiAgX19ffF9fXyAgICAgfCAgICAgL1xyXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xyXG4gKiAgICAgfCAgICAgICAgfFxyXG4gKi9cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIG1pbkFsbCwgbWF4QWxsLCBvcHRpb25zKSB7XHJcblxyXG4gICAgazEgLz0gc2NhbGU7XHJcbiAgICBrMiAvPSBzY2FsZTtcclxuXHJcbiAgICBpZiAobWluQWxsID49IGsxICYmIG1heEFsbCA8IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XHJcbiAgICBlbHNlIGlmIChtYXhBbGwgPCBrMSB8fCBtaW5BbGwgPj0gazIpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxyXG5cclxuICAgIHZhciBjbGlwcGVkID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldO1xyXG4gICAgICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBmZWF0dXJlLnR5cGU7XHJcblxyXG4gICAgICAgIHZhciBtaW4gPSBheGlzID09PSAwID8gZmVhdHVyZS5taW5YIDogZmVhdHVyZS5taW5ZO1xyXG4gICAgICAgIHZhciBtYXggPSBheGlzID09PSAwID8gZmVhdHVyZS5tYXhYIDogZmVhdHVyZS5tYXhZO1xyXG5cclxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8IGsyKSB7IC8vIHRyaXZpYWwgYWNjZXB0XHJcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaChmZWF0dXJlKTtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtYXggPCBrMSB8fCBtaW4gPj0gazIpIHsgLy8gdHJpdmlhbCByZWplY3RcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgbmV3R2VvbWV0cnkgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XHJcbiAgICAgICAgICAgIGNsaXBQb2ludHMoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xyXG4gICAgICAgICAgICBjbGlwTGluZShnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgZmFsc2UsIG9wdGlvbnMubGluZU1ldHJpY3MpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNsaXBMaW5lcyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgZmFsc2UpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJykge1xyXG4gICAgICAgICAgICBjbGlwTGluZXMoZ2VvbWV0cnksIG5ld0dlb21ldHJ5LCBrMSwgazIsIGF4aXMsIHRydWUpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwb2x5Z29uID0gW107XHJcbiAgICAgICAgICAgICAgICBjbGlwTGluZXMoZ2VvbWV0cnlbal0sIHBvbHlnb24sIGsxLCBrMiwgYXhpcywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9seWdvbi5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHBvbHlnb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobmV3R2VvbWV0cnkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbmVNZXRyaWNzICYmIHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5ld0dlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5pZCwgdHlwZSwgbmV3R2VvbWV0cnlbal0sIGZlYXR1cmUudGFncykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdHZW9tZXRyeS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ0xpbmVTdHJpbmcnO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gbmV3R2VvbWV0cnlbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcclxuICAgICAgICAgICAgICAgIHR5cGUgPSBuZXdHZW9tZXRyeS5sZW5ndGggPT09IDMgPyAnUG9pbnQnIDogJ011bHRpUG9pbnQnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeSwgZmVhdHVyZS50YWdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcykge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgdmFyIGEgPSBnZW9tW2kgKyBheGlzXTtcclxuXHJcbiAgICAgICAgaWYgKGEgPj0gazEgJiYgYSA8PSBrMikge1xyXG4gICAgICAgICAgICBuZXdHZW9tLnB1c2goZ2VvbVtpXSk7XHJcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAxXSk7XHJcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAyXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjbGlwTGluZShnZW9tLCBuZXdHZW9tLCBrMSwgazIsIGF4aXMsIGlzUG9seWdvbiwgdHJhY2tNZXRyaWNzKSB7XHJcblxyXG4gICAgdmFyIHNsaWNlID0gbmV3U2xpY2UoZ2VvbSk7XHJcbiAgICB2YXIgaW50ZXJzZWN0ID0gYXhpcyA9PT0gMCA/IGludGVyc2VjdFggOiBpbnRlcnNlY3RZO1xyXG4gICAgdmFyIGxlbiA9IGdlb20uc3RhcnQ7XHJcbiAgICB2YXIgc2VnTGVuLCB0O1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGggLSAzOyBpICs9IDMpIHtcclxuICAgICAgICB2YXIgYXggPSBnZW9tW2ldO1xyXG4gICAgICAgIHZhciBheSA9IGdlb21baSArIDFdO1xyXG4gICAgICAgIHZhciBheiA9IGdlb21baSArIDJdO1xyXG4gICAgICAgIHZhciBieCA9IGdlb21baSArIDNdO1xyXG4gICAgICAgIHZhciBieSA9IGdlb21baSArIDRdO1xyXG4gICAgICAgIHZhciBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XHJcbiAgICAgICAgdmFyIGIgPSBheGlzID09PSAwID8gYnggOiBieTtcclxuICAgICAgICB2YXIgZXhpdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0cmFja01ldHJpY3MpIHNlZ0xlbiA9IE1hdGguc3FydChNYXRoLnBvdyhheCAtIGJ4LCAyKSArIE1hdGgucG93KGF5IC0gYnksIDIpKTtcclxuXHJcbiAgICAgICAgaWYgKGEgPCBrMSkge1xyXG4gICAgICAgICAgICAvLyAtLS18LS0+ICB8IChsaW5lIGVudGVycyB0aGUgY2xpcCByZWdpb24gZnJvbSB0aGUgbGVmdClcclxuICAgICAgICAgICAgaWYgKGIgPiBrMSkge1xyXG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmFja01ldHJpY3MpIHNsaWNlLnN0YXJ0ID0gbGVuICsgc2VnTGVuICogdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoYSA+IGsyKSB7XHJcbiAgICAgICAgICAgIC8vIHwgIDwtLXwtLS0gKGxpbmUgZW50ZXJzIHRoZSBjbGlwIHJlZ2lvbiBmcm9tIHRoZSByaWdodClcclxuICAgICAgICAgICAgaWYgKGIgPCBrMikge1xyXG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcclxuICAgICAgICAgICAgICAgIGlmICh0cmFja01ldHJpY3MpIHNsaWNlLnN0YXJ0ID0gbGVuICsgc2VnTGVuICogdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFkZFBvaW50KHNsaWNlLCBheCwgYXksIGF6KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGIgPCBrMSAmJiBhID49IGsxKSB7XHJcbiAgICAgICAgICAgIC8vIDwtLXwtLS0gIHwgb3IgPC0tfC0tLS0tfC0tLSAobGluZSBleGl0cyB0aGUgY2xpcCByZWdpb24gb24gdGhlIGxlZnQpXHJcbiAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMSk7XHJcbiAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChiID4gazIgJiYgYSA8PSBrMikge1xyXG4gICAgICAgICAgICAvLyB8ICAtLS18LS0+IG9yIC0tLXwtLS0tLXwtLT4gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSByaWdodClcclxuICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcclxuICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXNQb2x5Z29uICYmIGV4aXRlZCkge1xyXG4gICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5lbmQgPSBsZW4gKyBzZWdMZW4gKiB0O1xyXG4gICAgICAgICAgICBuZXdHZW9tLnB1c2goc2xpY2UpO1xyXG4gICAgICAgICAgICBzbGljZSA9IG5ld1NsaWNlKGdlb20pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRyYWNrTWV0cmljcykgbGVuICs9IHNlZ0xlbjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcclxuICAgIHZhciBsYXN0ID0gZ2VvbS5sZW5ndGggLSAzO1xyXG4gICAgYXggPSBnZW9tW2xhc3RdO1xyXG4gICAgYXkgPSBnZW9tW2xhc3QgKyAxXTtcclxuICAgIGF6ID0gZ2VvbVtsYXN0ICsgMl07XHJcbiAgICBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XHJcbiAgICBpZiAoYSA+PSBrMSAmJiBhIDw9IGsyKSBhZGRQb2ludChzbGljZSwgYXgsIGF5LCBheik7XHJcblxyXG4gICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXHJcbiAgICBsYXN0ID0gc2xpY2UubGVuZ3RoIC0gMztcclxuICAgIGlmIChpc1BvbHlnb24gJiYgbGFzdCA+PSAzICYmIChzbGljZVtsYXN0XSAhPT0gc2xpY2VbMF0gfHwgc2xpY2VbbGFzdCArIDFdICE9PSBzbGljZVsxXSkpIHtcclxuICAgICAgICBhZGRQb2ludChzbGljZSwgc2xpY2VbMF0sIHNsaWNlWzFdLCBzbGljZVsyXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxyXG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xyXG4gICAgICAgIG5ld0dlb20ucHVzaChzbGljZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5ld1NsaWNlKGxpbmUpIHtcclxuICAgIHZhciBzbGljZSA9IFtdO1xyXG4gICAgc2xpY2Uuc2l6ZSA9IGxpbmUuc2l6ZTtcclxuICAgIHNsaWNlLnN0YXJ0ID0gbGluZS5zdGFydDtcclxuICAgIHNsaWNlLmVuZCA9IGxpbmUuZW5kO1xyXG4gICAgcmV0dXJuIHNsaWNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbGlwTGluZXMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24pIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNsaXBMaW5lKGdlb21baV0sIG5ld0dlb20sIGsxLCBrMiwgYXhpcywgaXNQb2x5Z29uLCBmYWxzZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZFBvaW50KG91dCwgeCwgeSwgeikge1xyXG4gICAgb3V0LnB1c2goeCk7XHJcbiAgICBvdXQucHVzaCh5KTtcclxuICAgIG91dC5wdXNoKHopO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnRlcnNlY3RYKG91dCwgYXgsIGF5LCBieCwgYnksIHgpIHtcclxuICAgIHZhciB0ID0gKHggLSBheCkgLyAoYnggLSBheCk7XHJcbiAgICBvdXQucHVzaCh4KTtcclxuICAgIG91dC5wdXNoKGF5ICsgKGJ5IC0gYXkpICogdCk7XHJcbiAgICBvdXQucHVzaCgxKTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnRlcnNlY3RZKG91dCwgYXgsIGF5LCBieCwgYnksIHkpIHtcclxuICAgIHZhciB0ID0gKHkgLSBheSkgLyAoYnkgLSBheSk7XHJcbiAgICBvdXQucHVzaChheCArIChieCAtIGF4KSAqIHQpO1xyXG4gICAgb3V0LnB1c2goeSk7XHJcbiAgICBvdXQucHVzaCgxKTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcbiIsIlxyXG5pbXBvcnQgY2xpcCBmcm9tICcuL2NsaXAnO1xyXG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgb3B0aW9ucykge1xyXG4gICAgdmFyIGJ1ZmZlciA9IG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQ7XHJcbiAgICB2YXIgbWVyZ2VkID0gZmVhdHVyZXM7XHJcbiAgICB2YXIgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCAxLCAtMSAtIGJ1ZmZlciwgYnVmZmVyLCAgICAgMCwgLTEsIDIsIG9wdGlvbnMpOyAvLyBsZWZ0IHdvcmxkIGNvcHlcclxuICAgIHZhciByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCAtMSwgMiwgb3B0aW9ucyk7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcclxuXHJcbiAgICBpZiAobGVmdCB8fCByaWdodCkge1xyXG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIC0xLCAyLCBvcHRpb25zKSB8fCBbXTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcclxuXHJcbiAgICAgICAgaWYgKGxlZnQpIG1lcmdlZCA9IHNoaWZ0RmVhdHVyZUNvb3JkcyhsZWZ0LCAxKS5jb25jYXQobWVyZ2VkKTsgLy8gbWVyZ2UgbGVmdCBpbnRvIGNlbnRlclxyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG1lcmdlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcclxuICAgIHZhciBuZXdGZWF0dXJlcyA9IFtdO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxyXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xyXG5cclxuICAgICAgICB2YXIgbmV3R2VvbWV0cnk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcclxuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xyXG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XHJcbiAgICAgICAgICAgIG5ld0dlb21ldHJ5ID0gW107XHJcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3UG9seWdvbiA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBmZWF0dXJlLmdlb21ldHJ5W2pdLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3UG9seWdvbi5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal1ba10sIG9mZnNldCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChuZXdQb2x5Z29uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV3RmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLnRhZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XHJcbiAgICB2YXIgbmV3UG9pbnRzID0gW107XHJcbiAgICBuZXdQb2ludHMuc2l6ZSA9IHBvaW50cy5zaXplO1xyXG5cclxuICAgIGlmIChwb2ludHMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIG5ld1BvaW50cy5zdGFydCA9IHBvaW50cy5zdGFydDtcclxuICAgICAgICBuZXdQb2ludHMuZW5kID0gcG9pbnRzLmVuZDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICAgIG5ld1BvaW50cy5wdXNoKHBvaW50c1tpXSArIG9mZnNldCwgcG9pbnRzW2kgKyAxXSwgcG9pbnRzW2kgKyAyXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3UG9pbnRzO1xyXG59XHJcbiIsIlxyXG4vLyBUcmFuc2Zvcm1zIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIGZlYXR1cmUgaW4gdGhlIGdpdmVuIHRpbGUgZnJvbVxyXG4vLyBtZXJjYXRvci1wcm9qZWN0ZWQgc3BhY2UgaW50byAoZXh0ZW50IHggZXh0ZW50KSB0aWxlIHNwYWNlLlxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xyXG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xyXG5cclxuICAgIHZhciB6MiA9IDEgPDwgdGlsZS56LFxyXG4gICAgICAgIHR4ID0gdGlsZS54LFxyXG4gICAgICAgIHR5ID0gdGlsZS55LFxyXG4gICAgICAgIGksIGosIGs7XHJcblxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRpbGUuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgZmVhdHVyZSA9IHRpbGUuZmVhdHVyZXNbaV0sXHJcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxyXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xyXG5cclxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5ID0gW107XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtqXSwgZ2VvbVtqICsgMV0sIGV4dGVudCwgejIsIHR4LCB0eSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciByaW5nID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZ2VvbVtqXS5sZW5ndGg7IGsgKz0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJpbmcucHVzaCh0cmFuc2Zvcm1Qb2ludChnZW9tW2pdW2tdLCBnZW9tW2pdW2sgKyAxXSwgZXh0ZW50LCB6MiwgdHgsIHR5KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2gocmluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGlsZS50cmFuc2Zvcm1lZCA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHRpbGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHgsIHksIGV4dGVudCwgejIsIHR4LCB0eSkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh4ICogejIgLSB0eCkpLFxyXG4gICAgICAgIE1hdGgucm91bmQoZXh0ZW50ICogKHkgKiB6MiAtIHR5KSldO1xyXG59XHJcbiIsIlxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVUaWxlKGZlYXR1cmVzLCB6LCB0eCwgdHksIG9wdGlvbnMpIHtcclxuICAgIHZhciB0b2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoKDEgPDwgeikgKiBvcHRpb25zLmV4dGVudCk7XHJcbiAgICB2YXIgdGlsZSA9IHtcclxuICAgICAgICBmZWF0dXJlczogW10sXHJcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxyXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXHJcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXHJcbiAgICAgICAgc291cmNlOiBudWxsLFxyXG4gICAgICAgIHg6IHR4LFxyXG4gICAgICAgIHk6IHR5LFxyXG4gICAgICAgIHo6IHosXHJcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxyXG4gICAgICAgIG1pblg6IDIsXHJcbiAgICAgICAgbWluWTogMSxcclxuICAgICAgICBtYXhYOiAtMSxcclxuICAgICAgICBtYXhZOiAwXHJcbiAgICB9O1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcclxuICAgICAgICBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmVzW2ldLCB0b2xlcmFuY2UsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB2YXIgbWluWCA9IGZlYXR1cmVzW2ldLm1pblg7XHJcbiAgICAgICAgdmFyIG1pblkgPSBmZWF0dXJlc1tpXS5taW5ZO1xyXG4gICAgICAgIHZhciBtYXhYID0gZmVhdHVyZXNbaV0ubWF4WDtcclxuICAgICAgICB2YXIgbWF4WSA9IGZlYXR1cmVzW2ldLm1heFk7XHJcblxyXG4gICAgICAgIGlmIChtaW5YIDwgdGlsZS5taW5YKSB0aWxlLm1pblggPSBtaW5YO1xyXG4gICAgICAgIGlmIChtaW5ZIDwgdGlsZS5taW5ZKSB0aWxlLm1pblkgPSBtaW5ZO1xyXG4gICAgICAgIGlmIChtYXhYID4gdGlsZS5tYXhYKSB0aWxlLm1heFggPSBtYXhYO1xyXG4gICAgICAgIGlmIChtYXhZID4gdGlsZS5tYXhZKSB0aWxlLm1heFkgPSBtYXhZO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRpbGU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZSwgdG9sZXJhbmNlLCBvcHRpb25zKSB7XHJcblxyXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxyXG4gICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGUsXHJcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdO1xyXG5cclxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpXSk7XHJcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2kgKyAxXSk7XHJcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XHJcbiAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xyXG4gICAgICAgIGFkZExpbmUoc2ltcGxpZmllZCwgZ2VvbSwgdGlsZSwgdG9sZXJhbmNlLCBmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHR5cGUgPT09ICdQb2x5Z29uJywgaSA9PT0gMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBnZW9tLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gZ2VvbVtrXTtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFkZExpbmUoc2ltcGxpZmllZCwgcG9seWdvbltpXSwgdGlsZSwgdG9sZXJhbmNlLCB0cnVlLCBpID09PSAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2ltcGxpZmllZC5sZW5ndGgpIHtcclxuICAgICAgICB2YXIgdGFncyA9IGZlYXR1cmUudGFncyB8fCBudWxsO1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgJiYgb3B0aW9ucy5saW5lTWV0cmljcykge1xyXG4gICAgICAgICAgICB0YWdzID0ge307XHJcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnRhZ3MpIHRhZ3Nba2V5XSA9IGZlYXR1cmUudGFnc1trZXldO1xyXG4gICAgICAgICAgICB0YWdzWydtYXBib3hfY2xpcF9zdGFydCddID0gZ2VvbS5zdGFydCAvIGdlb20uc2l6ZTtcclxuICAgICAgICAgICAgdGFnc1snbWFwYm94X2NsaXBfZW5kJ10gPSBnZW9tLmVuZCAvIGdlb20uc2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHRpbGVGZWF0dXJlID0ge1xyXG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcclxuICAgICAgICAgICAgdHlwZTogdHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nID8gMyA6XHJcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgPyAyIDogMSxcclxuICAgICAgICAgICAgdGFnczogdGFnc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGlsZUZlYXR1cmUuaWQgPSBmZWF0dXJlLmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2godGlsZUZlYXR1cmUpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRMaW5lKHJlc3VsdCwgZ2VvbSwgdGlsZSwgdG9sZXJhbmNlLCBpc1BvbHlnb24sIGlzT3V0ZXIpIHtcclxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZTtcclxuXHJcbiAgICBpZiAodG9sZXJhbmNlID4gMCAmJiAoZ2VvbS5zaXplIDwgKGlzUG9seWdvbiA/IHNxVG9sZXJhbmNlIDogdG9sZXJhbmNlKSkpIHtcclxuICAgICAgICB0aWxlLm51bVBvaW50cyArPSBnZW9tLmxlbmd0aCAvIDM7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByaW5nID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XHJcbiAgICAgICAgaWYgKHRvbGVyYW5jZSA9PT0gMCB8fCBnZW9tW2kgKyAyXSA+IHNxVG9sZXJhbmNlKSB7XHJcbiAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xyXG4gICAgICAgICAgICByaW5nLnB1c2goZ2VvbVtpXSk7XHJcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2kgKyAxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRpbGUubnVtUG9pbnRzKys7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzUG9seWdvbikgcmV3aW5kKHJpbmcsIGlzT3V0ZXIpO1xyXG5cclxuICAgIHJlc3VsdC5wdXNoKHJpbmcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXdpbmQocmluZywgY2xvY2t3aXNlKSB7XHJcbiAgICB2YXIgYXJlYSA9IDA7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAyOyBpIDwgbGVuOyBqID0gaSwgaSArPSAyKSB7XHJcbiAgICAgICAgYXJlYSArPSAocmluZ1tpXSAtIHJpbmdbal0pICogKHJpbmdbaSArIDFdICsgcmluZ1tqICsgMV0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZWEgPiAwID09PSBjbG9ja3dpc2UpIHtcclxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aDsgaSA8IGxlbiAvIDI7IGkgKz0gMikge1xyXG4gICAgICAgICAgICB2YXIgeCA9IHJpbmdbaV07XHJcbiAgICAgICAgICAgIHZhciB5ID0gcmluZ1tpICsgMV07XHJcbiAgICAgICAgICAgIHJpbmdbaV0gPSByaW5nW2xlbiAtIDIgLSBpXTtcclxuICAgICAgICAgICAgcmluZ1tpICsgMV0gPSByaW5nW2xlbiAtIDEgLSBpXTtcclxuICAgICAgICAgICAgcmluZ1tsZW4gLSAyIC0gaV0gPSB4O1xyXG4gICAgICAgICAgICByaW5nW2xlbiAtIDEgLSBpXSA9IHk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIlxyXG5pbXBvcnQgY29udmVydCBmcm9tICcuL2NvbnZlcnQnOyAgICAgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXHJcbmltcG9ydCBjbGlwIGZyb20gJy4vY2xpcCc7ICAgICAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXHJcbmltcG9ydCB3cmFwIGZyb20gJy4vd3JhcCc7ICAgICAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xyXG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJy4vdHJhbnNmb3JtJzsgLy8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxyXG5pbXBvcnQgY3JlYXRlVGlsZSBmcm9tICcuL3RpbGUnOyAgICAgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4gbmV3IEdlb0pTT05WVChkYXRhLCBvcHRpb25zKTtcclxufVxyXG5cclxuZnVuY3Rpb24gR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpIHtcclxuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcclxuXHJcbiAgICB2YXIgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xyXG5cclxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcclxuXHJcbiAgICBpZiAob3B0aW9ucy5tYXhab29tIDwgMCB8fCBvcHRpb25zLm1heFpvb20gPiAyNCkgdGhyb3cgbmV3IEVycm9yKCdtYXhab29tIHNob3VsZCBiZSBpbiB0aGUgMC0yNCByYW5nZScpO1xyXG4gICAgaWYgKG9wdGlvbnMucHJvbW90ZUlkICYmIG9wdGlvbnMuZ2VuZXJhdGVJZCkgdGhyb3cgbmV3IEVycm9yKCdwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuJyk7XHJcblxyXG4gICAgdmFyIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLnRpbGVzID0ge307XHJcbiAgICB0aGlzLnRpbGVDb29yZHMgPSBbXTtcclxuXHJcbiAgICBpZiAoZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3ByZXByb2Nlc3MgZGF0YScpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XHJcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xyXG4gICAgICAgIHRoaXMuc3RhdHMgPSB7fTtcclxuICAgICAgICB0aGlzLnRvdGFsID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpO1xyXG5cclxuICAgIC8vIHN0YXJ0IHNsaWNpbmcgZnJvbSB0aGUgdG9wIHRpbGUgZG93blxyXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xyXG5cclxuICAgIGlmIChkZWJ1Zykge1xyXG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XHJcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCd0aWxlcyBnZW5lcmF0ZWQ6JywgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpO1xyXG4gICAgfVxyXG59XHJcblxyXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XHJcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cclxuICAgIGluZGV4TWF4Wm9vbTogNSwgICAgICAgIC8vIG1heCB6b29tIGluIHRoZSB0aWxlIGluZGV4XHJcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxyXG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcclxuICAgIGV4dGVudDogNDA5NiwgICAgICAgICAgIC8vIHRpbGUgZXh0ZW50XHJcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcclxuICAgIGxpbmVNZXRyaWNzOiBmYWxzZSwgICAgIC8vIHdoZXRoZXIgdG8gY2FsY3VsYXRlIGxpbmUgbWV0cmljc1xyXG4gICAgcHJvbW90ZUlkOiBudWxsLCAgICAgICAgLy8gbmFtZSBvZiBhIGZlYXR1cmUgcHJvcGVydHkgdG8gYmUgcHJvbW90ZWQgdG8gZmVhdHVyZS5pZFxyXG4gICAgZ2VuZXJhdGVJZDogZmFsc2UsICAgICAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSBmZWF0dXJlIGlkcy4gQ2Fubm90IGJlIHVzZWQgd2l0aCBwcm9tb3RlSWRcclxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcclxufTtcclxuXHJcbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XHJcblxyXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcclxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxyXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcclxuXHJcbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXHJcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XHJcbiAgICAgICAgeSA9IHN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcclxuICAgICAgICB6ID0gc3RhY2sucG9wKCk7XHJcbiAgICAgICAgZmVhdHVyZXMgPSBzdGFjay5wb3AoKTtcclxuXHJcbiAgICAgICAgdmFyIHoyID0gMSA8PCB6LFxyXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXHJcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXTtcclxuXHJcbiAgICAgICAgaWYgKCF0aWxlKSB7XHJcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcclxuXHJcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHosIHgsIHksIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLnRpbGVDb29yZHMucHVzaCh7ejogeiwgeDogeCwgeTogeX0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgnY3JlYXRpb24nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0c1trZXldID0gKHRoaXMuc3RhdHNba2V5XSB8fCAwKSArIDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xyXG4gICAgICAgIHRpbGUuc291cmNlID0gZmVhdHVyZXM7XHJcblxyXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXHJcbiAgICAgICAgaWYgKCFjeikge1xyXG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXHJcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgd2UgcmVhY2hlZCBiYXNlIHpvb20gb3Igb3VyIHRhcmdldCB0aWxlIHpvb21cclxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiBpdCdzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgdGFyZ2V0IHRpbGVcclxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xyXG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcclxuICAgICAgICB0aWxlLnNvdXJjZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XHJcblxyXG4gICAgICAgIC8vIHZhbHVlcyB3ZSdsbCB1c2UgZm9yIGNsaXBwaW5nXHJcbiAgICAgICAgdmFyIGsxID0gMC41ICogb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCxcclxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcclxuICAgICAgICAgICAgazMgPSAwLjUgKyBrMSxcclxuICAgICAgICAgICAgazQgPSAxICsgazEsXHJcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcclxuXHJcbiAgICAgICAgdGwgPSBibCA9IHRyID0gYnIgPSBudWxsO1xyXG5cclxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4IC0gazEsIHggKyBrMywgMCwgdGlsZS5taW5YLCB0aWxlLm1heFgsIG9wdGlvbnMpO1xyXG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgejIsIHggKyBrMiwgeCArIGs0LCAwLCB0aWxlLm1pblgsIHRpbGUubWF4WCwgb3B0aW9ucyk7XHJcbiAgICAgICAgZmVhdHVyZXMgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAobGVmdCkge1xyXG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgbGVmdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmlnaHQpIHtcclxuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgcmlnaHQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdjbGlwcGluZycpO1xyXG5cclxuICAgICAgICBzdGFjay5wdXNoKHRsIHx8IFtdLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XHJcbiAgICAgICAgc3RhY2sucHVzaChibCB8fCBbXSwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIgKyAxKTtcclxuICAgICAgICBzdGFjay5wdXNoKHRyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XHJcbiAgICAgICAgc3RhY2sucHVzaChiciB8fCBbXSwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcclxuICAgIH1cclxufTtcclxuXHJcbkdlb0pTT05WVC5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uICh6LCB4LCB5KSB7XHJcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcclxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcclxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XHJcblxyXG4gICAgaWYgKHogPCAwIHx8IHogPiAyNCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgdmFyIHoyID0gMSA8PCB6O1xyXG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXHJcblxyXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcclxuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KTtcclxuXHJcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcclxuXHJcbiAgICB2YXIgejAgPSB6LFxyXG4gICAgICAgIHgwID0geCxcclxuICAgICAgICB5MCA9IHksXHJcbiAgICAgICAgcGFyZW50O1xyXG5cclxuICAgIHdoaWxlICghcGFyZW50ICYmIHowID4gMCkge1xyXG4gICAgICAgIHowLS07XHJcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XHJcbiAgICAgICAgeTAgPSBNYXRoLmZsb29yKHkwIC8gMik7XHJcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LnNvdXJjZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gaWYgd2UgZm91bmQgYSBwYXJlbnQgdGlsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBnZW9tZXRyeSwgd2UgY2FuIGRyaWxsIGRvd24gZnJvbSBpdFxyXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2ZvdW5kIHBhcmVudCB0aWxlIHolZC0lZC0lZCcsIHowLCB4MCwgeTApO1xyXG5cclxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnZHJpbGxpbmcgZG93bicpO1xyXG4gICAgdGhpcy5zcGxpdFRpbGUocGFyZW50LnNvdXJjZSwgejAsIHgwLCB5MCwgeiwgeCwgeSk7XHJcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50aWxlc1tpZF0gPyB0cmFuc2Zvcm0odGhpcy50aWxlc1tpZF0sIGV4dGVudCkgOiBudWxsO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gdG9JRCh6LCB4LCB5KSB7XHJcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcclxuICAgIGZvciAodmFyIGkgaW4gc3JjKSBkZXN0W2ldID0gc3JjW2ldO1xyXG4gICAgcmV0dXJuIGRlc3Q7XHJcbn1cclxuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7Z2V0SlNPTn0gZnJvbSAnLi4vdXRpbC9hamF4JztcclxuXHJcbmltcG9ydCB7UmVxdWVzdFBlcmZvcm1hbmNlfSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlJztcclxuaW1wb3J0IHJld2luZCBmcm9tICdAbWFwYm94L2dlb2pzb24tcmV3aW5kJztcclxuaW1wb3J0IEdlb0pTT05XcmFwcGVyIGZyb20gJy4vZ2VvanNvbl93cmFwcGVyJztcclxuaW1wb3J0IHZ0cGJmIGZyb20gJ3Z0LXBiZic7XHJcbmltcG9ydCBTdXBlcmNsdXN0ZXIgZnJvbSAnLi4vXy9zdXBlcmNsdXN0ZXInO1xyXG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJy4uL18vZ2VvanNvbi12dC9zcmMvaW5kZXgnO1xyXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XHJcbmltcG9ydCBWZWN0b3JUaWxlV29ya2VyU291cmNlIGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZSc7XHJcbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uJztcclxuXHJcbmltcG9ydCB0eXBlIHtcclxuICAgIFdvcmtlclRpbGVQYXJhbWV0ZXJzLFxyXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxyXG59IGZyb20gJy4uL3NvdXJjZS93b3JrZXJfc291cmNlJztcclxuXHJcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3InO1xyXG5pbXBvcnQgdHlwZSBTdHlsZUxheWVySW5kZXggZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXgnO1xyXG5cclxuaW1wb3J0IHR5cGUge0xvYWRWZWN0b3JEYXRhQ2FsbGJhY2t9IGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZSc7XHJcbmltcG9ydCB0eXBlIHtSZXF1ZXN0UGFyYW1ldGVycywgUmVzcG9uc2VDYWxsYmFja30gZnJvbSAnLi4vdXRpbC9hamF4JztcclxuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XHJcbmltcG9ydCB0eXBlIHtHZW9KU09ORmVhdHVyZX0gZnJvbSAnQG1hcGJveC9nZW9qc29uLXR5cGVzJztcclxuXHJcbmV4cG9ydCB0eXBlIExvYWRHZW9KU09OUGFyYW1ldGVycyA9IHtcclxuICAgIHJlcXVlc3Q/OiBSZXF1ZXN0UGFyYW1ldGVycyxcclxuICAgIGRhdGE/OiBzdHJpbmcsXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIGNsdXN0ZXI6IGJvb2xlYW4sXHJcbiAgICBzdXBlcmNsdXN0ZXJPcHRpb25zPzogT2JqZWN0LFxyXG4gICAgZ2VvanNvblZ0T3B0aW9ucz86IE9iamVjdCxcclxuICAgIGNsdXN0ZXJQcm9wZXJ0aWVzPzogT2JqZWN0LFxyXG4gICAgZmlsdGVyPzogQXJyYXk8bWl4ZWQ+XHJcbn07XHJcblxyXG5leHBvcnQgdHlwZSBMb2FkR2VvSlNPTiA9IChwYXJhbXM6IExvYWRHZW9KU09OUGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8T2JqZWN0PikgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2VvSlNPTkluZGV4IHtcclxuICAgIGdldFRpbGUoejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IE9iamVjdDtcclxuXHJcbiAgICAvLyBzdXBlcmNsdXN0ZXIgbWV0aG9kc1xyXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkOiBudW1iZXIpOiBudW1iZXI7XHJcbiAgICBnZXRDaGlsZHJlbihjbHVzdGVySWQ6IG51bWJlcik6IEFycmF5PEdlb0pTT05GZWF0dXJlPjtcclxuICAgIGdldExlYXZlcyhjbHVzdGVySWQ6IG51bWJlciwgbGltaXQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpOiBBcnJheTxHZW9KU09ORmVhdHVyZT47XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxvYWRHZW9KU09OVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjaykge1xyXG4gICAgY29uc3QgY2Fub25pY2FsID0gcGFyYW1zLnRpbGVJRC5jYW5vbmljYWw7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9nZW9KU09OSW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbnVsbCk7ICAvLyB3ZSBjb3VsZG4ndCBsb2FkIHRoZSBmaWxlXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ2VvSlNPTlRpbGUgPSB0aGlzLl9nZW9KU09OSW5kZXguZ2V0VGlsZShjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55KTtcclxuICAgIGlmICghZ2VvSlNPTlRpbGUpIHtcclxuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbnVsbCk7IC8vIG5vdGhpbmcgaW4gdGhlIGdpdmVuIHRpbGVcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBnZW9qc29uV3JhcHBlciA9IG5ldyBHZW9KU09OV3JhcHBlcihnZW9KU09OVGlsZS5mZWF0dXJlcyk7XHJcblxyXG4gICAgLy8gRW5jb2RlIHRoZSBnZW9qc29uLXZ0IHRpbGUgaW50byBiaW5hcnkgdmVjdG9yIHRpbGUgZm9ybS4gIFRoaXNcclxuICAgIC8vIGlzIGEgY29udmVuaWVuY2UgdGhhdCBhbGxvd3MgYEZlYXR1cmVJbmRleGAgdG8gb3BlcmF0ZSB0aGUgc2FtZSB3YXlcclxuICAgIC8vIGFjcm9zcyBgVmVjdG9yVGlsZVNvdXJjZWAgYW5kIGBHZW9KU09OU291cmNlYCBkYXRhLlxyXG4gICAgbGV0IHBiZiA9IHZ0cGJmKGdlb2pzb25XcmFwcGVyKTtcclxuICAgIGlmIChwYmYuYnl0ZU9mZnNldCAhPT0gMCB8fCBwYmYuYnl0ZUxlbmd0aCAhPT0gcGJmLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoIG5vZGUgQnVmZmVyIChodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3BiZi9pc3N1ZXMvMzUpXHJcbiAgICAgICAgcGJmID0gbmV3IFVpbnQ4QXJyYXkocGJmKTtcclxuICAgIH1cclxuXHJcbiAgICBjYWxsYmFjayhudWxsLCB7XHJcbiAgICAgICAgdmVjdG9yVGlsZTogZ2VvanNvbldyYXBwZXIsXHJcbiAgICAgICAgcmF3RGF0YTogcGJmLmJ1ZmZlclxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFNvdXJjZVN0YXRlID1cclxuICAgIHwgJ0lkbGUnICAgICAgICAgICAgLy8gU291cmNlIGVtcHR5IG9yIGRhdGEgbG9hZGVkXHJcbiAgICB8ICdDb2FsZXNjaW5nJyAgICAgIC8vIERhdGEgZmluaXNoZWQgbG9hZGluZywgYnV0IGRpc2NhcmQgJ2xvYWREYXRhJyBtZXNzYWdlcyB1bnRpbCByZWNlaXZpbmcgJ2NvYWxlc2NlZCdcclxuICAgIHwgJ05lZWRzTG9hZERhdGEnOyAgLy8gJ2xvYWREYXRhJyByZWNlaXZlZCB3aGlsZSBjb2FsZXNjaW5nLCB0cmlnZ2VyIG9uZSBtb3JlICdsb2FkRGF0YScgb24gcmVjZWl2aW5nICdjb2FsZXNjZWQnXHJcblxyXG4vKipcclxuICogVGhlIHtAbGluayBXb3JrZXJTb3VyY2V9IGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMge0BsaW5rIEdlb0pTT05Tb3VyY2V9LlxyXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGVhc2lseSByZXVzZWQgdG8gc3VwcG9ydCBjdXN0b20gc291cmNlIHR5cGVzXHJcbiAqIGZvciBkYXRhIGZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkL2NvbnZlcnRlZCBpbnRvIGFuIGluLW1lbW9yeSBHZW9KU09OXHJcbiAqIHJlcHJlc2VudGF0aW9uLiAgVG8gZG8gc28sIGNyZWF0ZSBpdCB3aXRoXHJcbiAqIGBuZXcgR2VvSlNPTldvcmtlclNvdXJjZShhY3RvciwgbGF5ZXJJbmRleCwgY3VzdG9tTG9hZEdlb0pTT05GdW5jdGlvbilgLlxyXG4gKiBGb3IgYSBmdWxsIGV4YW1wbGUsIHNlZSBbbWFwYm94LWdsLXRvcG9qc29uXShodHRwczovL2dpdGh1Yi5jb20vZGV2ZWxvcG1lbnRzZWVkL21hcGJveC1nbC10b3BvanNvbikuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jbGFzcyBHZW9KU09OV29ya2VyU291cmNlIGV4dGVuZHMgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSB7XHJcbiAgICBsb2FkR2VvSlNPTjogTG9hZEdlb0pTT047XHJcbiAgICBfc3RhdGU6IFNvdXJjZVN0YXRlO1xyXG4gICAgX3BlbmRpbmdDYWxsYmFjazogQ2FsbGJhY2s8e1xyXG4gICAgICAgIHJlc291cmNlVGltaW5nPzoge1tfOiBzdHJpbmddOiBBcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPn0sXHJcbiAgICAgICAgYWJhbmRvbmVkPzogYm9vbGVhbiB9PjtcclxuICAgIF9wZW5kaW5nTG9hZERhdGFQYXJhbXM6IExvYWRHZW9KU09OUGFyYW1ldGVycztcclxuICAgIF9nZW9KU09OSW5kZXg6IEdlb0pTT05JbmRleFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIFtsb2FkR2VvSlNPTl0gT3B0aW9uYWwgbWV0aG9kIGZvciBjdXN0b20gbG9hZGluZy9wYXJzaW5nIG9mXHJcbiAgICAgKiBHZW9KU09OIGJhc2VkIG9uIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIG1haW4tdGhyZWFkIFNvdXJjZS5cclxuICAgICAqIFNlZSB7QGxpbmsgR2VvSlNPTldvcmtlclNvdXJjZSNsb2FkR2VvSlNPTn0uXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihhY3RvcjogQWN0b3IsIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleCwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBsb2FkR2VvSlNPTjogP0xvYWRHZW9KU09OLCBwcm9qY3Rpb24pIHtcclxuICAgICAgICBzdXBlcihhY3RvciwgbGF5ZXJJbmRleCwgYXZhaWxhYmxlSW1hZ2VzLCBsb2FkR2VvSlNPTlRpbGUpO1xyXG4gICAgICAgIGlmIChsb2FkR2VvSlNPTikge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRHZW9KU09OID0gbG9hZEdlb0pTT047XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvamN0aW9uID0gcHJvamN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2hlcyAoaWYgYXBwcm9wcmlhdGUpLCBwYXJzZXMsIGFuZCBpbmRleCBnZW9qc29uIGRhdGEgaW50byB0aWxlcy4gVGhpc1xyXG4gICAgICogcHJlcGFyYXRvcnkgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgR2VvSlNPTldvcmtlclNvdXJjZSNsb2FkVGlsZX1cclxuICAgICAqIGNhbiBjb3JyZWN0bHkgc2VydmUgdXAgdGlsZXMuXHJcbiAgICAgKlxyXG4gICAgICogRGVmZXJzIHRvIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRHZW9KU09OfSBmb3IgdGhlIGZldGNoaW5nL3BhcnNpbmcsXHJcbiAgICAgKiBleHBlY3RpbmcgYGNhbGxiYWNrKGVycm9yLCBkYXRhKWAgdG8gYmUgY2FsbGVkIHdpdGggZWl0aGVyIGFuIGVycm9yIG9yIGFcclxuICAgICAqIHBhcnNlZCBHZW9KU09OIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBXaGVuIGBsb2FkRGF0YWAgcmVxdWVzdHMgY29tZSBpbiBmYXN0ZXIgdGhhbiB0aGV5IGNhbiBiZSBwcm9jZXNzZWQsXHJcbiAgICAgKiB0aGV5IGFyZSBjb2FsZXNjZWQgaW50byBhIHNpbmdsZSByZXF1ZXN0IHVzaW5nIHRoZSBsYXRlc3QgZGF0YS5cclxuICAgICAqIFNlZSB7QGxpbmsgR2VvSlNPTldvcmtlclNvdXJjZSNjb2FsZXNjZX1cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGxvYWREYXRhKHBhcmFtczogTG9hZEdlb0pTT05QYXJhbWV0ZXJzLCBjYWxsYmFjazogQ2FsbGJhY2s8e1xyXG4gICAgICAgIHJlc291cmNlVGltaW5nPzoge1tfOiBzdHJpbmddOiBBcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPn0sXHJcbiAgICAgICAgYWJhbmRvbmVkPzogYm9vbGVhbiB9Pikge1xyXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgLy8gVGVsbCB0aGUgZm9yZWdyb3VuZCB0aGUgcHJldmlvdXMgY2FsbCBoYXMgYmVlbiBhYmFuZG9uZWRcclxuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0NhbGxiYWNrKG51bGwsIHthYmFuZG9uZWQ6IHRydWV9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0NhbGxiYWNrID0gY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0xvYWREYXRhUGFyYW1zID0gcGFyYW1zO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fc3RhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgIT09ICdJZGxlJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdOZWVkc0xvYWREYXRhJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdDb2FsZXNjaW5nJztcclxuICAgICAgICAgICAgdGhpcy5fbG9hZERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbjogY2FsbGVkIGRpcmVjdGx5IGJ5IGBsb2FkRGF0YWBcclxuICAgICAqIG9yIGJ5IGBjb2FsZXNjZWAgdXNpbmcgc3RvcmVkIHBhcmFtZXRlcnMuXHJcbiAgICAgKi9cclxuICAgIF9sb2FkRGF0YSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3BlbmRpbmdDYWxsYmFjayB8fCAhdGhpcy5fcGVuZGluZ0xvYWREYXRhUGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2s7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5fcGVuZGluZ0xvYWREYXRhUGFyYW1zO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2s7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdMb2FkRGF0YVBhcmFtcztcclxuXHJcbiAgICAgICAgY29uc3QgcGVyZiA9IChwYXJhbXMgJiYgcGFyYW1zLnJlcXVlc3QgJiYgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nKSA/XHJcbiAgICAgICAgICAgIG5ldyBSZXF1ZXN0UGVyZm9ybWFuY2UocGFyYW1zLnJlcXVlc3QpIDogZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMubG9hZEdlb0pTT04ocGFyYW1zLCAoZXJyOiA/RXJyb3IsIGRhdGE6ID9PYmplY3QpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVyciB8fCAhZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke3BhcmFtcy5zb3VyY2V9JyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5gKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXdpbmQoZGF0YSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnN1cGVyY2x1c3Rlck9wdGlvbnMuY3VzdG9tcHJqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRTY3JpcHRzKHBhcmFtcy5zdXBlcmNsdXN0ZXJPcHRpb25zLmN1c3RvbXByaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSBjcmVhdGVFeHByZXNzaW9uKHBhcmFtcy5maWx0ZXIsIHt0eXBlOiAnYm9vbGVhbicsICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJywgb3ZlcnJpZGFibGU6IGZhbHNlLCB0cmFuc2l0aW9uOiBmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGlsZWQucmVzdWx0ID09PSAnZXJyb3InKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IGRhdGEuZmVhdHVyZXMuZmlsdGVyKGZlYXR1cmUgPT4gY29tcGlsZWQudmFsdWUuZXZhbHVhdGUoe3pvb206IDB9LCBmZWF0dXJlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB7dHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJywgZmVhdHVyZXN9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcCA9IHBhcmFtcy5nZW9qc29uVnRPcHRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgIG9wLnByb2o0UHJvamVjdGlvbiA9IHRoaXMucHJvamN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1cGVyY2x1c3Rlcm9wID0gcGFyYW1zLnN1cGVyY2x1c3Rlck9wdGlvbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VwZXJjbHVzdGVyb3AucHJvajRQcm9qZWN0aW9uID0gdGhpcy5wcm9qY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VvSlNPTkluZGV4ID0gcGFyYW1zLmNsdXN0ZXIgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3VwZXJjbHVzdGVyKGdldFN1cGVyY2x1c3Rlck9wdGlvbnMocGFyYW1zKSkubG9hZChkYXRhLmZlYXR1cmVzKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb2pzb252dChkYXRhLCBvcCk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBlcmYpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZVRpbWluZ0RhdGEgPSBwZXJmLmZpbmlzaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgbmVjZXNzYXJ5IHRvIGV2YWwgdGhlIHJlc3VsdCBvZiBnZXRFbnRyaWVzQnlOYW1lKCkgaGVyZSB2aWEgcGFyc2Uvc3RyaW5naWZ5XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZSBldmFsdWF0aW9uIGluIHRoZSBtYWluIHRocmVhZCBjYXVzZXMgVHlwZUVycm9yOiBpbGxlZ2FsIGludm9jYXRpb25cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VUaW1pbmdEYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZVRpbWluZyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzb3VyY2VUaW1pbmdbcGFyYW1zLnNvdXJjZV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc291cmNlVGltaW5nRGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoaWxlIHByb2Nlc3NpbmcgYGxvYWREYXRhYCwgd2UgY29hbGVzY2UgYWxsIGZ1cnRoZXJcclxuICAgICAqIGBsb2FkRGF0YWAgbWVzc2FnZXMgaW50byBhIHNpbmdsZSBjYWxsIHRvIF9sb2FkRGF0YVxyXG4gICAgICogdGhhdCB3aWxsIGhhcHBlbiBvbmNlIHdlJ3ZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlXHJcbiAgICAgKiBmaXJzdCBtZXNzYWdlLiB7QGxpbmsgR2VvSlNPTlNvdXJjZSNfdXBkYXRlV29ya2VyRGF0YX1cclxuICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHVzIHRoZSBgY29hbGVzY2VgIG1lc3NhZ2VcclxuICAgICAqIGF0IHRoZSB0aW1lIGl0IHJlY2VpdmVzIGEgcmVzcG9uc2UgZnJvbSBgbG9hZERhdGFgXHJcbiAgICAgKlxyXG4gICAgICogICAgICAgICAgU3RhdGU6IElkbGVcclxuICAgICAqICAgICAgICAgIOKGkSAgICAgICAgICB8XHJcbiAgICAgKiAgICAgJ2NvYWxlc2NlJyAgICdsb2FkRGF0YSdcclxuICAgICAqICAgICAgICAgIHwgICAgICh0cmlnZ2VycyBsb2FkKVxyXG4gICAgICogICAgICAgICAgfCAgICAgICAgICDihpNcclxuICAgICAqICAgICAgICBTdGF0ZTogQ29hbGVzY2luZ1xyXG4gICAgICogICAgICAgICAg4oaRICAgICAgICAgIHxcclxuICAgICAqICAgKHRyaWdnZXJzIGxvYWQpICAgfFxyXG4gICAgICogICAgICdjb2FsZXNjZScgICAnbG9hZERhdGEnXHJcbiAgICAgKiAgICAgICAgICB8ICAgICAgICAgIOKGk1xyXG4gICAgICogICAgICAgIFN0YXRlOiBOZWVkc0xvYWREYXRhXHJcbiAgICAgKi9cclxuICAgIGNvYWxlc2NlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ0NvYWxlc2NpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ0lkbGUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhdGUgPT09ICdOZWVkc0xvYWREYXRhJykge1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdDb2FsZXNjaW5nJztcclxuICAgICAgICAgICAgdGhpcy5fbG9hZERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNyZWxvYWRUaWxlfS5cclxuICAgICpcclxuICAgICogSWYgdGhlIHRpbGUgaXMgbG9hZGVkLCB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiBWZWN0b3JUaWxlV29ya2VyU291cmNlLlxyXG4gICAgKiBPdGhlcndpc2UsIHN1Y2ggYXMgYWZ0ZXIgYSBzZXREYXRhKCkgY2FsbCwgd2UgbG9hZCB0aGUgdGlsZSBmcmVzaC5cclxuICAgICpcclxuICAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAgKiBAcGFyYW0gcGFyYW1zLnVpZCBUaGUgVUlEIGZvciB0aGlzIHRpbGUuXHJcbiAgICAqIEBwcml2YXRlXHJcbiAgICAqL1xyXG4gICAgcmVsb2FkVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXHJcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XHJcblxyXG4gICAgICAgIGlmIChsb2FkZWQgJiYgbG9hZGVkW3VpZF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlbG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggYW5kIHBhcnNlIEdlb0pTT04gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbXMuICBDYWxscyBgY2FsbGJhY2tgXHJcbiAgICAgKiB3aXRoIGAoZXJyLCBkYXRhKWAsIHdoZXJlIGBkYXRhYCBpcyBhIHBhcnNlZCBHZW9KU09OIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBHZW9KU09OIGlzIGxvYWRlZCBhbmQgcGFyc2VkIGZyb20gYHBhcmFtcy51cmxgIGlmIGl0IGV4aXN0cywgb3IgZWxzZVxyXG4gICAgICogZXhwZWN0ZWQgYXMgYSBsaXRlcmFsIChzdHJpbmcgb3Igb2JqZWN0KSBgcGFyYW1zLmRhdGFgLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwYXJhbXNcclxuICAgICAqIEBwYXJhbSBbcGFyYW1zLnVybF0gQSBVUkwgdG8gdGhlIHJlbW90ZSBHZW9KU09OIGRhdGEuXHJcbiAgICAgKiBAcGFyYW0gW3BhcmFtcy5kYXRhXSBMaXRlcmFsIEdlb0pTT04gZGF0YS4gTXVzdCBiZSBwcm92aWRlZCBpZiBgcGFyYW1zLnVybGAgaXMgbm90LlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgbG9hZEdlb0pTT04ocGFyYW1zOiBMb2FkR2VvSlNPTlBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pIHtcclxuICAgICAgICAvLyBCZWNhdXNlIG9mIHNhbWUgb3JpZ2luIGlzc3VlcywgdXJscyBtdXN0IGVpdGhlciBpbmNsdWRlIGFuIGV4cGxpY2l0XHJcbiAgICAgICAgLy8gb3JpZ2luIG9yIGFic29sdXRlIHBhdGguXHJcbiAgICAgICAgLy8gaWU6IC9mb28vYmFyLmpzb24gb3IgaHR0cDovL2V4YW1wbGUuY29tL2Jhci5qc29uXHJcbiAgICAgICAgLy8gYnV0IG5vdCAuLi9mb28vYmFyLmpzb25cclxuICAgICAgICBpZiAocGFyYW1zLnJlcXVlc3QpIHtcclxuICAgICAgICAgICAgZ2V0SlNPTihwYXJhbXMucmVxdWVzdCwgY2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIEpTT04ucGFyc2UocGFyYW1zLmRhdGEpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW5wdXQgZGF0YSBnaXZlbiB0byAnJHtwYXJhbXMuc291cmNlfScgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW5wdXQgZGF0YSBnaXZlbiB0byAnJHtwYXJhbXMuc291cmNlfScgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVTb3VyY2UocGFyYW1zOiB7c291cmNlOiBzdHJpbmd9LCBjYWxsYmFjazogQ2FsbGJhY2s8bWl4ZWQ+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAvLyBEb24ndCBsZWFrIGNhbGxiYWNrc1xyXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2sobnVsbCwge2FiYW5kb25lZDogdHJ1ZX0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tKHBhcmFtczoge2NsdXN0ZXJJZDogbnVtYmVyfSwgY2FsbGJhY2s6IENhbGxiYWNrPG51bWJlcj4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLl9nZW9KU09OSW5kZXguZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20ocGFyYW1zLmNsdXN0ZXJJZCkpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldENsdXN0ZXJDaGlsZHJlbihwYXJhbXM6IHtjbHVzdGVySWQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhpcy5fZ2VvSlNPTkluZGV4LmdldENoaWxkcmVuKHBhcmFtcy5jbHVzdGVySWQpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDbHVzdGVyTGVhdmVzKHBhcmFtczoge2NsdXN0ZXJJZDogbnVtYmVyLCBsaW1pdDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhpcy5fZ2VvSlNPTkluZGV4LmdldExlYXZlcyhwYXJhbXMuY2x1c3RlcklkLCBwYXJhbXMubGltaXQsIHBhcmFtcy5vZmZzZXQpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U3VwZXJjbHVzdGVyT3B0aW9ucyh7c3VwZXJjbHVzdGVyT3B0aW9ucywgY2x1c3RlclByb3BlcnRpZXN9KSB7XHJcbiAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzIHx8ICFzdXBlcmNsdXN0ZXJPcHRpb25zKSByZXR1cm4gc3VwZXJjbHVzdGVyT3B0aW9ucztcclxuXHJcbiAgICBjb25zdCBtYXBFeHByZXNzaW9ucyA9IHt9O1xyXG4gICAgY29uc3QgcmVkdWNlRXhwcmVzc2lvbnMgPSB7fTtcclxuICAgIGNvbnN0IGdsb2JhbHMgPSB7YWNjdW11bGF0ZWQ6IG51bGwsIHpvb206IDB9O1xyXG4gICAgY29uc3QgZmVhdHVyZSA9IHtwcm9wZXJ0aWVzOiBudWxsfTtcclxuICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyUHJvcGVydGllcyk7XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgcHJvcGVydHlOYW1lcykge1xyXG4gICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcmVzc2lvbl0gPSBjbHVzdGVyUHJvcGVydGllc1trZXldO1xyXG5cclxuICAgICAgICBjb25zdCBtYXBFeHByZXNzaW9uUGFyc2VkID0gY3JlYXRlRXhwcmVzc2lvbihtYXBFeHByZXNzaW9uKTtcclxuICAgICAgICBjb25zdCByZWR1Y2VFeHByZXNzaW9uUGFyc2VkID0gY3JlYXRlRXhwcmVzc2lvbihcclxuICAgICAgICAgICAgdHlwZW9mIG9wZXJhdG9yID09PSAnc3RyaW5nJyA/IFtvcGVyYXRvciwgWydhY2N1bXVsYXRlZCddLCBbJ2dldCcsIGtleV1dIDogb3BlcmF0b3IpO1xyXG5cclxuICAgICAgICBhc3NlcnQobWFwRXhwcmVzc2lvblBhcnNlZC5yZXN1bHQgPT09ICdzdWNjZXNzJyk7XHJcbiAgICAgICAgYXNzZXJ0KHJlZHVjZUV4cHJlc3Npb25QYXJzZWQucmVzdWx0ID09PSAnc3VjY2VzcycpO1xyXG5cclxuICAgICAgICBtYXBFeHByZXNzaW9uc1trZXldID0gbWFwRXhwcmVzc2lvblBhcnNlZC52YWx1ZTtcclxuICAgICAgICByZWR1Y2VFeHByZXNzaW9uc1trZXldID0gcmVkdWNlRXhwcmVzc2lvblBhcnNlZC52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzdXBlcmNsdXN0ZXJPcHRpb25zLm1hcCA9IChwb2ludFByb3BlcnRpZXMpID0+IHtcclxuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMgPSBwb2ludFByb3BlcnRpZXM7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHByb3BlcnR5TmFtZXMpIHtcclxuICAgICAgICAgICAgcHJvcGVydGllc1trZXldID0gbWFwRXhwcmVzc2lvbnNba2V5XS5ldmFsdWF0ZShnbG9iYWxzLCBmZWF0dXJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XHJcbiAgICB9O1xyXG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucy5yZWR1Y2UgPSAoYWNjdW11bGF0ZWQsIGNsdXN0ZXJQcm9wZXJ0aWVzKSA9PiB7XHJcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzID0gY2x1c3RlclByb3BlcnRpZXM7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcHJvcGVydHlOYW1lcykge1xyXG4gICAgICAgICAgICBnbG9iYWxzLmFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWRba2V5XTtcclxuICAgICAgICAgICAgYWNjdW11bGF0ZWRba2V5XSA9IHJlZHVjZUV4cHJlc3Npb25zW2tleV0uZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gc3VwZXJjbHVzdGVyT3B0aW9ucztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgR2VvSlNPTldvcmtlclNvdXJjZTtcclxuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yJztcclxuXHJcbmltcG9ydCBTdHlsZUxheWVySW5kZXggZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXgnO1xyXG5pbXBvcnQgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSBmcm9tICcuL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UnO1xyXG5pbXBvcnQgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSBmcm9tICcuL3Jhc3Rlcl9kZW1fdGlsZV93b3JrZXJfc291cmNlJztcclxuaW1wb3J0IEdlb0pTT05Xb3JrZXJTb3VyY2UgZnJvbSAnLi9nZW9qc29uX3dvcmtlcl9zb3VyY2UnO1xyXG5pbXBvcnQge3Byb2o0fSBmcm9tICcuLi91dGlsL21hcGJveCc7XHJcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcclxuaW1wb3J0IHtwbHVnaW4gYXMgZ2xvYmFsUlRMVGV4dFBsdWdpbn0gZnJvbSAnLi9ydGxfdGV4dF9wbHVnaW4nO1xyXG5pbXBvcnQge2VuZm9yY2VDYWNoZVNpemVMaW1pdH0gZnJvbSAnLi4vdXRpbC90aWxlX3JlcXVlc3RfY2FjaGUnO1xyXG5cclxuaW1wb3J0IHR5cGUge1xyXG4gICAgV29ya2VyU291cmNlLFxyXG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXHJcbiAgICBXb3JrZXJERU1UaWxlUGFyYW1ldGVycyxcclxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcclxuICAgIFdvcmtlckRFTVRpbGVDYWxsYmFjayxcclxuICAgIFRpbGVQYXJhbWV0ZXJzXHJcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UnO1xyXG5cclxuaW1wb3J0IHR5cGUge1dvcmtlckdsb2JhbFNjb3BlSW50ZXJmYWNlfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXInO1xyXG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcclxuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XHJcbmltcG9ydCB0eXBlIHtQbHVnaW5TdGF0ZX0gZnJvbSAnLi9ydGxfdGV4dF9wbHVnaW4nO1xyXG5cclxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb3JrZXIge1xyXG4gICAgc2VsZjogV29ya2VyR2xvYmFsU2NvcGVJbnRlcmZhY2U7XHJcbiAgICBhY3RvcjogQWN0b3I7XHJcbiAgICBsYXllckluZGV4ZXM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllckluZGV4IH07XHJcbiAgICBhdmFpbGFibGVJbWFnZXM6IHtbXzogc3RyaW5nXTogQXJyYXk8c3RyaW5nPiB9O1xyXG4gICAgd29ya2VyU291cmNlVHlwZXM6IHtbXzogc3RyaW5nXTogQ2xhc3M8V29ya2VyU291cmNlPiB9O1xyXG4gICAgd29ya2VyU291cmNlczoge1tfOiBzdHJpbmddOiB7W186IHN0cmluZ106IHtbXzogc3RyaW5nXTogV29ya2VyU291cmNlIH0gfSB9O1xyXG4gICAgZGVtV29ya2VyU291cmNlczoge1tfOiBzdHJpbmddOiB7W186IHN0cmluZ106IFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2UgfSB9O1xyXG4gICAgcmVmZXJyZXI6ID9zdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2VsZjogV29ya2VyR2xvYmFsU2NvcGVJbnRlcmZhY2UpIHtcclxuICAgICAgICB0aGlzLnNlbGYgPSBzZWxmO1xyXG4gICAgICAgIHRoaXMuYWN0b3IgPSBuZXcgQWN0b3Ioc2VsZiwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5ZXJJbmRleGVzID0ge307XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VUeXBlcyA9IHtcclxuICAgICAgICAgICAgdmVjdG9yOiBWZWN0b3JUaWxlV29ya2VyU291cmNlLFxyXG4gICAgICAgICAgICBnZW9qc29uOiBHZW9KU09OV29ya2VyU291cmNlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gW21hcElkXVtzb3VyY2VUeXBlXVtzb3VyY2VOYW1lXSA9PiB3b3JrZXIgc291cmNlIGluc3RhbmNlXHJcbiAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzID0ge307XHJcbiAgICAgICAgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZi5yZWdpc3RlcldvcmtlclNvdXJjZSA9IChuYW1lOiBzdHJpbmcsIFdvcmtlclNvdXJjZTogQ2xhc3M8V29ya2VyU291cmNlPikgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXb3JrZXIgc291cmNlIHdpdGggbmFtZSBcIiR7bmFtZX1cIiBhbHJlYWR5IHJlZ2lzdGVyZWQuYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSA9IFdvcmtlclNvdXJjZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBUaGlzIGlzIGludm9rZWQgYnkgdGhlIFJUTCB0ZXh0IHBsdWdpbiB3aGVuIHRoZSBkb3dubG9hZCB2aWEgdGhlIGBpbXBvcnRTY3JpcHRzYCBjYWxsIGhhcyBmaW5pc2hlZCwgYW5kIHRoZSBjb2RlIGhhcyBiZWVuIHBhcnNlZC5cclxuICAgICAgICB0aGlzLnNlbGYucmVnaXN0ZXJSVExUZXh0UGx1Z2luID0gKHJ0bFRleHRQbHVnaW46IHthcHBseUFyYWJpY1NoYXBpbmc6IEZ1bmN0aW9uLCBwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ6IEZ1bmN0aW9uLCBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ/OiBGdW5jdGlvbn0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGdsb2JhbFJUTFRleHRQbHVnaW4uaXNQYXJzZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSVEwgdGV4dCBwbHVnaW4gYWxyZWFkeSByZWdpc3RlcmVkLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW5bJ2FwcGx5QXJhYmljU2hhcGluZyddID0gcnRsVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmc7XHJcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW5bJ3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCddID0gcnRsVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ7XHJcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW5bJ3Byb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dCddID0gcnRsVGV4dFBsdWdpbi5wcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRSZWZlcnJlcihtYXBJRDogc3RyaW5nLCByZWZlcnJlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9IHJlZmVycmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEltYWdlcyhtYXBJZDogc3RyaW5nLCBpbWFnZXM6IEFycmF5PHN0cmluZz4sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZUltYWdlc1ttYXBJZF0gPSBpbWFnZXM7XHJcbiAgICAgICAgZm9yIChjb25zdCB3b3JrZXJTb3VyY2UgaW4gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSkge1xyXG4gICAgICAgICAgICBjb25zdCB3cyA9IHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bd29ya2VyU291cmNlXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2UgaW4gd3MpIHtcclxuICAgICAgICAgICAgICAgIHdzW3NvdXJjZV0uYXZhaWxhYmxlSW1hZ2VzID0gaW1hZ2VzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TGF5ZXJzKG1hcElkOiBzdHJpbmcsIGxheWVyczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPiwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkucmVwbGFjZShsYXllcnMpO1xyXG4gICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGF5ZXJzKG1hcElkOiBzdHJpbmcsIHBhcmFtczoge2xheWVyczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPiwgcmVtb3ZlZElkczogQXJyYXk8c3RyaW5nPn0sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLmdldExheWVySW5kZXgobWFwSWQpLnVwZGF0ZShwYXJhbXMubGF5ZXJzLCBwYXJhbXMucmVtb3ZlZElkcyk7XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkVGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcclxuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xyXG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkubG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZERFTVRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJERU1UaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlckRFTVRpbGVDYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMuZ2V0REVNV29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMuc291cmNlKS5sb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWRUaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMgJiB7dHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xyXG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XHJcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlLCBwYXJhbXMuc291cmNlKS5yZWxvYWRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIGFib3J0VGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFRpbGVQYXJhbWV0ZXJzICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcclxuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xyXG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkuYWJvcnRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBUaWxlUGFyYW1ldGVycyAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcclxuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUsIHBhcmFtcy5zb3VyY2UpLnJlbW92ZVRpbGUocGFyYW1zLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlREVNVGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFRpbGVQYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgdGhpcy5nZXRERU1Xb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy5zb3VyY2UpLnJlbW92ZVRpbGUocGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVTb3VyY2UobWFwSWQ6IHN0cmluZywgcGFyYW1zOiB7c291cmNlOiBzdHJpbmd9ICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcclxuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xyXG4gICAgICAgIGFzc2VydChwYXJhbXMuc291cmNlKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdIHx8XHJcbiAgICAgICAgICAgICF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3BhcmFtcy50eXBlXSB8fFxyXG4gICAgICAgICAgICAhdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVtwYXJhbXMudHlwZV1bcGFyYW1zLnNvdXJjZV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVtwYXJhbXMudHlwZV1bcGFyYW1zLnNvdXJjZV07XHJcbiAgICAgICAgZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bcGFyYW1zLnR5cGVdW3BhcmFtcy5zb3VyY2VdO1xyXG5cclxuICAgICAgICBpZiAod29ya2VyLnJlbW92ZVNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVTb3VyY2UocGFyYW1zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGEge0BsaW5rIFdvcmtlclNvdXJjZX0gc2NyaXB0IGF0IHBhcmFtcy51cmwuICBUaGUgc2NyaXB0IGlzIHJ1blxyXG4gICAgICogKHVzaW5nIGltcG9ydFNjcmlwdHMpIHdpdGggYHJlZ2lzdGVyV29ya2VyU291cmNlYCBpbiBzY29wZSwgd2hpY2ggaXMgYVxyXG4gICAgICogZnVuY3Rpb24gdGFraW5nIGAobmFtZSwgd29ya2VyU291cmNlT2JqZWN0KWAuXHJcbiAgICAgKiAgQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgbG9hZFdvcmtlclNvdXJjZShtYXA6IHN0cmluZywgcGFyYW1zOiB7IHVybDogc3RyaW5nIH0sIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHBhcmFtcy51cmwpO1xyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3luY1JUTFBsdWdpblN0YXRlKG1hcDogc3RyaW5nLCBzdGF0ZTogUGx1Z2luU3RhdGUsIGNhbGxiYWNrOiBDYWxsYmFjazxib29sZWFuPikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW4uc2V0U3RhdGUoc3RhdGUpO1xyXG4gICAgICAgICAgICBjb25zdCBwbHVnaW5VUkwgPSBnbG9iYWxSVExUZXh0UGx1Z2luLmdldFBsdWdpblVSTCgpO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBnbG9iYWxSVExUZXh0UGx1Z2luLmlzTG9hZGVkKCkgJiZcclxuICAgICAgICAgICAgICAgICFnbG9iYWxSVExUZXh0UGx1Z2luLmlzUGFyc2VkKCkgJiZcclxuICAgICAgICAgICAgICAgIHBsdWdpblVSTCAhPSBudWxsIC8vIE5vdCBwb3NzaWJsZSB3aGVuIGBpc0xvYWRlZGAgaXMgdHJ1ZSwgYnV0IGtlZXBzIGZsb3cgaGFwcHlcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyhwbHVnaW5VUkwpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGUgPSBnbG9iYWxSVExUZXh0UGx1Z2luLmlzUGFyc2VkKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGNvbXBsZXRlID8gdW5kZWZpbmVkIDogbmV3IEVycm9yKGBSVEwgVGV4dCBQbHVnaW4gZmFpbGVkIHRvIGltcG9ydCBzY3JpcHRzIGZyb20gJHtwbHVnaW5VUkx9YCk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgY29tcGxldGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRBdmFpbGFibGVJbWFnZXMobWFwSWQ6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBhdmFpbGFibGVJbWFnZXMgPSB0aGlzLmF2YWlsYWJsZUltYWdlc1ttYXBJZF07XHJcblxyXG4gICAgICAgIGlmICghYXZhaWxhYmxlSW1hZ2VzKSB7XHJcbiAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF2YWlsYWJsZUltYWdlcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXllckluZGV4KG1hcElkOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbGF5ZXJJbmRleGVzID0gdGhpcy5sYXllckluZGV4ZXNbbWFwSWRdO1xyXG4gICAgICAgIGlmICghbGF5ZXJJbmRleGVzKSB7XHJcbiAgICAgICAgICAgIGxheWVySW5kZXhlcyA9IHRoaXMubGF5ZXJJbmRleGVzW21hcElkXSA9IG5ldyBTdHlsZUxheWVySW5kZXgoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxheWVySW5kZXhlcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRXb3JrZXJTb3VyY2UobWFwSWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZywgY3JzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdKVxyXG4gICAgICAgICAgICB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdID0ge307XHJcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdKVxyXG4gICAgICAgICAgICB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdID0ge307XHJcbiAgICAgICAgbGV0IGNyc0NoYW5nZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcm9qY3Rpb247XHJcbiAgICAgICAgaWYgKGNycykge1xyXG4gICAgICAgICAgICBjcnNDaGFuZ2UgPSBjcnMuX2lkICE9PSB0aGlzLl9sYXN0Q1JTSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RDUlNJZCA9IGNycy5faWQ7XHJcbiAgICAgICAgICAgIGlmIChjcnMuV0tUKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9qNC5kZWZzKGNycy5lcHNnQ29kZSwgY3JzLldLVCk7XHJcbiAgICAgICAgICAgICAgICBwcm9qY3Rpb24gPSBwcm9qNChjcnMuZXBzZ0NvZGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvamN0aW9uID0gcHJvajQoY3JzLmVwc2dDb2RlKTtcclxuICAgICAgICAgICAgfSAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdW3NvdXJjZV0pIHtcclxuICAgICAgICAgICAgLy8gdXNlIGEgd3JhcHBlZCBhY3RvciBzbyB0aGF0IHdlIGNhbiBhdHRhY2ggYSB0YXJnZXQgbWFwSWQgcGFyYW1cclxuICAgICAgICAgICAgLy8gdG8gYW55IG1lc3NhZ2VzIGludm9rZWQgYnkgdGhlIFdvcmtlclNvdXJjZVxyXG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IHtcclxuICAgICAgICAgICAgICAgIHNlbmQ6ICh0eXBlLCBkYXRhLCBjYWxsYmFjaywgbXVzdFF1ZXVlLCBzb3VyY2VJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0b3Iuc2VuZCh0eXBlLCBkYXRhLCBjYWxsYmFjaywgbWFwSWQsIG11c3RRdWV1ZSwgc291cmNlSWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdW3NvdXJjZV0gPSBuZXcgKHRoaXMud29ya2VyU291cmNlVHlwZXNbdHlwZV06IGFueSkoKGFjdG9yOiBhbnkpLCB0aGlzLmdldExheWVySW5kZXgobWFwSWQpLCB0aGlzLmdldEF2YWlsYWJsZUltYWdlcyhtYXBJZCksIG51bGwsIHByb2pjdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNyc0NoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdLnByb2pjdGlvbiA9IHByb2pjdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERFTVdvcmtlclNvdXJjZShtYXBJZDogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXSlcclxuICAgICAgICAgICAgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXSA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF1bc291cmNlXSkge1xyXG4gICAgICAgICAgICB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdW3NvdXJjZV0gPSBuZXcgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF1bc291cmNlXTtcclxuICAgIH1cclxuXHJcbiAgICBlbmZvcmNlQ2FjaGVTaXplTGltaXQobWFwSWQ6IHN0cmluZywgbGltaXQ6IG51bWJlcikge1xyXG4gICAgICAgIGVuZm9yY2VDYWNoZVNpemVMaW1pdChsaW1pdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qIGdsb2JhbCBzZWxmLCBXb3JrZXJHbG9iYWxTY29wZSAqL1xyXG5pZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmXHJcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpIHtcclxuICAgIHNlbGYud29ya2VyID0gbmV3IFdvcmtlcihzZWxmKTtcclxufVxyXG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gaXNTdXBwb3J0ZWQ7XG59IGVsc2UgaWYgKHdpbmRvdykge1xuICAgIHdpbmRvdy5tYXBib3hnbCA9IHdpbmRvdy5tYXBib3hnbCB8fCB7fTtcbiAgICB3aW5kb3cubWFwYm94Z2wuc3VwcG9ydGVkID0gaXNTdXBwb3J0ZWQ7XG4gICAgd2luZG93Lm1hcGJveGdsLm5vdFN1cHBvcnRlZFJlYXNvbiA9IG5vdFN1cHBvcnRlZFJlYXNvbjtcbn1cblxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBNYXBib3ggR0wgSlNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIFJldHVybiBgZmFsc2VgXG4gKiAgIGlmIHRoZSBwZXJmb3JtYW5jZSBvZiBNYXBib3ggR0wgSlMgd291bGQgYmUgZHJhbWF0aWNhbGx5IHdvcnNlIHRoYW5cbiAqICAgZXhwZWN0ZWQgKGkuZS4gYSBzb2Z0d2FyZSByZW5kZXJlciBpcyB3b3VsZCBiZSB1c2VkKVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdXBwb3J0ZWQob3B0aW9ucykge1xuICAgIHJldHVybiAhbm90U3VwcG9ydGVkUmVhc29uKG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBub3RTdXBwb3J0ZWRSZWFzb24ob3B0aW9ucykge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybiAnbm90IGEgYnJvd3Nlcic7XG4gICAgaWYgKCFpc0FycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNlbnQgQXJyYXkgc3VwcG9ydCc7XG4gICAgaWYgKCFpc0Z1bmN0aW9uU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEZ1bmN0aW9uIHN1cHBvcnQnO1xuICAgIGlmICghaXNPYmplY3RTdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgT2JqZWN0IHN1cHBvcnQnO1xuICAgIGlmICghaXNKU09OU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEpTT04gc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dvcmtlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCB3b3JrZXIgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IFVpbnQ4Q2xhbXBlZEFycmF5IHN1cHBvcnQnO1xuICAgIGlmICghaXNBcnJheUJ1ZmZlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCBBcnJheUJ1ZmZlciBzdXBwb3J0JztcbiAgICBpZiAoIWlzQ2FudmFzR2V0SW1hZ2VEYXRhU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IENhbnZhcy9nZXRJbWFnZURhdGEgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgV2ViR0wgc3VwcG9ydCc7XG59XG5cbmZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gaXNBcnJheVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBBcnJheS5wcm90b3R5cGUgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmV2ZXJ5ICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5tYXAgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnNvbWUgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZSAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgT2JqZWN0LmtleXMgJiZcbiAgICAgICAgT2JqZWN0LmNyZWF0ZSAmJlxuICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgJiZcbiAgICAgICAgT2JqZWN0LmlzU2VhbGVkICYmXG4gICAgICAgIE9iamVjdC5pc0Zyb3plbiAmJlxuICAgICAgICBPYmplY3QuaXNFeHRlbnNpYmxlICYmXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiZcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzICYmXG4gICAgICAgIE9iamVjdC5zZWFsICYmXG4gICAgICAgIE9iamVjdC5mcmVlemUgJiZcbiAgICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNKU09OU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnSlNPTicgaW4gd2luZG93ICYmICdwYXJzZScgaW4gSlNPTiAmJiAnc3RyaW5naWZ5JyBpbiBKU09OO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtlclN1cHBvcnRlZCgpIHtcbiAgICBpZiAoISgnV29ya2VyJyBpbiB3aW5kb3cgJiYgJ0Jsb2InIGluIHdpbmRvdyAmJiAnVVJMJyBpbiB3aW5kb3cpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFsnJ10sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgdmFyIHdvcmtlclVSTCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdmFyIHN1cHBvcnRlZDtcbiAgICB2YXIgd29ya2VyO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVUkwpO1xuICAgICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgfVxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwod29ya2VyVVJMKTtcblxuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbi8vIElFMTEgb25seSBzdXBwb3J0cyBgVWludDhDbGFtcGVkQXJyYXlgIGFzIG9mIHZlcnNpb25cbi8vIFtLQjI5Mjk0MzddKGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2VuLXVzL2tiLzI5Mjk0MzcpXG5mdW5jdGlvbiBpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnVWludDhDbGFtcGVkQXJyYXknIGluIHdpbmRvdztcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkL2lzc3Vlcy8xOVxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3O1xufVxuXG4vLyBTb21lIGJyb3dzZXJzIG9yIGJyb3dzZXIgZXh0ZW5zaW9ucyBibG9jayBhY2Nlc3MgdG8gY2FudmFzIGRhdGEgdG8gcHJldmVudCBmaW5nZXJwcmludGluZy5cbi8vIE1hcGJveCBHTCB1c2VzIHRoaXMgQVBJIHRvIGxvYWQgc3ByaXRlcyBhbmQgaW1hZ2VzIGluIGdlbmVyYWwuXG5mdW5jdGlvbiBpc0NhbnZhc0dldEltYWdlRGF0YVN1cHBvcnRlZCgpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7XG4gICAgcmV0dXJuIGltYWdlRGF0YSAmJiBpbWFnZURhdGEud2lkdGggPT09IGNhbnZhcy53aWR0aDtcbn1cblxudmFyIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZENhY2hlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB7XG5cbiAgICBpZiAoaXNXZWJHTFN1cHBvcnRlZENhY2hlW2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXNXZWJHTFN1cHBvcnRlZENhY2hlW2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRdID0gaXNXZWJHTFN1cHBvcnRlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNXZWJHTFN1cHBvcnRlZENhY2hlW2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRdO1xufVxuXG5pc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzID0ge1xuICAgIGFudGlhbGlhczogZmFsc2UsXG4gICAgYWxwaGE6IHRydWUsXG4gICAgc3RlbmNpbDogdHJ1ZSxcbiAgICBkZXB0aDogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZ2V0V2ViR0xDb250ZXh0KGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG5cbiAgICB2YXIgYXR0cmlidXRlcyA9IE9iamVjdC5jcmVhdGUoaXNTdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcyk7XG4gICAgYXR0cmlidXRlcy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDtcblxuICAgIGlmIChjYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKVxuICAgICAgICApO1xuXG4gICAgfSBlbHNlIGlmIChjYW52YXMuc3VwcG9ydHNDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjYW52YXMuc3VwcG9ydHNDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICBjYW52YXMuc3VwcG9ydHNDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKVxuICAgICAgICApO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIGF0dHJpYnV0ZXMpIHx8XG4gICAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcylcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuICAgIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIGlmICghZ2wpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyeSBjb21waWxpbmcgYSBzaGFkZXIgYW5kIGdldCBpdHMgY29tcGlsZSBzdGF0dXMuIFNvbWUgYnJvd3NlcnMgbGlrZSBCcmF2ZSBibG9jayB0aGlzIEFQSVxuICAgIC8vIHRvIHByZXZlbnQgZmluZ2VycHJpbnRpbmcuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBtZWFucyB0aGF0IE1hcGJveCBHTCB3b24ndCB3b3JrLlxuICAgIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTtcbiAgICBpZiAoIXNoYWRlciB8fCBnbC5pc0NvbnRleHRMb3N0KCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCAndm9pZCBtYWluKCkge30nKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG4gICAgcmV0dXJuIGdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PT0gdHJ1ZTtcbn1cbiIsIi8vIEBmbG93IHN0cmljdFxuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jb25zdCBET00gPSB7fTtcbmV4cG9ydCBkZWZhdWx0IERPTTtcblxuRE9NLmNyZWF0ZSA9IGZ1bmN0aW9uICh0YWdOYW1lOiBzdHJpbmcsIGNsYXNzTmFtZTogP3N0cmluZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBlbCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgIGlmIChjbGFzc05hbWUgIT09IHVuZGVmaW5lZCkgZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIGlmIChjb250YWluZXIpIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbCk7XG4gICAgcmV0dXJuIGVsO1xufTtcblxuRE9NLmNyZWF0ZU5TID0gZnVuY3Rpb24gKG5hbWVzcGFjZVVSSTogc3RyaW5nLCB0YWdOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0YWdOYW1lKTtcbiAgICByZXR1cm4gZWw7XG59O1xuXG5jb25zdCBkb2NTdHlsZSA9IHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG5mdW5jdGlvbiB0ZXN0UHJvcChwcm9wcykge1xuICAgIGlmICghZG9jU3R5bGUpIHJldHVybiBwcm9wc1swXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwcm9wc1tpXSBpbiBkb2NTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wc1swXTtcbn1cblxuY29uc3Qgc2VsZWN0UHJvcCA9IHRlc3RQcm9wKFsndXNlclNlbGVjdCcsICdNb3pVc2VyU2VsZWN0JywgJ1dlYmtpdFVzZXJTZWxlY3QnLCAnbXNVc2VyU2VsZWN0J10pO1xubGV0IHVzZXJTZWxlY3Q7XG5cbkRPTS5kaXNhYmxlRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jU3R5bGUgJiYgc2VsZWN0UHJvcCkge1xuICAgICAgICB1c2VyU2VsZWN0ID0gZG9jU3R5bGVbc2VsZWN0UHJvcF07XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gJ25vbmUnO1xuICAgIH1cbn07XG5cbkRPTS5lbmFibGVEcmFnID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChkb2NTdHlsZSAmJiBzZWxlY3RQcm9wKSB7XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gdXNlclNlbGVjdDtcbiAgICB9XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Qcm9wID0gdGVzdFByb3AoWyd0cmFuc2Zvcm0nLCAnV2Via2l0VHJhbnNmb3JtJ10pO1xuXG5ET00uc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24oZWw6IEhUTUxFbGVtZW50LCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzc3NTRcbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgZWwuc3R5bGVbdHJhbnNmb3JtUHJvcF0gPSB2YWx1ZTtcbn07XG5cbi8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZvciB7cGFzc2l2ZTogZmFsc2V9IHN1cHBvcnQgaW4gYWRkL3JlbW92ZUV2ZW50TGlzdGVuZXIuXG5sZXQgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuXG50cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgXCJwYXNzaXZlXCIsIHtcbiAgICAgICAgZ2V0KCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdFwiLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIiwgb3B0aW9ucywgb3B0aW9ucyk7XG59IGNhdGNoIChlcnIpIHtcbiAgICBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG59XG5cbkRPTS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odGFyZ2V0OiAqLCB0eXBlOiAqLCBjYWxsYmFjazogKiwgb3B0aW9uczoge3Bhc3NpdmU/OiBib29sZWFuLCBjYXB0dXJlPzogYm9vbGVhbn0gPSB7fSkge1xuICAgIGlmICgncGFzc2l2ZScgaW4gb3B0aW9ucyAmJiBwYXNzaXZlU3VwcG9ydGVkKSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgb3B0aW9ucy5jYXB0dXJlKTtcbiAgICB9XG59O1xuXG5ET00ucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKHRhcmdldDogKiwgdHlwZTogKiwgY2FsbGJhY2s6ICosIG9wdGlvbnM6IHtwYXNzaXZlPzogYm9vbGVhbiwgY2FwdHVyZT86IGJvb2xlYW59ID0ge30pIHtcbiAgICBpZiAoJ3Bhc3NpdmUnIGluIG9wdGlvbnMgJiYgcGFzc2l2ZVN1cHBvcnRlZCkge1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMuY2FwdHVyZSk7XG4gICAgfVxufTtcblxuLy8gU3VwcHJlc3MgdGhlIG5leHQgY2xpY2ssIGJ1dCBvbmx5IGlmIGl0J3MgaW1tZWRpYXRlLlxuY29uc3Qgc3VwcHJlc3NDbGljazogTW91c2VFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbn07XG5cbkRPTS5zdXBwcmVzc0NsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbiAgICB9LCAwKTtcbn07XG5cbkRPTS5tb3VzZVBvcyA9IGZ1bmN0aW9uIChlbDogSFRNTEVsZW1lbnQsIGU6IE1vdXNlRXZlbnQgfCB3aW5kb3cuVG91Y2hFdmVudCB8IFRvdWNoKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIGUuY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgICAgIGUuY2xpZW50WSAtIHJlY3QudG9wIC0gZWwuY2xpZW50VG9wXG4gICAgKTtcbn07XG5cbkRPTS50b3VjaFBvcyA9IGZ1bmN0aW9uIChlbDogSFRNTEVsZW1lbnQsIHRvdWNoZXM6IFRvdWNoTGlzdCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgcG9pbnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKG5ldyBQb2ludChcbiAgICAgICAgICAgIHRvdWNoZXNbaV0uY2xpZW50WCAtIHJlY3QubGVmdCAtIGVsLmNsaWVudExlZnQsXG4gICAgICAgICAgICB0b3VjaGVzW2ldLmNsaWVudFkgLSByZWN0LnRvcCAtIGVsLmNsaWVudFRvcFxuICAgICAgICApKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbn07XG5cbkRPTS5tb3VzZUJ1dHRvbiA9IGZ1bmN0aW9uIChlOiBNb3VzZUV2ZW50KSB7XG4gICAgYXNzZXJ0KGUudHlwZSA9PT0gJ21vdXNlZG93bicgfHwgZS50eXBlID09PSAnbW91c2V1cCcpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93Lkluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJyAmJiBlLmJ1dHRvbiA9PT0gMiAmJiBlLmN0cmxLZXkgJiZcbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoJ01BQycpID49IDApIHtcbiAgICAgICAgLy8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzEzMTpcbiAgICAgICAgLy8gRmlyZWZveCAoZGV0ZWN0ZWQgYnkgSW5zdGFsbFRyaWdnZXIpIG9uIE1hYyBkZXRlcm1pbmVzIGUuYnV0dG9uID0gMiB3aGVuXG4gICAgICAgIC8vIHVzaW5nIENvbnRyb2wgKyBsZWZ0IGNsaWNrXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gZS5idXR0b247XG59O1xuXG5ET00ucmVtb3ZlID0gZnVuY3Rpb24obm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG59O1xuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7Z2V0SlNPTiwgZ2V0SW1hZ2UsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4JztcclxuXHJcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XHJcbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcclxuXHJcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuL3N0eWxlX2ltYWdlJztcclxuaW1wb3J0IHR5cGUge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveCc7XHJcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xyXG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihiYXNlVVJMOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFjazx7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9Pik6IENhbmNlbGFibGUge1xyXG4gICAgbGV0IGpzb246IGFueSwgaW1hZ2UsIGVycm9yO1xyXG4gICAgY29uc3QgZm9ybWF0ID0gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID4gMSA/ICdAMngnIDogJyc7XHJcblxyXG4gICAgbGV0IGpzb25SZXF1ZXN0ID0gZ2V0SlNPTihyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcuanNvbicpLCBSZXNvdXJjZVR5cGUuU3ByaXRlSlNPTiksIChlcnI6ID9FcnJvciwgZGF0YTogP09iamVjdCkgPT4ge1xyXG4gICAgICAgIGpzb25SZXF1ZXN0ID0gbnVsbDtcclxuICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xyXG4gICAgICAgICAgICBqc29uID0gZGF0YTtcclxuICAgICAgICAgICAgbWF5YmVDb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBpbWFnZVJlcXVlc3QgPSBnZXRJbWFnZShyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcucG5nJyksIFJlc291cmNlVHlwZS5TcHJpdGVJbWFnZSksIChlcnIsIGltZykgPT4ge1xyXG4gICAgICAgIGltYWdlUmVxdWVzdCA9IG51bGw7XHJcbiAgICAgICAgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICBlcnJvciA9IGVycjtcclxuICAgICAgICAgICAgaW1hZ2UgPSBpbWc7XHJcbiAgICAgICAgICAgIG1heWJlQ29tcGxldGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBtYXliZUNvbXBsZXRlKCkge1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChqc29uICYmIGltYWdlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGltYWdlKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGpzb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCB4LCB5LCBzZGYsIHBpeGVsUmF0aW8sIHN0cmV0Y2hYLCBzdHJldGNoWSwgY29udGVudH0gPSBqc29uW2lkXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgUkdCQUltYWdlKHt3aWR0aCwgaGVpZ2h0fSk7XHJcbiAgICAgICAgICAgICAgICBSR0JBSW1hZ2UuY29weShpbWFnZURhdGEsIGRhdGEsIHt4LCB5fSwge3g6IDAsIHk6IDB9LCB7d2lkdGgsIGhlaWdodH0pO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkXSA9IHtkYXRhLCBwaXhlbFJhdGlvLCBzZGYsIHN0cmV0Y2hYLCBzdHJldGNoWSwgY29udGVudH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY2FuY2VsKCkge1xyXG4gICAgICAgICAgICBpZiAoanNvblJlcXVlc3QpIHtcclxuICAgICAgICAgICAgICAgIGpzb25SZXF1ZXN0LmNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAganNvblJlcXVlc3QgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbWFnZVJlcXVlc3QpIHtcclxuICAgICAgICAgICAgICAgIGltYWdlUmVxdWVzdC5jYW5jZWwoKTtcclxuICAgICAgICAgICAgICAgIGltYWdlUmVxdWVzdCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5cbmV4cG9ydCB0eXBlIFN0eWxlSW1hZ2VEYXRhID0ge1xuICAgIGRhdGE6IFJHQkFJbWFnZSxcbiAgICB2ZXJzaW9uOiBudW1iZXIsXG4gICAgaGFzUmVuZGVyQ2FsbGJhY2s/OiBib29sZWFuLFxuICAgIHVzZXJJbWFnZT86IFN0eWxlSW1hZ2VJbnRlcmZhY2Vcbn07XG5cbmV4cG9ydCB0eXBlIFN0eWxlSW1hZ2VNZXRhZGF0YSA9IHtcbiAgICBwaXhlbFJhdGlvOiBudW1iZXIsXG4gICAgc2RmOiBib29sZWFuLFxuICAgIHN0cmV0Y2hYPzogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgc3RyZXRjaFk/OiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBjb250ZW50PzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbn07XG5cbmV4cG9ydCB0eXBlIFN0eWxlSW1hZ2UgPSBTdHlsZUltYWdlRGF0YSAmIFN0eWxlSW1hZ2VNZXRhZGF0YTtcblxuZXhwb3J0IHR5cGUgU3R5bGVJbWFnZUludGVyZmFjZSA9IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSxcbiAgICByZW5kZXI/OiAoKSA9PiBib29sZWFuLFxuICAgIG9uQWRkPzogKG1hcDogTWFwLCBpZDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIG9uUmVtb3ZlPzogKCkgPT4gdm9pZFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclN0eWxlSW1hZ2UoaW1hZ2U6IFN0eWxlSW1hZ2UpIHtcbiAgICBjb25zdCB7dXNlckltYWdlfSA9IGltYWdlO1xuICAgIGlmICh1c2VySW1hZ2UgJiYgdXNlckltYWdlLnJlbmRlcikge1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gdXNlckltYWdlLnJlbmRlcigpO1xuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgaW1hZ2UuZGF0YS5yZXBsYWNlKG5ldyBVaW50OEFycmF5KHVzZXJJbWFnZS5kYXRhLmJ1ZmZlcikpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHN0eWxlIGltYWdlcy4gVGhpcyBpcyBhIHNwZWNpZmljYXRpb24gZm9yXG4gKiBpbXBsZW1lbnRlcnMgdG8gbW9kZWw6IGl0IGlzIG5vdCBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogSW1hZ2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBjYW4gYmUgcmVkcmF3biBmb3IgZXZlcnkgZnJhbWUuIFRoZXkgY2FuIGJlIHVzZWQgdG8gYW5pbWF0ZVxuICogaWNvbnMgYW5kIHBhdHRlcm5zIG9yIG1ha2UgdGhlbSByZXNwb25kIHRvIHVzZXIgaW5wdXQuIFN0eWxlIGltYWdlcyBjYW4gaW1wbGVtZW50IGFcbiAqIHtAbGluayBTdHlsZUltYWdlSW50ZXJmYWNlI3JlbmRlcn0gbWV0aG9kLiBUaGUgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSBmcmFtZSBhbmRcbiAqIGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgaW1hZ2UuXG4gKlxuICogQGludGVyZmFjZSBTdHlsZUltYWdlSW50ZXJmYWNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHRcbiAqIEBwcm9wZXJ0eSB7VWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5fSBkYXRhXG4gKlxuICogQHNlZSBbQWRkIGFuIGFuaW1hdGVkIGljb24gdG8gdGhlIG1hcC5dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1hbmltYXRlZC8pXG4gKlxuICogQGV4YW1wbGVcbiAqIHZhciBmbGFzaGluZ1NxdWFyZSA9IHtcbiAqICAgICB3aWR0aDogNjQsXG4gKiAgICAgaGVpZ2h0OiA2NCxcbiAqICAgICBkYXRhOiBuZXcgVWludDhBcnJheSg2NCAqIDY0ICogNCksXG4gKlxuICogICAgIG9uQWRkOiBmdW5jdGlvbihtYXApIHtcbiAqICAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gKiAgICAgfSxcbiAqXG4gKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgLy8ga2VlcCByZXBhaW50aW5nIHdoaWxlIHRoZSBpY29uIGlzIG9uIHRoZSBtYXBcbiAqICAgICAgICAgdGhpcy5tYXAudHJpZ2dlclJlcGFpbnQoKTtcbiAqXG4gKiAgICAgICAgIC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGJsYWNrIGFuZCB3aGl0ZSBiYXNlZCBvbiB0aGUgdGltZVxuICogICAgICAgICB2YXIgdmFsdWUgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKSAlIDIgPT09IDAgID8gMjU1IDogMDtcbiAqXG4gKiAgICAgICAgIC8vIGNoZWNrIGlmIGltYWdlIG5lZWRzIHRvIGJlIGNoYW5nZWRcbiAqICAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnByZXZpb3VzVmFsdWUpIHtcbiAqICAgICAgICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHZhbHVlO1xuICpcbiAqICAgICAgICAgICAgIHZhciBieXRlc1BlclBpeGVsID0gNDtcbiAqICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gKiAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCB0aGlzLmhlaWdodDsgeSsrKSB7XG4gKiAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoeSAqIHRoaXMud2lkdGggKyB4KSAqIGJ5dGVzUGVyUGl4ZWw7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAwXSA9IHZhbHVlO1xuICogICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZTtcbiAqICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW29mZnNldCArIDJdID0gdmFsdWU7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAzXSA9IDI1NTtcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICB9XG4gKlxuICogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW1hZ2UgY2hhbmdlZFxuICogICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiAgfVxuICpcbiAqICBtYXAuYWRkSW1hZ2UoJ2ZsYXNoaW5nX3NxdWFyZScsIGZsYXNoaW5nU3F1YXJlKTtcbiAqL1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGJlZm9yZSBldmVyeSBmcmFtZSB3aGVyZSB0aGUgaWNvbiB3aWxsIGJlIHVzZWQuXG4gKiBUaGUgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHVwZGF0ZSB0aGUgaW1hZ2UncyBgZGF0YWAgbWVtYmVyIHdpdGggYSBuZXcgaW1hZ2UuXG4gKlxuICogSWYgdGhlIG1ldGhvZCB1cGRhdGVzIHRoZSBpbWFnZSBpdCBtdXN0IHJldHVybiBgdHJ1ZWAgdG8gY29tbWl0IHRoZSBjaGFuZ2UuXG4gKiBJZiB0aGUgbWV0aG9kIHJldHVybnMgYGZhbHNlYCBvciBub3RoaW5nIHRoZSBpbWFnZSBpcyBhc3N1bWVkIHRvIG5vdCBoYXZlIGNoYW5nZWQuXG4gKlxuICogSWYgdXBkYXRlcyBhcmUgaW5mcmVxdWVudCBpdCBtYXliZSBlYXNpZXIgdG8gdXNlIHtAbGluayBNYXAjdXBkYXRlSW1hZ2V9IHRvIHVwZGF0ZVxuICogdGhlIGltYWdlIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIFN0eWxlSW1hZ2VJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgcmVuZGVyXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhpcyBtZXRob2QgdXBkYXRlZCB0aGUgaW1hZ2UuIGBmYWxzZWAgaWYgdGhlIGltYWdlIHdhcyBub3QgY2hhbmdlZC5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgbGF5ZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjYWRkSW1hZ2V9LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIFN0eWxlSW1hZ2VJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25BZGRcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcCB0aGlzIGN1c3RvbSBsYXllciB3YXMganVzdCBhZGRlZCB0by5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgaWNvbiBpcyByZW1vdmVkIGZyb20gdGhlIG1hcCB3aXRoIHtAbGluayBNYXAjcmVtb3ZlSW1hZ2V9LlxuICogVGhpcyBnaXZlcyB0aGUgaW1hZ2UgYSBjaGFuY2UgdG8gY2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICovXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgcG90cGFjayBmcm9tICdwb3RwYWNrJztcblxuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcbmltcG9ydCB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi9pbWFnZV9hdGxhcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtyZW5kZXJTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZSc7XG5pbXBvcnQge3dhcm5PbmNlfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtCaW59IGZyb20gJ3BvdHBhY2snO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5cbnR5cGUgUGF0dGVybiA9IHtcbiAgICBiaW46IEJpbixcbiAgICBwb3NpdGlvbjogSW1hZ2VQb3NpdGlvblxufTtcblxuLy8gV2hlbiBjb3BpZWQgaW50byB0aGUgYXRsYXMgdGV4dHVyZSwgaW1hZ2UgZGF0YSBpcyBwYWRkZWQgYnkgb25lIHBpeGVsIG9uIGVhY2ggc2lkZS4gSWNvblxuLy8gaW1hZ2VzIGFyZSBwYWRkZWQgd2l0aCBmdWxseSB0cmFuc3BhcmVudCBwaXhlbHMsIHdoaWxlIHBhdHRlcm4gaW1hZ2VzIGFyZSBwYWRkZWQgd2l0aCBhXG4vLyBjb3B5IG9mIHRoZSBpbWFnZSBkYXRhIHdyYXBwZWQgZnJvbSB0aGUgb3Bwb3NpdGUgc2lkZS4gSW4gYm90aCBjYXNlcywgdGhpcyBlbnN1cmVzIHRoZVxuLy8gY29ycmVjdCBiZWhhdmlvciBvZiBHTF9MSU5FQVIgdGV4dHVyZSBzYW1wbGluZyBtb2RlLlxuY29uc3QgcGFkZGluZyA9IDE7XG5cbi8qXG4gICAgSW1hZ2VNYW5hZ2VyIGRvZXMgdGhyZWUgdGhpbmdzOlxuXG4gICAgICAgIDEuIFRyYWNrcyByZXF1ZXN0cyBmb3IgaWNvbiBpbWFnZXMgZnJvbSB0aWxlIHdvcmtlcnMgYW5kIHNlbmRzIHJlc3BvbnNlcyB3aGVuIHRoZSByZXF1ZXN0cyBhcmUgZnVsZmlsbGVkLlxuICAgICAgICAyLiBCdWlsZHMgYSB0ZXh0dXJlIGF0bGFzIGZvciBwYXR0ZXJuIGltYWdlcy5cbiAgICAgICAgMy4gUmVyZW5kZXJzIHJlbmRlcmFibGUgaW1hZ2VzIG9uY2UgcGVyIGZyYW1lXG5cbiAgICBUaGVzZSBhcmUgZGlzcGFyYXRlIHJlc3BvbnNpYmlsaXRpZXMgYW5kIHNob3VsZCBldmVudHVhbGx5IGJlIGhhbmRsZWQgYnkgZGlmZmVyZW50IGNsYXNzZXMuIFdoZW4gd2UgaW1wbGVtZW50XG4gICAgZGF0YS1kcml2ZW4gc3VwcG9ydCBmb3IgYCotcGF0dGVybmAsIHdlJ2xsIGxpa2VseSB1c2UgcGVyLWJ1Y2tldCBwYXR0ZXJuIGF0bGFzZXMsIGFuZCB0aGF0IHdvdWxkIGJlIGEgZ29vZCB0aW1lXG4gICAgdG8gcmVmYWN0b3IgdGhpcy5cbiovXG5jbGFzcyBJbWFnZU1hbmFnZXIgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBpbWFnZXM6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX07XG4gICAgdXBkYXRlZEltYWdlczoge1tfOiBzdHJpbmddOiBib29sZWFufTtcbiAgICBjYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWU6IHtbXzogc3RyaW5nXTogYm9vbGVhbn07XG4gICAgbG9hZGVkOiBib29sZWFuO1xuICAgIHJlcXVlc3RvcnM6IEFycmF5PHtpZHM6IEFycmF5PHN0cmluZz4sIGNhbGxiYWNrOiBDYWxsYmFjazx7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9Pn0+O1xuXG4gICAgcGF0dGVybnM6IHtbXzogc3RyaW5nXTogUGF0dGVybn07XG4gICAgYXRsYXNJbWFnZTogUkdCQUltYWdlO1xuICAgIGF0bGFzVGV4dHVyZTogP1RleHR1cmU7XG4gICAgZGlydHk6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVkSW1hZ2VzID0ge307XG4gICAgICAgIHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lID0ge307XG4gICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVxdWVzdG9ycyA9IFtdO1xuXG4gICAgICAgIHRoaXMucGF0dGVybnMgPSB7fTtcbiAgICAgICAgdGhpcy5hdGxhc0ltYWdlID0gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IDEsIGhlaWdodDogMX0pO1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVkO1xuICAgIH1cblxuICAgIHNldExvYWRlZChsb2FkZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGVkID0gbG9hZGVkO1xuXG4gICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qge2lkcywgY2FsbGJhY2t9IG9mIHRoaXMucmVxdWVzdG9ycykge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmeShpZHMsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVxdWVzdG9ycyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2UoaWQ6IHN0cmluZyk6ID9TdHlsZUltYWdlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzW2lkXTtcbiAgICB9XG5cbiAgICBhZGRJbWFnZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW1hZ2VzW2lkXSk7XG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZShpZCwgaW1hZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlc1tpZF0gPSBpbWFnZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF92YWxpZGF0ZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlU3RyZXRjaChpbWFnZS5zdHJldGNoWCwgaW1hZ2UuZGF0YSAmJiBpbWFnZS5kYXRhLndpZHRoKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgSW1hZ2UgXCIke2lkfVwiIGhhcyBpbnZhbGlkIFwic3RyZXRjaFhcIiB2YWx1ZWApKSk7XG4gICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fdmFsaWRhdGVTdHJldGNoKGltYWdlLnN0cmV0Y2hZLCBpbWFnZS5kYXRhICYmIGltYWdlLmRhdGEuaGVpZ2h0KSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgSW1hZ2UgXCIke2lkfVwiIGhhcyBpbnZhbGlkIFwic3RyZXRjaFlcIiB2YWx1ZWApKSk7XG4gICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fdmFsaWRhdGVDb250ZW50KGltYWdlLmNvbnRlbnQsIGltYWdlKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgSW1hZ2UgXCIke2lkfVwiIGhhcyBpbnZhbGlkIFwiY29udGVudFwiIHZhbHVlYCkpKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZVN0cmV0Y2goc3RyZXRjaDogP0FycmF5PFtudW1iZXIsIG51bWJlcl0+IHwgdm9pZCwgc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghc3RyZXRjaCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBsYXN0ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHN0cmV0Y2gpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0WzBdIDwgbGFzdCB8fCBwYXJ0WzFdIDwgcGFydFswXSB8fCBzaXplIDwgcGFydFsxXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGFzdCA9IHBhcnRbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlQ29udGVudChjb250ZW50OiA/W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB2b2lkLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoY29udGVudC5sZW5ndGggIT09IDQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRlbnRbMF0gPCAwIHx8IGltYWdlLmRhdGEud2lkdGggPCBjb250ZW50WzBdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZW50WzFdIDwgMCB8fCBpbWFnZS5kYXRhLmhlaWdodCA8IGNvbnRlbnRbMV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRlbnRbMl0gPCAwIHx8IGltYWdlLmRhdGEud2lkdGggPCBjb250ZW50WzJdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZW50WzNdIDwgMCB8fCBpbWFnZS5kYXRhLmhlaWdodCA8IGNvbnRlbnRbM10pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRlbnRbMl0gPCBjb250ZW50WzBdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZW50WzNdIDwgY29udGVudFsxXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVJbWFnZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICBjb25zdCBvbGRJbWFnZSA9IHRoaXMuaW1hZ2VzW2lkXTtcbiAgICAgICAgYXNzZXJ0KG9sZEltYWdlKTtcbiAgICAgICAgYXNzZXJ0KG9sZEltYWdlLmRhdGEud2lkdGggPT09IGltYWdlLmRhdGEud2lkdGgpO1xuICAgICAgICBhc3NlcnQob2xkSW1hZ2UuZGF0YS5oZWlnaHQgPT09IGltYWdlLmRhdGEuaGVpZ2h0KTtcbiAgICAgICAgaW1hZ2UudmVyc2lvbiA9IG9sZEltYWdlLnZlcnNpb24gKyAxO1xuICAgICAgICB0aGlzLmltYWdlc1tpZF0gPSBpbWFnZTtcbiAgICAgICAgdGhpcy51cGRhdGVkSW1hZ2VzW2lkXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlSW1hZ2UoaWQ6IHN0cmluZykge1xuICAgICAgICBhc3NlcnQodGhpcy5pbWFnZXNbaWRdKTtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhdHRlcm5zW2lkXTtcblxuICAgICAgICBpZiAoaW1hZ2UudXNlckltYWdlICYmIGltYWdlLnVzZXJJbWFnZS5vblJlbW92ZSkge1xuICAgICAgICAgICAgaW1hZ2UudXNlckltYWdlLm9uUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0SW1hZ2VzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5pbWFnZXMpO1xuICAgIH1cblxuICAgIGdldEltYWdlcyhpZHM6IEFycmF5PHN0cmluZz4sIGNhbGxiYWNrOiBDYWxsYmFjazx7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9Pikge1xuICAgICAgICAvLyBJZiB0aGUgc3ByaXRlIGhhcyBiZWVuIGxvYWRlZCwgb3IgaWYgYWxsIHRoZSBpY29uIGRlcGVuZGVuY2llcyBhcmUgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgIC8vIChpLmUuIGlmIHRoZXkndmUgYmVlbiBhZGRlZCB2aWEgcnVudGltZSBzdHlsaW5nKSwgdGhlbiBub3RpZnkgdGhlIHJlcXVlc3RvciBpbW1lZGlhdGVseS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkZWxheSBub3RpZmljYXRpb24gdW50aWwgdGhlIHNwcml0ZSBpcyBsb2FkZWQuIEF0IHRoYXQgcG9pbnQsIGlmIGFueSBvZiB0aGVcbiAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBzdGlsbCB1bmF2YWlsYWJsZSwgd2UnbGwganVzdCBhc3N1bWUgdGhleSBhcmUgcGVybWFuZW50bHkgbWlzc2luZy5cbiAgICAgICAgbGV0IGhhc0FsbERlcGVuZGVuY2llcyA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5pc0xvYWRlZCgpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbWFnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbERlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0xvYWRlZCgpIHx8IGhhc0FsbERlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGlkcywgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0b3JzLnB1c2goe2lkcywgY2FsbGJhY2t9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9ub3RpZnkoaWRzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfT4pIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICAgICAgaWYoIWltYWdlICYmIHRoaXMuZGVmYXVsdEltYWdlTWFuZ2VyKXtcbiAgICAgICAgICAgICAgICBpbWFnZT0gdGhpcy5kZWZhdWx0SW1hZ2VNYW5nZXIuZ2V0SW1hZ2UoaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnc3R5bGVpbWFnZW1pc3NpbmcnLCB7aWR9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgaW1hZ2Ugc28gdGhhdCBvdXIgb3duIGNvcHkgb2YgaXRzIEFycmF5QnVmZmVyIGRvZXNuJ3QgZ2V0IHRyYW5zZmVycmVkLlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlW2lkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW1hZ2UuZGF0YS5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiBpbWFnZS5waXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBzZGY6IGltYWdlLnNkZixcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogaW1hZ2UudmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgc3RyZXRjaFg6IGltYWdlLnN0cmV0Y2hYLFxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoWTogaW1hZ2Uuc3RyZXRjaFksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGltYWdlLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGhhc1JlbmRlckNhbGxiYWNrOiBCb29sZWFuKGltYWdlLnVzZXJJbWFnZSAmJiBpbWFnZS51c2VySW1hZ2UucmVuZGVyKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGBJbWFnZSBcIiR7aWR9XCIgY291bGQgbm90IGJlIGxvYWRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW1hZ2Ugd2l0aCBtYXAuYWRkSW1hZ2UoKSBvciBhIFwic3ByaXRlXCIgcHJvcGVydHkgaW4geW91ciBzdHlsZS4gWW91IGNhbiBwcm92aWRlIG1pc3NpbmcgaW1hZ2VzIGJ5IGxpc3RlbmluZyBmb3IgdGhlIFwic3R5bGVpbWFnZW1pc3NpbmdcIiBtYXAgZXZlbnQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gUGF0dGVybiBzdHVmZlxuXG4gICAgZ2V0UGl4ZWxTaXplKCkge1xuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB0aGlzLmF0bGFzSW1hZ2U7XG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgZ2V0UGF0dGVybihpZDogc3RyaW5nKTogP0ltYWdlUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuc1tpZF07XG5cbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmdldEltYWdlKGlkKTtcbiAgICAgICAgaWYgKCFpbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiAmJiBwYXR0ZXJuLnBvc2l0aW9uLnZlcnNpb24gPT09IGltYWdlLnZlcnNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuLnBvc2l0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICAgICAgICBjb25zdCB3ID0gaW1hZ2UuZGF0YS53aWR0aCArIHBhZGRpbmcgKiAyO1xuICAgICAgICAgICAgY29uc3QgaCA9IGltYWdlLmRhdGEuaGVpZ2h0ICsgcGFkZGluZyAqIDI7XG4gICAgICAgICAgICBjb25zdCBiaW4gPSB7dywgaCwgeDogMCwgeTogMH07XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBJbWFnZVBvc2l0aW9uKGJpbiwgaW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1tpZF0gPSB7YmluLCBwb3NpdGlvbn07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuLnBvc2l0aW9uLnZlcnNpb24gPSBpbWFnZS52ZXJzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlUGF0dGVybkF0bGFzKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGF0dGVybnNbaWRdLnBvc2l0aW9uO1xuICAgIH1cblxuICAgIGJpbmQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGlmICghdGhpcy5hdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5hdGxhc0ltYWdlLCBnbC5SR0JBKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLmF0bGFzVGV4dHVyZS51cGRhdGUodGhpcy5hdGxhc0ltYWdlKTtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlUGF0dGVybkF0bGFzKCkge1xuICAgICAgICBjb25zdCBiaW5zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5wYXR0ZXJucykge1xuICAgICAgICAgICAgYmlucy5wdXNoKHRoaXMucGF0dGVybnNbaWRdLmJpbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7dywgaH0gPSBwb3RwYWNrKGJpbnMpO1xuXG4gICAgICAgIGNvbnN0IGRzdCA9IHRoaXMuYXRsYXNJbWFnZTtcbiAgICAgICAgZHN0LnJlc2l6ZSh7d2lkdGg6IHcgfHwgMSwgaGVpZ2h0OiBoIHx8IDF9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtiaW59ID0gdGhpcy5wYXR0ZXJuc1tpZF07XG4gICAgICAgICAgICBjb25zdCB4ID0gYmluLnggKyBwYWRkaW5nO1xuICAgICAgICAgICAgY29uc3QgeSA9IGJpbi55ICsgcGFkZGluZztcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuaW1hZ2VzW2lkXS5kYXRhO1xuICAgICAgICAgICAgY29uc3QgdyA9IHNyYy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGggPSBzcmMuaGVpZ2h0O1xuXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwge3g6IDAsIHk6IDB9LCB7eCwgeX0sIHt3aWR0aDogdywgaGVpZ2h0OiBofSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCAxIHBpeGVsIHdyYXBwZWQgcGFkZGluZyBvbiBlYWNoIHNpZGUgb2YgdGhlIGltYWdlLlxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHt4OiAwLCB5OiBoIC0gMX0sIHt4LCB5OiB5IC0gMX0sIHt3aWR0aDogdywgaGVpZ2h0OiAxfSk7IC8vIFRcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7eDogMCwgeTogICAgIDB9LCB7eCwgeTogeSArIGh9LCB7d2lkdGg6IHcsIGhlaWdodDogMX0pOyAvLyBCXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwge3g6IHcgLSAxLCB5OiAwfSwge3g6IHggLSAxLCB5fSwge3dpZHRoOiAxLCBoZWlnaHQ6IGh9KTsgLy8gTFxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHt4OiAwLCAgICAgeTogMH0sIHt4OiB4ICsgdywgeX0sIHt3aWR0aDogMSwgaGVpZ2h0OiBofSk7IC8vIFJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGJlZ2luRnJhbWUoKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lID0ge307XG4gICAgfVxuXG4gICAgZGlzcGF0Y2hSZW5kZXJDYWxsYmFja3MoaWRzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG5cbiAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayBmb3IgdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRpc3BhdGNoZWQgZm9yIGEgZGlmZmVyZW50IGZyYW1lXG4gICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWVbaWRdKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lW2lkXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICAgICAgYXNzZXJ0KGltYWdlKTtcblxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IHJlbmRlclN0eWxlSW1hZ2UoaW1hZ2UpO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUltYWdlKGlkLCBpbWFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEltYWdlTWFuYWdlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7IEltYWdlUG9zaXRpb24gfSBmcm9tICcuL2ltYWdlX2F0bGFzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgeyBTdHlsZUltYWdlIH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHsgQmluIH0gZnJvbSAncG90cGFjayc7XG5pbXBvcnQgdHlwZSB7IENhbGxiYWNrIH0gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IEltYWdlTWFuYWdlciBmcm9tICcuL2ltYWdlX21hbmFnZXInO1xuXG5jbGFzcyBJbWFnZU1hbmFnZXJGYWN0b3J5IHtcbiAgICBpbWFnZU1hbmFnZXJzOiB7IFtzdHJpbmddOiBJbWFnZU1hbmFnZXIgfTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlcnMgPSB7IGltYWdlX21hbmFnZXJfZGVmYXVsdDogbmV3IEltYWdlTWFuYWdlcigpIH07XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2Vyc1tcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiXS5zZXRMb2FkZWQodHJ1ZSk7XG4gICAgICAgIC8vdGhpcy5pbWFnZU1hbmFnZXJzID0ge307XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2UoaWQ6IHN0cmluZywgc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKTogP1N0eWxlSW1hZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW1hZ2VNYW5hZ2VyKHNvdXJjZUlkKS5nZXRJbWFnZShpZCk7XG4gICAgfVxuICAgIHNldEV2ZW50ZWRQYXJlbnQoXG4gICAgICAgIHBhcmVudDogP0V2ZW50ZWQsXG4gICAgICAgIGRhdGE/OiBPYmplY3QgfCAoKCkgPT4gT2JqZWN0KSxcbiAgICAgICAgc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2dldEltYWdlTWFuYWdlcihzb3VyY2VJZCkuc2V0RXZlbnRlZFBhcmVudChwYXJlbnQsIGRhdGEpO1xuICAgIH1cbiAgICBhZGRJbWFnZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSwgc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKSB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZU1hbmFnZXJzW3NvdXJjZUlkXSkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXJzW3NvdXJjZUlkXSA9IG5ldyBJbWFnZU1hbmFnZXIoKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VJZCAhPT0gXCJpbWFnZV9tYW5hZ2VyX2RlZmF1bHRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2Vyc1tcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWRcbiAgICAgICAgICAgICAgICBdLmRlZmF1bHRJbWFnZU1hbmdlciA9IHRoaXMuaW1hZ2VNYW5hZ2Vyc1tcbiAgICAgICAgICAgICAgICAgICAgXCJpbWFnZV9tYW5hZ2VyX2RlZmF1bHRcIlxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ2V0SW1hZ2VNYW5hZ2VyKHNvdXJjZUlkKS5hZGRJbWFnZShpZCwgaW1hZ2UpO1xuICAgIH1cbiAgICB1cGRhdGVJbWFnZShcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgaW1hZ2U6IFN0eWxlSW1hZ2UsXG4gICAgICAgIHNvdXJjZUlkID0gXCJpbWFnZV9tYW5hZ2VyX2RlZmF1bHRcIlxuICAgICkge1xuICAgICAgICBpZiAoIXNvdXJjZUlkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmltYWdlTWFuYWdlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZU1hbmFnZXIgPSB0aGlzLmltYWdlTWFuYWdlcnNba2V5XTtcbiAgICAgICAgICAgICAgICBpbWFnZU1hbmFnZXIudXBkYXRlSW1hZ2UoaWQsIGltYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2dldEltYWdlTWFuYWdlcihzb3VyY2VJZCkudXBkYXRlSW1hZ2UoaWQsIGltYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVJbWFnZShpZDogc3RyaW5nLCBzb3VyY2VJZCA9IFwiaW1hZ2VfbWFuYWdlcl9kZWZhdWx0XCIpIHtcbiAgICAgICAgdGhpcy5fZ2V0SW1hZ2VNYW5hZ2VyKHNvdXJjZUlkKS5yZW1vdmVJbWFnZShpZCk7XG4gICAgfVxuXG4gICAgbGlzdEltYWdlcyhzb3VyY2VJZCA9IFwiaW1hZ2VfbWFuYWdlcl9kZWZhdWx0XCIpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IGltYWdlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmltYWdlTWFuYWdlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlTWFuYWdlciA9IHRoaXMuaW1hZ2VNYW5hZ2Vyc1trZXldO1xuICAgICAgICAgICAgaW1hZ2VzLnB1c2goLi4uaW1hZ2VNYW5hZ2VyLmxpc3RJbWFnZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGltYWdlcztcbiAgICB9XG5cbiAgICBnZXRJbWFnZXMoXG4gICAgICAgIGlkczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrPHsgW3N0cmluZ106IFN0eWxlSW1hZ2UgfT4sXG4gICAgICAgIHNvdXJjZUlkID0gXCJpbWFnZV9tYW5hZ2VyX2RlZmF1bHRcIlxuICAgICkge1xuICAgICAgICB0aGlzLl9nZXRJbWFnZU1hbmFnZXIoc291cmNlSWQpLmdldEltYWdlcyhpZHMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBnZXRQaXhlbFNpemUoc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJbWFnZU1hbmFnZXIoc291cmNlSWQpLmdldFBpeGVsU2l6ZSgpO1xuICAgIH1cblxuICAgIGdldFBhdHRlcm4oaWQ6IHN0cmluZywgc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKTogP0ltYWdlUG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW1hZ2VNYW5hZ2VyKHNvdXJjZUlkKS5nZXRQYXR0ZXJuKGlkKTtcbiAgICB9XG5cbiAgICBiaW5kKGNvbnRleHQ6IENvbnRleHQsIHNvdXJjZUlkID0gXCJpbWFnZV9tYW5hZ2VyX2RlZmF1bHRcIikge1xuICAgICAgICB0aGlzLl9nZXRJbWFnZU1hbmFnZXIoc291cmNlSWQpLmJpbmQoY29udGV4dCk7XG4gICAgfVxuICAgIGlzTG9hZGVkKHNvdXJjZUlkID0gXCJpbWFnZV9tYW5hZ2VyX2RlZmF1bHRcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW1hZ2VNYW5hZ2VyKHNvdXJjZUlkKS5pc0xvYWRlZCgpO1xuICAgIH1cbiAgICBpc0FsbExvYWRlZCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5pbWFnZU1hbmFnZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZU1hbmFnZXIgPSB0aGlzLmltYWdlTWFuYWdlcnNba2V5XTtcbiAgICAgICAgICAgIGlmICghaW1hZ2VNYW5hZ2VyLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGJlZ2luRnJhbWUoc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJbWFnZU1hbmFnZXIoc291cmNlSWQpLmJlZ2luRnJhbWUoKTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaFJlbmRlckNhbGxiYWNrcyhcbiAgICAgICAgaWRzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICBzb3VyY2VJZCA9IFwiaW1hZ2VfbWFuYWdlcl9kZWZhdWx0XCJcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEltYWdlTWFuYWdlcihzb3VyY2VJZCkuZGlzcGF0Y2hSZW5kZXJDYWxsYmFja3MoaWRzKTtcbiAgICB9XG4gICAgc2V0TG9hZGVkKGxvYWRlZDogYm9vbGVhbiwgc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJbWFnZU1hbmFnZXIoc291cmNlSWQpLnNldExvYWRlZChsb2FkZWQpO1xuICAgIH1cbiAgICBfZ2V0SW1hZ2VNYW5hZ2VyKHNvdXJjZUlkKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlTWFuYWdlcnNbc291cmNlSWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZU1hbmFnZXJzW3NvdXJjZUlkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZU1hbmFnZXJzW1wiaW1hZ2VfbWFuYWdlcl9kZWZhdWx0XCJdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VNYW5hZ2VyRmFjdG9yeTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Z2V0QXJyYXlCdWZmZXIsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4JztcblxuaW1wb3J0IHBhcnNlR2x5cGhQQkYgZnJvbSAnLi9wYXJzZV9nbHlwaF9wYmYnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi9zdHlsZV9nbHlwaCc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZm9udHN0YWNrOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsVGVtcGxhdGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFjazx7W186IG51bWJlcl06IFN0eWxlR2x5cGggfCBudWxsfT4pIHtcbiAgICBjb25zdCBiZWdpbiA9IHJhbmdlICogMjU2O1xuICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgMjU1O1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QoXG4gICAgICAgIHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZUdseXBoc1VSTCh1cmxUZW1wbGF0ZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7Zm9udHN0YWNrfScsIGZvbnRzdGFjaylcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7cmFuZ2V9JywgYCR7YmVnaW59LSR7ZW5kfWApLFxuICAgICAgICBSZXNvdXJjZVR5cGUuR2x5cGhzKTtcblxuICAgIGdldEFycmF5QnVmZmVyKHJlcXVlc3QsIChlcnI6ID9FcnJvciwgZGF0YTogP0FycmF5QnVmZmVyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZ2x5cGhzID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZ2x5cGggb2YgcGFyc2VHbHlwaFBCRihkYXRhKSkge1xuICAgICAgICAgICAgICAgIGdseXBoc1tnbHlwaC5pZF0gPSBnbHlwaDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZ2x5cGhzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbnlTREY7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gVGlueVNERjtcblxudmFyIElORiA9IDFlMjA7XG5cbmZ1bmN0aW9uIFRpbnlTREYoZm9udFNpemUsIGJ1ZmZlciwgcmFkaXVzLCBjdXRvZmYsIGZvbnRGYW1pbHksIGZvbnRXZWlnaHQpIHtcbiAgICB0aGlzLmZvbnRTaXplID0gZm9udFNpemUgfHwgMjQ7XG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXIgPT09IHVuZGVmaW5lZCA/IDMgOiBidWZmZXI7XG4gICAgdGhpcy5jdXRvZmYgPSBjdXRvZmYgfHwgMC4yNTtcbiAgICB0aGlzLmZvbnRGYW1pbHkgPSBmb250RmFtaWx5IHx8ICdzYW5zLXNlcmlmJztcbiAgICB0aGlzLmZvbnRXZWlnaHQgPSBmb250V2VpZ2h0IHx8ICdub3JtYWwnO1xuICAgIHRoaXMucmFkaXVzID0gcmFkaXVzIHx8IDg7XG4gICAgdmFyIHNpemUgPSB0aGlzLnNpemUgPSB0aGlzLmZvbnRTaXplICsgdGhpcy5idWZmZXIgKiAyO1xuXG4gICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IHNpemU7XG5cbiAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgdGhpcy5jdHguZm9udCA9IHRoaXMuZm9udFdlaWdodCArICcgJyArIHRoaXMuZm9udFNpemUgKyAncHggJyArIHRoaXMuZm9udEZhbWlseTtcbiAgICB0aGlzLmN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSAnYmxhY2snO1xuXG4gICAgLy8gdGVtcG9yYXJ5IGFycmF5cyBmb3IgdGhlIGRpc3RhbmNlIHRyYW5zZm9ybVxuICAgIHRoaXMuZ3JpZE91dGVyID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogc2l6ZSk7XG4gICAgdGhpcy5ncmlkSW5uZXIgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUgKiBzaXplKTtcbiAgICB0aGlzLmYgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUpO1xuICAgIHRoaXMuZCA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSk7XG4gICAgdGhpcy56ID0gbmV3IEZsb2F0NjRBcnJheShzaXplICsgMSk7XG4gICAgdGhpcy52ID0gbmV3IEludDE2QXJyYXkoc2l6ZSk7XG5cbiAgICAvLyBoYWNrIGFyb3VuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzc4NTJcbiAgICB0aGlzLm1pZGRsZSA9IE1hdGgucm91bmQoKHNpemUgLyAyKSAqIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0dlY2tvLycpID49IDAgPyAxLjIgOiAxKSk7XG59XG5cblRpbnlTREYucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAoY2hhcikge1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLnNpemUsIHRoaXMuc2l6ZSk7XG4gICAgdGhpcy5jdHguZmlsbFRleHQoY2hhciwgdGhpcy5idWZmZXIsIHRoaXMubWlkZGxlKTtcblxuICAgIHZhciBpbWdEYXRhID0gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMuc2l6ZSwgdGhpcy5zaXplKTtcbiAgICB2YXIgYWxwaGFDaGFubmVsID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2l6ZSAqIHRoaXMuc2l6ZTsgaSsrKSB7XG4gICAgICAgIHZhciBhID0gaW1nRGF0YS5kYXRhW2kgKiA0ICsgM10gLyAyNTU7IC8vIGFscGhhIHZhbHVlXG4gICAgICAgIHRoaXMuZ3JpZE91dGVyW2ldID0gYSA9PT0gMSA/IDAgOiBhID09PSAwID8gSU5GIDogTWF0aC5wb3coTWF0aC5tYXgoMCwgMC41IC0gYSksIDIpO1xuICAgICAgICB0aGlzLmdyaWRJbm5lcltpXSA9IGEgPT09IDEgPyBJTkYgOiBhID09PSAwID8gMCA6IE1hdGgucG93KE1hdGgubWF4KDAsIGEgLSAwLjUpLCAyKTtcbiAgICB9XG5cbiAgICBlZHQodGhpcy5ncmlkT3V0ZXIsIHRoaXMuc2l6ZSwgdGhpcy5zaXplLCB0aGlzLmYsIHRoaXMuZCwgdGhpcy52LCB0aGlzLnopO1xuICAgIGVkdCh0aGlzLmdyaWRJbm5lciwgdGhpcy5zaXplLCB0aGlzLnNpemUsIHRoaXMuZiwgdGhpcy5kLCB0aGlzLnYsIHRoaXMueik7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zaXplICogdGhpcy5zaXplOyBpKyspIHtcbiAgICAgICAgdmFyIGQgPSB0aGlzLmdyaWRPdXRlcltpXSAtIHRoaXMuZ3JpZElubmVyW2ldO1xuICAgICAgICBhbHBoYUNoYW5uZWxbaV0gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMjU1IC0gMjU1ICogKGQgLyB0aGlzLnJhZGl1cyArIHRoaXMuY3V0b2ZmKSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxwaGFDaGFubmVsO1xufTtcblxuLy8gMkQgRXVjbGlkZWFuIGRpc3RhbmNlIHRyYW5zZm9ybSBieSBGZWx6ZW5zendhbGIgJiBIdXR0ZW5sb2NoZXIgaHR0cHM6Ly9jcy5icm93bi5lZHUvfnBmZi9wYXBlcnMvZHQtZmluYWwucGRmXG5mdW5jdGlvbiBlZHQoZGF0YSwgd2lkdGgsIGhlaWdodCwgZiwgZCwgdiwgeikge1xuICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmW3ldID0gZGF0YVt5ICogd2lkdGggKyB4XTtcbiAgICAgICAgfVxuICAgICAgICBlZHQxZChmLCBkLCB2LCB6LCBoZWlnaHQpO1xuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGRhdGFbeSAqIHdpZHRoICsgeF0gPSBkW3ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgZlt4XSA9IGRhdGFbeSAqIHdpZHRoICsgeF07XG4gICAgICAgIH1cbiAgICAgICAgZWR0MWQoZiwgZCwgdiwgeiwgd2lkdGgpO1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgZGF0YVt5ICogd2lkdGggKyB4XSA9IE1hdGguc3FydChkW3hdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gMUQgc3F1YXJlZCBkaXN0YW5jZSB0cmFuc2Zvcm1cbmZ1bmN0aW9uIGVkdDFkKGYsIGQsIHYsIHosIG4pIHtcbiAgICB2WzBdID0gMDtcbiAgICB6WzBdID0gLUlORjtcbiAgICB6WzFdID0gK0lORjtcblxuICAgIGZvciAodmFyIHEgPSAxLCBrID0gMDsgcSA8IG47IHErKykge1xuICAgICAgICB2YXIgcyA9ICgoZltxXSArIHEgKiBxKSAtIChmW3Zba11dICsgdltrXSAqIHZba10pKSAvICgyICogcSAtIDIgKiB2W2tdKTtcbiAgICAgICAgd2hpbGUgKHMgPD0geltrXSkge1xuICAgICAgICAgICAgay0tO1xuICAgICAgICAgICAgcyA9ICgoZltxXSArIHEgKiBxKSAtIChmW3Zba11dICsgdltrXSAqIHZba10pKSAvICgyICogcSAtIDIgKiB2W2tdKTtcbiAgICAgICAgfVxuICAgICAgICBrKys7XG4gICAgICAgIHZba10gPSBxO1xuICAgICAgICB6W2tdID0gcztcbiAgICAgICAgeltrICsgMV0gPSArSU5GO1xuICAgIH1cblxuICAgIGZvciAocSA9IDAsIGsgPSAwOyBxIDwgbjsgcSsrKSB7XG4gICAgICAgIHdoaWxlICh6W2sgKyAxXSA8IHEpIGsrKztcbiAgICAgICAgZFtxXSA9IChxIC0gdltrXSkgKiAocSAtIHZba10pICsgZlt2W2tdXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgbG9hZEdseXBoUmFuZ2UgZnJvbSAnLi4vc3R5bGUvbG9hZF9nbHlwaF9yYW5nZSc7XG5cbmltcG9ydCBUaW55U0RGIGZyb20gJ0BtYXBib3gvdGlueS1zZGYnO1xuaW1wb3J0IGlzQ2hhciBmcm9tICcuLi91dGlsL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jayc7XG5pbXBvcnQge2FzeW5jQWxsfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlJztcblxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2dseXBoJztcbmltcG9ydCB0eXBlIHtSZXF1ZXN0TWFuYWdlcn0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5cbnR5cGUgRW50cnkgPSB7XG4gICAgLy8gbnVsbCBtZWFucyB3ZSd2ZSByZXF1ZXN0ZWQgdGhlIHJhbmdlLCBidXQgdGhlIGdseXBoIHdhc24ndCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LlxuICAgIGdseXBoczoge1tpZDogbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9LFxuICAgIHJlcXVlc3RzOiB7W3JhbmdlOiBudW1iZXJdOiBBcnJheTxDYWxsYmFjazx7W186IG51bWJlcl06IFN0eWxlR2x5cGggfCBudWxsfT4+fSxcbiAgICByYW5nZXM6IHtbcmFuZ2U6IG51bWJlcl06IGJvb2xlYW4gfCBudWxsfSxcbiAgICB0aW55U0RGPzogVGlueVNERlxufTtcblxuY2xhc3MgR2x5cGhNYW5hZ2VyIHtcbiAgICByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXI7XG4gICAgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiA/c3RyaW5nO1xuICAgIGVudHJpZXM6IHtbXzogc3RyaW5nXTogRW50cnl9O1xuICAgIHVybDogP3N0cmluZztcblxuICAgIC8vIGV4cG9zZWQgYXMgc3RhdGljcyB0byBlbmFibGUgc3R1YmJpbmcgaW4gdW5pdCB0ZXN0c1xuICAgIHN0YXRpYyBsb2FkR2x5cGhSYW5nZTogdHlwZW9mIGxvYWRHbHlwaFJhbmdlO1xuICAgIHN0YXRpYyBUaW55U0RGOiBDbGFzczxUaW55U0RGPjtcblxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlciwgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiA/c3RyaW5nKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdE1hbmFnZXIgPSByZXF1ZXN0TWFuYWdlcjtcbiAgICAgICAgdGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IHt9O1xuICAgIH1cblxuICAgIHNldFVSTCh1cmw6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgfVxuXG4gICAgZ2V0R2x5cGhzKGdseXBoczoge1tzdGFjazogc3RyaW5nXTogQXJyYXk8bnVtYmVyPn0sIGNhbGxiYWNrOiBDYWxsYmFjazx7W3N0YWNrOiBzdHJpbmddOiB7W2lkOiBudW1iZXJdOiA/U3R5bGVHbHlwaH19Pikge1xuICAgICAgICBjb25zdCBhbGwgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0YWNrIGluIGdseXBocykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBnbHlwaHNbc3RhY2tdKSB7XG4gICAgICAgICAgICAgICAgYWxsLnB1c2goe3N0YWNrLCBpZH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXN5bmNBbGwoYWxsLCAoe3N0YWNrLCBpZH0sIGNhbGxiYWNrOiBDYWxsYmFjazx7c3RhY2s6IHN0cmluZywgaWQ6IG51bWJlciwgZ2x5cGg6ID9TdHlsZUdseXBofT4pID0+IHtcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZW50cmllc1tzdGFja107XG4gICAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSB0aGlzLmVudHJpZXNbc3RhY2tdID0ge1xuICAgICAgICAgICAgICAgICAgICBnbHlwaHM6IHt9LFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czoge30sXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlczoge31cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZ2x5cGggPSBlbnRyeS5nbHlwaHNbaWRdO1xuICAgICAgICAgICAgaWYgKGdseXBoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7c3RhY2ssIGlkLCBnbHlwaH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2x5cGggPSB0aGlzLl90aW55U0RGKGVudHJ5LCBzdGFjaywgaWQpO1xuICAgICAgICAgICAgaWYgKGdseXBoKSB7XG4gICAgICAgICAgICAgICAgZW50cnkuZ2x5cGhzW2lkXSA9IGdseXBoO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBofSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IE1hdGguZmxvb3IoaWQgLyAyNTYpO1xuICAgICAgICAgICAgaWYgKHJhbmdlICogMjU2ID4gNjU1MzUpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2dseXBocyA+IDY1NTM1IG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW50cnkucmFuZ2VzW3JhbmdlXSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBofSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV07XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdHMgPSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV0gPSBbXTtcbiAgICAgICAgICAgICAgICBHbHlwaE1hbmFnZXIubG9hZEdseXBoUmFuZ2Uoc3RhY2ssIHJhbmdlLCAodGhpcy51cmw6IGFueSksIHRoaXMucmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgIChlcnIsIHJlc3BvbnNlOiA/e1tfOiBudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKCtpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdseXBoc1sraWRdID0gcmVzcG9uc2VbK2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yYW5nZXNbcmFuZ2VdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2Igb2YgcmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYihlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXF1ZXN0cy5wdXNoKChlcnIsIHJlc3VsdDogP3tbXzogbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBoOiByZXN1bHRbaWRdIHx8IG51bGx9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVyciwgZ2x5cGhzOiA/QXJyYXk8e3N0YWNrOiBzdHJpbmcsIGlkOiBudW1iZXIsIGdseXBoOiA/U3R5bGVHbHlwaH0+KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGhzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHtzdGFjaywgaWQsIGdseXBofSBvZiBnbHlwaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGdseXBoIHNvIHRoYXQgb3VyIG93biBjb3B5IG9mIGl0cyBBcnJheUJ1ZmZlciBkb2Vzbid0IGdldCB0cmFuc2ZlcnJlZC5cbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdFtzdGFja10gfHwgKHJlc3VsdFtzdGFja10gPSB7fSkpW2lkXSA9IGdseXBoICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnbHlwaC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcDogZ2x5cGguYml0bWFwLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzOiBnbHlwaC5tZXRyaWNzXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2RvZXNDaGFyU3VwcG9ydExvY2FsR2x5cGgoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgICAgIHJldHVybiAhIXRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ICYmXG4gICAgICAgICAgICAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oaWQpIHx8XG4gICAgICAgICAgICAgICAgaXNDaGFyWydIYW5ndWwgU3lsbGFibGVzJ10oaWQpIHx8XG4gICAgICAgICAgICAgICAgaXNDaGFyWydIaXJhZ2FuYSddKGlkKSB8fFxuICAgICAgICAgICAgICAgIGlzQ2hhclsnS2F0YWthbmEnXShpZCkpO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5ldy1jYXAgKi9cbiAgICB9XG5cbiAgICBfdGlueVNERihlbnRyeTogRW50cnksIHN0YWNrOiBzdHJpbmcsIGlkOiBudW1iZXIpOiA/U3R5bGVHbHlwaCB7XG4gICAgICAgIGNvbnN0IGZhbWlseSA9IHRoaXMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5IHx8ICh0aGlzLnVybCA/IG51bGwgOiBzdGFjayk7XG4gICAgICAgIGlmICghZmFtaWx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhbWlseS5pbmRleE9mKFwiJ3N1cGVybWFwb2wtaWNvbnMnXCIpIDwgMCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGlueVNERiA9IGVudHJ5LnRpbnlTREY7XG4gICAgICAgIGlmICghdGlueVNERikge1xuICAgICAgICAgICAgbGV0IGZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICAgICAgICAgIGlmICgvYm9sZC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICc5MDAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvbWVkaXVtL2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzUwMCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9saWdodC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICcyMDAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGlueVNERiA9IGVudHJ5LnRpbnlTREYgPSBuZXcgR2x5cGhNYW5hZ2VyLlRpbnlTREYoMjQsIDMsIDgsIC4yNSwgZmFtaWx5LCBmb250V2VpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGJpdG1hcDogbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiAzMCwgaGVpZ2h0OiAzMH0sIHRpbnlTREYuZHJhdyhTdHJpbmcuZnJvbUNoYXJDb2RlKGlkKSkpLFxuICAgICAgICAgICAgbWV0cmljczoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDI0LFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgdG9wOiAtOCxcbiAgICAgICAgICAgICAgICBhZHZhbmNlOiAyNFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuR2x5cGhNYW5hZ2VyLmxvYWRHbHlwaFJhbmdlID0gbG9hZEdseXBoUmFuZ2U7XG5HbHlwaE1hbmFnZXIuVGlueVNERiA9IFRpbnlTREY7XG5cbmV4cG9ydCBkZWZhdWx0IEdseXBoTWFuYWdlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBHbHlwaE1hbmFnZXIgZnJvbSAnLi9nbHlwaF9tYW5hZ2VyJztcblxuY2xhc3MgR2x5cGhNYW5hZ2VyRmFjdG9yeSB7XG4gICAgZ2x5cGhNYW5hZ2VyczogeyBbc3RyaW5nXTogR2x5cGhNYW5hZ2VyIH1cblxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlciwgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiA/c3RyaW5nKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdE1hbmFnZXIgPSByZXF1ZXN0TWFuYWdlcjtcbiAgICAgICAgdGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VycyA9IHtcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiOm5ldyBHbHlwaE1hbmFnZXIodGhpcy5yZXF1ZXN0TWFuYWdlciwgdGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkpfTtcbiAgICB9XG4gICAgX2dldEdseXBoTWFuYWdlcihzb3VyY2VJZCkge1xuICAgICAgICBpZiAodGhpcy5nbHlwaE1hbmFnZXJzW3NvdXJjZUlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2x5cGhNYW5hZ2Vyc1tzb3VyY2VJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2x5cGhNYW5hZ2Vyc1tcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiXTtcbiAgICB9XG4gICAgc2V0VVJMKHVybDogP3N0cmluZywgc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKSB7XG4gICAgICAgIGlmICghdGhpcy5nbHlwaE1hbmFnZXJzW3NvdXJjZUlkXSkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXJzW3NvdXJjZUlkXSA9IG5ldyBHbHlwaE1hbmFnZXIodGhpcy5yZXF1ZXN0TWFuYWdlciwgdGhpcy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2dldEdseXBoTWFuYWdlcihzb3VyY2VJZCkuc2V0VVJMKHVybCk7XG4gICAgfVxuXG4gICAgZ2V0R2x5cGhzKGdseXBoczogeyBbc3RhY2s6IHN0cmluZ106IEFycmF5PG51bWJlcj4gfSwgY2FsbGJhY2s6IENhbGxiYWNrPHsgW3N0YWNrOiBzdHJpbmddOiB7IFtpZDogbnVtYmVyXTogP1N0eWxlR2x5cGggfSB9Piwgc291cmNlSWQgPSBcImltYWdlX21hbmFnZXJfZGVmYXVsdFwiKSB7XG4gICAgICAgIHRoaXMuX2dldEdseXBoTWFuYWdlcihzb3VyY2VJZCkuZ2V0R2x5cGhzKGdseXBocywgY2FsbGJhY2spO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEdseXBoTWFuYWdlckZhY3Rvcnk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmltcG9ydCB7ZW5kc1dpdGgsIGV4dGVuZCwgc3BoZXJpY2FsVG9DYXJ0ZXNpYW59IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQge1xuICAgIHZhbGlkYXRlU3R5bGUsXG4gICAgdmFsaWRhdGVMaWdodCxcbiAgICBlbWl0VmFsaWRhdGlvbkVycm9yc1xufSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZSc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9zdHlsZS1zcGVjJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcbmltcG9ydCB0eXBlIHtTdHlsZVNldHRlck9wdGlvbnN9IGZyb20gJy4uL3N0eWxlL3N0eWxlJztcbmltcG9ydCB7UHJvcGVydGllcywgVHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIFByb3BlcnR5LFxuICAgIFByb3BlcnR5VmFsdWUsXG4gICAgVHJhbnNpdGlvblBhcmFtZXRlcnNcbn0gZnJvbSAnLi9wcm9wZXJ0aWVzJztcblxuaW1wb3J0IHR5cGUge0xpZ2h0U3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5cbnR5cGUgTGlnaHRQb3NpdGlvbiA9IHtcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHo6IG51bWJlclxufTtcblxuY2xhc3MgTGlnaHRQb3NpdGlvblByb3BlcnR5IGltcGxlbWVudHMgUHJvcGVydHk8W251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBMaWdodFBvc2l0aW9uPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gc3R5bGVTcGVjLmxpZ2h0LnBvc2l0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8W251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBMaWdodFBvc2l0aW9uPiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBMaWdodFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHNwaGVyaWNhbFRvQ2FydGVzaWFuKHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUocGFyYW1ldGVycykpO1xuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6IExpZ2h0UG9zaXRpb24sIGI6IExpZ2h0UG9zaXRpb24sIHQ6IG51bWJlcik6IExpZ2h0UG9zaXRpb24ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgeTogaW50ZXJwb2xhdGUoYS55LCBiLnksIHQpLFxuICAgICAgICAgICAgejogaW50ZXJwb2xhdGUoYS56LCBiLnosIHQpLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxudHlwZSBQcm9wcyA9IHt8XG4gICAgXCJhbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJwb3NpdGlvblwiOiBMaWdodFBvc2l0aW9uUHJvcGVydHksXG4gICAgXCJjb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJpbnRlbnNpdHlcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLmxpZ2h0LmFuY2hvciksXG4gICAgXCJwb3NpdGlvblwiOiBuZXcgTGlnaHRQb3NpdGlvblByb3BlcnR5KCksXG4gICAgXCJjb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLmxpZ2h0LmNvbG9yKSxcbiAgICBcImludGVuc2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLmxpZ2h0LmludGVuc2l0eSksXG59KTtcblxuY29uc3QgVFJBTlNJVElPTl9TVUZGSVggPSAnLXRyYW5zaXRpb24nO1xuXG4vKlxuICogUmVwcmVzZW50cyB0aGUgbGlnaHQgdXNlZCB0byBsaWdodCBleHRydWRlZCBmZWF0dXJlcy5cbiAqL1xuY2xhc3MgTGlnaHQgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBfdHJhbnNpdGlvbmFibGU6IFRyYW5zaXRpb25hYmxlPFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZzogVHJhbnNpdGlvbmluZzxQcm9wcz47XG4gICAgcHJvcGVydGllczogUG9zc2libHlFdmFsdWF0ZWQ8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGlnaHRPcHRpb25zPzogTGlnaHRTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlID0gbmV3IFRyYW5zaXRpb25hYmxlKHByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLnNldExpZ2h0KGxpZ2h0T3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmcgPSB0aGlzLl90cmFuc2l0aW9uYWJsZS51bnRyYW5zaXRpb25lZCgpO1xuICAgIH1cblxuICAgIGdldExpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGUuc2VyaWFsaXplKCk7XG4gICAgfVxuXG4gICAgc2V0TGlnaHQobGlnaHQ/OiBMaWdodFNwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZUxpZ2h0LCBsaWdodCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBsaWdodCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsaWdodFtuYW1lXTtcbiAgICAgICAgICAgIGlmIChlbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRUcmFuc2l0aW9uKG5hbWUuc2xpY2UoMCwgLVRSQU5TSVRJT05fU1VGRklYLmxlbmd0aCksIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVyczogVHJhbnNpdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnRyYW5zaXRpb25lZChwYXJhbWV0ZXJzLCB0aGlzLl90cmFuc2l0aW9uaW5nKTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmluZy5oYXNUcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdGhpcy5fdHJhbnNpdGlvbmluZy5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZSh2YWxpZGF0ZTogRnVuY3Rpb24sIHZhbHVlOiBtaXhlZCwgb3B0aW9ucz86IHt2YWxpZGF0ZT86IGJvb2xlYW59KSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGUuY2FsbCh2YWxpZGF0ZVN0eWxlLCBleHRlbmQoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMjQwN1xuICAgICAgICAgICAgc3R5bGU6IHtnbHlwaHM6IHRydWUsIHNwcml0ZTogdHJ1ZX0sXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSkpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpZ2h0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt3YXJuT25jZX0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuLyoqXG4gKiBBIExpbmVBdGxhcyBsZXRzIHVzIHJldXNlIHJlbmRlcmVkIGRhc2hlZCBsaW5lc1xuICogYnkgd3JpdGluZyBtYW55IG9mIHRoZW0gdG8gYSB0ZXh0dXJlIGFuZCB0aGVuIGZldGNoaW5nIHRoZWlyIHBvc2l0aW9uc1xuICogdXNpbmcgLmdldERhc2guXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMaW5lQXRsYXMge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgbmV4dFJvdzogbnVtYmVyO1xuICAgIGJ5dGVzOiBudW1iZXI7XG4gICAgZGF0YTogVWludDhBcnJheTtcbiAgICBkYXNoRW50cnk6IHtbXzogc3RyaW5nXTogYW55fTtcbiAgICBkaXJ0eTogYm9vbGVhbjtcbiAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG5cbiAgICBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLm5leHRSb3cgPSAwO1xuXG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5kYXNoRW50cnkgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3IgY3JlYXRlIGEgZGFzaCBsaW5lIHBhdHRlcm4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGRhc2hhcnJheVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcm91bmQgd2hldGhlciB0byBhZGQgY2lyY2xlIGNhcHMgaW4gYmV0d2VlbiBkYXNoIHNlZ21lbnRzXG4gICAgICogQHJldHVybnMge09iamVjdH0gcG9zaXRpb24gb2YgZGFzaCB0ZXh0dXJlIGluIHsgeSwgaGVpZ2h0LCB3aWR0aCB9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXREYXNoKGRhc2hhcnJheTogQXJyYXk8bnVtYmVyPiwgcm91bmQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZGFzaGFycmF5LmpvaW4oXCIsXCIpICsgU3RyaW5nKHJvdW5kKTtcblxuICAgICAgICBpZiAoIXRoaXMuZGFzaEVudHJ5W2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMuZGFzaEVudHJ5W2tleV0gPSB0aGlzLmFkZERhc2goZGFzaGFycmF5LCByb3VuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGFzaEVudHJ5W2tleV07XG4gICAgfVxuXG4gICAgZ2V0RGFzaFJhbmdlcyhkYXNoYXJyYXk6IEFycmF5PG51bWJlcj4sIGxpbmVBdGxhc1dpZHRoOiBudW1iZXIsIHN0cmV0Y2g6IG51bWJlcikge1xuICAgICAgICAvLyBJZiBkYXNoYXJyYXkgaGFzIGFuIG9kZCBsZW5ndGgsIGJvdGggdGhlIGZpcnN0IGFuZCBsYXN0IHBhcnRzXG4gICAgICAgIC8vIGFyZSBkYXNoZXMgYW5kIHNob3VsZCBiZSBqb2luZWQgc2VhbWxlc3NseS5cbiAgICAgICAgY29uc3Qgb2RkRGFzaEFycmF5ID0gZGFzaGFycmF5Lmxlbmd0aCAlIDIgPT09IDE7XG5cbiAgICAgICAgY29uc3QgcmFuZ2VzID0gW107XG5cbiAgICAgICAgbGV0IGxlZnQgPSBvZGREYXNoQXJyYXkgPyAtZGFzaGFycmF5W2Rhc2hhcnJheS5sZW5ndGggLSAxXSAqIHN0cmV0Y2ggOiAwO1xuICAgICAgICBsZXQgcmlnaHQgPSBkYXNoYXJyYXlbMF0gKiBzdHJldGNoO1xuICAgICAgICBsZXQgaXNEYXNoID0gdHJ1ZTtcblxuICAgICAgICByYW5nZXMucHVzaCh7bGVmdCwgcmlnaHQsIGlzRGFzaCwgemVyb0xlbmd0aDogZGFzaGFycmF5WzBdID09PSAwfSk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnREYXNoTGVuZ3RoID0gZGFzaGFycmF5WzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGRhc2hhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaXNEYXNoID0gIWlzRGFzaDtcblxuICAgICAgICAgICAgY29uc3QgZGFzaExlbmd0aCA9IGRhc2hhcnJheVtpXTtcbiAgICAgICAgICAgIGxlZnQgPSBjdXJyZW50RGFzaExlbmd0aCAqIHN0cmV0Y2g7XG4gICAgICAgICAgICBjdXJyZW50RGFzaExlbmd0aCArPSBkYXNoTGVuZ3RoO1xuICAgICAgICAgICAgcmlnaHQgPSBjdXJyZW50RGFzaExlbmd0aCAqIHN0cmV0Y2g7XG5cbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHtsZWZ0LCByaWdodCwgaXNEYXNoLCB6ZXJvTGVuZ3RoOiBkYXNoTGVuZ3RoID09PSAwfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH1cblxuICAgIGFkZFJvdW5kRGFzaChyYW5nZXM6IE9iamVjdCwgc3RyZXRjaDogbnVtYmVyLCBuOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaGFsZlN0cmV0Y2ggPSBzdHJldGNoIC8gMjtcblxuICAgICAgICBmb3IgKGxldCB5ID0gLW47IHkgPD0gbjsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLm5leHRSb3cgKyBuICsgeTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53aWR0aCAqIHJvdztcbiAgICAgICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2N1cnJJbmRleF07XG5cbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHggLyByYW5nZS5yaWdodCA+IDEpIHsgcmFuZ2UgPSByYW5nZXNbKytjdXJySW5kZXhdOyB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0TGVmdCA9IE1hdGguYWJzKHggLSByYW5nZS5sZWZ0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0UmlnaHQgPSBNYXRoLmFicyh4IC0gcmFuZ2UucmlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pbkRpc3QgPSBNYXRoLm1pbihkaXN0TGVmdCwgZGlzdFJpZ2h0KTtcbiAgICAgICAgICAgICAgICBsZXQgc2lnbmVkRGlzdGFuY2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0TWlkZGxlID0gIHkgLyBuICogKGhhbGZTdHJldGNoICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmlzRGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0RWRnZSA9IGhhbGZTdHJldGNoIC0gTWF0aC5hYnMoZGlzdE1pZGRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gTWF0aC5zcXJ0KG1pbkRpc3QgKiBtaW5EaXN0ICsgZGlzdEVkZ2UgKiBkaXN0RWRnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSBoYWxmU3RyZXRjaCAtIE1hdGguc3FydChtaW5EaXN0ICogbWluRGlzdCArIGRpc3RNaWRkbGUgKiBkaXN0TWlkZGxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaW5kZXggKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyAxMjgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFJlZ3VsYXJEYXNoKHJhbmdlczogT2JqZWN0KSB7XG5cbiAgICAgICAgLy8gQ29sbGFwc2UgYW55IHplcm8tbGVuZ3RoIHJhbmdlXG4gICAgICAgIC8vIENvbGxhcHNlIG5laWdoYm91cmluZyBzYW1lLXR5cGUgcGFydHMgaW50byBhIHNpbmdsZSBwYXJ0XG4gICAgICAgIGZvciAobGV0IGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSByYW5nZXNbaV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gcmFuZ2VzW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChwYXJ0Lnplcm9MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByYW5nZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ICYmIG5leHQuaXNEYXNoID09PSBwYXJ0LmlzRGFzaCkge1xuICAgICAgICAgICAgICAgIG5leHQubGVmdCA9IHBhcnQubGVmdDtcbiAgICAgICAgICAgICAgICByYW5nZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tYmluZSB0aGUgZmlyc3QgYW5kIGxhc3QgcGFydHMgaWYgcG9zc2libGVcbiAgICAgICAgY29uc3QgZmlyc3QgPSByYW5nZXNbMF07XG4gICAgICAgIGNvbnN0IGxhc3QgPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoZmlyc3QuaXNEYXNoID09PSBsYXN0LmlzRGFzaCkge1xuICAgICAgICAgICAgZmlyc3QubGVmdCA9IGxhc3QubGVmdCAtIHRoaXMud2lkdGg7XG4gICAgICAgICAgICBsYXN0LnJpZ2h0ID0gZmlyc3QucmlnaHQgKyB0aGlzLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLndpZHRoICogdGhpcy5uZXh0Um93O1xuICAgICAgICBsZXQgY3VyckluZGV4ID0gMDtcbiAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2N1cnJJbmRleF07XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGlmICh4IC8gcmFuZ2UucmlnaHQgPiAxKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZXNbKytjdXJySW5kZXhdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXN0TGVmdCA9IE1hdGguYWJzKHggLSByYW5nZS5sZWZ0KTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RSaWdodCA9IE1hdGguYWJzKHggLSByYW5nZS5yaWdodCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pbkRpc3QgPSBNYXRoLm1pbihkaXN0TGVmdCwgZGlzdFJpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IHNpZ25lZERpc3RhbmNlID0gcmFuZ2UuaXNEYXNoID8gbWluRGlzdCA6IC1taW5EaXN0O1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFbaW5kZXggKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyAxMjgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZERhc2goZGFzaGFycmF5OiBBcnJheTxudW1iZXI+LCByb3VuZDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBuID0gcm91bmQgPyA3IDogMDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gMiAqIG4gKyAxO1xuXG4gICAgICAgIGlmICh0aGlzLm5leHRSb3cgKyBoZWlnaHQgPiB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0xpbmVBdGxhcyBvdXQgb2Ygc3BhY2UnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGFzaGFycmF5Lmxlbmd0aDsgaSsrKSB7IGxlbmd0aCArPSBkYXNoYXJyYXlbaV07IH1cblxuICAgICAgICBpZiAobGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJldGNoID0gdGhpcy53aWR0aCAvIGxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlcyA9IHRoaXMuZ2V0RGFzaFJhbmdlcyhkYXNoYXJyYXksIHRoaXMud2lkdGgsIHN0cmV0Y2gpO1xuXG4gICAgICAgICAgICBpZiAocm91bmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFJvdW5kRGFzaChyYW5nZXMsIHN0cmV0Y2gsIG4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFJlZ3VsYXJEYXNoKHJhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXNoRW50cnkgPSB7XG4gICAgICAgICAgICB5OiAodGhpcy5uZXh0Um93ICsgbiArIDAuNSkgLyB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgIGhlaWdodDogMiAqIG4gLyB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiBsZW5ndGhcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5leHRSb3cgKz0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZGFzaEVudHJ5O1xuICAgIH1cblxuICAgIGJpbmQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuUkVQRUFUKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLlJFUEVBVCk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5BTFBIQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIGdsLkFMUEhBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBnbC5BTFBIQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGluZUF0bGFzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt1bmlxdWVJZCwgYXN5bmNBbGx9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgQWN0b3IgZnJvbSAnLi9hY3Rvcic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIFdvcmtlclBvb2wgZnJvbSAnLi93b3JrZXJfcG9vbCc7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgZnJvbSBhIHtAbGluayBTb3VyY2V9IHRvIGFuIGFzc29jaWF0ZWRcbiAqIHtAbGluayBXb3JrZXJTb3VyY2V9LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIERpc3BhdGNoZXIge1xuICAgIHdvcmtlclBvb2w6IFdvcmtlclBvb2w7XG4gICAgYWN0b3JzOiBBcnJheTxBY3Rvcj47XG4gICAgY3VycmVudEFjdG9yOiBudW1iZXI7XG4gICAgaWQ6IG51bWJlcjtcblxuICAgIC8vIGV4cG9zZWQgdG8gYWxsb3cgc3R1YmJpbmcgaW4gdW5pdCB0ZXN0c1xuICAgIHN0YXRpYyBBY3RvcjogQ2xhc3M8QWN0b3I+O1xuXG4gICAgY29uc3RydWN0b3Iod29ya2VyUG9vbDogV29ya2VyUG9vbCwgcGFyZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy53b3JrZXJQb29sID0gd29ya2VyUG9vbDtcbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAwO1xuICAgICAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5hY3F1aXJlKHRoaXMuaWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaV07XG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IG5ldyBEaXNwYXRjaGVyLkFjdG9yKHdvcmtlciwgcGFyZW50LCB0aGlzLmlkKTtcbiAgICAgICAgICAgIGFjdG9yLm5hbWUgPSBgV29ya2VyICR7aX1gO1xuICAgICAgICAgICAgdGhpcy5hY3RvcnMucHVzaChhY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHRoaXMuYWN0b3JzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byBhbGwgV29ya2Vycy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGJyb2FkY2FzdCh0eXBlOiBzdHJpbmcsIGRhdGE6IG1peGVkLCBjYj86IEZ1bmN0aW9uKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLmFjdG9ycy5sZW5ndGgpO1xuICAgICAgICBjYiA9IGNiIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICBhc3luY0FsbCh0aGlzLmFjdG9ycywgKGFjdG9yLCBkb25lKSA9PiB7XG4gICAgICAgICAgICBhY3Rvci5zZW5kKHR5cGUsIGRhdGEsIGRvbmUpO1xuICAgICAgICB9LCBjYik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZXMgYW4gYWN0b3IgdG8gZGlzcGF0Y2ggbWVzc2FnZXMgdG8uIFRoZSBhY3RvcnMgYXJlIGRpc3RyaWJ1dGVkIGluIHJvdW5kLXJvYmluIGZhc2hpb24uXG4gICAgICogQHJldHVybnMgQW4gYWN0b3Igb2JqZWN0IGJhY2tlZCBieSBhIHdlYiB3b3JrZXIgZm9yIHByb2Nlc3NpbmcgbWVzc2FnZXMuXG4gICAgICovXG4gICAgZ2V0QWN0b3IoKTogQWN0b3Ige1xuICAgICAgICBhc3NlcnQodGhpcy5hY3RvcnMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAodGhpcy5jdXJyZW50QWN0b3IgKyAxKSAlIHRoaXMuYWN0b3JzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0b3JzW3RoaXMuY3VycmVudEFjdG9yXTtcbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuYWN0b3JzLmZvckVhY2goKGFjdG9yKSA9PiB7IGFjdG9yLnJlbW92ZSgpOyB9KTtcbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy53b3JrZXJQb29sLnJlbGVhc2UodGhpcy5pZCk7XG4gICAgfVxufVxuXG5EaXNwYXRjaGVyLkFjdG9yID0gQWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IERpc3BhdGNoZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BpY2ssIGV4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHtnZXRKU09OLCBSZXNvdXJjZVR5cGV9IGZyb20gJy4uL3V0aWwvYWpheCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuXG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHR5cGUge1RpbGVKU09OfSBmcm9tICcuLi90eXBlcy90aWxlanNvbic7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9wdGlvbnM6IGFueSwgcmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyLCBjYWxsYmFjazogQ2FsbGJhY2s8VGlsZUpTT04+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgbG9hZGVkID0gZnVuY3Rpb24oZXJyOiA/RXJyb3IsIHRpbGVKU09OOiA/T2JqZWN0KSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbGVKU09OKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHBpY2soXG4gICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgc291cmNlIG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgVGlsZUpTT05cbiAgICAgICAgICAgICAgICBleHRlbmQodGlsZUpTT04sIG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIFsndGlsZXMnLCAnbWluem9vbScsICdtYXh6b29tJywgJ2F0dHJpYnV0aW9uJywgJ21hcGJveF9sb2dvJywgJ2JvdW5kcycsICdzY2hlbWUnLCAndGlsZVNpemUnLCAnZW5jb2RpbmcnXVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHRpbGVKU09OLnZlY3Rvcl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudmVjdG9yTGF5ZXJzID0gdGlsZUpTT04udmVjdG9yX2xheWVycztcbiAgICAgICAgICAgICAgICByZXN1bHQudmVjdG9yTGF5ZXJJZHMgPSByZXN1bHQudmVjdG9yTGF5ZXJzLm1hcCgobGF5ZXIpID0+IHsgcmV0dXJuIGxheWVyLmlkOyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnRpbGVzID0gcmVxdWVzdE1hbmFnZXIuY2Fub25pY2FsaXplVGlsZXNldChyZXN1bHQsIG9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICAgIHJldHVybiBnZXRKU09OKHJlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QocmVxdWVzdE1hbmFnZXIubm9ybWFsaXplU291cmNlVVJMKG9wdGlvbnMudXJsKSwgUmVzb3VyY2VUeXBlLlNvdXJjZSksIGxvYWRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJyb3dzZXIuZnJhbWUoKCkgPT4gbG9hZGVkKG51bGwsIG9wdGlvbnMpKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xyXG5cclxuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMnO1xyXG5pbXBvcnQge21lcmNhdG9yWGZyb21MbmcsIG1lcmNhdG9yWWZyb21MYXR9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlJztcclxuXHJcbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XHJcblxyXG5jbGFzcyBUaWxlQm91bmRzIHtcclxuICAgIGJvdW5kczogTG5nTGF0Qm91bmRzO1xyXG4gICAgbWluem9vbTogbnVtYmVyO1xyXG4gICAgbWF4em9vbTogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG1pbnpvb206ID9udW1iZXIsIG1heHpvb206ID9udW1iZXIpIHtcclxuICAgICAgICB0aGlzLmJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KHRoaXMudmFsaWRhdGVCb3VuZHMoYm91bmRzKSk7XHJcbiAgICAgICAgdGhpcy5taW56b29tID0gbWluem9vbSB8fCAwO1xyXG4gICAgICAgIHRoaXMubWF4em9vbSA9IG1heHpvb20gfHwgMjQ7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVCb3VuZHMoYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYm91bmRzIHByb3BlcnR5IGNvbnRhaW5zIHZhbGlkIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVzXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJvdW5kcykgfHwgYm91bmRzLmxlbmd0aCAhPT0gNCkgcmV0dXJuIFstMTgwLCAtOTAsIDE4MCwgOTBdO1xyXG4gICAgICAgIHJldHVybiBbTWF0aC5tYXgoLTE4MCwgYm91bmRzWzBdKSwgTWF0aC5tYXgoLTkwLCBib3VuZHNbMV0pLCBNYXRoLm1pbigxODAsIGJvdW5kc1syXSksIE1hdGgubWluKDkwLCBib3VuZHNbM10pXTtcclxuICAgIH1cclxuXHJcbiAgICBjb250YWlucyh0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCwgb3JpZ2luWCwgb3JpZ2luWSwgd2lkdGgsIGhlaWdodCwgY3JzKSB7XHJcbiAgICAgICAgY29uc3Qgd29ybGRTaXplID0gTWF0aC5wb3coMiwgdGlsZUlELnopO1xyXG4gICAgICAgIGxldCB3ZXN0ID0gdGhpcy5ib3VuZHMuZ2V0V2VzdCgpO1xyXG4gICAgICAgIGxldCBub3J0aCA9IHRoaXMuYm91bmRzLmdldE5vcnRoKCk7XHJcbiAgICAgICAgbGV0IGVhc3QgPSB0aGlzLmJvdW5kcy5nZXRFYXN0KCk7XHJcbiAgICAgICAgbGV0IHNvdXRoID0gdGhpcy5ib3VuZHMuZ2V0U291dGgoKTtcclxuICAgICAgICBjb25zdCBjZW50ZXIgPSB0aGlzLmJvdW5kcy5nZXRDZW50ZXIoKTtcclxuICAgICAgICBpZiAoY3JzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heExhdCA9IGNycy5sbmdMYXRFeHRlbnRbM107XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbkxhdCA9IGNycy5sbmdMYXRFeHRlbnRbMV07XHJcbiAgICAgICAgICAgIGNvbnN0IG1heExuZyA9IGNycy5sbmdMYXRFeHRlbnRbMl07XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbkxuZyA9IGNycy5sbmdMYXRFeHRlbnRbMF07XHJcbiAgICAgICAgICAgIG5vcnRoID0gTWF0aC5taW4oTWF0aC5tYXgobWluTGF0LCBub3J0aCksIG1heExhdCk7XHJcbiAgICAgICAgICAgIHNvdXRoID0gTWF0aC5taW4oTWF0aC5tYXgobWluTGF0LCBzb3V0aCksIG1heExhdCk7XHJcbiAgICAgICAgICAgIHdlc3QgPSBNYXRoLm1pbihNYXRoLm1heChtaW5MbmcsIHdlc3QpLCBtYXhMbmcpO1xyXG4gICAgICAgICAgICBlYXN0ID0gTWF0aC5taW4oTWF0aC5tYXgobWluTG5nLCBlYXN0KSwgbWF4TG5nKTtcclxuICAgICAgICAgICAgY2VudGVyLmxhdCA9IChub3J0aCArIHNvdXRoKSAvIDIuMDtcclxuICAgICAgICAgICAgY2VudGVyLmxuZyA9ICh3ZXN0ICsgZWFzdCkgLyAyLjA7XHJcbiAgICAgICAgICAgIHdlc3QgPSBjcnMuZnJvbVdHUzg0KFt3ZXN0LCBjZW50ZXIubGF0XSlbMF07XHJcbiAgICAgICAgICAgIG5vcnRoID0gY3JzLmZyb21XR1M4NChbY2VudGVyLmxuZywgbm9ydGhdKVsxXTtcclxuICAgICAgICAgICAgZWFzdCA9IGNycy5mcm9tV0dTODQoW2Vhc3QsIGNlbnRlci5sYXRdKVswXTtcclxuICAgICAgICAgICAgc291dGggPSBjcnMuZnJvbVdHUzg0KFtjZW50ZXIubG5nLCBzb3V0aF0pWzFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZXZlbCA9IHtcclxuICAgICAgICAgICAgbWluWDogTWF0aC5mbG9vcihcclxuICAgICAgICAgICAgICAgICgod2VzdCAtIG9yaWdpblgpICogd29ybGRTaXplKSAvIHdpZHRoXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIG1pblk6IE1hdGguZmxvb3IoXHJcbiAgICAgICAgICAgICAgICAoKG9yaWdpblkgLSBub3J0aCkgKiB3b3JsZFNpemUpIC8gaGVpZ2h0XHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIG1heFg6IE1hdGguY2VpbChcclxuICAgICAgICAgICAgICAgICgoZWFzdCAtIG9yaWdpblgpICogd29ybGRTaXplKSAvIHdpZHRoXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIG1heFk6IE1hdGguY2VpbChcclxuICAgICAgICAgICAgICAgICgob3JpZ2luWSAtIHNvdXRoKSAqIHdvcmxkU2l6ZSkgLyBoZWlnaHRcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGhpdCA9XHJcbiAgICAgICAgICAgIHRpbGVJRC54ID49IGxldmVsLm1pblggJiZcclxuICAgICAgICAgICAgdGlsZUlELnggPCBsZXZlbC5tYXhYICYmXHJcbiAgICAgICAgICAgIHRpbGVJRC55ID49IGxldmVsLm1pblkgJiZcclxuICAgICAgICAgICAgdGlsZUlELnkgPCBsZXZlbC5tYXhZO1xyXG4gICAgICAgIHJldHVybiBoaXQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRpbGVCb3VuZHM7XHJcbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xyXG5cclxuaW1wb3J0IHtleHRlbmQsIHBpY2t9IGZyb20gJy4uL3V0aWwvdXRpbCc7XHJcbmltcG9ydCBsb2FkVGlsZUpTT04gZnJvbSAnLi9sb2FkX3RpbGVqc29uJztcclxuaW1wb3J0IHtwb3N0VHVybnN0aWxlRXZlbnQsIHBvc3RNYXBMb2FkRXZlbnR9IGZyb20gJy4uL3V0aWwvbWFwYm94JztcclxuaW1wb3J0IFRpbGVCb3VuZHMgZnJvbSAnLi90aWxlX2JvdW5kcyc7XHJcbmltcG9ydCB7UmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXgnO1xyXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xyXG5pbXBvcnQge2NhY2hlRW50cnlQb3NzaWJseUFkZGVkfSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZSc7XHJcblxyXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZSc7XHJcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xyXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcclxuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xyXG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZSc7XHJcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xyXG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZSc7XHJcbmltcG9ydCB0eXBlIHtWZWN0b3JTb3VyY2VTcGVjaWZpY2F0aW9uLCBQcm9tb3RlSWRTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcclxuXHJcbi8qKlxyXG4gKiBBIHNvdXJjZSBjb250YWluaW5nIHZlY3RvciB0aWxlcyBpbiBbTWFwYm94IFZlY3RvciBUaWxlIGZvcm1hdF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vdmVjdG9yLXRpbGVzL3JlZmVyZW5jZS8pLlxyXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8jdmVjdG9yKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcclxuICpcclxuICogQGV4YW1wbGVcclxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcclxuICogICAgIHR5cGU6ICd2ZWN0b3InLFxyXG4gKiAgICAgdXJsOiAnbWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY2J1xyXG4gKiB9KTtcclxuICpcclxuICogQGV4YW1wbGVcclxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcclxuICogICAgIHR5cGU6ICd2ZWN0b3InLFxyXG4gKiAgICAgdGlsZXM6IFsnaHR0cHM6Ly9kMjV1YXJoeHl3emwxai5jbG91ZGZyb250Lm5ldC92MC4xL3t6fS97eH0ve3l9Lm12dCddLFxyXG4gKiAgICAgbWluem9vbTogNixcclxuICogICAgIG1heHpvb206IDE0XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBtYXAuZ2V0U291cmNlKCdzb21lIGlkJykuc2V0VXJsKFwibWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY2XCIpO1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBtYXAuZ2V0U291cmNlKCdzb21lIGlkJykuc2V0VGlsZXMoWydodHRwczovL2QyNXVhcmh4eXd6bDFqLmNsb3VkZnJvbnQubmV0L3YwLjEve3p9L3t4fS97eX0ubXZ0J10pO1xyXG4gKiBAc2VlIFtBZGQgYSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKVxyXG4gKiBAc2VlIFtBZGQgYSB0aGlyZCBwYXJ0eSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RoaXJkLXBhcnR5LylcclxuICovXHJcbmNsYXNzIFZlY3RvclRpbGVTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcclxuICAgIHR5cGU6ICd2ZWN0b3InO1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIG1pbnpvb206IG51bWJlcjtcclxuICAgIG1heHpvb206IG51bWJlcjtcclxuICAgIHVybDogc3RyaW5nO1xyXG4gICAgc2NoZW1lOiBzdHJpbmc7XHJcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xyXG4gICAgcHJvbW90ZUlkOiA/UHJvbW90ZUlkU3BlY2lmaWNhdGlvbjtcclxuXHJcbiAgICBfb3B0aW9uczogVmVjdG9yU291cmNlU3BlY2lmaWNhdGlvbjtcclxuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XHJcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xyXG4gICAgbWFwOiBNYXA7XHJcbiAgICBib3VuZHM6ID9bbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcclxuICAgIHRpbGVzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgdGlsZUJvdW5kczogVGlsZUJvdW5kcztcclxuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiBib29sZWFuO1xyXG4gICAgaXNUaWxlQ2xpcHBlZDogYm9vbGVhbjtcclxuICAgIF90aWxlSlNPTlJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xyXG4gICAgX2xvYWRlZDogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBWZWN0b3JTb3VyY2VTcGVjaWZpY2F0aW9uICYge2NvbGxlY3RSZXNvdXJjZVRpbWluZzogYm9vbGVhbn0sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xyXG5cclxuICAgICAgICB0aGlzLnR5cGUgPSAndmVjdG9yJztcclxuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xyXG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xyXG4gICAgICAgIHRoaXMuc2NoZW1lID0gJ3h5eic7XHJcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcclxuICAgICAgICB0aGlzLl9zY2FsZXMgPSBbXTtcclxuICAgICAgICB0aGlzLl9yZXNvbHV0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNUaWxlQ2xpcHBlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGV4dGVuZCh0aGlzLCBwaWNrKG9wdGlvbnMsIFsndXJsJywgJ3NjaGVtZScsICd0aWxlU2l6ZScsICdwcm9tb3RlSWQnXSkpO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe3R5cGU6ICd2ZWN0b3InfSwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IG9wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50aWxlU2l6ZSAhPT0gNTEyKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmVjdG9yIHRpbGUgc291cmNlcyBtdXN0IGhhdmUgYSB0aWxlU2l6ZSBvZiA1MTInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChldmVudGVkUGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcclxuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBsb2FkVGlsZUpTT04odGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCAoZXJyLCB0aWxlSlNPTikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04pIHtcclxuICAgICAgICAgICAgICAgIGV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZUpTT04uYm91bmRzKSB0aGlzLnRpbGVCb3VuZHMgPSBuZXcgVGlsZUJvdW5kcyh0aWxlSlNPTi5ib3VuZHMsIHRoaXMubWluem9vbSwgdGhpcy5tYXh6b29tKTtcclxuICAgICAgICAgICAgICAgIHBvc3RUdXJuc3RpbGVFdmVudCh0aWxlSlNPTi50aWxlcywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgICAgICAgICBwb3N0TWFwTG9hZEV2ZW50KHRpbGVKU09OLnRpbGVzLCB0aGlzLm1hcC5fZ2V0TWFwSWQoKSwgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9za3VUb2tlbiwgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYGNvbnRlbnRgIGlzIGluY2x1ZGVkIGhlcmUgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGBTdHlsZSNfdXBkYXRlU291cmNlc2AgaXMgY2FsbGVkXHJcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIFRpbGVKU09OIGFycml2ZXMuIHRoaXMgbWFrZXMgc3VyZSB0aGUgdGlsZXMgbmVlZGVkIGFyZSBsb2FkZWQgb25jZSBUaWxlSlNPTiBhcnJpdmVzXHJcbiAgICAgICAgICAgICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL3B1bGwvNDM0NyNkaXNjdXNzaW9uX3IxMDQ0MTgwODhcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ30pKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzVGlsZSh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMudGlsZUJvdW5kcyB8fCB0aGlzLnRpbGVCb3VuZHMuY29udGFpbnModGlsZUlELmNhbm9uaWNhbCwgdGhpcy5vcmlnaW5YLCB0aGlzLm9yaWdpblksIHRoaXMud29ybGRXaWR0aCwgdGhpcy53b3JsZEhlaWdodCwgdGhpcy5tYXAuZ2V0Q1JTKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWRkKG1hcDogTWFwKSB7XHJcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XHJcbiAgICAgICAgY29uc3QgY3JzID0gIG1hcC5nZXRDUlMoKTtcclxuICAgICAgICB0aGlzLndvcmxkV2lkdGggPSBjcnMuZ2V0V2lkdGgoKTtcclxuICAgICAgICB0aGlzLndvcmxkSGVpZ2h0ID0gY3JzLmdldEhlaWdodCgpO1xyXG4gICAgICAgIHRoaXMub3JpZ2luWCA9IGNycy5nZXRPcmlnaW5YKCk7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5ZID0gY3JzLmdldE9yaWdpblkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNvdXJjZVByb3BlcnR5KGNhbGxiYWNrOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0LmNhbmNlbCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLm1hcC5zdHlsZS5zb3VyY2VDYWNoZXNbdGhpcy5pZF07XHJcbiAgICAgICAgc291cmNlQ2FjaGUuY2xlYXJUaWxlcygpO1xyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc291cmNlIGB0aWxlc2AgcHJvcGVydHkgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0aWxlcyBBbiBhcnJheSBvZiBvbmUgb3IgbW9yZSB0aWxlIHNvdXJjZSBVUkxzLCBhcyBpbiB0aGUgVGlsZUpTT04gc3BlYy5cclxuICAgICAqIEByZXR1cm5zIHtWZWN0b3JUaWxlU291cmNlfSB0aGlzXHJcbiAgICAgKi9cclxuICAgIHNldFRpbGVzKHRpbGVzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdGhpcy5zZXRTb3VyY2VQcm9wZXJ0eSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMudGlsZXMgPSB0aWxlcztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBzb3VyY2UgYHVybGAgcHJvcGVydHkgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEEgVVJMIHRvIGEgVGlsZUpTT04gcmVzb3VyY2UuIFN1cHBvcnRlZCBwcm90b2NvbHMgYXJlIGBodHRwOmAsIGBodHRwczpgLCBhbmQgYG1hcGJveDovLzxUaWxlc2V0IElEPmAuXHJcbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yVGlsZVNvdXJjZX0gdGhpc1xyXG4gICAgICovXHJcbiAgICBzZXRVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNldFNvdXJjZVByb3BlcnR5KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cmwgPSB1cmw7XHJcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMudXJsID0gdXJsO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBvblJlbW92ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGlsZUpTT05SZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcclxuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWFsaXplKCkge1xyXG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVUaWxlVVJMKHRpbGUudGlsZUlELmNhbm9uaWNhbC51cmwodGhpcy50aWxlcywgdGhpcy5zY2hlbWUsMCx0aGlzLnRpbGVTaXplLHRoaXMuZ2V0U2NhbGU/dGhpcy5nZXRTY2FsZSh0aWxlLnRpbGVJRC5jYW5vbmljYWwueiwgdGhpcy50aWxlU2l6ZSk6dW5kZWZpbmVkKSwgdGhpcy51cmwsIG51bGwpO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuVGlsZSksXHJcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXHJcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXHJcbiAgICAgICAgICAgIHpvb206IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxyXG4gICAgICAgICAgICB0aWxlU2l6ZTogdGhpcy50aWxlU2l6ZSAqIHRpbGUudGlsZUlELm92ZXJzY2FsZUZhY3RvcigpLFxyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcclxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxyXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlcyxcclxuICAgICAgICAgICAgcHJvbW90ZUlkOiB0aGlzLnByb21vdGVJZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nO1xyXG5cclxuICAgICAgICBpZiAoIXRpbGUuYWN0b3IgfHwgdGlsZS5zdGF0ZSA9PT0gJ2V4cGlyZWQnKSB7XHJcbiAgICAgICAgICAgIHRpbGUuYWN0b3IgPSB0aGlzLmRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcclxuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0ID0gdGlsZS5hY3Rvci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRpbGUuc3RhdGUgPT09ICdsb2FkaW5nJykge1xyXG4gICAgICAgICAgICAvLyBzY2hlZHVsZSB0aWxlIHJlbG9hZGluZyBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWRcclxuICAgICAgICAgICAgdGlsZS5yZWxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdCA9IHRpbGUuYWN0b3Iuc2VuZCgncmVsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCBkYXRhKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XHJcblxyXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIuc3RhdHVzICE9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc291cmNlVGltaW5nKVxyXG4gICAgICAgICAgICAgICAgdGlsZS5yZXNvdXJjZVRpbWluZyA9IGRhdGEucmVzb3VyY2VUaW1pbmc7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMgJiYgZGF0YSkgdGlsZS5zZXRFeHBpcnlEYXRhKGRhdGEpO1xyXG4gICAgICAgICAgICB0aWxlLmxvYWRWZWN0b3JEYXRhKGRhdGEsIHRoaXMubWFwLnBhaW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQodGhpcy5kaXNwYXRjaGVyKTtcclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRpbGUucmVsb2FkQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFRpbGUodGlsZSwgdGlsZS5yZWxvYWRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICB0aWxlLnJlbG9hZENhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhYm9ydFRpbGUodGlsZTogVGlsZSkge1xyXG4gICAgICAgIGlmICh0aWxlLnJlcXVlc3QpIHtcclxuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0LmNhbmNlbCgpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGlsZS5hY3Rvcikge1xyXG4gICAgICAgICAgICB0aWxlLmFjdG9yLnNlbmQoJ2Fib3J0VGlsZScsIHt1aWQ6IHRpbGUudWlkLCB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZH0sIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSkge1xyXG4gICAgICAgIHRpbGUudW5sb2FkVmVjdG9yRGF0YSgpO1xyXG4gICAgICAgIGlmICh0aWxlLmFjdG9yKSB7XHJcbiAgICAgICAgICAgIHRpbGUuYWN0b3Iuc2VuZCgncmVtb3ZlVGlsZScsIHt1aWQ6IHRpbGUudWlkLCB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZH0sIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhc1RyYW5zaXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZ2V0TWV0ZXJQZXJNYXBVbml0KHVuaXQpIHtcclxuICAgICAgICBjb25zdCBlYXJjaFJhZGl1c0luTWV0ZXJzID0gNjM3ODEzNztcclxuICAgICAgICBsZXQgbWV0ZXJQZXJNYXBVbml0ID0gMTtcclxuICAgICAgICBpZiAodW5pdCA9PT0gXCJkZWdyZWVcIiB8fCB1bml0ID09PSBcImRlZ3JlZXNcIiB8fCB1bml0ID09PSBcImRcIikge1xyXG4gICAgICAgICAgICAvLyDmr4/luqbooajnpLrlpJrlsJHnsbPjgIJcclxuICAgICAgICAgICAgbWV0ZXJQZXJNYXBVbml0ID0gKE1hdGguUEkgKiAyICogZWFyY2hSYWRpdXNJbk1ldGVycykgLyAzNjA7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1bml0ID09PSBcImtpbG9tZXRlclwiIHx8IHVuaXQgPT09IFwia21cIikge1xyXG4gICAgICAgICAgICBtZXRlclBlck1hcFVuaXQgPSAxLjBlLTM7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1bml0ID09PSBcImluY2hcIikge1xyXG4gICAgICAgICAgICBtZXRlclBlck1hcFVuaXQgPSAxIC8gMi41Mzk5OTk5OTE4ZS0yO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodW5pdCA9PT0gXCJmb290XCIpIHtcclxuICAgICAgICAgICAgbWV0ZXJQZXJNYXBVbml0ID0gMC4zMDQ4O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWV0ZXJQZXJNYXBVbml0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJlc29sdXRpb24oeiwgdGlsZVNpemUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3Jlc29sdXRpb25zW3pdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdXRpb25zW3pdID0gdGhpcy53b3JsZFdpZHRoIC8gTWF0aC5wb3coMiwgeikgLyB0aWxlU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdXRpb25zW3pdO1xyXG4gICAgfVxyXG4gICAgZ2V0U2NhbGUoeiwgdGlsZVNpemUpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3NjYWxlc1t6XSkge1xyXG4gICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLmdldFJlc29sdXRpb24oeiwgdGlsZVNpemUpO1xyXG4gICAgICAgICAgICBjb25zdCBpbmNoUGVyTWV0ZXIgPSAxIC8gMC4wMjU0O1xyXG4gICAgICAgICAgICAvLyDlnLDnkIPljYrlvoTjgIJcclxuICAgICAgICAgICAgY29uc3QgbWV0ZXJQZXJNYXBVbml0ID0gdGhpcy5nZXRNZXRlclBlck1hcFVuaXQodGhpcy5tYXAuZ2V0Q1JTKCkuZ2V0VW5pdCgpKTtcclxuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSByZXMgKiA5NiAqIGluY2hQZXJNZXRlciAqIG1ldGVyUGVyTWFwVW5pdDtcclxuICAgICAgICAgICAgdGhpcy5fc2NhbGVzW3pdID0gMS4wIC8gc2NhbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY2FsZXNbel07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZlY3RvclRpbGVTb3VyY2U7XHJcbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQge2V4dGVuZCwgcGlja30gZnJvbSAnLi4vdXRpbC91dGlsJztcclxuXHJcbmltcG9ydCB7Z2V0SW1hZ2UsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4JztcclxuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcclxuaW1wb3J0IGxvYWRUaWxlSlNPTiBmcm9tICcuL2xvYWRfdGlsZWpzb24nO1xyXG5pbXBvcnQge3Bvc3RUdXJuc3RpbGVFdmVudCwgcG9zdE1hcExvYWRFdmVudH0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xyXG5pbXBvcnQgVGlsZUJvdW5kcyBmcm9tICcuL3RpbGVfYm91bmRzJztcclxuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUnO1xyXG5cclxuaW1wb3J0IHtjYWNoZUVudHJ5UG9zc2libHlBZGRlZH0gZnJvbSAnLi4vdXRpbC90aWxlX3JlcXVlc3RfY2FjaGUnO1xyXG5cclxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UnO1xyXG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcclxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XHJcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcclxuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUnO1xyXG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcclxuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUnO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgICBSYXN0ZXJTb3VyY2VTcGVjaWZpY2F0aW9uLFxyXG4gICAgUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvblxyXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xyXG5cclxuY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBTb3VyY2Uge1xyXG4gICAgdHlwZTogJ3Jhc3RlcicgfCAncmFzdGVyLWRlbSc7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgbWluem9vbTogbnVtYmVyO1xyXG4gICAgbWF4em9vbTogbnVtYmVyO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICBzY2hlbWU6IHN0cmluZztcclxuICAgIHRpbGVTaXplOiBudW1iZXI7XHJcblxyXG4gICAgYm91bmRzOiA/W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XHJcbiAgICB0aWxlQm91bmRzOiBUaWxlQm91bmRzO1xyXG4gICAgcm91bmRab29tOiBib29sZWFuO1xyXG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcclxuICAgIG1hcDogTWFwO1xyXG4gICAgdGlsZXM6IEFycmF5PHN0cmluZz47XHJcblxyXG4gICAgX2xvYWRlZDogYm9vbGVhbjtcclxuICAgIF9vcHRpb25zOiBSYXN0ZXJTb3VyY2VTcGVjaWZpY2F0aW9uIHwgUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvbjtcclxuICAgIF90aWxlSlNPTlJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJhc3RlclNvdXJjZVNwZWNpZmljYXRpb24gfCBSYXN0ZXJERU1Tb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcclxuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMudHlwZSA9ICdyYXN0ZXInO1xyXG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XHJcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XHJcbiAgICAgICAgdGhpcy5yb3VuZFpvb20gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2NoZW1lID0gJ3h5eic7XHJcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcclxuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zY2FsZXMgPSBbXTtcclxuICAgICAgICB0aGlzLl9yZXNvbHV0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmFzdGVyU291cmNlID0gJyc7XHJcbiAgICAgICAgdGhpcy5jYWNoZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVkaXJlY3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxheWVyc0lEID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByb3h5ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRpbGV2ZXJzaW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJhc3RlcmZ1bmN0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByakNvb3JkU3lzID0gbnVsbDtcclxuICAgICAgICB0aGlzLmZvcm1hdCA9ICdwbmcnO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe3R5cGU6ICdyYXN0ZXInfSwgb3B0aW9ucyk7XHJcbiAgICAgICAgZXh0ZW5kKHRoaXMsIHBpY2sob3B0aW9ucywgWyd1cmwnLCAnc2NoZW1lJywgJ3RpbGVTaXplJywgJ3Jhc3RlclNvdXJjZScsICd0cmFuc3BhcmVudCcsICdjYWNoZUVuYWJsZWQnLCAncmVkaXJlY3QnLCAnbGF5ZXJzSUQnLCAncHJveHknLCAndGlsZXZlcnNpb24nLCAncmFzdGVyZnVuY3Rpb24nLCAnZm9ybWF0JywgJ3ByakNvb3JkU3lzJ10pKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcclxuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBsb2FkVGlsZUpTT04odGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCAoZXJyLCB0aWxlSlNPTikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04pIHtcclxuICAgICAgICAgICAgICAgIGV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZUpTT04uYm91bmRzKSB0aGlzLnRpbGVCb3VuZHMgPSBuZXcgVGlsZUJvdW5kcyh0aWxlSlNPTi5ib3VuZHMsIHRoaXMubWluem9vbSwgdGhpcy5tYXh6b29tKTtcclxuXHJcbiAgICAgICAgICAgICAgICBwb3N0VHVybnN0aWxlRXZlbnQodGlsZUpTT04udGlsZXMpO1xyXG4gICAgICAgICAgICAgICAgcG9zdE1hcExvYWRFdmVudCh0aWxlSlNPTi50aWxlcywgdGhpcy5tYXAuX2dldE1hcElkKCksIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5fc2t1VG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGBjb250ZW50YCBpcyBpbmNsdWRlZCBoZXJlIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBgU3R5bGUjX3VwZGF0ZVNvdXJjZXNgIGlzIGNhbGxlZFxyXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBUaWxlSlNPTiBhcnJpdmVzLiB0aGlzIG1ha2VzIHN1cmUgdGhlIHRpbGVzIG5lZWRlZCBhcmUgbG9hZGVkIG9uY2UgVGlsZUpTT04gYXJyaXZlc1xyXG4gICAgICAgICAgICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9wdWxsLzQzNDcjZGlzY3Vzc2lvbl9yMTA0NDE4MDg4XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YSd9KSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWRkKG1hcDogTWFwKSB7XHJcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XHJcbiAgICAgICAgY29uc3QgY3JzID0gIG1hcC5nZXRDUlMoKTtcclxuICAgICAgICB0aGlzLndvcmxkV2lkdGggPSBjcnMuZ2V0V2lkdGgoKTtcclxuICAgICAgICB0aGlzLndvcmxkSGVpZ2h0ID0gY3JzLmdldEhlaWdodCgpO1xyXG4gICAgICAgIHRoaXMub3JpZ2luWCA9IGNycy5nZXRPcmlnaW5YKCk7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5ZID0gY3JzLmdldE9yaWdpblkoKTtcclxuICAgICAgICB0aGlzLmxvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBvblJlbW92ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGlsZUpTT05SZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcclxuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWFsaXplKCkge1xyXG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLnRpbGVCb3VuZHMgfHwgdGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKHRpbGVJRC5jYW5vbmljYWwsIHRoaXMub3JpZ2luWCwgdGhpcy5vcmlnaW5ZLCB0aGlzLndvcmxkV2lkdGgsIHRoaXMud29ybGRIZWlnaHQsIHRoaXMubWFwLmdldENSUygpKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcclxuICAgICAgICBsZXQgdXJsID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5yYXN0ZXJTb3VyY2UgPT09IFwiaXNlcnZlclwiICYmIHRoaXMuZ2V0U2NhbGUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLmdldFNjYWxlKHRpbGUudGlsZUlELmNhbm9uaWNhbC56LCB0aGlzLnRpbGVTaXplKTtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5tYXAuX21hcENSUy5nZXRPcmlnaW4oKTtcclxuICAgICAgICAgICAgY29uc3QgbWFwVXJscyA9IGAke1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aWxlc1tcclxuICAgICAgICAgICAgICAgICAgICAodGlsZS50aWxlSUQuY2Fub25pY2FsLnggKyB0aWxlLnRpbGVJRC5jYW5vbmljYWwueSkgJVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9YC5zcGxpdChcIj9cIik7XHJcbiAgICAgICAgICAgIHVybCA9IGAke21hcFVybHNbMF19L3RpbGVpbWFnZS4ke3RoaXMuZm9ybWF0fT9zY2FsZT0ke3NjYWxlfSZ4PSR7XHJcbiAgICAgICAgICAgICAgICB0aWxlLnRpbGVJRC5jYW5vbmljYWwueFxyXG4gICAgICAgICAgICB9Jnk9JHt0aWxlLnRpbGVJRC5jYW5vbmljYWwueX0md2lkdGg9JHt0aGlzLnRpbGVTaXplfSZoZWlnaHQ9JHtcclxuICAgICAgICAgICAgICAgIHRoaXMudGlsZVNpemVcclxuICAgICAgICAgICAgfSZ0cmFuc3BhcmVudD0ke3RoaXMudHJhbnNwYXJlbnR9JnJlZGlyZWN0PSR7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0XHJcbiAgICAgICAgICAgIH0mY2FjaGVFbmFibGVkPSR7dGhpcy5jYWNoZUVuYWJsZWR9Jm9yaWdpbj0ke2VuY29kZVVSSUNvbXBvbmVudChcclxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgeDogb3JpZ2luWzBdLCB5OiBvcmlnaW5bMV0gfSlcclxuICAgICAgICAgICAgKX1gO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXllcnNJRCkge1xyXG4gICAgICAgICAgICAgICAgdXJsID0gYCR7dXJsfSZsYXllcnNJRD0ke3RoaXMubGF5ZXJzSUR9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy50aWxldmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdXJsID0gYCR7dXJsfSZ0aWxldmVyc2lvbj0ke3RoaXMudGlsZXZlcnNpb259YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5yYXN0ZXJmdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdXJsID0gYCR7dXJsfSZyYXN0ZXJmdW5jdGlvbj0ke2VuY29kZVVSSUNvbXBvbmVudChcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnJhc3RlcmZ1bmN0aW9uKVxyXG4gICAgICAgICAgICAgICAgKX1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByakNvb3JkU3lzKSB7XHJcbiAgICAgICAgICAgICAgICB1cmwgPSBgJHt1cmx9JnByakNvb3JkU3lzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucHJqQ29vcmRTeXMpXHJcbiAgICAgICAgICAgICAgICApfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG1hcFVybHNbMV0pIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IGAke3VybH0mJHttYXBVcmxzWzFdfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBhID0gcGFyc2VJbnQodGhpcy5fb3B0aW9ucy56b29tT2Zmc2V0KVxyXG4gICAgICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLl9vcHRpb25zLnpvb21PZmZzZXQpXHJcbiAgICAgICAgICAgICAgICA6IDA7XHJcbiAgICAgICAgICAgIHVybCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVUaWxlVVJMKFxyXG4gICAgICAgICAgICAgICAgdGlsZS50aWxlSUQuY2Fub25pY2FsLnVybChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGEsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNjYWxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5nZXRTY2FsZSh0aWxlLnRpbGVJRC5jYW5vbmljYWwueiwgdGhpcy50aWxlU2l6ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVybCxcclxuICAgICAgICAgICAgICAgIHRoaXMudGlsZVNpemVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHRoaXMudXJsLCB0aGlzLnRpbGVTaXplKTtcclxuICAgICAgICAvLyBpY2xpZW50XHJcbiAgICAgICAgaWYgKHRoaXMucHJveHkpIHtcclxuICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5wcm94eX0ke2VuY29kZVVSSUNvbXBvbmVudCh1cmwpfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRpbGUucmVxdWVzdCA9IGdldEltYWdlKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlRpbGUpLCAoZXJyLCBpbWcpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAndW5sb2FkZWQnO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5fcmVmcmVzaEV4cGlyZWRUaWxlcykgdGlsZS5zZXRFeHBpcnlEYXRhKGltZyk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgKGltZzogYW55KS5jYWNoZUNvbnRyb2w7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgKGltZzogYW55KS5leHBpcmVzO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLm1hcC5wYWludGVyLmNvbnRleHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XHJcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLm1hcC5wYWludGVyLmdldFRpbGVUZXh0dXJlKGltZy53aWR0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlsZS50ZXh0dXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLnVwZGF0ZShpbWcsIHt1c2VNaXBtYXA6IHRydWV9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgaW1nLCBnbC5SR0JBLCB7dXNlTWlwbWFwOiB0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyZihnbC5URVhUVVJFXzJELCBjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQodGhpcy5kaXNwYXRjaGVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFib3J0VGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcclxuICAgICAgICBpZiAodGlsZS5yZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5jYW5jZWwoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xyXG4gICAgICAgIGlmICh0aWxlLnRleHR1cmUpIHRoaXMubWFwLnBhaW50ZXIuc2F2ZVRpbGVUZXh0dXJlKHRpbGUudGV4dHVyZSk7XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNUcmFuc2l0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNZXRlclBlck1hcFVuaXQodW5pdCkge1xyXG4gICAgICAgIGNvbnN0IGVhcmNoUmFkaXVzSW5NZXRlcnMgPSA2Mzc4MTM3O1xyXG4gICAgICAgIGxldCBtZXRlclBlck1hcFVuaXQgPSAxO1xyXG4gICAgICAgIGlmICh1bml0ID09PSBcImRlZ3JlZVwiIHx8IHVuaXQgPT09IFwiZGVncmVlc1wiIHx8IHVuaXQgPT09IFwiZFwiKSB7XHJcbiAgICAgICAgICAgIC8vIOavj+W6puihqOekuuWkmuWwkeexs+OAglxyXG4gICAgICAgICAgICBtZXRlclBlck1hcFVuaXQgPSAoTWF0aC5QSSAqIDIgKiBlYXJjaFJhZGl1c0luTWV0ZXJzKSAvIDM2MDtcclxuICAgICAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwia2lsb21ldGVyXCIgfHwgdW5pdCA9PT0gXCJrbVwiKSB7XHJcbiAgICAgICAgICAgIG1ldGVyUGVyTWFwVW5pdCA9IDEuMGUtMztcclxuICAgICAgICB9IGVsc2UgaWYgKHVuaXQgPT09IFwiaW5jaFwiKSB7XHJcbiAgICAgICAgICAgIG1ldGVyUGVyTWFwVW5pdCA9IDEgLyAyLjUzOTk5OTk5MThlLTI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1bml0ID09PSBcImZvb3RcIikge1xyXG4gICAgICAgICAgICBtZXRlclBlck1hcFVuaXQgPSAwLjMwNDg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtZXRlclBlck1hcFVuaXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVzb2x1dGlvbih6LCB0aWxlU2l6ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fcmVzb2x1dGlvbnNbel0pIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzb2x1dGlvbnNbel0gPSB0aGlzLndvcmxkV2lkdGggLyBNYXRoLnBvdygyLCB6KSAvIHRpbGVTaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb2x1dGlvbnNbel07XHJcbiAgICB9XHJcbiAgICBnZXRTY2FsZSh6LCB0aWxlU2l6ZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fc2NhbGVzW3pdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZ2V0UmVzb2x1dGlvbih6LCB0aWxlU2l6ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluY2hQZXJNZXRlciA9IDEgLyAwLjAyNTQ7XHJcbiAgICAgICAgICAgIC8vIOWcsOeQg+WNiuW+hOOAglxyXG4gICAgICAgICAgICBjb25zdCBtZXRlclBlck1hcFVuaXQgPSB0aGlzLmdldE1ldGVyUGVyTWFwVW5pdCh0aGlzLm1hcC5nZXRDUlMoKS5nZXRVbml0KCkpO1xyXG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IHJlcyAqIDk2ICogaW5jaFBlck1ldGVyICogbWV0ZXJQZXJNYXBVbml0O1xyXG4gICAgICAgICAgICB0aGlzLl9zY2FsZXNbel0gPSAxLjAgLyBzY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NjYWxlc1t6XTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmFzdGVyVGlsZVNvdXJjZTtcclxuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7Z2V0SW1hZ2UsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4JztcclxuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbCc7XHJcbmltcG9ydCB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcclxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcclxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XHJcbmltcG9ydCBvZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgZnJvbSAnLi4vdXRpbC9vZmZzY3JlZW5fY2FudmFzX3N1cHBvcnRlZCc7XHJcbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcclxuaW1wb3J0IFJhc3RlclRpbGVTb3VyY2UgZnJvbSAnLi9yYXN0ZXJfdGlsZV9zb3VyY2UnO1xyXG4vLyBlbnN1cmUgREVNRGF0YSBpcyByZWdpc3RlcmVkIGZvciB3b3JrZXIgdHJhbnNmZXIgb24gbWFpbiB0aHJlYWQ6XHJcbmltcG9ydCAnLi4vZGF0YS9kZW1fZGF0YSc7XHJcblxyXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZSc7XHJcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcclxuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUnO1xyXG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcclxuaW1wb3J0IHR5cGUge1Jhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xyXG5cclxuY2xhc3MgUmFzdGVyREVNVGlsZVNvdXJjZSBleHRlbmRzIFJhc3RlclRpbGVTb3VyY2UgaW1wbGVtZW50cyBTb3VyY2Uge1xyXG4gICAgZW5jb2Rpbmc6IFwibWFwYm94XCIgfCBcInRlcnJhcml1bVwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcclxuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XHJcbiAgICAgICAgdGhpcy50eXBlID0gJ3Jhc3Rlci1kZW0nO1xyXG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe3R5cGU6ICdyYXN0ZXItZGVtJ30sIG9wdGlvbnMpO1xyXG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nIHx8IFwibWFwYm94XCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWFsaXplKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdyYXN0ZXItZGVtJyxcclxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcclxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXHJcbiAgICAgICAgICAgIHRpbGVzOiB0aGlzLnRpbGVzLFxyXG4gICAgICAgICAgICBib3VuZHM6IHRoaXMuYm91bmRzLFxyXG4gICAgICAgICAgICBlbmNvZGluZzogdGhpcy5lbmNvZGluZ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHRoaXMudGlsZVNpemUpO1xyXG4gICAgICAgIHRpbGUucmVxdWVzdCA9IGdldEltYWdlKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlRpbGUpLCBpbWFnZUxvYWRlZC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGlsZS5uZWlnaGJvcmluZ1RpbGVzID0gdGhpcy5fZ2V0TmVpZ2hib3JpbmdUaWxlcyh0aWxlLnRpbGVJRCk7XHJcbiAgICAgICAgZnVuY3Rpb24gaW1hZ2VMb2FkZWQoZXJyLCBpbWcpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcclxuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICd1bmxvYWRlZCc7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGltZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzKSB0aWxlLnNldEV4cGlyeURhdGEoaW1nKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nOiBhbnkpLmNhY2hlQ29udHJvbDtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSAoaW1nOiBhbnkpLmV4cGlyZXM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2ZlciA9IHdpbmRvdy5JbWFnZUJpdG1hcCAmJiBpbWcgaW5zdGFuY2VvZiB3aW5kb3cuSW1hZ2VCaXRtYXAgJiYgb2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYXdJbWFnZURhdGEgPSB0cmFuc2ZlciA/IGltZyA6IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGltZywgMSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcclxuICAgICAgICAgICAgICAgICAgICBjb29yZDogdGlsZS50aWxlSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHJhd0ltYWdlRGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogdGhpcy5lbmNvZGluZ1xyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUuYWN0b3IgfHwgdGlsZS5zdGF0ZSA9PT0gJ2V4cGlyZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5hY3RvciA9IHRoaXMuZGlzcGF0Y2hlci5nZXRBY3RvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuYWN0b3Iuc2VuZCgnbG9hZERFTVRpbGUnLCBwYXJhbXMsIGRvbmUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCBkZW0pIHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkZW0pIHtcclxuICAgICAgICAgICAgICAgIHRpbGUuZGVtID0gZGVtO1xyXG4gICAgICAgICAgICAgICAgdGlsZS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2dldE5laWdoYm9yaW5nVGlsZXModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XHJcbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gdGlsZUlELmNhbm9uaWNhbDtcclxuICAgICAgICBjb25zdCBkaW0gPSBNYXRoLnBvdygyLCBjYW5vbmljYWwueik7XHJcblxyXG4gICAgICAgIGNvbnN0IHB4ID0gKGNhbm9uaWNhbC54IC0gMSArIGRpbSkgJSBkaW07XHJcbiAgICAgICAgY29uc3QgcHh3ID0gY2Fub25pY2FsLnggPT09IDAgPyB0aWxlSUQud3JhcCAtIDEgOiB0aWxlSUQud3JhcDtcclxuICAgICAgICBjb25zdCBueCA9IChjYW5vbmljYWwueCArIDEgKyBkaW0pICUgZGltO1xyXG4gICAgICAgIGNvbnN0IG54dyA9IGNhbm9uaWNhbC54ICsgMSA9PT0gZGltID8gdGlsZUlELndyYXAgKyAxIDogdGlsZUlELndyYXA7XHJcblxyXG4gICAgICAgIGNvbnN0IG5laWdoYm9yaW5nVGlsZXMgPSB7fTtcclxuICAgICAgICAvLyBhZGQgYWRqYWNlbnQgdGlsZXNcclxuICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55LCkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XHJcbiAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIG54dywgY2Fub25pY2FsLnosIG54LCBjYW5vbmljYWwueSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XHJcblxyXG4gICAgICAgIC8vIEFkZCB1cHBlciBuZWlnaGJvcmluZ1RpbGVzXHJcbiAgICAgICAgaWYgKGNhbm9uaWNhbC55ID4gMCkge1xyXG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XHJcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCB0aWxlSUQud3JhcCwgY2Fub25pY2FsLnosIGNhbm9uaWNhbC54LCBjYW5vbmljYWwueSAtIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xyXG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEFkZCBsb3dlciBuZWlnaGJvcmluZ1RpbGVzXHJcbiAgICAgICAgaWYgKGNhbm9uaWNhbC55ICsgMSA8IGRpbSkge1xyXG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XHJcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCB0aWxlSUQud3JhcCwgY2Fub25pY2FsLnosIGNhbm9uaWNhbC54LCBjYW5vbmljYWwueSArIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xyXG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmVpZ2hib3JpbmdUaWxlcztcclxuICAgIH1cclxuXHJcbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcclxuICAgICAgICBpZiAodGlsZS5kZW1UZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0aWxlLmRlbVRleHR1cmUpO1xyXG4gICAgICAgIGlmICh0aWxlLmZibykge1xyXG4gICAgICAgICAgICB0aWxlLmZiby5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLmZibztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRpbGUuZGVtKSBkZWxldGUgdGlsZS5kZW07XHJcbiAgICAgICAgZGVsZXRlIHRpbGUubmVpZ2hib3JpbmdUaWxlcztcclxuXHJcbiAgICAgICAgdGlsZS5zdGF0ZSA9ICd1bmxvYWRlZCc7XHJcbiAgICAgICAgaWYgKHRpbGUuYWN0b3IpIHtcclxuICAgICAgICAgICAgdGlsZS5hY3Rvci5zZW5kKCdyZW1vdmVERU1UaWxlJywge3VpZDogdGlsZS51aWQsIHNvdXJjZTogdGhpcy5pZH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJhc3RlckRFTVRpbGVTb3VyY2U7XHJcbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQgeyBFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZCB9IGZyb20gXCIuLi91dGlsL2V2ZW50ZWRcIjtcclxuXHJcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gXCIuLi91dGlsL3V0aWxcIjtcclxuaW1wb3J0IEVYVEVOVCBmcm9tIFwiLi4vZGF0YS9leHRlbnRcIjtcclxuaW1wb3J0IHsgUmVzb3VyY2VUeXBlIH0gZnJvbSBcIi4uL3V0aWwvYWpheFwiO1xyXG5pbXBvcnQgYnJvd3NlciBmcm9tIFwiLi4vdXRpbC9icm93c2VyXCI7XHJcblxyXG5pbXBvcnQgdHlwZSB7IFNvdXJjZSB9IGZyb20gXCIuL3NvdXJjZVwiO1xyXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSBcIi4uL3VpL21hcFwiO1xyXG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gXCIuLi91dGlsL2Rpc3BhdGNoZXJcIjtcclxuaW1wb3J0IHR5cGUgVGlsZSBmcm9tIFwiLi90aWxlXCI7XHJcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gXCIuLi91dGlsL2FjdG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgQ2FsbGJhY2sgfSBmcm9tIFwiLi4vdHlwZXMvY2FsbGJhY2tcIjtcclxuaW1wb3J0IHR5cGUgeyBHZW9KU09OLCBHZW9KU09ORmVhdHVyZSB9IGZyb20gXCJAbWFwYm94L2dlb2pzb24tdHlwZXNcIjtcclxuaW1wb3J0IHR5cGUge1xyXG4gICAgR2VvSlNPTlNvdXJjZVNwZWNpZmljYXRpb24sXHJcbiAgICBQcm9tb3RlSWRTcGVjaWZpY2F0aW9uLFxyXG59IGZyb20gXCIuLi9zdHlsZS1zcGVjL3R5cGVzXCI7XHJcblxyXG4vKipcclxuICogQSBzb3VyY2UgY29udGFpbmluZyBHZW9KU09OLlxyXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1nZW9qc29uKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcclxuICpcclxuICogQGV4YW1wbGVcclxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcclxuICogICAgIHR5cGU6ICdnZW9qc29uJyxcclxuICogICAgIGRhdGE6ICdodHRwczovL2QyYWQ2YjR1cjd5dnBxLmNsb3VkZnJvbnQubmV0L25hdHVyYWxlYXJ0aC0zLjMuMC9uZV8xMG1fcG9ydHMuZ2VvanNvbidcclxuICogfSk7XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XHJcbiAqICAgIHR5cGU6ICdnZW9qc29uJyxcclxuICogICAgZGF0YToge1xyXG4gKiAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcclxuICogICAgICAgIFwiZmVhdHVyZXNcIjogW3tcclxuICogICAgICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXHJcbiAqICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHt9LFxyXG4gKiAgICAgICAgICAgIFwiZ2VvbWV0cnlcIjoge1xyXG4gKiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxyXG4gKiAgICAgICAgICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFtcclxuICogICAgICAgICAgICAgICAgICAgIC03Ni41MzA2MzI5NzI3MTcyOSxcclxuICogICAgICAgICAgICAgICAgICAgIDM5LjE4MTc0MDc3OTk0MTA4XHJcbiAqICAgICAgICAgICAgICAgIF1cclxuICogICAgICAgICAgICB9XHJcbiAqICAgICAgICB9XVxyXG4gKiAgICB9XHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBtYXAuZ2V0U291cmNlKCdzb21lIGlkJykuc2V0RGF0YSh7XHJcbiAqICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcclxuICogICBcImZlYXR1cmVzXCI6IFt7XHJcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcclxuICogICAgICAgXCJwcm9wZXJ0aWVzXCI6IHsgXCJuYW1lXCI6IFwiTnVsbCBJc2xhbmRcIiB9LFxyXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcclxuICogICAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXHJcbiAqICAgICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFsgMCwgMCBdXHJcbiAqICAgICAgIH1cclxuICogICB9XVxyXG4gKiB9KTtcclxuICogQHNlZSBbRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxyXG4gKiBAc2VlIFtBZGQgYSBHZW9KU09OIGxpbmVdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2VvanNvbi1saW5lLylcclxuICogQHNlZSBbQ3JlYXRlIGEgaGVhdG1hcCBmcm9tIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9oZWF0bWFwLylcclxuICogQHNlZSBbQ3JlYXRlIGFuZCBzdHlsZSBjbHVzdGVyc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jbHVzdGVyLylcclxuICovXHJcbmNsYXNzIEdlb0pTT05Tb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcclxuICAgIHR5cGU6IFwiZ2VvanNvblwiO1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIG1pbnpvb206IG51bWJlcjtcclxuICAgIG1heHpvb206IG51bWJlcjtcclxuICAgIHRpbGVTaXplOiBudW1iZXI7XHJcbiAgICBhdHRyaWJ1dGlvbjogc3RyaW5nO1xyXG4gICAgcHJvbW90ZUlkOiA/UHJvbW90ZUlkU3BlY2lmaWNhdGlvbjtcclxuXHJcbiAgICBpc1RpbGVDbGlwcGVkOiBib29sZWFuO1xyXG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ6IGJvb2xlYW47XHJcbiAgICBfZGF0YTogR2VvSlNPTiB8IHN0cmluZztcclxuICAgIF9vcHRpb25zOiBhbnk7XHJcbiAgICB3b3JrZXJPcHRpb25zOiBhbnk7XHJcbiAgICBtYXA6IE1hcDtcclxuICAgIGN1c3RvbXByajogXCJcIjtcclxuICAgIGFjdG9yOiBBY3RvcjtcclxuICAgIF9sb2FkZWQ6IGJvb2xlYW47XHJcbiAgICBfY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFuO1xyXG4gICAgX3Jlc291cmNlVGltaW5nOiBBcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPjtcclxuICAgIF9yZW1vdmVkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgaWQ6IHN0cmluZyxcclxuICAgICAgICBvcHRpb25zOiBHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbiAmIHtcclxuICAgICAgICAgICAgd29ya2VyT3B0aW9ucz86IGFueSxcclxuICAgICAgICAgICAgY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFuLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcixcclxuICAgICAgICBldmVudGVkUGFyZW50OiBFdmVudGVkXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcblxyXG4gICAgICAgIC8vIGB0eXBlYCBpcyBhIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgY29uc3RhbnQgdG8gbWFrZSBpdCBlYXN5IGZvciAzcmRcclxuICAgICAgICAvLyBwYXJ0aWVzIHRvIHVzZSBHZW9KU09OU291cmNlIHRvIGJ1aWxkIHRoZWlyIG93biBzb3VyY2UgdHlwZXMuXHJcbiAgICAgICAgdGhpcy50eXBlID0gXCJnZW9qc29uXCI7XHJcblxyXG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XHJcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMTg7XHJcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcclxuICAgICAgICB0aGlzLmlzVGlsZUNsaXBwZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3JlbW92ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3RvciA9IGRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcclxuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RhdGEgPSAob3B0aW9ucy5kYXRhOiBhbnkpO1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe30sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcclxuICAgICAgICB0aGlzLl9yZXNvdXJjZVRpbWluZyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5tYXh6b29tICE9PSB1bmRlZmluZWQpIHRoaXMubWF4em9vbSA9IG9wdGlvbnMubWF4em9vbTtcclxuICAgICAgICBpZiAob3B0aW9ucy50eXBlKSB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuYXR0cmlidXRpb24pIHRoaXMuYXR0cmlidXRpb24gPSBvcHRpb25zLmF0dHJpYnV0aW9uO1xyXG4gICAgICAgIHRoaXMucHJvbW90ZUlkID0gb3B0aW9ucy5wcm9tb3RlSWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjYWxlID0gRVhURU5UIC8gdGhpcy50aWxlU2l6ZTtcclxuXHJcbiAgICAgICAgLy8gc2VudCB0byB0aGUgd29ya2VyLCBhbG9uZyB3aXRoIGB1cmw6IC4uLmAgb3IgYGRhdGE6IGxpdGVyYWwgZ2VvanNvbmAsXHJcbiAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gbG9hZC9wYXJzZS9pbmRleCB0aGUgZ2VvanNvbiBkYXRhXHJcbiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYG9wdGlvbnMud29ya2VyT3B0aW9uc2AgaGVscHMgdG8gbWFrZSBpdCBlYXN5IGZvclxyXG4gICAgICAgIC8vIHRoaXJkLXBhcnR5IHNvdXJjZXMgdG8gaGFjay9yZXVzZSBHZW9KU09OU291cmNlLlxyXG4gICAgICAgIHRoaXMud29ya2VyT3B0aW9ucyA9IGV4dGVuZChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICAgICAgY2x1c3Rlcjogb3B0aW9ucy5jbHVzdGVyIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZ2VvanNvblZ0T3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMuYnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJ1ZmZlciA6IDEyOCkgKlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSxcclxuICAgICAgICAgICAgICAgICAgICB0b2xlcmFuY2U6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLnRvbGVyYW5jZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMudG9sZXJhbmNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAuMzc1KSAqIHNjYWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dGVudDogRVhURU5ULFxyXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbXByajogb3B0aW9ucy5jdXN0b21wcmosXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvajRQcm9qZWN0aW9uIDogdGhpcy5tYXAucHJvajRQcm9qZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heFpvb206IHRoaXMubWF4em9vbSxcclxuICAgICAgICAgICAgICAgICAgICBsaW5lTWV0cmljczogb3B0aW9ucy5saW5lTWV0cmljcyB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUlkOiBvcHRpb25zLmdlbmVyYXRlSWQgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc3VwZXJjbHVzdGVyT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG1heFpvb206XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2x1c3Rlck1heFpvb20gIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1pbihvcHRpb25zLmNsdXN0ZXJNYXhab29tLCB0aGlzLm1heHpvb20gLSAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLm1heHpvb20gLSAxLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pblBvaW50czogTWF0aC5tYXgoMiwgb3B0aW9ucy5jbHVzdGVyTWluUG9pbnRzIHx8IDIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dGVudDogRVhURU5ULFxyXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbXByajogb3B0aW9ucy5jdXN0b21wcmosXHJcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiAob3B0aW9ucy5jbHVzdGVyUmFkaXVzIHx8IDUwKSAqIHNjYWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvZzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVJZDogb3B0aW9ucy5nZW5lcmF0ZUlkIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNsdXN0ZXJQcm9wZXJ0aWVzOiBvcHRpb25zLmNsdXN0ZXJQcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBvcHRpb25zLmZpbHRlcixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb3B0aW9ucy53b3JrZXJPcHRpb25zXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkKCkge1xyXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7IGRhdGFUeXBlOiBcInNvdXJjZVwiIH0pKTtcclxuICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKChlcnIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkYXRhOiBPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogXCJzb3VyY2VcIixcclxuICAgICAgICAgICAgICAgIHNvdXJjZURhdGFUeXBlOiBcIm1ldGFkYXRhXCIsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlVGltaW5nLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLnJlc291cmNlVGltaW5nID0gdGhpcy5fcmVzb3VyY2VUaW1pbmc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvdXJjZVRpbWluZyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhbHRob3VnaCBHZW9KU09OIHNvdXJjZXMgY29udGFpbiBubyBtZXRhZGF0YSwgd2UgZmlyZSB0aGlzIGV2ZW50IHRvIGxldCB0aGUgU291cmNlQ2FjaGVcclxuICAgICAgICAgICAgLy8ga25vdyBpdHMgb2sgdG8gc3RhcnQgcmVxdWVzdGluZyB0aWxlcy5cclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudChcImRhdGFcIiwgZGF0YSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWRkKG1hcDogTWFwKSB7XHJcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XHJcbiAgICAgICAgdGhpcy53b3JrZXJPcHRpb25zLmNycyA9IHtlcHNnQ29kZTp0aGlzLm1hcC5nZXRDUlMoKS5lcHNnQ29kZSwgV0tUOiB0aGlzLm1hcC5nZXRDUlMoKS5nZXRXS1QoKSwgX2lkOiB0aGlzLm1hcC5nZXRDUlMoKS5faWR9XHJcbiAgICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3VzdG9tcHJqKGN1c3RvbXByaikge1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMuY3VzdG9tcHJqID0gY3VzdG9tcHJqO1xyXG4gICAgICAgIC8vIHRoaXMuX29wdGlvbnMucHJvajRQcm9qZWN0aW9uID0gdGhpcy5tYXAucHJvajRQcm9qZWN0aW9uO1xyXG4gICAgICAgIHRoaXMud29ya2VyT3B0aW9ucy5zdXBlcmNsdXN0ZXJPcHRpb25zLmN1c3RvbXByaiA9IGN1c3RvbXByajtcclxuICAgICAgICB0aGlzLndvcmtlck9wdGlvbnMuZ2VvanNvblZ0T3B0aW9ucy5jdXN0b21wcmogPSBjdXN0b21wcmo7XHJcbiAgICAgICAgdGhpcy53b3JrZXJPcHRpb25zLmNycyA9IHtlcHNnQ29kZTp0aGlzLm1hcC5nZXRDUlMoKS5lcHNnQ29kZSwgV0tUOiB0aGlzLm1hcC5nZXRDUlMoKS5nZXRXS1QoKSwgX2lkOiB0aGlzLm1hcC5nZXRDUlMoKS5faWR9XHJcbiAgICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBHZW9KU09OIGRhdGEgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IGRhdGEgQSBHZW9KU09OIGRhdGEgb2JqZWN0IG9yIGEgVVJMIHRvIG9uZS4gVGhlIGxhdHRlciBpcyBwcmVmZXJhYmxlIGluIHRoZSBjYXNlIG9mIGxhcmdlIEdlb0pTT04gZmlsZXMuXHJcbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xyXG4gICAgICovXHJcbiAgICBzZXREYXRhKGRhdGE6IEdlb0pTT04gfCBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KFwiZGF0YWxvYWRpbmdcIiwgeyBkYXRhVHlwZTogXCJzb3VyY2VcIiB9KSk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlV29ya2VyRGF0YSgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZGF0YTogT2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6IFwic291cmNlXCIsXHJcbiAgICAgICAgICAgICAgICBzb3VyY2VEYXRhVHlwZTogXCJjb250ZW50XCIsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb3VyY2VUaW1pbmcgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlVGltaW5nLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLnJlc291cmNlVGltaW5nID0gdGhpcy5fcmVzb3VyY2VUaW1pbmc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvdXJjZVRpbWluZyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoXCJkYXRhXCIsIGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBnZXREYXRhKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9vcmlnaW5EYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW5EYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2RhdGEgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgY2x1c3RlcmVkIHNvdXJjZXMsIGZldGNoZXMgdGhlIHpvb20gYXQgd2hpY2ggdGhlIGdpdmVuIGNsdXN0ZXIgZXhwYW5kcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2x1c3RlcklkIFRoZSB2YWx1ZSBvZiB0aGUgY2x1c3RlcidzIGBjbHVzdGVyX2lkYCBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB6b29tIHZhbHVlIGlzIHJldHJpZXZlZCAoYChlcnJvciwgem9vbSkgPT4geyAuLi4gfWApLlxyXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IHRoaXNcclxuICAgICAqL1xyXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkOiBudW1iZXIsIGNhbGxiYWNrOiBDYWxsYmFjazxudW1iZXI+KSB7XHJcbiAgICAgICAgdGhpcy5hY3Rvci5zZW5kKFxyXG4gICAgICAgICAgICBcImdlb2pzb24uZ2V0Q2x1c3RlckV4cGFuc2lvblpvb21cIixcclxuICAgICAgICAgICAgeyBjbHVzdGVySWQsIHNvdXJjZTogdGhpcy5pZCB9LFxyXG4gICAgICAgICAgICBjYWxsYmFja1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgY2x1c3RlcmVkIHNvdXJjZXMsIGZldGNoZXMgdGhlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBjbHVzdGVyIG9uIHRoZSBuZXh0IHpvb20gbGV2ZWwgKGFzIGFuIGFycmF5IG9mIEdlb0pTT04gZmVhdHVyZXMpLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZlYXR1cmVzIGFyZSByZXRyaWV2ZWQgKGAoZXJyb3IsIGZlYXR1cmVzKSA9PiB7IC4uLiB9YCkuXHJcbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xyXG4gICAgICovXHJcbiAgICBnZXRDbHVzdGVyQ2hpbGRyZW4oXHJcbiAgICAgICAgY2x1c3RlcklkOiBudW1iZXIsXHJcbiAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PEdlb0pTT05GZWF0dXJlPj5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuYWN0b3Iuc2VuZChcclxuICAgICAgICAgICAgXCJnZW9qc29uLmdldENsdXN0ZXJDaGlsZHJlblwiLFxyXG4gICAgICAgICAgICB7IGNsdXN0ZXJJZCwgc291cmNlOiB0aGlzLmlkIH0sXHJcbiAgICAgICAgICAgIGNhbGxiYWNrXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvciBjbHVzdGVyZWQgc291cmNlcywgZmV0Y2hlcyB0aGUgb3JpZ2luYWwgcG9pbnRzIHRoYXQgYmVsb25nIHRvIHRoZSBjbHVzdGVyIChhcyBhbiBhcnJheSBvZiBHZW9KU09OIGZlYXR1cmVzKS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2x1c3RlcklkIFRoZSB2YWx1ZSBvZiB0aGUgY2x1c3RlcidzIGBjbHVzdGVyX2lkYCBwcm9wZXJ0eS5cclxuICAgICAqIEBwYXJhbSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdG8gcmV0dXJuLlxyXG4gICAgICogQHBhcmFtIG9mZnNldCBUaGUgbnVtYmVyIG9mIGZlYXR1cmVzIHRvIHNraXAgKGUuZy4gZm9yIHBhZ2luYXRpb24pLlxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZlYXR1cmVzIGFyZSByZXRyaWV2ZWQgKGAoZXJyb3IsIGZlYXR1cmVzKSA9PiB7IC4uLiB9YCkuXHJcbiAgICAgKiBAcmV0dXJucyB7R2VvSlNPTlNvdXJjZX0gdGhpc1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIFJldHJpZXZlIGNsdXN0ZXIgbGVhdmVzIG9uIGNsaWNrXHJcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgJ2NsdXN0ZXJzJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICogICB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGUucG9pbnQsIHtcclxuICAgICAqICAgICBsYXllcnM6IFsnY2x1c3RlcnMnXVxyXG4gICAgICogICB9KTtcclxuICAgICAqXHJcbiAgICAgKiAgIHZhciBjbHVzdGVySWQgPSBmZWF0dXJlc1swXS5wcm9wZXJ0aWVzLmNsdXN0ZXJfaWQ7XHJcbiAgICAgKiAgIHZhciBwb2ludENvdW50ID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5wb2ludF9jb3VudDtcclxuICAgICAqICAgdmFyIGNsdXN0ZXJTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdjbHVzdGVycycpO1xyXG4gICAgICpcclxuICAgICAqICAgY2x1c3RlclNvdXJjZS5nZXRDbHVzdGVyTGVhdmVzKGNsdXN0ZXJJZCwgcG9pbnRDb3VudCwgMCwgZnVuY3Rpb24oZXJyb3IsIGZlYXR1cmVzKSB7XHJcbiAgICAgKiAgICAgLy8gUHJpbnQgY2x1c3RlciBsZWF2ZXMgaW4gdGhlIGNvbnNvbGVcclxuICAgICAqICAgICBjb25zb2xlLmxvZygnQ2x1c3RlciBsZWF2ZXM6JywgZXJyb3IsIGZlYXR1cmVzKTtcclxuICAgICAqICAgfSlcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBnZXRDbHVzdGVyTGVhdmVzKFxyXG4gICAgICAgIGNsdXN0ZXJJZDogbnVtYmVyLFxyXG4gICAgICAgIGxpbWl0OiBudW1iZXIsXHJcbiAgICAgICAgb2Zmc2V0OiBudW1iZXIsXHJcbiAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PEdlb0pTT05GZWF0dXJlPj5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuYWN0b3Iuc2VuZChcclxuICAgICAgICAgICAgXCJnZW9qc29uLmdldENsdXN0ZXJMZWF2ZXNcIixcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICAgICAgY2x1c3RlcklkLFxyXG4gICAgICAgICAgICAgICAgbGltaXQsXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhbGxiYWNrXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogUmVzcG9uc2libGUgZm9yIGludm9raW5nIFdvcmtlclNvdXJjZSdzIGdlb2pzb24ubG9hZERhdGEgdGFyZ2V0LCB3aGljaFxyXG4gICAgICogaGFuZGxlcyBsb2FkaW5nIHRoZSBnZW9qc29uIGRhdGEgYW5kIHByZXBhcmluZyB0byBzZXJ2ZSBpdCB1cCBhcyB0aWxlcyxcclxuICAgICAqIHVzaW5nIGdlb2pzb24tdnQgb3Igc3VwZXJjbHVzdGVyIGFzIGFwcHJvcHJpYXRlLlxyXG4gICAgICovXHJcbiAgICBfdXBkYXRlV29ya2VyRGF0YShjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcclxuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gZXh0ZW5kKHt9LCB0aGlzLndvcmtlck9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBvcHRpb25zLnJlcXVlc3QgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChcclxuICAgICAgICAgICAgICAgIGJyb3dzZXIucmVzb2x2ZVVSTChkYXRhKSxcclxuICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZS5Tb3VyY2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgb3B0aW9ucy5yZXF1ZXN0LmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRhcmdldCB7dGhpcy50eXBlfS5sb2FkRGF0YSByYXRoZXIgdGhhbiBsaXRlcmFsbHkgZ2VvanNvbi5sb2FkRGF0YSxcclxuICAgICAgICAvLyBzbyB0aGF0IG90aGVyIGdlb2pzb24tbGlrZSBzb3VyY2UgdHlwZXMgY2FuIGVhc2lseSByZXVzZSB0aGlzXHJcbiAgICAgICAgLy8gaW1wbGVtZW50YXRpb25cclxuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoYCR7dGhpcy50eXBlfS5sb2FkRGF0YWAsIG9wdGlvbnMsIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5EYXRhID0gcmVzdWx0LmRhdGEgfHwgbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlbW92ZWQgfHwgKHJlc3VsdCAmJiByZXN1bHQuYWJhbmRvbmVkKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICYmXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzb3VyY2VUaW1pbmcgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZVRpbWluZ1t0aGlzLmlkXVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvdXJjZVRpbWluZyA9IHJlc3VsdC5yZXNvdXJjZVRpbWluZ1t0aGlzLmlkXS5zbGljZSgwKTtcclxuICAgICAgICAgICAgLy8gQW55IGBsb2FkRGF0YWAgY2FsbHMgdGhhdCBwaWxlZCB1cCB3aGlsZSB3ZSB3ZXJlIHByb2Nlc3NpbmdcclxuICAgICAgICAgICAgLy8gdGhpcyBvbmUgd2lsbCBnZXQgY29hbGVzY2VkIGludG8gYSBzaW5nbGUgY2FsbCB3aGVuIHRoaXNcclxuICAgICAgICAgICAgLy8gJ2NvYWxlc2NlJyBtZXNzYWdlIGlzIHByb2Nlc3NlZC5cclxuICAgICAgICAgICAgLy8gV2Ugd291bGQgc2VsZi1zZW5kIGZyb20gdGhlIHdvcmtlciBpZiB3ZSBoYWQgYWNjZXNzIHRvIGl0c1xyXG4gICAgICAgICAgICAvLyBtZXNzYWdlIHF1ZXVlLiBXYWl0aW5nIGluc3RlYWQgZm9yIHRoZSAnY29hbGVzY2UnIHRvIHJvdW5kLXRyaXBcclxuICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgZm9yZWdyb3VuZCBqdXN0IG1lYW5zIHdlJ3JlIHRocm90dGxpbmcgdGhlIHdvcmtlclxyXG4gICAgICAgICAgICAvLyB0byBydW4gYXQgYSBsaXR0bGUgbGVzcyB0aGFuIGZ1bGwtdGhyb3R0bGUuXHJcbiAgICAgICAgICAgIHRoaXMuYWN0b3Iuc2VuZChcclxuICAgICAgICAgICAgICAgIGAke3RoaXMudHlwZX0uY29hbGVzY2VgLFxyXG4gICAgICAgICAgICAgICAgeyBzb3VyY2U6IG9wdGlvbnMuc291cmNlIH0sXHJcbiAgICAgICAgICAgICAgICBudWxsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICF0aWxlLmFjdG9yID8gXCJsb2FkVGlsZVwiIDogXCJyZWxvYWRUaWxlXCI7XHJcbiAgICAgICAgdGlsZS5hY3RvciA9IHRoaXMuYWN0b3I7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXHJcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXHJcbiAgICAgICAgICAgIHpvb206IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxyXG4gICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heHpvb20sXHJcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplLFxyXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIHBpeGVsUmF0aW86IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcclxuICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzOiB0aGlzLm1hcC5zaG93Q29sbGlzaW9uQm94ZXMsXHJcbiAgICAgICAgICAgIHByb21vdGVJZDogdGhpcy5wcm9tb3RlSWQsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gdGhpcy5hY3Rvci5zZW5kKG1lc3NhZ2UsIHBhcmFtcywgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xyXG4gICAgICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRpbGUubG9hZFZlY3RvckRhdGEoXHJcbiAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXAucGFpbnRlcixcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPT09IFwicmVsb2FkVGlsZVwiXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWJvcnRUaWxlKHRpbGU6IFRpbGUpIHtcclxuICAgICAgICBpZiAodGlsZS5yZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5jYW5jZWwoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGlsZS5hYm9ydGVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcclxuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcclxuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoXCJyZW1vdmVUaWxlXCIsIHtcclxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcclxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxyXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25SZW1vdmUoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hY3Rvci5zZW5kKFwicmVtb3ZlU291cmNlXCIsIHsgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VyaWFsaXplKCkge1xyXG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMsIHtcclxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc1RyYW5zaXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHZW9KU09OU291cmNlO1xyXG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMn0sXG4gICAge25hbWU6ICdhX3RleHR1cmVfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMn1cbl0pO1xuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xyXG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xyXG5pbXBvcnQge2dldEltYWdlLCBSZXNvdXJjZVR5cGV9IGZyb20gJy4uL3V0aWwvYWpheCc7XHJcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xyXG5pbXBvcnQge1Jhc3RlckJvdW5kc0FycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcclxuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xyXG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQnO1xyXG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZSc7XHJcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xyXG5cclxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UnO1xyXG5pbXBvcnQgdHlwZSB7Q2FudmFzU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi9jYW52YXNfc291cmNlJztcclxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XHJcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcclxuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUnO1xyXG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrJztcclxuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXInO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgICBJbWFnZVNvdXJjZVNwZWNpZmljYXRpb24sXHJcbiAgICBWaWRlb1NvdXJjZVNwZWNpZmljYXRpb25cclxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcclxuXHJcbnR5cGUgQ29vcmRpbmF0ZXMgPSBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07XHJcblxyXG4vKipcclxuICogQSBkYXRhIHNvdXJjZSBjb250YWluaW5nIGFuIGltYWdlLlxyXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1pbWFnZSkgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy4pXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vIGFkZCB0byBtYXBcclxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcclxuICogICAgdHlwZTogJ2ltYWdlJyxcclxuICogICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvZm9vLnBuZycsXHJcbiAqICAgIGNvb3JkaW5hdGVzOiBbXHJcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXHJcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXHJcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xN10sXHJcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xN11cclxuICogICAgXVxyXG4gKiB9KTtcclxuICpcclxuICogLy8gdXBkYXRlIGNvb3JkaW5hdGVzXHJcbiAqIHZhciBteVNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKTtcclxuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xyXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxyXG4gKiAgICAgWy03Ni41MjgwMzY1OTQzOTA4NywgMzkuMTgzODM2NDg0NzU4N10sXHJcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcclxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxyXG4gKiBdKTtcclxuICpcclxuICogLy8gdXBkYXRlIHVybCBhbmQgY29vcmRpbmF0ZXMgc2ltdWx0YW5lb3VzbHlcclxuICogbXlTb3VyY2UudXBkYXRlSW1hZ2Uoe1xyXG4gKiAgICB1cmw6ICdodHRwczovL3d3dy5tYXBib3guY29tL2ltYWdlcy9iYXIucG5nJyxcclxuICogICAgY29vcmRpbmF0ZXM6IFtcclxuICogICAgICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcclxuICogICAgICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxyXG4gKiAgICAgICAgWy03Ni41Mjk1Mzg2MzE0MzkyLCAzOS4xNzY4MzM5MjUwNzYwNl0sXHJcbiAqICAgICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cclxuICogICAgXVxyXG4gKiB9KVxyXG4gKlxyXG4gKiBtYXAucmVtb3ZlU291cmNlKCdzb21lIGlkJyk7ICAvLyByZW1vdmVcclxuICogQHNlZSBbQWRkIGFuIGltYWdlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ltYWdlLW9uLWEtbWFwLylcclxuICovXHJcbmNsYXNzIEltYWdlU291cmNlIGV4dGVuZHMgRXZlbnRlZCBpbXBsZW1lbnRzIFNvdXJjZSB7XHJcbiAgICB0eXBlOiBzdHJpbmc7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgbWluem9vbTogbnVtYmVyO1xyXG4gICAgbWF4em9vbTogbnVtYmVyO1xyXG4gICAgdGlsZVNpemU6IG51bWJlcjtcclxuICAgIHVybDogc3RyaW5nO1xyXG5cclxuICAgIGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcztcclxuICAgIHRpbGVzOiB7W186IHN0cmluZ106IFRpbGV9O1xyXG4gICAgb3B0aW9uczogYW55O1xyXG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcclxuICAgIG1hcDogTWFwO1xyXG4gICAgdGV4dHVyZTogVGV4dHVyZSB8IG51bGw7XHJcbiAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwO1xyXG4gICAgdGlsZUlEOiBDYW5vbmljYWxUaWxlSUQ7XHJcbiAgICBfYm91bmRzQXJyYXk6IFJhc3RlckJvdW5kc0FycmF5O1xyXG4gICAgYm91bmRzQnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XHJcbiAgICBib3VuZHNTZWdtZW50czogU2VnbWVudFZlY3RvcjtcclxuICAgIF9sb2FkZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBJbWFnZVNvdXJjZVNwZWNpZmljYXRpb24gfCBWaWRlb1NvdXJjZVNwZWNpZmljYXRpb24gfCBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcclxuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gb3B0aW9ucy5jb29yZGluYXRlcztcclxuXHJcbiAgICAgICAgdGhpcy50eXBlID0gJ2ltYWdlJztcclxuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xyXG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xyXG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XHJcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZChuZXdDb29yZGluYXRlcz86IENvb3JkaW5hdGVzLCBzdWNjZXNzQ2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xyXG5cclxuICAgICAgICB0aGlzLnVybCA9IHRoaXMub3B0aW9ucy51cmw7XHJcblxyXG4gICAgICAgIGdldEltYWdlKHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHRoaXMudXJsLCBSZXNvdXJjZVR5cGUuSW1hZ2UpLCAoZXJyLCBpbWFnZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBuZXdDb29yZGluYXRlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgaW1hZ2UgVVJMIGFuZCwgb3B0aW9uYWxseSwgdGhlIGNvb3JkaW5hdGVzLiBUbyBhdm9pZCBoYXZpbmcgdGhlIGltYWdlIGZsYXNoIGFmdGVyIGNoYW5naW5nLFxyXG4gICAgICogc2V0IHRoZSBgcmFzdGVyLWZhZGUtZHVyYXRpb25gIHBhaW50IHByb3BlcnR5IG9uIHRoZSByYXN0ZXIgbGF5ZXIgdG8gMC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy51cmxdIFJlcXVpcmVkIGltYWdlIFVSTC5cclxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IFtvcHRpb25zLmNvb3JkaW5hdGVzXSBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyxcclxuICAgICAqICAgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbnVtYmVycywgd2hpY2ggZGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoZSBpbWFnZS5cclxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cclxuICAgICAqICAgVGhleSBkbyBub3QgaGF2ZSB0byByZXByZXNlbnQgYSByZWN0YW5nbGUuXHJcbiAgICAgKiBAcmV0dXJucyB7SW1hZ2VTb3VyY2V9IHRoaXNcclxuICAgICAqL1xyXG4gICAgdXBkYXRlSW1hZ2Uob3B0aW9uczoge3VybDogc3RyaW5nLCBjb29yZGluYXRlcz86IENvb3JkaW5hdGVzfSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pbWFnZSB8fCAhb3B0aW9ucy51cmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0aW9ucy51cmwgPSBvcHRpb25zLnVybDtcclxuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucy5jb29yZGluYXRlcywgKCkgPT4geyB0aGlzLnRleHR1cmUgPSBudWxsOyB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBfZmluaXNoTG9hZGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy5tYXApIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKTtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnfSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkFkZChtYXA6IE1hcCkge1xyXG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW1hZ2UncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIEZvdXIgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzLFxyXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIGltYWdlLlxyXG4gICAgICogICBUaGUgY29vcmRpbmF0ZXMgc3RhcnQgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UgYW5kIHByb2NlZWQgaW4gY2xvY2t3aXNlIG9yZGVyLlxyXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cclxuICAgICAqIEByZXR1cm5zIHtJbWFnZVNvdXJjZX0gdGhpc1xyXG4gICAgICovXHJcbiAgICBzZXRDb29yZGluYXRlcyhjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSB3aGljaCBtZXJjYXRvciB0aWxlIGlzIHN1aXRhYmxlIGZvciByZW5kZXJpbmcgdGhlIHZpZGVvIGluXHJcbiAgICAgICAgLy8gYW5kIGNyZWF0ZSBhIGJ1ZmZlciB3aXRoIHRoZSBjb3JuZXIgY29vcmRpbmF0ZXMuIFRoZXNlIGNvb3JkaW5hdGVzXHJcbiAgICAgICAgLy8gbWF5IGJlIG91dHNpZGUgdGhlIHRpbGUsIGJlY2F1c2UgcmFzdGVyIHRpbGVzIGFyZW4ndCBjbGlwcGVkIHdoZW4gcmVuZGVyaW5nLlxyXG5cclxuICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIGdlbyBjb29yZGluYXRlcyBpbnRvICh6b29tIDApIHRpbGUgc3BhY2UgY29vcmRpbmF0ZXNcclxuICAgICAgICBjb25zdCBjb3JuZXJDb29yZHMgPSBjb29yZGluYXRlcy5tYXAoKGNvb3IpID0+IHsgcmV0dXJuIHRoaXMubWFwLmdldENSUygpLmZyb21MbmdMYXQoY29vcik7IH0pO1xyXG5cclxuICAgICAgICAvLyBDb21wdXRlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdGlsZSB3ZSdsbCB1c2UgdG8gaG9sZCB0aGlzIGltYWdlJ3NcclxuICAgICAgICAvLyByZW5kZXIgZGF0YVxyXG4gICAgICAgIHRoaXMudGlsZUlEID0gZ2V0Q29vcmRpbmF0ZXNDZW50ZXJUaWxlSUQoY29ybmVyQ29vcmRzLCB0aGlzLm1hcC5nZXRDUlMoKS5nZXRFeHRlbnQoKSk7XHJcblxyXG4gICAgICAgIC8vIENvbnN0cmFpbiBtaW4vbWF4IHpvb20gdG8gb3VyIHRpbGUncyB6b29tIGxldmVsIGluIG9yZGVyIHRvIGZvcmNlXHJcbiAgICAgICAgLy8gU291cmNlQ2FjaGUgdG8gcmVxdWVzdCB0aGlzIHRpbGUgKG5vIG1hdHRlciB3aGF0IHRoZSBtYXAncyB6b29tXHJcbiAgICAgICAgLy8gbGV2ZWwpXHJcbiAgICAgICAgdGhpcy5taW56b29tID0gdGhpcy5tYXh6b29tID0gdGhpcy50aWxlSUQuejtcclxuXHJcbiAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBjb3JuZXIgY29vcmRpbmF0ZXMgaW50byB0aGUgY29vcmRpbmF0ZSBzcGFjZSBvZiBvdXJcclxuICAgICAgICAvLyB0aWxlLlxyXG4gICAgICAgIGNvbnN0IHRpbGVDb29yZHMgPSBjb3JuZXJDb29yZHMubWFwKChjb29yZCkgPT4gdGhpcy50aWxlSUQuZ2V0VGlsZVBvaW50KGNvb3JkKS5fcm91bmQoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5ID0gbmV3IFJhc3RlckJvdW5kc0FycmF5KCk7XHJcbiAgICAgICAgdGhpcy5fYm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGlsZUNvb3Jkc1swXS54LCB0aWxlQ29vcmRzWzBdLnksIDAsIDApO1xyXG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRpbGVDb29yZHNbMV0ueCwgdGlsZUNvb3Jkc1sxXS55LCBFWFRFTlQsIDApO1xyXG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRpbGVDb29yZHNbM10ueCwgdGlsZUNvb3Jkc1szXS55LCAwLCBFWFRFTlQpO1xyXG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRpbGVDb29yZHNbMl0ueCwgdGlsZUNvb3Jkc1syXS55LCBFWFRFTlQsIEVYVEVOVCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmJvdW5kc0J1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJvdW5kc0J1ZmZlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6J3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9KSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlcGFyZSgpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwIHx8ICF0aGlzLmltYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLm1hcC5wYWludGVyLmNvbnRleHQ7XHJcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzU2VnbWVudHMpIHtcclxuICAgICAgICAgICAgdGhpcy5ib3VuZHNTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuaW1hZ2UsIGdsLlJHQkEpO1xyXG4gICAgICAgICAgICB0aGlzLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB3IGluIHRoaXMudGlsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMudGlsZXNbd107XHJcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJykge1xyXG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xyXG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xyXG4gICAgICAgIC8vIFdlIGhhdmUgYSBzaW5nbGUgdGlsZSAtLSB3aG9vc2UgY29vcmRpbmF0ZXMgYXJlIHRoaXMudGlsZUlEIC0tIHRoYXRcclxuICAgICAgICAvLyBjb3ZlcnMgdGhlIGltYWdlIHdlIHdhbnQgdG8gcmVuZGVyLiAgSWYgdGhhdCdzIHRoZSBvbmUgYmVpbmdcclxuICAgICAgICAvLyByZXF1ZXN0ZWQsIHNldCBpdCB1cCB3aXRoIHRoZSBpbWFnZTsgb3RoZXJ3aXNlLCBtYXJrIHRoZSB0aWxlIGFzXHJcbiAgICAgICAgLy8gYGVycm9yZWRgIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBubyBkYXRhIGZvciBpdC5cclxuICAgICAgICAvLyBJZiB0aGUgd29ybGQgd3JhcHMsIHdlIG1heSBoYXZlIG11bHRpcGxlIFwid3JhcHBlZFwiIGNvcGllcyBvZiB0aGVcclxuICAgICAgICAvLyBzaW5nbGUgdGlsZS5cclxuICAgICAgICBpZiAodGhpcy50aWxlSUQgJiYgdGhpcy50aWxlSUQuZXF1YWxzKHRpbGUudGlsZUlELmNhbm9uaWNhbCkpIHtcclxuICAgICAgICAgICAgdGhpcy50aWxlc1tTdHJpbmcodGlsZS50aWxlSUQud3JhcCldID0gdGlsZTtcclxuICAgICAgICAgICAgdGlsZS5idWNrZXRzID0ge307XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUoKTogT2JqZWN0IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLFxyXG4gICAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwsXHJcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNUcmFuc2l0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEdpdmVuIGEgbGlzdCBvZiBjb29yZGluYXRlcywgZ2V0IHRoZWlyIGNlbnRlciBhcyBhIGNvb3JkaW5hdGUuXHJcbiAqXHJcbiAqIEByZXR1cm5zIGNlbnRlcnBvaW50XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29vcmRpbmF0ZXNDZW50ZXJUaWxlSUQoY29vcmRzOiBBcnJheTxNZXJjYXRvckNvb3JkaW5hdGU+LCBpbmRleEV4dGVudDogQXJyYXk8bnVtYmVyPikge1xyXG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcclxuICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XHJcbiAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcclxuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xyXG5cclxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XHJcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGNvb3JkLngpO1xyXG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBjb29yZC55KTtcclxuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY29vcmQueCk7XHJcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGNvb3JkLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGR4ID0gbWF4WCAtIG1pblg7XHJcbiAgICBjb25zdCBkeSA9IG1heFkgLSBtaW5ZO1xyXG4gICAgY29uc3QgZE1heCA9IE1hdGgubWF4KGR4LCBkeSk7XHJcbiAgICBjb25zdCB6b29tID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xyXG4gICAgY29uc3QgdGlsZXNBdFpvb20gPSBNYXRoLnBvdygyLCB6b29tKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IENhbm9uaWNhbFRpbGVJRChcclxuICAgICAgICAgICAgem9vbSxcclxuICAgICAgICAgICAgTWF0aC5mbG9vcigobWluWCArIG1heFgpIC8gMiAqIHRpbGVzQXRab29tKSxcclxuICAgICAgICAgICAgTWF0aC5mbG9vcigobWluWSArIG1heFkpIC8gMiAqIHRpbGVzQXRab29tKSxcclxuICAgICAgICAgICAgaW5kZXhFeHRlbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJbWFnZVNvdXJjZTtcclxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtnZXRWaWRlbywgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuXG5pbXBvcnQgSW1hZ2VTb3VyY2UgZnJvbSAnLi9pbWFnZV9zb3VyY2UnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50JztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlJztcbmltcG9ydCB7RXJyb3JFdmVudH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy9lcnJvci92YWxpZGF0aW9uX2Vycm9yJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlcic7XG5pbXBvcnQgdHlwZSB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcbmltcG9ydCB0eXBlIHtWaWRlb1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB2aWRlby5cbiAqIChTZWUgdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzLXZpZGVvKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICd2aWRlbycsXG4gKiAgICB1cmw6IFtcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2UubXA0JyxcbiAqICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2Uud2VibSdcbiAqICAgIF0sXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICogICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlXG4gKiB2YXIgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtBZGQgYSB2aWRlb10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS92aWRlby1vbi1hLW1hcC8pXG4gKi9cbmNsYXNzIFZpZGVvU291cmNlIGV4dGVuZHMgSW1hZ2VTb3VyY2Uge1xuICAgIG9wdGlvbnM6IFZpZGVvU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICB1cmxzOiBBcnJheTxzdHJpbmc+O1xuICAgIHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50O1xuICAgIHJvdW5kWm9vbTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogVmlkZW9Tb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KTtcbiAgICAgICAgdGhpcy5yb3VuZFpvb20gPSB0cnVlO1xuICAgICAgICB0aGlzLnR5cGUgPSAndmlkZW8nO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hY2NlcHRlZFZpZGVvID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy51cmxzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdXJsIG9mIG9wdGlvbnMudXJscykge1xuICAgICAgICAgICAgdGhpcy51cmxzLnB1c2godGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuU291cmNlKS51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9eKGh0dHB8aHR0cHMpOlxcL1xcLy4qLy50ZXN0KHRoaXMudXJsc1swXSkpIHtcbiAgICAgICAgICBnZXRWaWRlbyh0aGlzLnVybHMsIHRoaXMuaW5pdFZpZGVvLmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWNjZXB0ZWRWaWRlbyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgdmlkZW9JZCA9IHRoaXMudXJsc1swXTtcbiAgICAgICAgICAgIHZhciB2aWRlbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZGVvSWQpO1xuICAgICAgICAgICAgdGhpcy5pbml0VmlkZW8oIXZpZGVvICYmIG5ldyBWYWxpZGF0aW9uRXJyb3IoKFwic291cmNlcy5cIiArICh0aGlzLmlkKSksIG51bGwsICd2aWRlbyBpcyBub3QgZm91bmQnKSwgdmlkZW8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdFZpZGVvIChlcnIsIHZpZGVvKSB7XG4gICAgICB2YXIgdGhpcyQxID0gdGhpcztcbiAgICAgIHRoaXMkMS5fbWFudWFsRmFrZVBsYXkgPSB0cnVlO1xuICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgfSBlbHNlIGlmICh2aWRlbykge1xuICAgICAgICAgIHRoaXMudmlkZW8gPSB2aWRlbztcbiAgICAgICAgICBpZiAoIXRoaXMuX2FjY2VwdGVkVmlkZW8gfHwgdGhpcy52aWRlby5sb29wICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICB0aGlzLnZpZGVvLmxvb3AgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN0YXJ0IHJlcGFpbnRpbmcgd2hlbiB2aWRlbyBzdGFydHMgcGxheWluZy4gaGFzVHJhbnNpdGlvbigpIHdpbGwgdGhlbiByZXR1cm5cbiAgICAgICAgICAvLyB0cnVlIHRvIHRyaWdnZXIgYWRkaXRpb25hbCBmcmFtZXMgYXMgbG9uZyBhcyB0aGUgdmlkZW9zIGNvbnRpbnVlcyBwbGF5aW5nLlxuICAgICAgICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdGhpcyQxLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaWYodGhpcyQxLl9maXJzdEZyYW1lUmVuZGVyZWQgJiYgdGhpcyQxLl9tYW51YWxGYWtlUGxheSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzJDEudmlkZW8uYXV0b3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzJDEudmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS52aWRlby5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhpcyQxLl9tYW51YWxGYWtlUGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgdGhpcyQxLmZpcmUobmV3IEV2ZW50KCd2aWRlb2xvYWRlZCcpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5fYWNjZXB0ZWRWaWRlbykge1xuICAgICAgICAgICAgICAgICAgdGhpcy52aWRlby5hdXRvcGxheSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy52aWRlby5tdXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHZpZGVvLlxuICAgICAqL1xuICAgIHBhdXNlKCkge1xuICAgICAgICBpZiAodGhpcy52aWRlbykge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheXMgdGhlIHZpZGVvLlxuICAgICAqL1xuICAgIHBsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgcGxheWJhY2sgdG8gYSB0aW1lc3RhbXAsIGluIHNlY29uZHMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZWVrKHNlY29uZHM6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy52aWRlbykge1xuICAgICAgICAgICAgY29uc3Qgc2Vla2FibGVSYW5nZSA9IHRoaXMudmlkZW8uc2Vla2FibGU7XG4gICAgICAgICAgICBpZiAoc2Vjb25kcyA8IHNlZWthYmxlUmFuZ2Uuc3RhcnQoMCkgfHwgc2Vjb25kcyA+IHNlZWthYmxlUmFuZ2UuZW5kKDApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHt0aGlzLmlkfWAsIG51bGwsIGBQbGF5YmFjayBmb3IgdGhpcyB2aWRlbyBjYW4gYmUgc2V0IG9ubHkgYmV0d2VlbiB0aGUgJHtzZWVrYWJsZVJhbmdlLnN0YXJ0KDApfSBhbmQgJHtzZWVrYWJsZVJhbmdlLmVuZCgwKX0tc2Vjb25kIG1hcmsuYCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnZpZGVvLmN1cnJlbnRUaW1lID0gc2Vjb25kcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEhUTUwgYHZpZGVvYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxWaWRlb0VsZW1lbnR9IFRoZSBIVE1MIGB2aWRlb2AgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXRWaWRlbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW87XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgaWYgKHRoaXMubWFwKSByZXR1cm47XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZpZGVvJ3MgY29vcmRpbmF0ZXMgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgc2V0Q29vcmRpbmF0ZXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgVmlkZW9Tb3VyY2VcbiAgICAgKiBAcmV0dXJucyB7VmlkZW9Tb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICAvLyBzZXRDb29yZGluYXRlcyBpbmhlcml0ZWQgZnJvbSBJbWFnZVNvdXJjZVxuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnZpZGVvLnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vdCBlbm91Z2ggZGF0YSBmb3IgY3VycmVudCBwb3NpdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzU2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy52aWRlbywgZ2wuUkdCQSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnZpZGVvLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy52aWRlbyk7XG4gICAgICAgICAgICB0aGlzLl9maXJzdEZyYW1lUmVuZGVyZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLnRpbGVzW3ddO1xuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgICB1cmxzOiB0aGlzLnVybHMsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvICYmICF0aGlzLnZpZGVvLnBhdXNlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpZGVvU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEltYWdlU291cmNlIGZyb20gJy4vaW1hZ2Vfc291cmNlJztcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgcmFzdGVyQm91bmRzQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXR0cmlidXRlcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUnO1xuaW1wb3J0IHtFcnJvckV2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB0eXBlIHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuXG5leHBvcnQgdHlwZSBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uID0ge3xcbiAgICBcInR5cGVcIjogXCJjYW52YXNcIixcbiAgICBcImNvb3JkaW5hdGVzXCI6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICBcImFuaW1hdGVcIj86IGJvb2xlYW4sXG4gICAgXCJjYW52YXNcIjogc3RyaW5nIHwgSFRNTENhbnZhc0VsZW1lbnRcbnx9O1xuXG4vKipcbiAqIE9wdGlvbnMgdG8gYWRkIGEgY2FudmFzIHNvdXJjZSB0eXBlIHRvIHRoZSBtYXAuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FudmFzU291cmNlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgU291cmNlIHR5cGUuIE11c3QgYmUgYFwiY2FudmFzXCJgLlxuICogQHByb3BlcnR5IHtzdHJpbmd8SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhcyBDYW52YXMgc291cmNlIGZyb20gd2hpY2ggdG8gcmVhZCBwaXhlbHMuIENhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIElEIG9mIHRoZSBjYW52YXMgZWxlbWVudCwgb3IgdGhlIGBIVE1MQ2FudmFzRWxlbWVudGAgaXRzZWxmLlxuICogQHByb3BlcnR5IHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgZGVub3Rpbmcgd2hlcmUgdG8gcGxhY2UgdGhlIGNvcm5lcnMgb2YgdGhlIGNhbnZhcywgc3BlY2lmaWVkIGluIGBbbG9uZ2l0dWRlLCBsYXRpdHVkZV1gIHBhaXJzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYW5pbWF0ZT10cnVlXSBXaGV0aGVyIHRoZSBjYW52YXMgc291cmNlIGlzIGFuaW1hdGVkLiBJZiB0aGUgY2FudmFzIGlzIHN0YXRpYyAoaS5lLiBwaXhlbHMgZG8gbm90IG5lZWQgdG8gYmUgcmUtcmVhZCBvbiBldmVyeSBmcmFtZSksIGBhbmltYXRlYCBzaG91bGQgYmUgc2V0IHRvIGBmYWxzZWAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqL1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYW4gSFRNTCBjYW52YXMuIFNlZSB7QGxpbmsgQ2FudmFzU291cmNlT3B0aW9uc30gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgIHR5cGU6ICdjYW52YXMnLFxuICogICAgY2FudmFzOiAnaWRPZk15SFRNTENhbnZhcycsXG4gKiAgICBhbmltYXRlOiB0cnVlLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAqICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogdmFyIG15U291cmNlID0gbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpO1xuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICogICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqIF0pO1xuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICovXG5jbGFzcyBDYW52YXNTb3VyY2UgZXh0ZW5kcyBJbWFnZVNvdXJjZSB7XG4gICAgb3B0aW9uczogQ2FudmFzU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICBhbmltYXRlOiBib29sZWFuO1xuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBwbGF5OiAoKSA9PiB2b2lkO1xuICAgIHBhdXNlOiAoKSA9PiB2b2lkO1xuICAgIF9wbGF5aW5nOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KTtcblxuICAgICAgICAvLyBXZSBidWlsZCBpbiBzb21lIHZhbGlkYXRpb24gaGVyZSwgc2luY2UgY2FudmFzIHNvdXJjZXMgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBzdHlsZSBzcGVjOlxuICAgICAgICBpZiAoIW9wdGlvbnMuY29vcmRpbmF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7aWR9YCwgbnVsbCwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJjb29yZGluYXRlc1wiJykpKTtcbiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zLmNvb3JkaW5hdGVzKSB8fCBvcHRpb25zLmNvb3JkaW5hdGVzLmxlbmd0aCAhPT0gNCB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29vcmRpbmF0ZXMuc29tZShjID0+ICFBcnJheS5pc0FycmF5KGMpIHx8IGMubGVuZ3RoICE9PSAyIHx8IGMuc29tZShsID0+IHR5cGVvZiBsICE9PSAnbnVtYmVyJykpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdcImNvb3JkaW5hdGVzXCIgcHJvcGVydHkgbXVzdCBiZSBhbiBhcnJheSBvZiA0IGxvbmdpdHVkZS9sYXRpdHVkZSBhcnJheSBwYWlycycpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlICYmIHR5cGVvZiBvcHRpb25zLmFuaW1hdGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnb3B0aW9uYWwgXCJhbmltYXRlXCIgcHJvcGVydHkgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImNhbnZhc1wiJykpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5jYW52YXMgIT09ICdzdHJpbmcnICYmICEob3B0aW9ucy5jYW52YXMgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdcImNhbnZhc1wiIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhlIGNhbnZhcyBlbGVtZW50IGZyb20gd2hpY2ggdG8gcmVhZCwgb3IgYW4gSFRNTENhbnZhc0VsZW1lbnQgaW5zdGFuY2UnKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5hbmltYXRlID0gb3B0aW9ucy5hbmltYXRlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmFuaW1hdGUgOiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgYW5pbWF0aW9uLiBUaGUgaW1hZ2Ugd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgY2FudmFzIHRvIHRoZSBtYXAgb24gZWFjaCBmcmFtZS5cbiAgICAgKiBAbWV0aG9kIHBsYXlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgQ2FudmFzU291cmNlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBhbmltYXRpb24uIFRoZSBtYXAgd2lsbCBkaXNwbGF5IGEgc3RhdGljIGNvcHkgb2YgdGhlIGNhbnZhcyBpbWFnZS5cbiAgICAgKiBAbWV0aG9kIHBhdXNlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSAodGhpcy5vcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkgP1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYW52YXMgOlxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdDYW52YXMgZGltZW5zaW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8uJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0Q2FudmFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXM7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFuaW1hdGUpIHRoaXMucGxheSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjYW52YXMncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBzZXRDb29yZGluYXRlc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBDYW52YXNTb3VyY2VcbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyxcbiAgICAgKiAgIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG51bWJlcnMsIHdoaWNoIGRlZmluZSB0aGUgY29ybmVycyBvZiB0aGUgY2FudmFzLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhcyBhbmQgcHJvY2VlZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cbiAgICAgKiBAcmV0dXJucyB7Q2FudmFzU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgLy8gc2V0Q29vcmRpbmF0ZXMgaW5oZXJpdGVkIGZyb20gSW1hZ2VTb3VyY2VcblxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIGxldCByZXNpemUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLndpZHRoICE9PSB0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgICAgICByZXNpemUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy5oZWlnaHQgIT09IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodDtcbiAgICAgICAgICAgIHJlc2l6ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFzSW52YWxpZERpbWVuc2lvbnMoKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90IGVub3VnaCBkYXRhIGZvciBjdXJyZW50IHBvc2l0aW9uXG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzU2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5jYW52YXMsIGdsLlJHQkEsIHtwcmVtdWx0aXBseTogdHJ1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZSB8fCB0aGlzLl9wbGF5aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUudXBkYXRlKHRoaXMuY2FudmFzLCB7cHJlbXVsdGlwbHk6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdyBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy50aWxlc1t3XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdjYW52YXMnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxheWluZztcbiAgICB9XG5cbiAgICBfaGFzSW52YWxpZERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBbdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodF0pIHtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSB8fCB4IDw9IDApIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhbnZhc1NvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7YmluZEFsbH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHR5cGUge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcCc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2snO1xuaW1wb3J0IHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4vdGlsZV9pZCc7XG5cbi8qKlxuICogVGhlIGBTb3VyY2VgIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggc291cmNlIHR5cGUsIGluY2x1ZGluZyBcImNvcmVcIiB0eXBlcyAoYHZlY3RvcmAsIGByYXN0ZXJgLFxuICogYHZpZGVvYCwgZXRjLikgYW5kIGFsbCBjdXN0b20sIHRoaXJkLXBhcnR5IHR5cGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gTXVzdCBub3QgYmUgdXNlZCBieSBhbnkgZXhpc3Rpbmcgc291cmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU291cmNlIG9wdGlvbnMsIHNwZWNpZmljIHRvIHRoZSBzb3VyY2UgdHlwZSAoZXhjZXB0IGZvciBgb3B0aW9ucy50eXBlYCwgd2hpY2ggaXMgYWx3YXlzXG4gKiByZXF1aXJlZCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIFRoZSBzb3VyY2UgdHlwZSwgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIGBuYW1lYCB1c2VkIGluIHtAbGluayBTdHlsZSNhZGRTb3VyY2VUeXBlfS5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlciBBIHtAbGluayBEaXNwYXRjaGVyfSBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgd29ya2Vycy5cbiAqXG4gKiBAZmlyZXMgZGF0YSB3aXRoIGB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ31gIHRvIGluZGljYXRlIHRoYXQgYW55IG5lY2Vzc2FyeSBtZXRhZGF0YVxuICogaGFzIGJlZW4gbG9hZGVkIHNvIHRoYXQgaXQncyBva2F5IHRvIGNhbGwgYGxvYWRUaWxlYDsgYW5kIHdpdGggYHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9YFxuICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgc291cmNlIGRhdGEgaGFzIGNoYW5nZWQsIHNvIHRoYXQgYW55IGN1cnJlbnQgY2FjaGVzIHNob3VsZCBiZSBmbHVzaGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gIE11c3QgbWF0Y2ggdGhlIGlkIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWluem9vbVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heHpvb21cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNUaWxlQ2xpcHBlZCBgZmFsc2VgIGlmIHRpbGVzIGNhbiBiZSBkcmF3biBvdXRzaWRlIHRoZWlyIGJvdW5kYXJpZXMsIGB0cnVlYCBpZiB0aGV5IGNhbm5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwYXJzZU92ZXJzY2FsZWQgYHRydWVgIGlmIHRpbGVzIHNob3VsZCBiZSBzZW50IGJhY2sgdG8gdGhlIHdvcmtlciBmb3IgZWFjaCBvdmVyem9vbWVkIHpvb21cbiAqIGxldmVsLCBgZmFsc2VgIGlmIG5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRab29tIGB0cnVlYCBpZiB6b29tIGxldmVscyBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGluIHRoZSBzb3VyY2UgZGF0YSwgYGZhbHNlYFxuICogaWYgdGhleSBhcmUgZmxvb3ItZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb3VyY2Uge1xuICAgICt0eXBlOiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXIsXG4gICAgbWF4em9vbTogbnVtYmVyLFxuICAgIHRpbGVTaXplOiBudW1iZXIsXG4gICAgYXR0cmlidXRpb24/OiBzdHJpbmcsXG5cbiAgICByb3VuZFpvb20/OiBib29sZWFuLFxuICAgIGlzVGlsZUNsaXBwZWQ/OiBib29sZWFuLFxuICAgIG1hcGJveF9sb2dvPzogYm9vbGVhbixcbiAgICB0aWxlSUQ/OiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ/OiBib29sZWFuLFxuICAgIHZlY3RvckxheWVySWRzPzogQXJyYXk8c3RyaW5nPixcblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbjtcbiAgICBsb2FkZWQoKTogYm9vbGVhbjtcblxuICAgIGZpcmUoZXZlbnQ6IEV2ZW50KTogbWl4ZWQ7XG5cbiAgICArb25BZGQ/OiAobWFwOiBNYXApID0+IHZvaWQ7XG4gICAgK29uUmVtb3ZlPzogKG1hcDogTWFwKSA9PiB2b2lkO1xuXG4gICAgbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KTogdm9pZDtcbiAgICAraGFzVGlsZT86ICh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpID0+IGJvb2xlYW47XG4gICAgK2Fib3J0VGlsZT86ICh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pID0+IHZvaWQ7XG4gICAgK3VubG9hZFRpbGU/OiAodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQSBwbGFpbiAoc3RyaW5naWZpYWJsZSkgSlMgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc291cmNlLlxuICAgICAqIENyZWF0aW5nIGEgc291cmNlIHVzaW5nIHRoZSByZXR1cm5lZCBvYmplY3QgYXMgdGhlIGBvcHRpb25zYCBzaG91bGQgcmVzdWx0IGluIGEgU291cmNlIHRoYXQgaXNcbiAgICAgKiBlcXVpdmFsZW50IHRvIHRoaXMgb25lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VyaWFsaXplKCk6IE9iamVjdDtcblxuICAgICtwcmVwYXJlPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBTb3VyY2VTdGF0aWNzID0ge1xuICAgIC8qXG4gICAgICogQW4gb3B0aW9uYWwgVVJMIHRvIGEgc2NyaXB0IHdoaWNoLCB3aGVuIHJ1biBieSBhIFdvcmtlciwgcmVnaXN0ZXJzIGEge0BsaW5rIFdvcmtlclNvdXJjZX1cbiAgICAgKiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBTb3VyY2UgdHlwZSBieSBjYWxsaW5nIGBzZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlKHdvcmtlclNvdXJjZTogV29ya2VyU291cmNlKWAuXG4gICAgICovXG4gICAgd29ya2VyU291cmNlVVJMPzogVVJMO1xufTtcblxuZXhwb3J0IHR5cGUgU291cmNlQ2xhc3MgPSBDbGFzczxTb3VyY2U+ICYgU291cmNlU3RhdGljcztcblxuaW1wb3J0IHZlY3RvciBmcm9tICcuLi9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlJztcbmltcG9ydCByYXN0ZXIgZnJvbSAnLi4vc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZSc7XG5pbXBvcnQgcmFzdGVyRGVtIGZyb20gJy4uL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfc291cmNlJztcbmltcG9ydCBnZW9qc29uIGZyb20gJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZSc7XG5pbXBvcnQgdmlkZW8gZnJvbSAnLi4vc291cmNlL3ZpZGVvX3NvdXJjZSc7XG5pbXBvcnQgaW1hZ2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZSc7XG5pbXBvcnQgY2FudmFzIGZyb20gJy4uL3NvdXJjZS9jYW52YXNfc291cmNlJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMnO1xuXG5jb25zdCBzb3VyY2VUeXBlcyA9IHtcbiAgICB2ZWN0b3IsXG4gICAgcmFzdGVyLFxuICAgICdyYXN0ZXItZGVtJzogcmFzdGVyRGVtLFxuICAgIGdlb2pzb24sXG4gICAgdmlkZW8sXG4gICAgaW1hZ2UsXG4gICAgY2FudmFzXG59O1xuXG4vKlxuICogQ3JlYXRlcyBhIHRpbGVkIGRhdGEgc291cmNlIGluc3RhbmNlIGdpdmVuIGFuIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBpZFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBBIHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdCBjb21wbGlhbnQgd2l0aFxuICogW2BtYXBib3gtZ2wtc3R5bGUtc3BlY2BdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIG9yLCBmb3IgYSB0aGlyZC1wYXJ0eSBzb3VyY2UgdHlwZSxcbiAgKiB3aXRoIHRoYXQgdHlwZSdzIHJlcXVpcmVtZW50cy5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlclxuICogQHJldHVybnMge1NvdXJjZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZSA9IGZ1bmN0aW9uKGlkOiBzdHJpbmcsIHNwZWNpZmljYXRpb246IFNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgc291cmNlVHlwZXNbc3BlY2lmaWNhdGlvbi50eXBlXShpZCwgKHNwZWNpZmljYXRpb246IGFueSksIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgaWYgKHNvdXJjZS5pZCAhPT0gaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBTb3VyY2UgaWQgdG8gYmUgJHtpZH0gaW5zdGVhZCBvZiAke3NvdXJjZS5pZH1gKTtcbiAgICB9XG5cbiAgICBiaW5kQWxsKFsnbG9hZCcsICdhYm9ydCcsICd1bmxvYWQnLCAnc2VyaWFsaXplJywgJ3ByZXBhcmUnXSwgc291cmNlKTtcbiAgICByZXR1cm4gc291cmNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNvdXJjZVR5cGVzW25hbWVdO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFR5cGUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nLCB0eXBlOiBDbGFzczxTb3VyY2U+KSB7XG4gICAgc291cmNlVHlwZXNbbmFtZV0gPSB0eXBlO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RvciB7XG4gICAgc2VuZCh0eXBlOiBzdHJpbmcsIGRhdGE6IE9iamVjdCwgY2FsbGJhY2s6IENhbGxiYWNrPGFueT4pOiB2b2lkO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDb2xsaXNpb25JbmRleCBmcm9tICcuLi9zeW1ib2wvY29sbGlzaW9uX2luZGV4JztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHtSZXRhaW5lZFF1ZXJ5RGF0YX0gZnJvbSAnLi4vc3ltYm9sL3BsYWNlbWVudCc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge21hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbi8qXG4gKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udmVydCBmcm9tIHRpbGUgY29vcmRpbmF0ZXMgdG8gdmlld3BvcnQgcGl4ZWwgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBpeGVsUG9zTWF0cml4KHRyYW5zZm9ybSwgdGlsZUlEKSB7XG4gICAgY29uc3QgdCA9IG1hdDQuaWRlbnRpdHkoW10pO1xuICAgIG1hdDQudHJhbnNsYXRlKHQsIHQsIFsxLCAxLCAwXSk7XG4gICAgbWF0NC5zY2FsZSh0LCB0LCBbdHJhbnNmb3JtLndpZHRoICogMC41LCB0cmFuc2Zvcm0uaGVpZ2h0ICogMC41LCAxXSk7XG4gICAgcmV0dXJuIG1hdDQubXVsdGlwbHkodCwgdCwgdHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeCh0aWxlSUQudG9VbndyYXBwZWQoKSkpO1xufVxuXG5mdW5jdGlvbiBxdWVyeUluY2x1ZGVzM0RMYXllcihsYXllcnM/OiBBcnJheTxzdHJpbmc+LCBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSwgc291cmNlSUQ6IHN0cmluZykge1xuICAgIGlmIChsYXllcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIG9mIGxheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBzdHlsZUxheWVyc1tsYXllcklEXTtcbiAgICAgICAgICAgIGlmIChsYXllciAmJiBsYXllci5zb3VyY2UgPT09IHNvdXJjZUlEICYmIGxheWVyLnR5cGUgPT09ICdmaWxsLWV4dHJ1c2lvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHN0eWxlTGF5ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHN0eWxlTGF5ZXJzW2tleV07XG4gICAgICAgICAgICBpZiAobGF5ZXIuc291cmNlID09PSBzb3VyY2VJRCAmJiBsYXllci50eXBlID09PSAnZmlsbC1leHRydXNpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlSZW5kZXJlZEZlYXR1cmVzKHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzOiB7W186IHN0cmluZ106IE9iamVjdH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sIGxheWVyczogQXJyYXk8c3RyaW5nPiwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcblxuICAgIGNvbnN0IGhhczNETGF5ZXIgPSBxdWVyeUluY2x1ZGVzM0RMYXllcihwYXJhbXMgJiYgcGFyYW1zLmxheWVycywgc3R5bGVMYXllcnMsIHNvdXJjZUNhY2hlLmlkKTtcbiAgICBjb25zdCBtYXhQaXRjaFNjYWxlRmFjdG9yID0gdHJhbnNmb3JtLm1heFBpdGNoU2NhbGVGYWN0b3IoKTtcbiAgICBjb25zdCB0aWxlc0luID0gc291cmNlQ2FjaGUudGlsZXNJbihxdWVyeUdlb21ldHJ5LCBtYXhQaXRjaFNjYWxlRmFjdG9yLCBoYXMzRExheWVyKTtcblxuICAgIHRpbGVzSW4uc29ydChzb3J0VGlsZXNJbik7XG4gICAgY29uc3QgcmVuZGVyZWRGZWF0dXJlTGF5ZXJzID0gW107XG4gICAgZm9yIChjb25zdCB0aWxlSW4gb2YgdGlsZXNJbikge1xuICAgICAgICByZW5kZXJlZEZlYXR1cmVMYXllcnMucHVzaCh7XG4gICAgICAgICAgICB3cmFwcGVkVGlsZUlEOiB0aWxlSW4udGlsZUlELndyYXBwZWQoKS5rZXksXG4gICAgICAgICAgICBxdWVyeVJlc3VsdHM6IHRpbGVJbi50aWxlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLl9zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aWxlSW4ucXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICB0aWxlSW4uY2FtZXJhUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICB0aWxlSW4uc2NhbGUsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBtYXhQaXRjaFNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgIGdldFBpeGVsUG9zTWF0cml4KHNvdXJjZUNhY2hlLnRyYW5zZm9ybSwgdGlsZUluLnRpbGVJRCkpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG1lcmdlUmVuZGVyZWRGZWF0dXJlTGF5ZXJzKHJlbmRlcmVkRmVhdHVyZUxheWVycyk7XG5cbiAgICAvLyBNZXJnZSBzdGF0ZSBmcm9tIFNvdXJjZUNhY2hlIGludG8gdGhlIHJlc3VsdHNcbiAgICBmb3IgKGNvbnN0IGxheWVySUQgaW4gcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdFtsYXllcklEXS5mb3JFYWNoKChmZWF0dXJlV3JhcHBlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVXcmFwcGVyLmZlYXR1cmU7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNvdXJjZUNhY2hlLmdldEZlYXR1cmVTdGF0ZShmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXSwgZmVhdHVyZS5pZCk7XG4gICAgICAgICAgICBmZWF0dXJlLnNvdXJjZSA9IGZlYXR1cmUubGF5ZXIuc291cmNlO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5zb3VyY2VMYXllciA9IGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVhdHVyZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzKHN0eWxlTGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2FjaGVzOiB7W186IHN0cmluZ106IFNvdXJjZUNhY2hlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbiwgbGF5ZXJzOiBBcnJheTxzdHJpbmc+LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25JbmRleDogQ29sbGlzaW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRRdWVyeURhdGE6IHtbXzogbnVtYmVyXTogUmV0YWluZWRRdWVyeURhdGF9KSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3QgcmVuZGVyZWRTeW1ib2xzID0gY29sbGlzaW9uSW5kZXgucXVlcnlSZW5kZXJlZFN5bWJvbHMocXVlcnlHZW9tZXRyeSk7XG4gICAgY29uc3QgYnVja2V0UXVlcnlEYXRhID0gW107XG4gICAgZm9yIChjb25zdCBidWNrZXRJbnN0YW5jZUlkIG9mIE9iamVjdC5rZXlzKHJlbmRlcmVkU3ltYm9scykubWFwKE51bWJlcikpIHtcbiAgICAgICAgYnVja2V0UXVlcnlEYXRhLnB1c2gocmV0YWluZWRRdWVyeURhdGFbYnVja2V0SW5zdGFuY2VJZF0pO1xuICAgIH1cbiAgICBidWNrZXRRdWVyeURhdGEuc29ydChzb3J0VGlsZXNJbik7XG5cbiAgICBmb3IgKGNvbnN0IHF1ZXJ5RGF0YSBvZiBidWNrZXRRdWVyeURhdGEpIHtcbiAgICAgICAgY29uc3QgYnVja2V0U3ltYm9scyA9IHF1ZXJ5RGF0YS5mZWF0dXJlSW5kZXgubG9va3VwU3ltYm9sRmVhdHVyZXMoXG4gICAgICAgICAgICAgICAgcmVuZGVyZWRTeW1ib2xzW3F1ZXJ5RGF0YS5idWNrZXRJbnN0YW5jZUlkXSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5RGF0YS5idWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBxdWVyeURhdGEuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVyLFxuICAgICAgICAgICAgICAgIHBhcmFtcy5sYXllcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zLmF2YWlsYWJsZUltYWdlcyxcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIGluIGJ1Y2tldFN5bWJvbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEZlYXR1cmVzID0gcmVzdWx0W2xheWVySURdID0gcmVzdWx0W2xheWVySURdIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJTeW1ib2xzID0gYnVja2V0U3ltYm9sc1tsYXllcklEXTtcbiAgICAgICAgICAgIGxheWVyU3ltYm9scy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWF0Y2ggdG9wRG93bkZlYXR1cmVDb21wYXJhdG9yIGZyb20gRmVhdHVyZUluZGV4LCBidXQgdXNpbmdcbiAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudCBzb3J0aW5nIG9mIGZlYXR1cmVzIGZyb20gYnVja2V0LnNvcnRGZWF0dXJlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVTb3J0T3JkZXIgPSBxdWVyeURhdGEuZmVhdHVyZVNvcnRPcmRlcjtcbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZVNvcnRPcmRlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBxdWVyeVJlbmRlcmVkU3ltYm9scyBkb2N1bWVudGF0aW9uIHNheXMgd2UnbGwgcmV0dXJuIGZlYXR1cmVzIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIFwidG9wLXRvLWJvdHRvbVwiIHJlbmRlcmluZyBvcmRlciAoYWthIGxhc3QtdG8tZmlyc3QpLlxuICAgICAgICAgICAgICAgICAgICAvLyBBY3R1YWxseSB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgc3ltYm9sIGluc3RhbmNlcyBwZXIgZmVhdHVyZSwgc29cbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc29ydCBlYWNoIGZlYXR1cmUgYmFzZWQgb24gdGhlIGZpcnN0IG1hdGNoaW5nIHN5bWJvbCBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkQSA9IGZlYXR1cmVTb3J0T3JkZXIuaW5kZXhPZihhLmZlYXR1cmVJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZEIgPSBmZWF0dXJlU29ydE9yZGVyLmluZGV4T2YoYi5mZWF0dXJlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc29ydGVkQSA+PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHNvcnRlZEIgPj0gMCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0ZWRCIC0gc29ydGVkQTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWNrZXQgaGFzbid0IGJlZW4gcmUtc29ydGVkIGJhc2VkIG9uIGFuZ2xlLCBzbyB1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJldmVyc2Ugb2YgdGhlIG9yZGVyIHRoZSBmZWF0dXJlcyBhcHBlYXJlZCBpbiB0aGUgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuZmVhdHVyZUluZGV4IC0gYS5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEZlYXR1cmUgb2YgbGF5ZXJTeW1ib2xzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0RmVhdHVyZXMucHVzaChzeW1ib2xGZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YXRlIGZyb20gU291cmNlQ2FjaGUgaW50byB0aGUgcmVzdWx0c1xuICAgIGZvciAoY29uc3QgbGF5ZXJOYW1lIGluIHJlc3VsdCkge1xuICAgICAgICByZXN1bHRbbGF5ZXJOYW1lXS5mb3JFYWNoKChmZWF0dXJlV3JhcHBlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVXcmFwcGVyLmZlYXR1cmU7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHN0eWxlTGF5ZXJzW2xheWVyTmFtZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBzb3VyY2VDYWNoZS5nZXRGZWF0dXJlU3RhdGUoZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ10sIGZlYXR1cmUuaWQpO1xuICAgICAgICAgICAgZmVhdHVyZS5zb3VyY2UgPSBmZWF0dXJlLmxheWVyLnNvdXJjZTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXSkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmUuc291cmNlTGF5ZXIgPSBmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmUuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgcGFyYW1zOiBhbnkpIHtcbiAgICBjb25zdCB0aWxlcyA9IHNvdXJjZUNhY2hlLmdldFJlbmRlcmFibGVJZHMoKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIHJldHVybiBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChpZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGNvbnN0IGRhdGFUaWxlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW2ldO1xuICAgICAgICBjb25zdCBkYXRhSUQgPSB0aWxlLnRpbGVJRC5jYW5vbmljYWwua2V5O1xuICAgICAgICBpZiAoIWRhdGFUaWxlc1tkYXRhSURdKSB7XG4gICAgICAgICAgICBkYXRhVGlsZXNbZGF0YUlEXSA9IHRydWU7XG4gICAgICAgICAgICB0aWxlLnF1ZXJ5U291cmNlRmVhdHVyZXMocmVzdWx0LCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc29ydFRpbGVzSW4oYSwgYikge1xuICAgIGNvbnN0IGlkQSA9IGEudGlsZUlEO1xuICAgIGNvbnN0IGlkQiA9IGIudGlsZUlEO1xuICAgIHJldHVybiAoaWRBLm92ZXJzY2FsZWRaIC0gaWRCLm92ZXJzY2FsZWRaKSB8fCAoaWRBLmNhbm9uaWNhbC55IC0gaWRCLmNhbm9uaWNhbC55KSB8fCAoaWRBLndyYXAgLSBpZEIud3JhcCkgfHwgKGlkQS5jYW5vbmljYWwueCAtIGlkQi5jYW5vbmljYWwueCk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVuZGVyZWRGZWF0dXJlTGF5ZXJzKHRpbGVzKSB7XG4gICAgLy8gTWVyZ2UgcmVzdWx0cyBmcm9tIGFsbCB0aWxlcywgYnV0IGlmIHR3byB0aWxlcyBzaGFyZSB0aGUgc2FtZVxuICAgIC8vIHdyYXBwZWQgSUQsIGRvbid0IGR1cGxpY2F0ZSBmZWF0dXJlcyBiZXR3ZWVuIHRoZSB0d28gdGlsZXNcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCB3cmFwcGVkSURMYXllck1hcCA9IHt9O1xuICAgIGZvciAoY29uc3QgdGlsZSBvZiB0aWxlcykge1xuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSB0aWxlLnF1ZXJ5UmVzdWx0cztcbiAgICAgICAgY29uc3Qgd3JhcHBlZElEID0gdGlsZS53cmFwcGVkVGlsZUlEO1xuICAgICAgICBjb25zdCB3cmFwcGVkSURMYXllcnMgPSB3cmFwcGVkSURMYXllck1hcFt3cmFwcGVkSURdID0gd3JhcHBlZElETGF5ZXJNYXBbd3JhcHBlZElEXSB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIGluIHF1ZXJ5UmVzdWx0cykge1xuICAgICAgICAgICAgY29uc3QgdGlsZUZlYXR1cmVzID0gcXVlcnlSZXN1bHRzW2xheWVySURdO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZElERmVhdHVyZXMgPSB3cmFwcGVkSURMYXllcnNbbGF5ZXJJRF0gPSB3cmFwcGVkSURMYXllcnNbbGF5ZXJJRF0gfHwge307XG4gICAgICAgICAgICBjb25zdCByZXN1bHRGZWF0dXJlcyA9IHJlc3VsdFtsYXllcklEXSA9IHJlc3VsdFtsYXllcklEXSB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGlsZUZlYXR1cmUgb2YgdGlsZUZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3cmFwcGVkSURGZWF0dXJlc1t0aWxlRmVhdHVyZS5mZWF0dXJlSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZWRJREZlYXR1cmVzW3RpbGVGZWF0dXJlLmZlYXR1cmVJbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRGZWF0dXJlcy5wdXNoKHRpbGVGZWF0dXJlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlJztcblxuLyoqXG4gKiBBIFtsZWFzdC1yZWNlbnRseS11c2VkIGNhY2hlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX2FsZ29yaXRobXMpXG4gKiB3aXRoIGhhc2ggbG9va3VwIG1hZGUgcG9zc2libGUgYnkga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyBpbiBwYXJhbGxlbCB0b1xuICogYW4gYXJyYXkgb2YgZGljdGlvbmFyeSBvZiB2YWx1ZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUaWxlQ2FjaGUge1xuICAgIG1heDogbnVtYmVyO1xuICAgIGRhdGE6IHtba2V5OiBzdHJpbmddOiBBcnJheTx7IHZhbHVlOiBUaWxlLCB0aW1lb3V0OiA/VGltZW91dElEfT59O1xuICAgIG9yZGVyOiBBcnJheTxzdHJpbmc+O1xuICAgIG9uUmVtb3ZlOiAoZWxlbWVudDogVGlsZSkgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25SZW1vdmUgY2FsbGJhY2sgY2FsbGVkIHdpdGggaXRlbXMgd2hlbiB0aGV5IGV4cGlyZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1heDogbnVtYmVyLCBvblJlbW92ZTogKGVsZW1lbnQ6IFRpbGUpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMub25SZW1vdmUgPSBvblJlbW92ZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjYWNoZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZW1vdmVkRGF0YSBvZiB0aGlzLmRhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQocmVtb3ZlZERhdGEudGltZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5vcmRlciA9IFtdO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGtleSwgdmFsdWUgY29tYmluYXRpb24gdG8gdGhlIGNhY2hlLCB0cmltbWluZyBpdHMgc2l6ZSBpZiB0aGlzIHB1c2hlc1xuICAgICAqIGl0IG92ZXIgbWF4IGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIGxvb2t1cCBrZXkgZm9yIHRoZSBpdGVtXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIGFueSB2YWx1ZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgZGF0YTogVGlsZSwgZXhwaXJ5VGltZW91dDogbnVtYmVyIHwgdm9pZCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aWxlSUQud3JhcHBlZCgpLmtleTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhV3JhcHBlciA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgdGltZW91dDogdW5kZWZpbmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGV4cGlyeVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YVdyYXBwZXIudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRpbGVJRCwgZGF0YVdyYXBwZXIpO1xuICAgICAgICAgICAgfSwgZXhwaXJ5VGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKGRhdGFXcmFwcGVyKTtcbiAgICAgICAgdGhpcy5vcmRlci5wdXNoKGtleSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWREYXRhID0gdGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEpIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGBrZXlgIGlzIHByZXNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gYmUgbG9va2VkLXVwXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGNhY2hlIGhhcyB0aGlzIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBoYXModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aWxlSUQud3JhcHBlZCgpLmtleSBpbiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBhIHNwZWNpZmljIGtleSBhbmQgcmVtb3ZlIGRhdGEgZnJvbSBjYWNoZS5cbiAgICAgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyBgbnVsbGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gbG9vayB1cFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgZGF0YSwgb3IgbnVsbCBpZiBpdCBpc24ndCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0QW5kUmVtb3ZlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ID9UaWxlIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyh0aWxlSUQpKSB7IHJldHVybiBudWxsOyB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aWxlSUQud3JhcHBlZCgpLmtleSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBHZXQgYW5kIHJlbW92ZSB0aGUgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKi9cbiAgICBfZ2V0QW5kUmVtb3ZlQnlLZXkoa2V5OiBzdHJpbmcpOiA/VGlsZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XS5zaGlmdCgpO1xuICAgICAgICBpZiAoZGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQoZGF0YS50aW1lb3V0KTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhW2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKGtleSksIDEpO1xuXG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogR2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgKHdyYXBwZWQgdGlsZSkga2V5LlxuICAgICAqL1xuICAgIGdldEJ5S2V5KGtleTogc3RyaW5nKTogP1RpbGUge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhW2tleV07XG4gICAgICAgIHJldHVybiBkYXRhID8gZGF0YVswXS52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBhIHNwZWNpZmljIGtleSB3aXRob3V0IHJlbW92aW5nIGRhdGFcbiAgICAgKiBmcm9tIHRoZSBjYWNoZS4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsIHJldHVybnMgYG51bGxgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRCB0aGUga2V5IHRvIGxvb2sgdXBcbiAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIGRhdGEsIG9yIG51bGwgaWYgaXQgaXNuJ3QgZm91bmRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiA/VGlsZSB7XG4gICAgICAgIGlmICghdGhpcy5oYXModGlsZUlEKSkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFbdGlsZUlELndyYXBwZWQoKS5rZXldWzBdO1xuICAgICAgICByZXR1cm4gZGF0YS52YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBrZXkvdmFsdWUgY29tYmluYXRpb24gZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRCB0aGUga2V5IGZvciB0aGUgcGFpciB0byBkZWxldGVcbiAgICAgKiBAcGFyYW0ge1RpbGV9IHZhbHVlIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQsIHJlbW92ZSB0aGF0IGV4YWN0IHZlcnNpb24gb2YgdGhlIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtUaWxlQ2FjaGV9IHRoaXMgY2FjaGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlbW92ZSh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHZhbHVlOiA/eyB2YWx1ZTogVGlsZSwgdGltZW91dDogP1RpbWVvdXRJRH0pIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyh0aWxlSUQpKSB7IHJldHVybiB0aGlzOyB9XG4gICAgICAgIGNvbnN0IGtleSA9IHRpbGVJRC53cmFwcGVkKCkua2V5O1xuXG4gICAgICAgIGNvbnN0IGRhdGFJbmRleCA9IHZhbHVlID09PSB1bmRlZmluZWQgPyAwIDogdGhpcy5kYXRhW2tleV0uaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XVtkYXRhSW5kZXhdO1xuICAgICAgICB0aGlzLmRhdGFba2V5XS5zcGxpY2UoZGF0YUluZGV4LCAxKTtcbiAgICAgICAgaWYgKGRhdGEudGltZW91dCkgY2xlYXJUaW1lb3V0KGRhdGEudGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFba2V5XS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uUmVtb3ZlKGRhdGEudmFsdWUpO1xuICAgICAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2Yoa2V5KSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBtYXggc2l6ZSBvZiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IHRoZSBtYXggc2l6ZSBvZiB0aGUgY2FjaGVcbiAgICAgKiBAcmV0dXJucyB7VGlsZUNhY2hlfSB0aGlzIGNhY2hlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRNYXhTaXplKG1heDogbnVtYmVyKTogVGlsZUNhY2hlIHtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWREYXRhID0gdGhpcy5fZ2V0QW5kUmVtb3ZlQnlLZXkodGhpcy5vcmRlclswXSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEpIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGVudHJpZXMgdGhhdCBkbyBub3QgcGFzcyBhIGZpbHRlciBmdW5jdGlvbi4gVXNlZCBmb3IgcmVtb3ZpbmdcbiAgICAgKiBzdGFsZSB0aWxlcyBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZpbHRlckZuIERldGVybWluZXMgd2hldGhlciB0aGUgdGlsZSBpcyBmaWx0ZXJlZC4gSWYgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZSB0aWxlIHdpbGwgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqL1xuICAgIGZpbHRlcihmaWx0ZXJGbjogKHRpbGU6IFRpbGUpID0+IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5kYXRhW2tleV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlckZuKGVudHJ5LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVkLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVtb3ZlZCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoci52YWx1ZS50aWxlSUQsIHIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUaWxlQ2FjaGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXl9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcbmltcG9ydCB0eXBlIHtUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5LCBMaW5lU3RyaXBJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuY2xhc3MgSW5kZXhCdWZmZXIge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcbiAgICBkeW5hbWljRHJhdzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheSB8IExpbmVTdHJpcEluZGV4QXJyYXksIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0RyYXcgPSBCb29sZWFuKGR5bmFtaWNEcmF3KTtcblxuICAgICAgICAvLyBUaGUgYm91bmQgaW5kZXggYnVmZmVyIGlzIHBhcnQgb2YgdmVydGV4IGFycmF5IG9iamVjdCBzdGF0ZS4gV2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBtb2RpZnkgd2hhdGV2ZXIgVkFPIGhhcHBlbnMgdG8gYmUgY3VycmVudGx5IGJvdW5kLCBzbyBtYWtlIHN1cmUgdGhlIGRlZmF1bHRcbiAgICAgICAgLy8gdmVydGV4IGFycmF5IHByb3ZpZGVkIGJ5IHRoZSBjb250ZXh0IGlzIGJvdW5kIGluc3RlYWQuXG4gICAgICAgIHRoaXMuY29udGV4dC51bmJpbmRWQU8oKTtcblxuICAgICAgICBjb250ZXh0LmJpbmRFbGVtZW50QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGFycmF5LmFycmF5QnVmZmVyLCB0aGlzLmR5bmFtaWNEcmF3ID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgICAgIGlmICghdGhpcy5keW5hbWljRHJhdykge1xuICAgICAgICAgICAgZGVsZXRlIGFycmF5LmFycmF5QnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRFbGVtZW50QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShhcnJheTogU3RydWN0QXJyYXkpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGFzc2VydCh0aGlzLmR5bmFtaWNEcmF3KTtcbiAgICAgICAgLy8gVGhlIHJpZ2h0IFZBTyB3aWxsIGdldCB0aGlzIGJ1ZmZlciByZS1ib3VuZCBsYXRlciBpbiBWZXJ0ZXhBcnJheU9iamVjdCNiaW5kXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTYyMFxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAwLCBhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW5kZXhCdWZmZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBTdHJ1Y3RBcnJheSxcbiAgICBTdHJ1Y3RBcnJheU1lbWJlclxufSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheSc7XG5cbmltcG9ydCB0eXBlIFByb2dyYW0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0nO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcblxuLyoqXG4gKiBAZW51bSB7c3RyaW5nfSBBdHRyaWJ1dGVUeXBlXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbmNvbnN0IEF0dHJpYnV0ZVR5cGUgPSB7XG4gICAgSW50ODogICAnQllURScsXG4gICAgVWludDg6ICAnVU5TSUdORURfQllURScsXG4gICAgSW50MTY6ICAnU0hPUlQnLFxuICAgIFVpbnQxNjogJ1VOU0lHTkVEX1NIT1JUJyxcbiAgICBJbnQzMjogICdJTlQnLFxuICAgIFVpbnQzMjogJ1VOU0lHTkVEX0lOVCcsXG4gICAgRmxvYXQzMjogJ0ZMT0FUJ1xufTtcblxuLyoqXG4gKiBUaGUgYFZlcnRleEJ1ZmZlcmAgY2xhc3MgdHVybnMgYSBgU3RydWN0QXJyYXlgIGludG8gYSBXZWJHTCBidWZmZXIuIEVhY2ggbWVtYmVyIG9mIHRoZSBTdHJ1Y3RBcnJheSdzXG4gKiBTdHJ1Y3QgdHlwZSBpcyBjb252ZXJ0ZWQgdG8gYSBXZWJHTCBhdHJpYnV0ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFZlcnRleEJ1ZmZlciB7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgYXR0cmlidXRlczogJFJlYWRPbmx5QXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIGl0ZW1TaXplOiBudW1iZXI7XG4gICAgZHluYW1pY0RyYXc6ID9ib29sZWFuO1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkeW5hbWljRHJhdyBXaGV0aGVyIHRoaXMgYnVmZmVyIHdpbGwgYmUgcmVwZWF0ZWRseSB1cGRhdGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgYXJyYXk6IFN0cnVjdEFycmF5LCBhdHRyaWJ1dGVzOiAkUmVhZE9ubHlBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgICAgdGhpcy5pdGVtU2l6ZSA9IGFycmF5LmJ5dGVzUGVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5keW5hbWljRHJhdyA9IGR5bmFtaWNEcmF3O1xuXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgY29udGV4dC5iaW5kVmVydGV4QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBhcnJheS5hcnJheUJ1ZmZlciwgdGhpcy5keW5hbWljRHJhdyA/IGdsLkRZTkFNSUNfRFJBVyA6IGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICBpZiAoIXRoaXMuZHluYW1pY0RyYXcpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBhcnJheS5hcnJheUJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kVmVydGV4QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShhcnJheTogU3RydWN0QXJyYXkpIHtcbiAgICAgICAgYXNzZXJ0KGFycmF5Lmxlbmd0aCA9PT0gdGhpcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICAgIGdsLmJ1ZmZlclN1YkRhdGEoZ2wuQVJSQVlfQlVGRkVSLCAwLCBhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW5hYmxlQXR0cmlidXRlcyhnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBQcm9ncmFtPCo+KSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJJbmRleDogbnVtYmVyIHwgdm9pZCA9IHByb2dyYW0uYXR0cmlidXRlc1ttZW1iZXIubmFtZV07XG4gICAgICAgICAgICBpZiAoYXR0cmliSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGF0dHJpYkluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgYXR0cmlidXRlIHBvaW50ZXJzIGluIGEgV2ViR0wgY29udGV4dFxuICAgICAqIEBwYXJhbSBnbCBUaGUgV2ViR0wgY29udGV4dFxuICAgICAqIEBwYXJhbSBwcm9ncmFtIFRoZSBhY3RpdmUgV2ViR0wgcHJvZ3JhbVxuICAgICAqIEBwYXJhbSB2ZXJ0ZXhPZmZzZXQgSW5kZXggb2YgdGhlIHN0YXJ0aW5nIHZlcnRleCBvZiB0aGUgc2VnbWVudFxuICAgICAqL1xuICAgIHNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFByb2dyYW08Kj4sIHZlcnRleE9mZnNldDogP251bWJlcikge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyID0gdGhpcy5hdHRyaWJ1dGVzW2pdO1xuICAgICAgICAgICAgY29uc3QgYXR0cmliSW5kZXg6IG51bWJlciB8IHZvaWQgPSBwcm9ncmFtLmF0dHJpYnV0ZXNbbWVtYmVyLm5hbWVdO1xuXG4gICAgICAgICAgICBpZiAoYXR0cmliSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYkluZGV4LFxuICAgICAgICAgICAgICAgICAgICBtZW1iZXIuY29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICAgICAgKGdsOiBhbnkpW0F0dHJpYnV0ZVR5cGVbbWVtYmVyLnR5cGVdXSxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbVNpemUsXG4gICAgICAgICAgICAgICAgICAgIG1lbWJlci5vZmZzZXQgKyAodGhpcy5pdGVtU2l6ZSAqICh2ZXJ0ZXhPZmZzZXQgfHwgMCkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIEdMIGJ1ZmZlciBib3VuZCB0byB0aGUgZ2l2ZW4gV2ViR0wgY29udGV4dFxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5idWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlcnRleEJ1ZmZlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3InO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQmxlbmRGdW5jVHlwZSxcbiAgICBCbGVuZEVxdWF0aW9uVHlwZSxcbiAgICBDb2xvck1hc2tUeXBlLFxuICAgIERlcHRoUmFuZ2VUeXBlLFxuICAgIERlcHRoTWFza1R5cGUsXG4gICAgU3RlbmNpbEZ1bmNUeXBlLFxuICAgIFN0ZW5jaWxPcFR5cGUsXG4gICAgRGVwdGhGdW5jVHlwZSxcbiAgICBUZXh0dXJlVW5pdFR5cGUsXG4gICAgVmlld3BvcnRUeXBlLFxuICAgIEN1bGxGYWNlTW9kZVR5cGUsXG4gICAgRnJvbnRGYWNlVHlwZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWU8VD4ge1xuICAgIGN1cnJlbnQ6IFQ7XG4gICAgZGVmYXVsdDogVDtcbiAgICBkaXJ0eTogYm9vbGVhbjtcbiAgICBnZXQoKTogVDtcbiAgICBzZXREZWZhdWx0KCk6IHZvaWQ7XG4gICAgc2V0KHZhbHVlOiBUKTogdm9pZDtcbn1cblxuY2xhc3MgQmFzZVZhbHVlPFQ+IGltcGxlbWVudHMgVmFsdWU8VD4ge1xuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gICAgY3VycmVudDogVDtcbiAgICBkZWZhdWx0OiBUO1xuICAgIGRpcnR5OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICB0aGlzLmdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5nZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZGVmYXVsdDtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCgpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudDtcbiAgICB9XG4gICAgc2V0KHZhbHVlOiBUKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgLy8gb3ZlcnJpZGRlbiBpbiBjaGlsZCBjbGFzc2VzO1xuICAgIH1cblxuICAgIGdldERlZmF1bHQoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHQ7IC8vIG92ZXJyaWRlbiBpbiBjaGlsZCBjbGFzc2VzXG4gICAgfVxuICAgIHNldERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMuc2V0KHRoaXMuZGVmYXVsdCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYXJDb2xvciBleHRlbmRzIEJhc2VWYWx1ZTxDb2xvcj4ge1xuICAgIGdldERlZmF1bHQoKTogQ29sb3Ige1xuICAgICAgICByZXR1cm4gQ29sb3IudHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIHNldCh2OiBDb2xvcikge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodi5yID09PSBjLnIgJiYgdi5nID09PSBjLmcgJiYgdi5iID09PSBjLmIgJiYgdi5hID09PSBjLmEgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jbGVhckNvbG9yKHYuciwgdi5nLCB2LmIsIHYuYSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhckRlcHRoIGV4dGVuZHMgQmFzZVZhbHVlPG51bWJlcj4ge1xuICAgIGdldERlZmF1bHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHNldCh2OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmNsZWFyRGVwdGgodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhclN0ZW5jaWwgZXh0ZW5kcyBCYXNlVmFsdWU8bnVtYmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc2V0KHY6IG51bWJlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY2xlYXJTdGVuY2lsKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sb3JNYXNrIGV4dGVuZHMgQmFzZVZhbHVlPENvbG9yTWFza1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IENvbG9yTWFza1R5cGUge1xuICAgICAgICByZXR1cm4gW3RydWUsIHRydWUsIHRydWUsIHRydWVdO1xuICAgIH1cbiAgICBzZXQodjogQ29sb3JNYXNrVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmIHZbMl0gPT09IGNbMl0gJiYgdlszXSA9PT0gY1szXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmNvbG9yTWFzayh2WzBdLCB2WzFdLCB2WzJdLCB2WzNdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoTWFzayBleHRlbmRzIEJhc2VWYWx1ZTxEZXB0aE1hc2tUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBEZXB0aE1hc2tUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldCh2OiBEZXB0aE1hc2tUeXBlKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5kZXB0aE1hc2sodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVuY2lsTWFzayBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAweEZGO1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5zdGVuY2lsTWFzayh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0ZW5jaWxGdW5jIGV4dGVuZHMgQmFzZVZhbHVlPFN0ZW5jaWxGdW5jVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogU3RlbmNpbEZ1bmNUeXBlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZ1bmM6IHRoaXMuZ2wuQUxXQVlTLFxuICAgICAgICAgICAgcmVmOiAwLFxuICAgICAgICAgICAgbWFzazogMHhGRlxuICAgICAgICB9O1xuICAgIH1cbiAgICBzZXQodjogU3RlbmNpbEZ1bmNUeXBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2LmZ1bmMgPT09IGMuZnVuYyAmJiB2LnJlZiA9PT0gYy5yZWYgJiYgdi5tYXNrID09PSBjLm1hc2sgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5zdGVuY2lsRnVuYyh2LmZ1bmMsIHYucmVmLCB2Lm1hc2spO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RlbmNpbE9wIGV4dGVuZHMgQmFzZVZhbHVlPFN0ZW5jaWxPcFR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IFN0ZW5jaWxPcFR5cGUge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHJldHVybiBbZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuS0VFUF07XG4gICAgfVxuICAgIHNldCh2OiBTdGVuY2lsT3BUeXBlKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdID09PSBjWzBdICYmIHZbMV0gPT09IGNbMV0gJiYgdlsyXSA9PT0gY1syXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnN0ZW5jaWxPcCh2WzBdLCB2WzFdLCB2WzJdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0ZW5jaWxUZXN0IGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoUmFuZ2UgZXh0ZW5kcyBCYXNlVmFsdWU8RGVwdGhSYW5nZVR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IERlcHRoUmFuZ2VUeXBlIHtcbiAgICAgICAgcmV0dXJuIFswLCAxXTtcbiAgICB9XG4gICAgc2V0KHY6IERlcHRoUmFuZ2VUeXBlKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdID09PSBjWzBdICYmIHZbMV0gPT09IGNbMV0gJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5kZXB0aFJhbmdlKHZbMF0sIHZbMV0pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwdGhUZXN0IGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwdGhGdW5jIGV4dGVuZHMgQmFzZVZhbHVlPERlcHRoRnVuY1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IERlcHRoRnVuY1R5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5MRVNTO1xuICAgIH1cbiAgICBzZXQodjogRGVwdGhGdW5jVHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuZGVwdGhGdW5jKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmxlbmQgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5CTEVORCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsZW5kRnVuYyBleHRlbmRzIEJhc2VWYWx1ZTxCbGVuZEZ1bmNUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBCbGVuZEZ1bmNUeXBlIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICByZXR1cm4gW2dsLk9ORSwgZ2wuWkVST107XG4gICAgfVxuICAgIHNldCh2OiBCbGVuZEZ1bmNUeXBlKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdID09PSBjWzBdICYmIHZbMV0gPT09IGNbMV0gJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5ibGVuZEZ1bmModlswXSwgdlsxXSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbGVuZENvbG9yIGV4dGVuZHMgQmFzZVZhbHVlPENvbG9yPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBDb2xvciB7XG4gICAgICAgIHJldHVybiBDb2xvci50cmFuc3BhcmVudDtcbiAgICB9XG4gICAgc2V0KHY6IENvbG9yKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2LnIgPT09IGMuciAmJiB2LmcgPT09IGMuZyAmJiB2LmIgPT09IGMuYiAmJiB2LmEgPT09IGMuYSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmJsZW5kQ29sb3Iodi5yLCB2LmcsIHYuYiwgdi5hKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsZW5kRXF1YXRpb24gZXh0ZW5kcyBCYXNlVmFsdWU8QmxlbmRFcXVhdGlvblR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IEJsZW5kRXF1YXRpb25UeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuRlVOQ19BREQ7XG4gICAgfVxuICAgIHNldCh2OiBCbGVuZEVxdWF0aW9uVHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuYmxlbmRFcXVhdGlvbih2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEN1bGxGYWNlIGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEN1bGxGYWNlU2lkZSBleHRlbmRzIEJhc2VWYWx1ZTxDdWxsRmFjZU1vZGVUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBDdWxsRmFjZU1vZGVUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuQkFDSztcbiAgICB9XG4gICAgc2V0KHY6IEN1bGxGYWNlTW9kZVR5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmN1bGxGYWNlKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnJvbnRGYWNlIGV4dGVuZHMgQmFzZVZhbHVlPEZyb250RmFjZVR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IEZyb250RmFjZVR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5DQ1c7XG4gICAgfVxuICAgIHNldCh2OiBGcm9udEZhY2VUeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5mcm9udEZhY2Uodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmFtIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTFByb2dyYW0+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMUHJvZ3JhbSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMUHJvZ3JhbSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbSh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGl2ZVRleHR1cmVVbml0IGV4dGVuZHMgQmFzZVZhbHVlPFRleHR1cmVVbml0VHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogVGV4dHVyZVVuaXRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuVEVYVFVSRTA7XG4gICAgfVxuICAgIHNldCh2OiBUZXh0dXJlVW5pdFR5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmFjdGl2ZVRleHR1cmUodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWaWV3cG9ydCBleHRlbmRzIEJhc2VWYWx1ZTxWaWV3cG9ydFR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IFZpZXdwb3J0VHlwZSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgcmV0dXJuIFswLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHRdO1xuICAgIH1cbiAgICBzZXQodjogVmlld3BvcnRUeXBlKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdID09PSBjWzBdICYmIHZbMV0gPT09IGNbMV0gJiYgdlsyXSA9PT0gY1syXSAmJiB2WzNdID09PSBjWzNdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQodlswXSwgdlsxXSwgdlsyXSwgdlszXSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kRnJhbWVidWZmZXIgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMRnJhbWVidWZmZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMRnJhbWVidWZmZXIge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTEZyYW1lYnVmZmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZFJlbmRlcmJ1ZmZlciBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xSZW5kZXJidWZmZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMUmVuZGVyYnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xSZW5kZXJidWZmZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRUZXh0dXJlIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTFRleHR1cmU+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMVGV4dHVyZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMVGV4dHVyZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kVmVydGV4QnVmZmVyIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTEJ1ZmZlcj4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xCdWZmZXIge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTEJ1ZmZlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZEVsZW1lbnRCdWZmZXIgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMQnVmZmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTEJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMQnVmZmVyKSB7XG4gICAgICAgIC8vIEFsd2F5cyByZWJpbmRcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRWZXJ0ZXhBcnJheU9FUyBleHRlbmRzIEJhc2VWYWx1ZTxhbnk+IHtcbiAgICB2YW86IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgICAgIHRoaXMudmFvID0gY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdDtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMudmFvIHx8IHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnZhby5iaW5kVmVydGV4QXJyYXlPRVModik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaXhlbFN0b3JlVW5wYWNrIGV4dGVuZHMgQmFzZVZhbHVlPG51bWJlcj4ge1xuICAgIGdldERlZmF1bHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIHNldCh2OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19BTElHTk1FTlQsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgKHY6IGFueSkpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxTdG9yZVVucGFja0ZsaXBZIGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCAodjogYW55KSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmNsYXNzIEZyYW1lYnVmZmVyQXR0YWNobWVudDxUPiBleHRlbmRzIEJhc2VWYWx1ZTw/VD4ge1xuICAgIHBhcmVudDogV2ViR0xGcmFtZWJ1ZmZlcjtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcGFyZW50OiBXZWJHTEZyYW1lYnVmZmVyKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQpO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sb3JBdHRhY2htZW50IGV4dGVuZHMgRnJhbWVidWZmZXJBdHRhY2htZW50PFdlYkdMVGV4dHVyZT4ge1xuICAgIHNldERpcnR5KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTFRleHR1cmUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldCh0aGlzLnBhcmVudCk7XG4gICAgICAgIC8vIG5vdGU6IGl0J3MgcG9zc2libGUgdG8gYXR0YWNoIGEgcmVuZGVyYnVmZmVyIHRvIHRoZSBjb2xvclxuICAgICAgICAvLyBhdHRhY2htZW50IHBvaW50LCBidXQgdGh1cyBmYXIgTUJHTCBvbmx5IHVzZXMgdGV4dHVyZXMgZm9yIGNvbG9yXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB2LCAwKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoQXR0YWNobWVudCBleHRlbmRzIEZyYW1lYnVmZmVyQXR0YWNobWVudDxXZWJHTFJlbmRlcmJ1ZmZlcj4ge1xuICAgIHNldCh2OiA/V2ViR0xSZW5kZXJidWZmZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldCh0aGlzLnBhcmVudCk7XG4gICAgICAgIC8vIG5vdGU6IGl0J3MgcG9zc2libGUgdG8gYXR0YWNoIGEgdGV4dHVyZSB0byB0aGUgZGVwdGggYXR0YWNobWVudFxuICAgICAgICAvLyBwb2ludCwgYnV0IHRodXMgZmFyIE1CR0wgb25seSB1c2VzIHJlbmRlcmJ1ZmZlcnMgZm9yIGRlcHRoXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkRFUFRIX0FUVEFDSE1FTlQsIGdsLlJFTkRFUkJVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtDb2xvckF0dGFjaG1lbnQsIERlcHRoQXR0YWNobWVudH0gZnJvbSAnLi92YWx1ZSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi9jb250ZXh0JztcblxuY2xhc3MgRnJhbWVidWZmZXIge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcjtcbiAgICBjb2xvckF0dGFjaG1lbnQ6IENvbG9yQXR0YWNobWVudDtcbiAgICBkZXB0aEF0dGFjaG1lbnQ6IERlcHRoQXR0YWNobWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBoYXNEZXB0aDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGZibyA9IHRoaXMuZnJhbWVidWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG4gICAgICAgIHRoaXMuY29sb3JBdHRhY2htZW50ID0gbmV3IENvbG9yQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICBpZiAoaGFzRGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhBdHRhY2htZW50ID0gbmV3IERlcHRoQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSA9PT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmNvbG9yQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgaWYgKHRleHR1cmUpIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwdGhBdHRhY2htZW50KSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJidWZmZXIgPSB0aGlzLmRlcHRoQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgICAgIGlmIChyZW5kZXJidWZmZXIpIGdsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGcmFtZWJ1ZmZlcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7RGVwdGhGdW5jVHlwZSwgRGVwdGhNYXNrVHlwZSwgRGVwdGhSYW5nZVR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBBTFdBWVMgPSAweDAyMDc7XG5cbmNsYXNzIERlcHRoTW9kZSB7XG4gICAgZnVuYzogRGVwdGhGdW5jVHlwZTtcbiAgICBtYXNrOiBEZXB0aE1hc2tUeXBlO1xuICAgIHJhbmdlOiBEZXB0aFJhbmdlVHlwZTtcblxuICAgIC8vIERlcHRoTWFzayBlbnVtc1xuICAgIHN0YXRpYyBSZWFkT25seTogYm9vbGVhbjtcbiAgICBzdGF0aWMgUmVhZFdyaXRlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGVwdGhGdW5jOiBEZXB0aEZ1bmNUeXBlLCBkZXB0aE1hc2s6IERlcHRoTWFza1R5cGUsIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2VUeXBlKSB7XG4gICAgICAgIHRoaXMuZnVuYyA9IGRlcHRoRnVuYztcbiAgICAgICAgdGhpcy5tYXNrID0gZGVwdGhNYXNrO1xuICAgICAgICB0aGlzLnJhbmdlID0gZGVwdGhSYW5nZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxEZXB0aE1vZGU+O1xufVxuXG5EZXB0aE1vZGUuUmVhZE9ubHkgPSBmYWxzZTtcbkRlcHRoTW9kZS5SZWFkV3JpdGUgPSB0cnVlO1xuXG5EZXB0aE1vZGUuZGlzYWJsZWQgPSBuZXcgRGVwdGhNb2RlKEFMV0FZUywgRGVwdGhNb2RlLlJlYWRPbmx5LCBbMCwgMV0pO1xuXG5leHBvcnQgZGVmYXVsdCBEZXB0aE1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1N0ZW5jaWxPcENvbnN0YW50LCBTdGVuY2lsVGVzdH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IEFMV0FZUyA9IDB4MDIwNztcbmNvbnN0IEtFRVAgPSAweDFFMDA7XG5cbmNsYXNzIFN0ZW5jaWxNb2RlIHtcbiAgICB0ZXN0OiBTdGVuY2lsVGVzdDtcbiAgICByZWY6IG51bWJlcjtcbiAgICBtYXNrOiBudW1iZXI7XG4gICAgZmFpbDogU3RlbmNpbE9wQ29uc3RhbnQ7XG4gICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudDtcbiAgICBwYXNzOiBTdGVuY2lsT3BDb25zdGFudDtcblxuICAgIGNvbnN0cnVjdG9yKHRlc3Q6IFN0ZW5jaWxUZXN0LCByZWY6IG51bWJlciwgbWFzazogbnVtYmVyLCBmYWlsOiBTdGVuY2lsT3BDb25zdGFudCxcbiAgICAgICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudCwgcGFzczogU3RlbmNpbE9wQ29uc3RhbnQpIHtcbiAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuZmFpbCA9IGZhaWw7XG4gICAgICAgIHRoaXMuZGVwdGhGYWlsID0gZGVwdGhGYWlsO1xuICAgICAgICB0aGlzLnBhc3MgPSBwYXNzO1xuICAgIH1cblxuICAgIHN0YXRpYyBkaXNhYmxlZDogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPjtcbn1cblxuU3RlbmNpbE1vZGUuZGlzYWJsZWQgPSBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IEFMV0FZUywgbWFzazogMH0sIDAsIDAsIEtFRVAsIEtFRVAsIEtFRVApO1xuXG5leHBvcnQgZGVmYXVsdCBTdGVuY2lsTW9kZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcblxuaW1wb3J0IHR5cGUge0JsZW5kRnVuY1R5cGUsIENvbG9yTWFza1R5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBaRVJPID0gMHgwMDAwO1xuY29uc3QgT05FID0gMHgwMDAxO1xuY29uc3QgT05FX01JTlVTX1NSQ19BTFBIQSA9IDB4MDMwMztcblxuY2xhc3MgQ29sb3JNb2RlIHtcbiAgICBibGVuZEZ1bmN0aW9uOiBCbGVuZEZ1bmNUeXBlO1xuICAgIGJsZW5kQ29sb3I6IENvbG9yO1xuICAgIG1hc2s6IENvbG9yTWFza1R5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihibGVuZEZ1bmN0aW9uOiBCbGVuZEZ1bmNUeXBlLCBibGVuZENvbG9yOiBDb2xvciwgbWFzazogQ29sb3JNYXNrVHlwZSkge1xuICAgICAgICB0aGlzLmJsZW5kRnVuY3Rpb24gPSBibGVuZEZ1bmN0aW9uO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IgPSBibGVuZENvbG9yO1xuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xuICAgIH1cblxuICAgIHN0YXRpYyBSZXBsYWNlOiBCbGVuZEZ1bmNUeXBlO1xuXG4gICAgc3RhdGljIGRpc2FibGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbiAgICBzdGF0aWMgdW5ibGVuZGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbiAgICBzdGF0aWMgYWxwaGFCbGVuZGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbn1cblxuQ29sb3JNb2RlLlJlcGxhY2UgPSBbT05FLCBaRVJPXTtcblxuQ29sb3JNb2RlLmRpc2FibGVkID0gbmV3IENvbG9yTW9kZShDb2xvck1vZGUuUmVwbGFjZSwgQ29sb3IudHJhbnNwYXJlbnQsIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0pO1xuQ29sb3JNb2RlLnVuYmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoQ29sb3JNb2RlLlJlcGxhY2UsIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuQ29sb3JNb2RlLmFscGhhQmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoW09ORSwgT05FX01JTlVTX1NSQ19BTFBIQV0sIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xvck1vZGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7Q3VsbEZhY2VNb2RlVHlwZSwgRnJvbnRGYWNlVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IEJBQ0sgPSAweDA0MDU7XG5jb25zdCBDQ1cgPSAweDA5MDE7XG5cbmNsYXNzIEN1bGxGYWNlTW9kZSB7XG4gICAgZW5hYmxlOiBib29sZWFuO1xuICAgIG1vZGU6IEN1bGxGYWNlTW9kZVR5cGU7XG4gICAgZnJvbnRGYWNlOiBGcm9udEZhY2VUeXBlO1xuXG4gICAgY29uc3RydWN0b3IoZW5hYmxlOiBib29sZWFuLCBtb2RlOiBDdWxsRmFjZU1vZGVUeXBlLCBmcm9udEZhY2U6IEZyb250RmFjZVR5cGUpIHtcbiAgICAgICAgdGhpcy5lbmFibGUgPSBlbmFibGU7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlID0gZnJvbnRGYWNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBkaXNhYmxlZDogJFJlYWRPbmx5PEN1bGxGYWNlTW9kZT47XG4gICAgc3RhdGljIGJhY2tDQ1c6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+O1xufVxuXG5DdWxsRmFjZU1vZGUuZGlzYWJsZWQgPSBuZXcgQ3VsbEZhY2VNb2RlKGZhbHNlLCBCQUNLLCBDQ1cpO1xuQ3VsbEZhY2VNb2RlLmJhY2tDQ1cgPSBuZXcgQ3VsbEZhY2VNb2RlKHRydWUsIEJBQ0ssIENDVyk7XG5cbmV4cG9ydCBkZWZhdWx0IEN1bGxGYWNlTW9kZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgSW5kZXhCdWZmZXIgZnJvbSAnLi9pbmRleF9idWZmZXInO1xuXG5pbXBvcnQgVmVydGV4QnVmZmVyIGZyb20gJy4vdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgRnJhbWVidWZmZXIgZnJvbSAnLi9mcmFtZWJ1ZmZlcic7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4vZGVwdGhfbW9kZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuL2NvbG9yX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7ZGVlcEVxdWFsfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHtDbGVhckNvbG9yLCBDbGVhckRlcHRoLCBDbGVhclN0ZW5jaWwsIENvbG9yTWFzaywgRGVwdGhNYXNrLCBTdGVuY2lsTWFzaywgU3RlbmNpbEZ1bmMsIFN0ZW5jaWxPcCwgU3RlbmNpbFRlc3QsIERlcHRoUmFuZ2UsIERlcHRoVGVzdCwgRGVwdGhGdW5jLCBCbGVuZCwgQmxlbmRGdW5jLCBCbGVuZENvbG9yLCBCbGVuZEVxdWF0aW9uLCBDdWxsRmFjZSwgQ3VsbEZhY2VTaWRlLCBGcm9udEZhY2UsIFByb2dyYW0sIEFjdGl2ZVRleHR1cmVVbml0LCBWaWV3cG9ydCwgQmluZEZyYW1lYnVmZmVyLCBCaW5kUmVuZGVyYnVmZmVyLCBCaW5kVGV4dHVyZSwgQmluZFZlcnRleEJ1ZmZlciwgQmluZEVsZW1lbnRCdWZmZXIsIEJpbmRWZXJ0ZXhBcnJheU9FUywgUGl4ZWxTdG9yZVVucGFjaywgUGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEsIFBpeGVsU3RvcmVVbnBhY2tGbGlwWX0gZnJvbSAnLi92YWx1ZSc7XG5cbmltcG9ydCB0eXBlIHtUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5LCBMaW5lU3RyaXBJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2luZGV4X2FycmF5X3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICAgIFN0cnVjdEFycmF5LFxuICAgIFN0cnVjdEFycmF5TWVtYmVyXG59IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbnR5cGUgQ2xlYXJBcmdzID0ge1xuICAgIGNvbG9yPzogQ29sb3IsXG4gICAgZGVwdGg/OiBudW1iZXIsXG4gICAgc3RlbmNpbD86IG51bWJlclxufTtcblxuY2xhc3MgQ29udGV4dCB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgICBleHRWZXJ0ZXhBcnJheU9iamVjdDogYW55O1xuICAgIGN1cnJlbnROdW1BdHRyaWJ1dGVzOiA/bnVtYmVyO1xuICAgIG1heFRleHR1cmVTaXplOiBudW1iZXI7XG5cbiAgICBjbGVhckNvbG9yOiBDbGVhckNvbG9yO1xuICAgIGNsZWFyRGVwdGg6IENsZWFyRGVwdGg7XG4gICAgY2xlYXJTdGVuY2lsOiBDbGVhclN0ZW5jaWw7XG4gICAgY29sb3JNYXNrOiBDb2xvck1hc2s7XG4gICAgZGVwdGhNYXNrOiBEZXB0aE1hc2s7XG4gICAgc3RlbmNpbE1hc2s6IFN0ZW5jaWxNYXNrO1xuICAgIHN0ZW5jaWxGdW5jOiBTdGVuY2lsRnVuYztcbiAgICBzdGVuY2lsT3A6IFN0ZW5jaWxPcDtcbiAgICBzdGVuY2lsVGVzdDogU3RlbmNpbFRlc3Q7XG4gICAgZGVwdGhSYW5nZTogRGVwdGhSYW5nZTtcbiAgICBkZXB0aFRlc3Q6IERlcHRoVGVzdDtcbiAgICBkZXB0aEZ1bmM6IERlcHRoRnVuYztcbiAgICBibGVuZDogQmxlbmQ7XG4gICAgYmxlbmRGdW5jOiBCbGVuZEZ1bmM7XG4gICAgYmxlbmRDb2xvcjogQmxlbmRDb2xvcjtcbiAgICBibGVuZEVxdWF0aW9uOiBCbGVuZEVxdWF0aW9uO1xuICAgIGN1bGxGYWNlOiBDdWxsRmFjZTtcbiAgICBjdWxsRmFjZVNpZGU6IEN1bGxGYWNlU2lkZTtcbiAgICBmcm9udEZhY2U6IEZyb250RmFjZTtcbiAgICBwcm9ncmFtOiBQcm9ncmFtO1xuICAgIGFjdGl2ZVRleHR1cmU6IEFjdGl2ZVRleHR1cmVVbml0O1xuICAgIHZpZXdwb3J0OiBWaWV3cG9ydDtcbiAgICBiaW5kRnJhbWVidWZmZXI6IEJpbmRGcmFtZWJ1ZmZlcjtcbiAgICBiaW5kUmVuZGVyYnVmZmVyOiBCaW5kUmVuZGVyYnVmZmVyO1xuICAgIGJpbmRUZXh0dXJlOiBCaW5kVGV4dHVyZTtcbiAgICBiaW5kVmVydGV4QnVmZmVyOiBCaW5kVmVydGV4QnVmZmVyO1xuICAgIGJpbmRFbGVtZW50QnVmZmVyOiBCaW5kRWxlbWVudEJ1ZmZlcjtcbiAgICBiaW5kVmVydGV4QXJyYXlPRVM6IEJpbmRWZXJ0ZXhBcnJheU9FUztcbiAgICBwaXhlbFN0b3JlVW5wYWNrOiBQaXhlbFN0b3JlVW5wYWNrO1xuICAgIHBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhOiBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYTtcbiAgICBwaXhlbFN0b3JlVW5wYWNrRmxpcFk6IFBpeGVsU3RvcmVVbnBhY2tGbGlwWTtcblxuICAgIGV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYzogYW55O1xuICAgIGV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY01heDogYW55O1xuICAgIGV4dFRleHR1cmVIYWxmRmxvYXQ6IGFueTtcbiAgICBleHRSZW5kZXJUb1RleHR1cmVIYWxmRmxvYXQ6IGFueTtcbiAgICBleHRUaW1lclF1ZXJ5OiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb2xvciA9IG5ldyBDbGVhckNvbG9yKHRoaXMpO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGggPSBuZXcgQ2xlYXJEZXB0aCh0aGlzKTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwgPSBuZXcgQ2xlYXJTdGVuY2lsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbG9yTWFzayA9IG5ldyBDb2xvck1hc2sodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhNYXNrID0gbmV3IERlcHRoTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsTWFzayA9IG5ldyBTdGVuY2lsTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYyA9IG5ldyBTdGVuY2lsRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsT3AgPSBuZXcgU3RlbmNpbE9wKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0ID0gbmV3IFN0ZW5jaWxUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoUmFuZ2UgPSBuZXcgRGVwdGhSYW5nZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXB0aFRlc3QgPSBuZXcgRGVwdGhUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoRnVuYyA9IG5ldyBEZXB0aEZ1bmModGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmQgPSBuZXcgQmxlbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRGdW5jID0gbmV3IEJsZW5kRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZENvbG9yID0gbmV3IEJsZW5kQ29sb3IodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbiA9IG5ldyBCbGVuZEVxdWF0aW9uKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlID0gbmV3IEN1bGxGYWNlKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZSA9IG5ldyBDdWxsRmFjZVNpZGUodGhpcyk7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlID0gbmV3IEZyb250RmFjZSh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbmV3IFByb2dyYW0odGhpcyk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZSA9IG5ldyBBY3RpdmVUZXh0dXJlVW5pdCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kRnJhbWVidWZmZXIgPSBuZXcgQmluZEZyYW1lYnVmZmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIgPSBuZXcgQmluZFJlbmRlcmJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVGV4dHVyZSA9IG5ldyBCaW5kVGV4dHVyZSh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVmVydGV4QnVmZmVyID0gbmV3IEJpbmRWZXJ0ZXhCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZEVsZW1lbnRCdWZmZXIgPSBuZXcgQmluZEVsZW1lbnRCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZFZlcnRleEFycmF5T0VTID0gdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCAmJiBuZXcgQmluZFZlcnRleEFycmF5T0VTKHRoaXMpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2sgPSBuZXcgUGl4ZWxTdG9yZVVucGFjayh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSA9IG5ldyBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkgPSBuZXcgUGl4ZWxTdG9yZVVucGFja0ZsaXBZKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljID0gKFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKSB8fFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJykgfHxcbiAgICAgICAgICAgIGdsLmdldEV4dGVuc2lvbignV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXggPSBnbC5nZXRQYXJhbWV0ZXIodGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUhhbGZGbG9hdCA9IGdsLmdldEV4dGVuc2lvbignT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcpO1xuICAgICAgICBpZiAodGhpcy5leHRUZXh0dXJlSGFsZkZsb2F0KSB7XG4gICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyk7XG4gICAgICAgICAgICB0aGlzLmV4dFJlbmRlclRvVGV4dHVyZUhhbGZGbG9hdCA9IGdsLmdldEV4dGVuc2lvbignRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4dFRpbWVyUXVlcnkgPSBnbC5nZXRFeHRlbnNpb24oJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeScpO1xuICAgICAgICB0aGlzLm1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xuICAgIH1cblxuICAgIHNldERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMudW5iaW5kVkFPKCk7XG5cbiAgICAgICAgdGhpcy5jbGVhckNvbG9yLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbGVhckRlcHRoLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVwdGhNYXNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsTWFzay5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc3RlbmNpbEZ1bmMuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxPcC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc3RlbmNpbFRlc3Quc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlcHRoUmFuZ2Uuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlcHRoVGVzdC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVwdGhGdW5jLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5ibGVuZC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmxlbmRGdW5jLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5ibGVuZENvbG9yLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5ibGVuZEVxdWF0aW9uLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jdWxsRmFjZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY3VsbEZhY2VTaWRlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5mcm9udEZhY2Uuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnByb2dyYW0uc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmFjdGl2ZVRleHR1cmUuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmJpbmRGcmFtZWJ1ZmZlci5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFjay5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgc2V0RGlydHkoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJDb2xvci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xlYXJEZXB0aC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb2xvck1hc2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlcHRoTWFzay5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RlbmNpbE1hc2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsT3AuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aFJhbmdlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aFRlc3QuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlcHRoRnVuYy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmxlbmQuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kRnVuYy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmxlbmRDb2xvci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbi5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VsbEZhY2UuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcm9ncmFtLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hY3RpdmVUZXh0dXJlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3cG9ydC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZEZyYW1lYnVmZmVyLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iaW5kUmVuZGVyYnVmZmVyLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iaW5kVGV4dHVyZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZFZlcnRleEJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZEVsZW1lbnRCdWZmZXIuZGlydHkgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kVmVydGV4QXJyYXlPRVMuZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFjay5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGEuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY3JlYXRlSW5kZXhCdWZmZXIoYXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheSB8IExpbmVJbmRleEFycmF5IHwgTGluZVN0cmlwSW5kZXhBcnJheSwgZHluYW1pY0RyYXc/OiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5kZXhCdWZmZXIodGhpcywgYXJyYXksIGR5bmFtaWNEcmF3KTtcbiAgICB9XG5cbiAgICBjcmVhdGVWZXJ0ZXhCdWZmZXIoYXJyYXk6IFN0cnVjdEFycmF5LCBhdHRyaWJ1dGVzOiAkUmVhZE9ubHlBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gbmV3IFZlcnRleEJ1ZmZlcih0aGlzLCBhcnJheSwgYXR0cmlidXRlcywgZHluYW1pY0RyYXcpO1xuICAgIH1cblxuICAgIGNyZWF0ZVJlbmRlcmJ1ZmZlcihzdG9yYWdlRm9ybWF0OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcblxuICAgICAgICBjb25zdCByYm8gPSBnbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgdGhpcy5iaW5kUmVuZGVyYnVmZmVyLnNldChyYm8pO1xuICAgICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKGdsLlJFTkRFUkJVRkZFUiwgc3RvcmFnZUZvcm1hdCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIHJibztcbiAgICB9XG5cbiAgICBjcmVhdGVGcmFtZWJ1ZmZlcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgaGFzRGVwdGg6IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFtZWJ1ZmZlcih0aGlzLCB3aWR0aCwgaGVpZ2h0LCBoYXNEZXB0aCk7XG4gICAgfVxuXG4gICAgY2xlYXIoe2NvbG9yLCBkZXB0aH06IENsZWFyQXJncykge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGxldCBtYXNrID0gMDtcblxuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIG1hc2sgfD0gZ2wuQ09MT1JfQlVGRkVSX0JJVDtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDb2xvci5zZXQoY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5jb2xvck1hc2suc2V0KFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRlcHRoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbWFzayB8PSBnbC5ERVBUSF9CVUZGRVJfQklUO1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBwbGF0Zm9ybXMgd2hlcmUgY2xlYXJEZXB0aCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgICAgLy8gd2l0aG91dCByZXNldGluZyB0aGUgZGVwdGhSYW5nZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zNDM3XG4gICAgICAgICAgICB0aGlzLmRlcHRoUmFuZ2Uuc2V0KFswLCAxXSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2xlYXJEZXB0aC5zZXQoZGVwdGgpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aE1hc2suc2V0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VlIG5vdGUgaW4gUGFpbnRlciNjbGVhclN0ZW5jaWw6IGltcGxlbWVudCB0aGlzIHRoZSBlYXN5IHdheSBvbmNlIEdQVSBidWcvd29ya2Fyb3VuZCBpcyBmaXhlZCB1cHN0cmVhbVxuICAgICAgICAvLyBpZiAodHlwZW9mIHN0ZW5jaWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vICAgICBtYXNrIHw9IGdsLlNURU5DSUxfQlVGRkVSX0JJVDtcbiAgICAgICAgLy8gICAgIHRoaXMuY2xlYXJTdGVuY2lsLnNldChzdGVuY2lsKTtcbiAgICAgICAgLy8gICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0KDB4RkYpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgZ2wuY2xlYXIobWFzayk7XG4gICAgfVxuXG4gICAgc2V0Q3VsbEZhY2UoY3VsbEZhY2VNb2RlOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPikge1xuICAgICAgICBpZiAoY3VsbEZhY2VNb2RlLmVuYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VsbEZhY2Uuc2V0KGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VsbEZhY2Uuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZVNpZGUuc2V0KGN1bGxGYWNlTW9kZS5tb2RlKTtcbiAgICAgICAgICAgIHRoaXMuZnJvbnRGYWNlLnNldChjdWxsRmFjZU1vZGUuZnJvbnRGYWNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERlcHRoTW9kZShkZXB0aE1vZGU6ICRSZWFkT25seTxEZXB0aE1vZGU+KSB7XG4gICAgICAgIGlmIChkZXB0aE1vZGUuZnVuYyA9PT0gdGhpcy5nbC5BTFdBWVMgJiYgIWRlcHRoTW9kZS5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLmRlcHRoVGVzdC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXB0aFRlc3Quc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aEZ1bmMuc2V0KGRlcHRoTW9kZS5mdW5jKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhNYXNrLnNldChkZXB0aE1vZGUubWFzayk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoUmFuZ2Uuc2V0KGRlcHRoTW9kZS5yYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGVuY2lsTW9kZShzdGVuY2lsTW9kZTogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPikge1xuICAgICAgICBpZiAoc3RlbmNpbE1vZGUudGVzdC5mdW5jID09PSB0aGlzLmdsLkFMV0FZUyAmJiAhc3RlbmNpbE1vZGUubWFzaykge1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrLnNldChzdGVuY2lsTW9kZS5tYXNrKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbE9wLnNldChbc3RlbmNpbE1vZGUuZmFpbCwgc3RlbmNpbE1vZGUuZGVwdGhGYWlsLCBzdGVuY2lsTW9kZS5wYXNzXSk7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jLnNldCh7XG4gICAgICAgICAgICAgICAgZnVuYzogc3RlbmNpbE1vZGUudGVzdC5mdW5jLFxuICAgICAgICAgICAgICAgIHJlZjogc3RlbmNpbE1vZGUucmVmLFxuICAgICAgICAgICAgICAgIG1hc2s6IHN0ZW5jaWxNb2RlLnRlc3QubWFza1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb2xvck1vZGUoY29sb3JNb2RlOiAkUmVhZE9ubHk8Q29sb3JNb2RlPikge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGNvbG9yTW9kZS5ibGVuZEZ1bmN0aW9uLCBDb2xvck1vZGUuUmVwbGFjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYmxlbmQuc2V0KGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmxlbmQuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5ibGVuZEZ1bmMuc2V0KGNvbG9yTW9kZS5ibGVuZEZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuYmxlbmRDb2xvci5zZXQoY29sb3JNb2RlLmJsZW5kQ29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb2xvck1hc2suc2V0KGNvbG9yTW9kZS5tYXNrKTtcbiAgICB9XG5cbiAgICB1bmJpbmRWQU8oKSB7XG4gICAgICAgIC8vIFVuYmluZGluZyB0aGUgVkFPIHByZXZlbnRzIG90aGVyIHRoaW5ncyAoY3VzdG9tIGxheWVycywgbmV3IGJ1ZmZlciBjcmVhdGlvbikgZnJvbVxuICAgICAgICAvLyB1bmludGVudGlvbmFsbHkgY2hhbmdpbmcgdGhlIHN0YXRlIG9mIHRoZSBsYXN0IFZBTyB1c2VkLlxuICAgICAgICBpZiAodGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kVmVydGV4QXJyYXlPRVMuc2V0KG51bGwpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250ZXh0O1xuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7Y3JlYXRlIGFzIGNyZWF0ZVNvdXJjZX0gZnJvbSAnLi9zb3VyY2UnO1xyXG5cclxuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcclxuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkJztcclxuaW1wb3J0IFRpbGVDYWNoZSBmcm9tICcuL3RpbGVfY2FjaGUnO1xyXG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlJztcclxuaW1wb3J0IHtrZXlzRGlmZmVyZW5jZSwgdmFsdWVzfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcclxuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dCc7XHJcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcclxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcclxuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQnO1xyXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XHJcbmltcG9ydCBTb3VyY2VGZWF0dXJlU3RhdGUgZnJvbSAnLi9zb3VyY2Vfc3RhdGUnO1xyXG5cclxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UnO1xyXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwJztcclxuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xyXG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlcic7XHJcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcclxuaW1wb3J0IHR5cGUge1RpbGVTdGF0ZX0gZnJvbSAnLi90aWxlJztcclxuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XHJcbmltcG9ydCB0eXBlIHtTb3VyY2VTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcclxuXHJcbi8qKlxyXG4gKiBgU291cmNlQ2FjaGVgIGlzIHJlc3BvbnNpYmxlIGZvclxyXG4gKlxyXG4gKiAgLSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBgU291cmNlYFxyXG4gKiAgLSBmb3J3YXJkaW5nIGV2ZW50cyBmcm9tIGBTb3VyY2VgXHJcbiAqICAtIGNhY2hpbmcgdGlsZXMgbG9hZGVkIGZyb20gYW4gaW5zdGFuY2Ugb2YgYFNvdXJjZWBcclxuICogIC0gbG9hZGluZyB0aGUgdGlsZXMgbmVlZGVkIHRvIHJlbmRlciBhIGdpdmVuIHZpZXdwb3J0XHJcbiAqICAtIHVubG9hZGluZyB0aGUgY2FjaGVkIHRpbGVzIG5vdCBuZWVkZWQgdG8gcmVuZGVyIGEgZ2l2ZW4gdmlld3BvcnRcclxuICpcclxuICogQHByaXZhdGVcclxuICovXHJcbmNsYXNzIFNvdXJjZUNhY2hlIGV4dGVuZHMgRXZlbnRlZCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcclxuICAgIG1hcDogTWFwO1xyXG4gICAgc3R5bGU6IFN0eWxlO1xyXG5cclxuICAgIF9zb3VyY2U6IFNvdXJjZTtcclxuICAgIF9zb3VyY2VMb2FkZWQ6IGJvb2xlYW47XHJcbiAgICBfc291cmNlRXJyb3JlZDogYm9vbGVhbjtcclxuICAgIF90aWxlczoge1tfOiBzdHJpbmddOiBUaWxlfTtcclxuICAgIF9wcmV2TG5nOiBudW1iZXIgfCB2b2lkO1xyXG4gICAgX2NhY2hlOiBUaWxlQ2FjaGU7XHJcbiAgICBfdGltZXJzOiB7W186IGFueV06IFRpbWVvdXRJRH07XHJcbiAgICBfY2FjaGVUaW1lcnM6IHtbXzogYW55XTogVGltZW91dElEfTtcclxuICAgIF9tYXhUaWxlQ2FjaGVTaXplOiA/bnVtYmVyO1xyXG4gICAgX3BhdXNlZDogYm9vbGVhbjtcclxuICAgIF9zaG91bGRSZWxvYWRPblJlc3VtZTogYm9vbGVhbjtcclxuICAgIF9jb3ZlcmVkVGlsZXM6IHtbXzogc3RyaW5nXTogYm9vbGVhbn07XHJcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcclxuICAgIF9pc0lkUmVuZGVyYWJsZTogKGlkOiBzdHJpbmcsIHN5bWJvbExheWVyPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcclxuICAgIHVzZWQ6IGJvb2xlYW47XHJcbiAgICBfc3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZTtcclxuICAgIF9sb2FkZWRQYXJlbnRUaWxlczoge1tfOiBzdHJpbmddOiA/VGlsZX07XHJcblxyXG4gICAgc3RhdGljIG1heFVuZGVyem9vbWluZzogbnVtYmVyO1xyXG4gICAgc3RhdGljIG1heE92ZXJ6b29taW5nOiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcikge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XHJcblxyXG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9zb3VyY2VMb2FkZWQgc2lnbmlmaWVzIHRoYXQgdGhlIFRpbGVKU09OIGlzIGxvYWRlZCBpZiBhcHBsaWNhYmxlLlxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgc291cmNlIHR5cGUgZG9lcyBub3QgY29tZSB3aXRoIGEgVGlsZUpTT04sIHRoZSBmbGFnIHNpZ25pZmllcyB0aGVcclxuICAgICAgICAgICAgLy8gc291cmNlIGRhdGEgaGFzIGxvYWRlZCAoaS5lIGdlb2pzb24gaGFzIGJlZW4gdGlsZWQgb24gdGhlIHdvcmtlciBhbmQgaXMgcmVhZHkpXHJcbiAgICAgICAgICAgIGlmIChlLmRhdGFUeXBlID09PSAnc291cmNlJyAmJiBlLnNvdXJjZURhdGFUeXBlID09PSAnbWV0YWRhdGEnKSB0aGlzLl9zb3VyY2VMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gZm9yIHNvdXJjZXMgd2l0aCBtdXRhYmxlIGRhdGEsIHRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgdW5kZXJseWluZyBkYXRhXHJcbiAgICAgICAgICAgIC8vIHRvIGEgc291cmNlIGlzIGNoYW5nZWQuIChpLmUuIEdlb0pTT05Tb3VyY2Ujc2V0RGF0YSBhbmQgSW1hZ2VTb3VyY2Ujc2VyQ29vcmRpbmF0ZXMpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VMb2FkZWQgJiYgIXRoaXMuX3BhdXNlZCAmJiBlLmRhdGFUeXBlID09PSBcInNvdXJjZVwiICYmIGUuc291cmNlRGF0YVR5cGUgPT09ICdjb250ZW50Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm9uKCdlcnJvcicsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlRXJyb3JlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IGNyZWF0ZVNvdXJjZShpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpbGVzID0ge307XHJcbiAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgVGlsZUNhY2hlKDAsIHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fdGltZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5fY2FjaGVUaW1lcnMgPSB7fTtcclxuICAgICAgICB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcyA9IHt9O1xyXG5cclxuICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXMgPSB7fTtcclxuICAgICAgICB0aGlzLl9zdGF0ZSA9IG5ldyBTb3VyY2VGZWF0dXJlU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZChtYXA6IE1hcCkge1xyXG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xyXG4gICAgICAgIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPSBtYXAgPyBtYXAuX21heFRpbGVDYWNoZVNpemUgOiBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uQWRkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5vbkFkZChtYXApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblJlbW92ZShtYXA6IE1hcCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uUmVtb3ZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5vblJlbW92ZShtYXApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiB0cnVlIGlmIG5vIHRpbGUgZGF0YSBpcyBwZW5kaW5nLCB0aWxlcyB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzXHJcbiAgICAgKiBhbiBhZGRpdGlvbmFsIEFQSSBjYWxsIGlzIHJlY2VpdmVkLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VFcnJvcmVkKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VMb2FkZWQpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2UubG9hZGVkKCkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgZm9yIChjb25zdCB0IGluIHRoaXMuX3RpbGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1t0XTtcclxuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnICYmIHRpbGUuc3RhdGUgIT09ICdlcnJvcmVkJylcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U291cmNlKCk6IFNvdXJjZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBwYXVzZSgpIHtcclxuICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3VtZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3BhdXNlZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHNob3VsZFJlbG9hZCA9IHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lO1xyXG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNob3VsZFJlbG9hZCkgdGhpcy5yZWxvYWQoKTtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0pIHRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtKTtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5sb2FkVGlsZSh0aWxlLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgX3VubG9hZFRpbGUodGlsZTogVGlsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS51bmxvYWRUaWxlKHRpbGUsICgpID0+IHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBfYWJvcnRUaWxlKHRpbGU6IFRpbGUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc291cmNlLmFib3J0VGlsZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5hYm9ydFRpbGUodGlsZSwgKCkgPT4ge30pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlcmlhbGl6ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLnNlcmlhbGl6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXBhcmUoY29udGV4dDogQ29udGV4dCkge1xyXG4gICAgICAgIGlmICAodGhpcy5fc291cmNlLnByZXBhcmUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlLnByZXBhcmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3N0YXRlLmNvYWxlc2NlQ2hhbmdlcyh0aGlzLl90aWxlcywgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMuX3RpbGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpXTtcclxuICAgICAgICAgICAgdGlsZS51cGxvYWQoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHRpbGUucHJlcGFyZSh0aGlzLm1hcC5zdHlsZS5pbWFnZU1hbmFnZXJGYWN0b3J5Ll9nZXRJbWFnZU1hbmFnZXIodGhpcy5pZCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhbGwgdGlsZSBpZHMgb3JkZXJlZCB3aXRoIHotb3JkZXIsIGFuZCBjYXN0IHRvIG51bWJlcnNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGdldElkcygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gKHZhbHVlcyh0aGlzLl90aWxlcyk6IGFueSkubWFwKCh0aWxlOiBUaWxlKSA9PiB0aWxlLnRpbGVJRCkuc29ydChjb21wYXJlVGlsZUlkKS5tYXAoaWQgPT4gaWQua2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZW5kZXJhYmxlSWRzKHN5bWJvbExheWVyPzogYm9vbGVhbik6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmFibGVzOiBBcnJheTxUaWxlPiA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSWRSZW5kZXJhYmxlKGlkLCBzeW1ib2xMYXllcikpIHJlbmRlcmFibGVzLnB1c2godGhpcy5fdGlsZXNbaWRdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN5bWJvbExheWVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJhYmxlcy5zb3J0KChhXzogVGlsZSwgYl86IFRpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBhXy50aWxlSUQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gYl8udGlsZUlEO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZEEgPSAobmV3IFBvaW50KGEuY2Fub25pY2FsLngsIGEuY2Fub25pY2FsLnkpKS5fcm90YXRlKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdGF0ZWRCID0gKG5ldyBQb2ludChiLmNhbm9uaWNhbC54LCBiLmNhbm9uaWNhbC55KSkuX3JvdGF0ZSh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5vdmVyc2NhbGVkWiAtIGIub3ZlcnNjYWxlZFogfHwgcm90YXRlZEIueSAtIHJvdGF0ZWRBLnkgfHwgcm90YXRlZEIueCAtIHJvdGF0ZWRBLng7XHJcbiAgICAgICAgICAgIH0pLm1hcCh0aWxlID0+IHRpbGUudGlsZUlELmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZW5kZXJhYmxlcy5tYXAodGlsZSA9PiB0aWxlLnRpbGVJRCkuc29ydChjb21wYXJlVGlsZUlkKS5tYXAoaWQgPT4gaWQua2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNSZW5kZXJhYmxlUGFyZW50KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudFRpbGUgPSB0aGlzLmZpbmRMb2FkZWRQYXJlbnQodGlsZUlELCAwKTtcclxuICAgICAgICBpZiAocGFyZW50VGlsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNJZFJlbmRlcmFibGUocGFyZW50VGlsZS50aWxlSUQua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0lkUmVuZGVyYWJsZShpZDogc3RyaW5nLCBzeW1ib2xMYXllcj86IGJvb2xlYW4pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbaWRdICYmIHRoaXMuX3RpbGVzW2lkXS5oYXNEYXRhKCkgJiZcclxuICAgICAgICAgICAgIXRoaXMuX2NvdmVyZWRUaWxlc1tpZF0gJiYgKHN5bWJvbExheWVyIHx8ICF0aGlzLl90aWxlc1tpZF0uaG9sZGluZ0ZvckZhZGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcy5fdGlsZXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbGVzW2ldLnN0YXRlICE9PSBcImVycm9yZWRcIikgdGhpcy5fcmVsb2FkVGlsZShpLCAncmVsb2FkaW5nJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9yZWxvYWRUaWxlKGlkOiBzdHJpbmcsIHN0YXRlOiBUaWxlU3RhdGUpIHtcclxuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xyXG5cclxuICAgICAgICAvLyB0aGlzIHBvdGVudGlhbGx5IGRvZXMgbm90IGFkZHJlc3MgYWxsIHVuZGVybHlpbmdcclxuICAgICAgICAvLyBpc3N1ZXMgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzQyNTJcclxuICAgICAgICAvLyAtIGhhcmQgdG8gdGVsbCB3aXRob3V0IHJlcHJvIHN0ZXBzXHJcbiAgICAgICAgaWYgKCF0aWxlKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gXCJsb2FkaW5nXCIgdGlsZXMgYW5kIFwicmVsb2FkaW5nXCIgb3IgXCJleHBpcmVkXCJcclxuICAgICAgICAvLyB0aWxlcyBpcyB0aGF0IFwicmVsb2FkaW5nXCIvXCJleHBpcmVkXCIgdGlsZXMgYXJlIFwicmVuZGVyYWJsZVwiLlxyXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgYSBcImxvYWRpbmdcIiB0aWxlIGNhbm5vdCBiZWNvbWUgYSBcInJlbG9hZGluZ1wiIHRpbGUgd2l0aG91dFxyXG4gICAgICAgIC8vIGZpcnN0IGJlY29taW5nIGEgXCJsb2FkZWRcIiB0aWxlLlxyXG4gICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGluZycpIHtcclxuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9IHN0YXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fbG9hZFRpbGUodGlsZSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIHRpbGUsIGlkLCBzdGF0ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF90aWxlTG9hZGVkKHRpbGU6IFRpbGUsIGlkOiBzdHJpbmcsIHByZXZpb3VzU3RhdGU6IFRpbGVTdGF0ZSwgZXJyOiA/RXJyb3IpIHtcclxuICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XHJcbiAgICAgICAgICAgIGlmICgoZXJyOiBhbnkpLnN0YXR1cyAhPT0gNDA0KSB0aGlzLl9zb3VyY2UuZmlyZShuZXcgRXJyb3JFdmVudChlcnIsIHt0aWxlfSkpO1xyXG4gICAgICAgICAgICAvLyBjb250aW51ZSB0byB0cnkgbG9hZGluZyBwYXJlbnQvY2hpbGRyZW4gdGlsZXMgaWYgYSB0aWxlIGRvZXNuJ3QgZXhpc3QgKDQwNClcclxuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRpbGUudGltZUFkZGVkID0gYnJvd3Nlci5ub3coKTtcclxuICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gJ2V4cGlyZWQnKSB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoaWQsIHRpbGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmdldFNvdXJjZSgpLnR5cGUgPT09ICdyYXN0ZXItZGVtJyAmJiB0aWxlLmRlbSkgdGhpcy5fYmFja2ZpbGxERU0odGlsZSk7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUuaW5pdGlhbGl6ZVRpbGVTdGF0ZSh0aWxlLCB0aGlzLm1hcCA/IHRoaXMubWFwLnBhaW50ZXIgOiBudWxsKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc291cmNlLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgdGlsZSwgY29vcmQ6IHRpbGUudGlsZUlEfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGb3IgcmFzdGVyIHRlcnJhaW4gc291cmNlLCBiYWNrZmlsbCBERU0gdG8gZWxpbWluYXRlIHZpc2libGUgdGlsZSBib3VuZGFyaWVzXHJcbiAgICAqIEBwcml2YXRlXHJcbiAgICAqL1xyXG4gICAgX2JhY2tmaWxsREVNKHRpbGU6IFRpbGUpIHtcclxuICAgICAgICBjb25zdCByZW5kZXJhYmxlcyA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyYWJsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYm9yZGVySWQgPSByZW5kZXJhYmxlc1tpXTtcclxuICAgICAgICAgICAgaWYgKHRpbGUubmVpZ2hib3JpbmdUaWxlcyAmJiB0aWxlLm5laWdoYm9yaW5nVGlsZXNbYm9yZGVySWRdKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJUaWxlID0gdGhpcy5nZXRUaWxlQnlJRChib3JkZXJJZCk7XHJcbiAgICAgICAgICAgICAgICBmaWxsQm9yZGVyKHRpbGUsIGJvcmRlclRpbGUpO1xyXG4gICAgICAgICAgICAgICAgZmlsbEJvcmRlcihib3JkZXJUaWxlLCB0aWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZmlsbEJvcmRlcih0aWxlLCBib3JkZXJUaWxlKSB7XHJcbiAgICAgICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGR4ID0gYm9yZGVyVGlsZS50aWxlSUQuY2Fub25pY2FsLnggLSB0aWxlLnRpbGVJRC5jYW5vbmljYWwueDtcclxuICAgICAgICAgICAgY29uc3QgZHkgPSBib3JkZXJUaWxlLnRpbGVJRC5jYW5vbmljYWwueSAtIHRpbGUudGlsZUlELmNhbm9uaWNhbC55O1xyXG4gICAgICAgICAgICBjb25zdCBkaW0gPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5jYW5vbmljYWwueik7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlcklkID0gYm9yZGVyVGlsZS50aWxlSUQua2V5O1xyXG4gICAgICAgICAgICBpZiAoZHggPT09IDAgJiYgZHkgPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA+IDEpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgZGVsdGEgY29vcmRpbmF0ZSBmb3Igd29ybGQgd3JhcGFyb3VuZC5cclxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeCArIGRpbSkgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBkeCArPSBkaW07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGR4IC0gZGltKSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGR4IC09IGRpbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWJvcmRlclRpbGUuZGVtIHx8ICF0aWxlLmRlbSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aWxlLmRlbS5iYWNrZmlsbEJvcmRlcihib3JkZXJUaWxlLmRlbSwgZHgsIGR5KTtcclxuICAgICAgICAgICAgaWYgKHRpbGUubmVpZ2hib3JpbmdUaWxlcyAmJiB0aWxlLm5laWdoYm9yaW5nVGlsZXNbYm9yZGVySWRdKVxyXG4gICAgICAgICAgICAgICAgdGlsZS5uZWlnaGJvcmluZ1RpbGVzW2JvcmRlcklkXS5iYWNrZmlsbGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCBhIHNwZWNpZmljIHRpbGUgYnkgVGlsZUlEXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBnZXRUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IFRpbGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRpbGVCeUlEKHRpbGVJRC5rZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGEgc3BlY2lmaWMgdGlsZSBieSBpZFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgZ2V0VGlsZUJ5SUQoaWQ6IHN0cmluZyk6IFRpbGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3IgYSBnaXZlbiBzZXQgb2YgdGlsZXMsIHJldGFpbiBjaGlsZHJlbiB0aGF0IGFyZSBsb2FkZWQgYW5kIGhhdmUgYSB6b29tXHJcbiAgICAgKiBiZXR3ZWVuIGB6b29tYCAoZXhjbHVzaXZlKSBhbmQgYG1heENvdmVyaW5nWm9vbWAgKGluY2x1c2l2ZSlcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9yZXRhaW5Mb2FkZWRDaGlsZHJlbihcclxuICAgICAgICBpZGVhbFRpbGVzOiB7W186IGFueV06IE92ZXJzY2FsZWRUaWxlSUR9LFxyXG4gICAgICAgIHpvb206IG51bWJlcixcclxuICAgICAgICBtYXhDb3ZlcmluZ1pvb206IG51bWJlcixcclxuICAgICAgICByZXRhaW46IHtbXzogYW55XTogT3ZlcnNjYWxlZFRpbGVJRH1cclxuICAgICkge1xyXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcclxuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XHJcblxyXG4gICAgICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIHJlbmRlcmFibGUgdGlsZXMgdXAgdG8gbWF4Q292ZXJpbmdab29tXHJcbiAgICAgICAgICAgIGlmIChyZXRhaW5baWRdIHx8XHJcbiAgICAgICAgICAgICAgICAhdGlsZS5oYXNEYXRhKCkgfHxcclxuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIDw9IHpvb20gfHxcclxuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaID4gbWF4Q292ZXJpbmdab29tXHJcbiAgICAgICAgICAgICkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggcGFyZW50cyBhbmQgcmV0YWluIHRoZSB0b3Btb3N0IGxvYWRlZCBvbmUgaWYgZm91bmRcclxuICAgICAgICAgICAgbGV0IHRvcG1vc3RMb2FkZWRJRCA9IHRpbGUudGlsZUlEO1xyXG4gICAgICAgICAgICB3aGlsZSAodGlsZSAmJiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiA+IHpvb20gKyAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJRCA9IHRpbGUudGlsZUlELnNjYWxlZFRvKHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3BhcmVudElELmtleV07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5oYXNEYXRhKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3Btb3N0TG9hZGVkSUQgPSBwYXJlbnRJRDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFuY2VzdG9ycyBvZiB0aGUgdG9wbW9zdCBsb2FkZWQgY2hpbGQgdG8gc2VlIGlmIHRoZXJlJ3Mgb25lIHRoYXQgbmVlZGVkIGl0XHJcbiAgICAgICAgICAgIGxldCB0aWxlSUQgPSB0b3Btb3N0TG9hZGVkSUQ7XHJcbiAgICAgICAgICAgIHdoaWxlICh0aWxlSUQub3ZlcnNjYWxlZFogPiB6b29tKSB7XHJcbiAgICAgICAgICAgICAgICB0aWxlSUQgPSB0aWxlSUQuc2NhbGVkVG8odGlsZUlELm92ZXJzY2FsZWRaIC0gMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlkZWFsVGlsZXNbdGlsZUlELmtleV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIHBhcmVudCB0aGF0IG5lZWRlZCBhIGxvYWRlZCBjaGlsZDsgcmV0YWluIHRoYXQgY2hpbGRcclxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bdG9wbW9zdExvYWRlZElELmtleV0gPSB0b3Btb3N0TG9hZGVkSUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIGEgbG9hZGVkIHBhcmVudCBvZiB0aGUgZ2l2ZW4gdGlsZSAodXAgdG8gbWluQ292ZXJpbmdab29tKVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgZmluZExvYWRlZFBhcmVudCh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIG1pbkNvdmVyaW5nWm9vbTogbnVtYmVyKTogP1RpbGUge1xyXG4gICAgICAgIGlmICh0aWxlSUQua2V5IGluIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW3RpbGVJRC5rZXldO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50aWxlSUQub3ZlcnNjYWxlZFogPj0gbWluQ292ZXJpbmdab29tKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGVJRC5vdmVyc2NhbGVkWiAtIDE7IHogPj0gbWluQ292ZXJpbmdab29tOyB6LS0pIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50VGlsZUlEID0gdGlsZUlELnNjYWxlZFRvKHopO1xyXG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fZ2V0TG9hZGVkVGlsZShwYXJlbnRUaWxlSUQpO1xyXG4gICAgICAgICAgICBpZiAodGlsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2dldExvYWRlZFRpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogP1RpbGUge1xyXG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1t0aWxlSUQua2V5XTtcclxuICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGlsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGlsZUNhY2hlIGlnbm9yZXMgd3JhcCBpbiBsb29rdXAuXHJcbiAgICAgICAgY29uc3QgY2FjaGVkVGlsZSA9IHRoaXMuX2NhY2hlLmdldEJ5S2V5KHRpbGVJRC53cmFwcGVkKCkua2V5KTtcclxuICAgICAgICByZXR1cm4gY2FjaGVkVGlsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlc2l6ZXMgdGhlIHRpbGUgY2FjaGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld3BvcnQncyBzaXplXHJcbiAgICAgKiBvciB0aGUgbWF4VGlsZUNhY2hlU2l6ZSBvcHRpb24gcGFzc2VkIGR1cmluZyBtYXAgY3JlYXRpb25cclxuICAgICAqXHJcbiAgICAgKiBMYXJnZXIgdmlld3BvcnRzIHVzZSBtb3JlIHRpbGVzIGFuZCBuZWVkIGxhcmdlciBjYWNoZXMuIExhcmdlciB2aWV3cG9ydHNcclxuICAgICAqIGFyZSBtb3JlIGxpa2VseSB0byBiZSBmb3VuZCBvbiBkZXZpY2VzIHdpdGggbW9yZSBtZW1vcnkgYW5kIG9uIHBhZ2VzIHdoZXJlXHJcbiAgICAgKiB0aGUgbWFwIGlzIG1vcmUgaW1wb3J0YW50LlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgdXBkYXRlQ2FjaGVTaXplKHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XHJcbiAgICAgICAgY29uc3Qgd2lkdGhJblRpbGVzID0gTWF0aC5jZWlsKHRyYW5zZm9ybS53aWR0aCAvIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSkgKyAxO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodEluVGlsZXMgPSBNYXRoLmNlaWwodHJhbnNmb3JtLmhlaWdodCAvIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSkgKyAxO1xyXG4gICAgICAgIGNvbnN0IGFwcHJveFRpbGVzSW5WaWV3ID0gd2lkdGhJblRpbGVzICogaGVpZ2h0SW5UaWxlcztcclxuICAgICAgICBjb25zdCBjb21tb25ab29tUmFuZ2UgPSA1O1xyXG5cclxuICAgICAgICBjb25zdCB2aWV3RGVwZW5kZW50TWF4U2l6ZSA9IE1hdGguZmxvb3IoYXBwcm94VGlsZXNJblZpZXcgKiBjb21tb25ab29tUmFuZ2UpO1xyXG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0eXBlb2YgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9PT0gJ251bWJlcicgPyBNYXRoLm1pbih0aGlzLl9tYXhUaWxlQ2FjaGVTaXplLCB2aWV3RGVwZW5kZW50TWF4U2l6ZSkgOiB2aWV3RGVwZW5kZW50TWF4U2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2FjaGUuc2V0TWF4U2l6ZShtYXhTaXplKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVXcmFwSnVtcChsbmc6IG51bWJlcikge1xyXG4gICAgICAgIC8vIE9uIHRvcCBvZiB0aGUgcmVndWxhciB6L3gveSB2YWx1ZXMsIFRpbGVJRHMgaGF2ZSBhIGB3cmFwYCB2YWx1ZSB0aGF0IHNwZWNpZnlcclxuICAgICAgICAvLyB3aGljaCBjcHB5IG9mIHRoZSB3b3JsZCB0aGUgdGlsZSBiZWxvbmdzIHRvLiBGb3IgZXhhbXBsZSwgYXQgYGxuZzogMTBgIHlvdVxyXG4gICAgICAgIC8vIG1pZ2h0IHJlbmRlciB6L3gveS8wIHdoaWxlIGF0IGBsbmc6IDM3MGAgeW91IHdvdWxkIHJlbmRlciB6L3gveS8xLlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gV2hlbiBsbmcgdmFsdWVzIGdldCB3cmFwcGVkIChnb2luZyBmcm9tIGBsbmc6IDM3MGAgdG8gYGxvbmc6IDEwYCkgeW91IGV4cGVjdFxyXG4gICAgICAgIC8vIHRvIHNlZSB0aGUgc2FtZSB0aGluZyBvbiB0aGUgc2NyZWVuICgzNzAgZGVncmVlcyBhbmQgMTAgZGVncmVlcyBpcyB0aGUgc2FtZVxyXG4gICAgICAgIC8vIHBsYWNlIGluIHRoZSB3b3JsZCkgYnV0IGFsbCB0aGUgVGlsZUlEcyB3aWxsIGhhdmUgZGlmZmVyZW50IHdyYXAgdmFsdWVzLlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gbWFrZSB0aGlzIHRyYW5zaXRpb24gc2VhbWxlc3MsIHdlIGNhbGN1bGF0ZSB0aGUgcm91bmRlZCBkaWZmZXJlbmNlIG9mXHJcbiAgICAgICAgLy8gXCJ3b3JsZHNcIiBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBmcmFtZS4gSWYgdGhlIG1hcCBwYW5uZWQgYnlcclxuICAgICAgICAvLyBhIHdvcmxkLCB0aGVuIHdlIGNhbiBhc3NpZ24gYWxsIHRoZSB0aWxlcyBuZXcgVGlsZUlEcyB3aXRoIHVwZGF0ZWQgd3JhcCB2YWx1ZXMuXHJcbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGFzc2lnbiB6L3gveS8xIGEgbmV3IGlkOiB6L3gveS8wLiBJdCBpcyB0aGUgc2FtZSB0aWxlLCBqdXN0IHJlbmRlcmVkXHJcbiAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgcG9zaXRpb24uXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcmV1c2UgdGhlIHRpbGVzIGF0IG1vcmUgaWRlYWwgbG9jYXRpb25zIGFuZCBwcmV2ZW50IGZsaWNrZXJpbmcuXHJcbiAgICAgICAgY29uc3QgcHJldkxuZyA9IHRoaXMuX3ByZXZMbmcgPT09IHVuZGVmaW5lZCA/IGxuZyA6IHRoaXMuX3ByZXZMbmc7XHJcbiAgICAgICAgY29uc3QgbG5nRGlmZmVyZW5jZSA9IGxuZyAtIHByZXZMbmc7XHJcbiAgICAgICAgY29uc3Qgd29ybGREaWZmZXJlbmNlID0gbG5nRGlmZmVyZW5jZSAvIDM2MDtcclxuICAgICAgICBjb25zdCB3cmFwRGVsdGEgPSBNYXRoLnJvdW5kKHdvcmxkRGlmZmVyZW5jZSk7XHJcbiAgICAgICAgdGhpcy5fcHJldkxuZyA9IGxuZztcclxuXHJcbiAgICAgICAgaWYgKHdyYXBEZWx0YSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aWxlczoge1tfOiBzdHJpbmddOiBUaWxlfSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl90aWxlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2tleV07XHJcbiAgICAgICAgICAgICAgICB0aWxlLnRpbGVJRCA9IHRpbGUudGlsZUlELnVud3JhcFRvKHRpbGUudGlsZUlELndyYXAgKyB3cmFwRGVsdGEpO1xyXG4gICAgICAgICAgICAgICAgdGlsZXNbdGlsZS50aWxlSUQua2V5XSA9IHRpbGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fdGlsZXMgPSB0aWxlcztcclxuXHJcbiAgICAgICAgICAgIC8vIFJlc2V0IHRpbGUgcmVsb2FkIHRpbWVyc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbWVycykge1xyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihpZCwgdGlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRpbGVzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHZpZXdwb3J0IGFuZCBhZGRzIG5ldyB0aWxlcyB0aGF0XHJcbiAgICAgKiBhcmUgaW5zaWRlIHRoZSB2aWV3cG9ydC5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZSh0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xyXG4gICAgICAgIGlmICghdGhpcy5fc291cmNlTG9hZGVkIHx8IHRoaXMuX3BhdXNlZCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZVNpemUodHJhbnNmb3JtKTtcclxuICAgICAgICB0aGlzLmhhbmRsZVdyYXBKdW1wKHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcpO1xyXG5cclxuICAgICAgICAvLyBDb3ZlcmVkIGlzIGEgbGlzdCBvZiByZXRhaW5lZCB0aWxlcyB3aG8ncyBhcmVhcyBhcmUgZnVsbHkgY292ZXJlZCBieSBvdGhlcixcclxuICAgICAgICAvLyBiZXR0ZXIsIHJldGFpbmVkIHRpbGVzLiBUaGV5IGFyZSBub3QgZHJhd24gc2VwYXJhdGVseS5cclxuICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXMgPSB7fTtcclxuXHJcbiAgICAgICAgbGV0IGlkZWFsVGlsZUlEcztcclxuICAgICAgICBpZiAoIXRoaXMudXNlZCkge1xyXG4gICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSBbXTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZS50aWxlSUQpIHtcclxuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gdHJhbnNmb3JtLmdldFZpc2libGVVbndyYXBwZWRDb29yZGluYXRlcyh0aGlzLl9zb3VyY2UudGlsZUlEKVxyXG4gICAgICAgICAgICAgICAgLm1hcCgodW53cmFwcGVkKSA9PiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh1bndyYXBwZWQuY2Fub25pY2FsLnosIHVud3JhcHBlZC53cmFwLCB1bndyYXBwZWQuY2Fub25pY2FsLnosIHVud3JhcHBlZC5jYW5vbmljYWwueCwgdW53cmFwcGVkLmNhbm9uaWNhbC55LCB0aGlzLmluZGV4RXh0ZW50KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gdHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe1xyXG4gICAgICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMuX3NvdXJjZS50aWxlU2l6ZSxcclxuICAgICAgICAgICAgICAgIG1pbnpvb206IHRoaXMuX3NvdXJjZS5taW56b29tLFxyXG4gICAgICAgICAgICAgICAgbWF4em9vbTogdGhpcy5fc291cmNlLm1heHpvb20sXHJcbiAgICAgICAgICAgICAgICByb3VuZFpvb206IHRoaXMuX3NvdXJjZS5yb3VuZFpvb20sXHJcbiAgICAgICAgICAgICAgICByZXBhcnNlT3ZlcnNjYWxlZDogdGhpcy5fc291cmNlLnJlcGFyc2VPdmVyc2NhbGVkXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5oYXNUaWxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSBpZGVhbFRpbGVJRHMuZmlsdGVyKChjb29yZCkgPT4gKHRoaXMuX3NvdXJjZS5oYXNUaWxlOiBhbnkpKGNvb3JkKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgb3Zlcnpvb21pbmcvdW5kZXJ6b29taW5nIGFtb3VudHMuXHJcbiAgICAgICAgY29uc3Qgem9vbSA9IHRyYW5zZm9ybS5jb3ZlcmluZ1pvb21MZXZlbCh0aGlzLl9zb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IG1pbkNvdmVyaW5nWm9vbSA9IE1hdGgubWF4KHpvb20gLSBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pO1xyXG4gICAgICAgIGNvbnN0IG1heENvdmVyaW5nWm9vbSA9IE1hdGgubWF4KHpvb20gKyBTb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcsICB0aGlzLl9zb3VyY2UubWluem9vbSk7XHJcblxyXG4gICAgICAgIC8vIFJldGFpbiBpcyBhIGxpc3Qgb2YgdGlsZXMgdGhhdCB3ZSBzaG91bGRuJ3QgZGVsZXRlLCBldmVuIGlmIHRoZXkgYXJlIG5vdFxyXG4gICAgICAgIC8vIHRoZSBtb3N0IGlkZWFsIHRpbGUgZm9yIHRoZSBjdXJyZW50IHZpZXdwb3J0LiBUaGlzIG1heSBpbmNsdWRlIHRpbGVzIGxpa2VcclxuICAgICAgICAvLyBwYXJlbnQgb3IgY2hpbGQgdGlsZXMgdGhhdCBhcmUgKmFscmVhZHkqIGxvYWRlZC5cclxuICAgICAgICBjb25zdCByZXRhaW4gPSB0aGlzLl91cGRhdGVSZXRhaW5lZFRpbGVzKGlkZWFsVGlsZUlEcywgem9vbSk7XHJcblxyXG4gICAgICAgIGlmIChpc1Jhc3RlclR5cGUodGhpcy5fc291cmNlLnR5cGUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudHNGb3JGYWRpbmc6IHtbXzogc3RyaW5nXTogT3ZlcnNjYWxlZFRpbGVJRH0gPSB7fTtcclxuICAgICAgICAgICAgY29uc3QgZmFkaW5nVGlsZXMgPSB7fTtcclxuICAgICAgICAgICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMocmV0YWluKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVJRCA9IHJldGFpbltpZF07XHJcbiAgICAgICAgICAgICAgICBhc3NlcnQodGlsZUlELmtleSA9PT0gaWQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgdGlsZS5mYWRlRW5kVGltZSAmJiB0aWxlLmZhZGVFbmRUaW1lIDw9IGJyb3dzZXIubm93KCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0aWxlIGlzIGxvYWRlZCBidXQgc3RpbGwgZmFkaW5nIGluLCBmaW5kIHBhcmVudHMgdG8gY3Jvc3MtZmFkZSB3aXRoIGl0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRUaWxlID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KHRpbGVJRCwgbWluQ292ZXJpbmdab29tKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkVGlsZShwYXJlbnRUaWxlLnRpbGVJRCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50c0ZvckZhZGluZ1twYXJlbnRUaWxlLnRpbGVJRC5rZXldID0gcGFyZW50VGlsZS50aWxlSUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZmFkaW5nVGlsZXNbaWRdID0gdGlsZUlEO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBmb3IgdGlsZXMgdGhhdCBhcmUgc3RpbGwgZmFkaW5nIGluLCBhbHNvIGZpbmQgY2hpbGRyZW4gdG8gY3Jvc3MtZmFkZSB3aXRoXHJcbiAgICAgICAgICAgIHRoaXMuX3JldGFpbkxvYWRlZENoaWxkcmVuKGZhZGluZ1RpbGVzLCB6b29tLCBtYXhDb3ZlcmluZ1pvb20sIHJldGFpbik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHBhcmVudHNGb3JGYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGlmICghcmV0YWluW2lkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgdGlsZSBpcyBvbmx5IG5lZWRlZCBmb3IgZmFkaW5nLCBtYXJrIGl0IGFzIGNvdmVyZWQgc28gdGhhdCBpdCBpc24ndCByZW5kZXJlZCBvbiBpdCdzIG93bi5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gcGFyZW50c0ZvckZhZGluZ1tpZF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcmV0YWluZWRJZCBpbiByZXRhaW4pIHtcclxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJldGFpbmVkIHRpbGVzIGFsd2F5cyBjbGVhciBhbnkgZXhpc3RpbmcgZmFkZSBob2xkc1xyXG4gICAgICAgICAgICAvLyBzbyB0aGF0IGlmIHRoZXkncmUgcmVtb3ZlZCBhZ2FpbiB0aGVpciBmYWRlIHRpbWVyIHN0YXJ0cyBmcmVzaC5cclxuICAgICAgICAgICAgdGhpcy5fdGlsZXNbcmV0YWluZWRJZF0uY2xlYXJGYWRlSG9sZCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0aWxlcyB3ZSBkb24ndCBuZWVkIGFueW1vcmUuXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlID0ga2V5c0RpZmZlcmVuY2UodGhpcy5fdGlsZXMsIHJldGFpbik7XHJcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgcmVtb3ZlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1t0aWxlSURdO1xyXG4gICAgICAgICAgICBpZiAodGlsZS5oYXNTeW1ib2xCdWNrZXRzICYmICF0aWxlLmhvbGRpbmdGb3JGYWRlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRpbGUuc2V0SG9sZER1cmF0aW9uKHRoaXMubWFwLl9mYWRlRHVyYXRpb24pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aWxlLmhhc1N5bWJvbEJ1Y2tldHMgfHwgdGlsZS5zeW1ib2xGYWRlRmluaXNoZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZSh0aWxlSUQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBjYWNoZSBvZiBsb2FkZWQgcGFyZW50c1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUxvYWRlZFBhcmVudFRpbGVDYWNoZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGlsZXNbaWRdLmhvbGRpbmdGb3JGYWRlKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVRpbGUoaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF91cGRhdGVSZXRhaW5lZFRpbGVzKGlkZWFsVGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIHpvb206IG51bWJlcik6IHtbXzogc3RyaW5nXTogT3ZlcnNjYWxlZFRpbGVJRH0ge1xyXG4gICAgICAgIGNvbnN0IHJldGFpbjoge1tfOiBzdHJpbmddOiBPdmVyc2NhbGVkVGlsZUlEfSA9IHt9O1xyXG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IHtbXzogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgY29uc3QgbWluQ292ZXJpbmdab29tID0gTWF0aC5tYXgoem9vbSAtIFNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSk7XHJcbiAgICAgICAgY29uc3QgbWF4Q292ZXJpbmdab29tID0gTWF0aC5tYXgoem9vbSArIFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZywgIHRoaXMuX3NvdXJjZS5taW56b29tKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWlzc2luZ1RpbGVzID0ge307XHJcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgaWRlYWxUaWxlSURzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl9hZGRUaWxlKHRpbGVJRCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZXRhaW4gdGhlIHRpbGUgZXZlbiBpZiBpdCdzIG5vdCBsb2FkZWQgYmVjYXVzZSBpdCdzIGFuIGlkZWFsIHRpbGUuXHJcbiAgICAgICAgICAgIHJldGFpblt0aWxlSUQua2V5XSA9IHRpbGVJRDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoem9vbSA8IHRoaXMuX3NvdXJjZS5tYXh6b29tKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBzYXZlIG1pc3NpbmcgdGlsZXMgdGhhdCBwb3RlbnRpYWxseSBoYXZlIGxvYWRlZCBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgbWlzc2luZ1RpbGVzW3RpbGVJRC5rZXldID0gdGlsZUlEO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXRhaW4gYW55IGxvYWRlZCBjaGlsZHJlbiBvZiBpZGVhbCB0aWxlcyB1cCB0byBtYXhDb3ZlcmluZ1pvb21cclxuICAgICAgICB0aGlzLl9yZXRhaW5Mb2FkZWRDaGlsZHJlbihtaXNzaW5nVGlsZXMsIHpvb20sIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgaWRlYWxUaWxlSURzKSB7XHJcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XHJcblxyXG4gICAgICAgICAgICBpZiAodGlsZS5oYXNEYXRhKCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gVGhlIHRpbGUgd2UgcmVxdWlyZSBpcyBub3QgeWV0IGxvYWRlZCBvciBkb2VzIG5vdCBleGlzdDtcclxuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmaW5kIGNoaWxkcmVuIHRoYXQgZnVsbHkgY292ZXIgaXQuXHJcblxyXG4gICAgICAgICAgICBpZiAoem9vbSArIDEgPiB0aGlzLl9zb3VyY2UubWF4em9vbSkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2UncmUgbG9va2luZyBmb3IgYW4gb3Zlcnpvb21lZCBjaGlsZCB0aWxlLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDb29yZCA9IHRpbGVJRC5jaGlsZHJlbih0aGlzLl9zb3VyY2UubWF4em9vbSlbMF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFRpbGUgPSB0aGlzLmdldFRpbGUoY2hpbGRDb29yZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFjaGlsZFRpbGUgJiYgY2hpbGRUaWxlLmhhc0RhdGEoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltjaGlsZENvb3JkLmtleV0gPSBjaGlsZENvb3JkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB0aWxlIGlzIGNvdmVyZWQgYnkgb3Zlcnpvb21lZCBjaGlsZFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYWxsIDQgaW1tZWRpYXRlIGNoaWxkcmVuIGFyZSBsb2FkZWQgKGkuZS4gdGhlIG1pc3NpbmcgaWRlYWwgdGlsZSBpcyBjb3ZlcmVkKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aWxlSUQuY2hpbGRyZW4odGhpcy5fc291cmNlLm1heHpvb20pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXRhaW5bY2hpbGRyZW5bMF0ua2V5XSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltjaGlsZHJlblsxXS5rZXldICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2NoaWxkcmVuWzJdLmtleV0gJiZcclxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRyZW5bM10ua2V5XSkgY29udGludWU7IC8vIHRpbGUgaXMgY292ZXJlZCBieSBjaGlsZHJlblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBXZSBjb3VsZG4ndCBmaW5kIGNoaWxkIHRpbGVzIHRoYXQgZW50aXJlbHkgY292ZXIgdGhlIGlkZWFsIHRpbGU7IGxvb2sgZm9yIHBhcmVudHMgbm93LlxyXG5cclxuICAgICAgICAgICAgLy8gQXMgd2UgYXNjZW5kIHVwIHRoZSB0aWxlIHB5cmFtaWQgb2YgdGhlIGlkZWFsIHRpbGUsIHdlIGNoZWNrIHdoZXRoZXIgdGhlIHBhcmVudFxyXG4gICAgICAgICAgICAvLyB0aWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVxdWVzdGVkIChhbmQgZXJyb3JlZCBiZWNhdXNlIHdlIG9ubHkgbG9vcCBvdmVyIHRpbGVzIHdpdGggbm8gZGF0YSlcclxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcmVxdWVzdCBpdHMgcGFyZW50LlxyXG4gICAgICAgICAgICBsZXQgcGFyZW50V2FzUmVxdWVzdGVkID0gdGlsZS53YXNSZXF1ZXN0ZWQoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IG92ZXJzY2FsZWRaID0gdGlsZUlELm92ZXJzY2FsZWRaIC0gMTsgb3ZlcnNjYWxlZFogPj0gbWluQ292ZXJpbmdab29tOyAtLW92ZXJzY2FsZWRaKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRpbGVJRC5zY2FsZWRUbyhvdmVyc2NhbGVkWik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQnJlYWsgcGFyZW50IHRpbGUgYXNjZW50IGlmIHRoaXMgcm91dGUgaGFzIGJlZW4gcHJldmlvdXNseSBjaGVja2VkIGJ5IGFub3RoZXIgY2hpbGQuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFtwYXJlbnRJZC5rZXldKSBicmVhaztcclxuICAgICAgICAgICAgICAgIGNoZWNrZWRbcGFyZW50SWQua2V5XSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuZ2V0VGlsZShwYXJlbnRJZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgJiYgcGFyZW50V2FzUmVxdWVzdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuX2FkZFRpbGUocGFyZW50SWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bcGFyZW50SWQua2V5XSA9IHBhcmVudElkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgdmFsdWVzLCBzaW5jZSB0aGV5J3JlIHRoZSBwYXJlbnQgb2YgdGhlIG5leHQgaXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBhcmVudCB0aWxlIGFzY2VudCBsb29wLlxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFdhc1JlcXVlc3RlZCA9IHRpbGUud2FzUmVxdWVzdGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpKSBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJldGFpbjtcclxuICAgIH1cclxuXHJcbiAgICBfdXBkYXRlTG9hZGVkUGFyZW50VGlsZUNhY2hlKCkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzID0ge307XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgdGlsZUtleSBpbiB0aGlzLl90aWxlcykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gW107XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRUaWxlOiA/VGlsZTtcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRJZCA9IHRoaXMuX3RpbGVzW3RpbGVLZXldLnRpbGVJRDtcclxuXHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3QgbG9hZGVkIGFuY2VzdG9yIGJ5IHRyYXZlcnNpbmcgdGhlIHRpbGUgdHJlZSB0b3dhcmRzIHRoZSByb290IGFuZFxyXG4gICAgICAgICAgICAvLyBjYWNoaW5nIHJlc3VsdHMgYWxvbmcgdGhlIHdheVxyXG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudElkLm92ZXJzY2FsZWRaID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0IGZyb20gcHJldmlvdXMgdHJhdmVyc2Fscz9cclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SWQua2V5IGluIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50VGlsZSA9IHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW2N1cnJlbnRJZC5rZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChjdXJyZW50SWQua2V5KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJcyB0aGUgcGFyZW50IGxvYWRlZD9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gY3VycmVudElkLnNjYWxlZFRvKGN1cnJlbnRJZC5vdmVyc2NhbGVkWiAtIDEpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50VGlsZSA9IHRoaXMuX2dldExvYWRlZFRpbGUocGFyZW50SWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50SWQgPSBwYXJlbnRJZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCBvZiB0aGlzIHRyYXZlcnNhbCB0byBhbGwgbmV3bHkgdmlzaXRlZCB0aWxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXRoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlc1trZXldID0gcGFyZW50VGlsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIHRpbGUsIGdpdmVuIGl0cyBjb29yZGluYXRlLCB0byB0aGUgcHlyYW1pZC5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9hZGRUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IFRpbGUge1xyXG4gICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XHJcbiAgICAgICAgaWYgKHRpbGUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aWxlO1xyXG5cclxuICAgICAgICB0aWxlID0gdGhpcy5fY2FjaGUuZ2V0QW5kUmVtb3ZlKHRpbGVJRCk7XHJcbiAgICAgICAgaWYgKHRpbGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKHRpbGVJRC5rZXksIHRpbGUpO1xyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHRpbGVJRCBiZWNhdXNlIHRoZSBjYWNoZWQgdGlsZSBjb3VsZCBoYXZlIGhhZCBhIGRpZmZlcmVudCB3cmFwIHZhbHVlXHJcbiAgICAgICAgICAgIHRpbGUudGlsZUlEID0gdGlsZUlEO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZS5pbml0aWFsaXplVGlsZVN0YXRlKHRpbGUsIHRoaXMubWFwID8gdGhpcy5tYXAucGFpbnRlciA6IG51bGwpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVUaW1lcnNbdGlsZUlELmtleV0pIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jYWNoZVRpbWVyc1t0aWxlSUQua2V5XSk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FjaGVUaW1lcnNbdGlsZUlELmtleV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIodGlsZUlELmtleSwgdGlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IEJvb2xlYW4odGlsZSk7XHJcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgICAgICAgdGlsZSA9IG5ldyBUaWxlKHRpbGVJRCwgdGhpcy5fc291cmNlLnRpbGVTaXplICogdGlsZUlELm92ZXJzY2FsZUZhY3RvcigpKTtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZFRpbGUodGlsZSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIHRpbGUsIHRpbGVJRC5rZXksIHRpbGUuc3RhdGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBzaWxlbmNlIGZsb3cuXHJcbiAgICAgICAgaWYgKCF0aWxlKSByZXR1cm4gKG51bGw6IGFueSk7XHJcblxyXG4gICAgICAgIHRpbGUudXNlcysrO1xyXG4gICAgICAgIHRoaXMuX3RpbGVzW3RpbGVJRC5rZXldID0gdGlsZTtcclxuICAgICAgICBpZiAoIWNhY2hlZCkgdGhpcy5fc291cmNlLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHt0aWxlLCBjb29yZDogdGlsZS50aWxlSUQsIGRhdGFUeXBlOiAnc291cmNlJ30pKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRpbGU7XHJcbiAgICB9XHJcblxyXG4gICAgX3NldFRpbGVSZWxvYWRUaW1lcihpZDogc3RyaW5nLCB0aWxlOiBUaWxlKSB7XHJcbiAgICAgICAgaWYgKGlkIGluIHRoaXMuX3RpbWVycykge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW2lkXSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXhwaXJ5VGltZW91dCA9IHRpbGUuZ2V0RXhwaXJ5VGltZW91dCgpO1xyXG4gICAgICAgIGlmIChleHBpcnlUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyc1tpZF0gPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFRpbGUoaWQsICdleHBpcmVkJyk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGltZXJzW2lkXTtcclxuICAgICAgICAgICAgfSwgZXhwaXJ5VGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGEgdGlsZSwgZ2l2ZW4gaXRzIGlkLCBmcm9tIHRoZSBweXJhbWlkXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfcmVtb3ZlVGlsZShpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcclxuICAgICAgICBpZiAoIXRpbGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGlsZS51c2VzLS07XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuX3RpbGVzW2lkXTtcclxuICAgICAgICBpZiAodGhpcy5fdGltZXJzW2lkXSkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW2lkXSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbGUudXNlcyA+IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpICYmIHRpbGUuc3RhdGUgIT09ICdyZWxvYWRpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlLmFkZCh0aWxlLnRpbGVJRCwgdGlsZSwgdGlsZS5nZXRFeHBpcnlUaW1lb3V0KCkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRpbGUuYWJvcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2Fib3J0VGlsZSh0aWxlKTtcclxuICAgICAgICAgICAgdGhpcy5fdW5sb2FkVGlsZSh0aWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYWxsIHRpbGVzIGZyb20gdGhpcyBweXJhbWlkXHJcbiAgICAgKi9cclxuICAgIGNsZWFyVGlsZXMoKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcylcclxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZShpZCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NhY2hlLnJlc2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWFyY2ggdGhyb3VnaCBvdXIgY3VycmVudCB0aWxlcyBhbmQgYXR0ZW1wdCB0byBmaW5kIHRoZSB0aWxlcyB0aGF0XHJcbiAgICAgKiBjb3ZlciB0aGUgZ2l2ZW4gYm91bmRzLlxyXG4gICAgICogQHBhcmFtIHBvaW50UXVlcnlHZW9tZXRyeSBjb29yZGluYXRlcyBvZiB0aGUgY29ybmVycyBvZiBib3VuZGluZyByZWN0YW5nbGVcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSByZXN1bHQgaXRlbXMgaGF2ZSB7dGlsZSwgbWluWCwgbWF4WCwgbWluWSwgbWF4WX0sIHdoZXJlIG1pbi9tYXggYm91bmRpbmcgdmFsdWVzIGFyZSB0aGUgZ2l2ZW4gYm91bmRzIHRyYW5zZm9ybWVkIGluIGludG8gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhpcyB0aWxlLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgdGlsZXNJbihwb2ludFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PiwgbWF4UGl0Y2hTY2FsZUZhY3RvcjogbnVtYmVyLCBoYXMzRExheWVyOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpbGVSZXN1bHRzID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtO1xyXG4gICAgICAgIGlmICghdHJhbnNmb3JtKSByZXR1cm4gdGlsZVJlc3VsdHM7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbWVyYVBvaW50UXVlcnlHZW9tZXRyeSA9IGhhczNETGF5ZXIgP1xyXG4gICAgICAgICAgICB0cmFuc2Zvcm0uZ2V0Q2FtZXJhUXVlcnlHZW9tZXRyeShwb2ludFF1ZXJ5R2VvbWV0cnkpIDpcclxuICAgICAgICAgICAgcG9pbnRRdWVyeUdlb21ldHJ5O1xyXG5cclxuICAgICAgICBjb25zdCBxdWVyeUdlb21ldHJ5ID0gcG9pbnRRdWVyeUdlb21ldHJ5Lm1hcCgocCkgPT4gdHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZShwKSk7XHJcbiAgICAgICAgY29uc3QgY2FtZXJhUXVlcnlHZW9tZXRyeSA9IGNhbWVyYVBvaW50UXVlcnlHZW9tZXRyeS5tYXAoKHApID0+IHRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUocCkpO1xyXG5cclxuICAgICAgICBjb25zdCBpZHMgPSB0aGlzLmdldElkcygpO1xyXG5cclxuICAgICAgICBsZXQgbWluWCA9IEluZmluaXR5O1xyXG4gICAgICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XHJcbiAgICAgICAgbGV0IG1heFggPSAtSW5maW5pdHk7XHJcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBjYW1lcmFRdWVyeUdlb21ldHJ5KSB7XHJcbiAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBwLngpO1xyXG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcC55KTtcclxuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHAueCk7XHJcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBwLnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkc1tpXV07XHJcbiAgICAgICAgICAgIGlmICh0aWxlLmhvbGRpbmdGb3JGYWRlKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRpbGVzIGhlbGQgZm9yIGZhZGluZyBhcmUgY292ZXJlZCBieSB0aWxlcyB0aGF0IGFyZSBjbG9zZXIgdG8gaWRlYWxcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGVJRCA9IHRpbGUudGlsZUlEO1xyXG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHRyYW5zZm9ybS56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xyXG4gICAgICAgICAgICBjb25zdCBxdWVyeVBhZGRpbmcgPSBtYXhQaXRjaFNjYWxlRmFjdG9yICogdGlsZS5xdWVyeVBhZGRpbmcgKiBFWFRFTlQgLyB0aWxlLnRpbGVTaXplIC8gc2NhbGU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0aWxlU3BhY2VCb3VuZHMgPSBbXHJcbiAgICAgICAgICAgICAgICB0aWxlSUQuZ2V0VGlsZVBvaW50KG5ldyBNZXJjYXRvckNvb3JkaW5hdGUobWluWCwgbWluWSkpLFxyXG4gICAgICAgICAgICAgICAgdGlsZUlELmdldFRpbGVQb2ludChuZXcgTWVyY2F0b3JDb29yZGluYXRlKG1heFgsIG1heFkpKVxyXG4gICAgICAgICAgICBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRpbGVTcGFjZUJvdW5kc1swXS54IC0gcXVlcnlQYWRkaW5nIDwgRVhURU5UICYmIHRpbGVTcGFjZUJvdW5kc1swXS55IC0gcXVlcnlQYWRkaW5nIDwgRVhURU5UICYmXHJcbiAgICAgICAgICAgICAgICB0aWxlU3BhY2VCb3VuZHNbMV0ueCArIHF1ZXJ5UGFkZGluZyA+PSAwICYmIHRpbGVTcGFjZUJvdW5kc1sxXS55ICsgcXVlcnlQYWRkaW5nID49IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlU3BhY2VRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4gPSBxdWVyeUdlb21ldHJ5Lm1hcCgoYykgPT4gdGlsZUlELmdldFRpbGVQb2ludChjKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlU3BhY2VDYW1lcmFRdWVyeUdlb21ldHJ5ID0gY2FtZXJhUXVlcnlHZW9tZXRyeS5tYXAoKGMpID0+IHRpbGVJRC5nZXRUaWxlUG9pbnQoYykpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRpbGVSZXN1bHRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgdGlsZUlELFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IHRpbGVTcGFjZVF1ZXJ5R2VvbWV0cnksXHJcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhUXVlcnlHZW9tZXRyeTogdGlsZVNwYWNlQ2FtZXJhUXVlcnlHZW9tZXRyeSxcclxuICAgICAgICAgICAgICAgICAgICBzY2FsZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aWxlUmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICBnZXRWaXNpYmxlQ29vcmRpbmF0ZXMoc3ltYm9sTGF5ZXI/OiBib29sZWFuKTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4ge1xyXG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcyhzeW1ib2xMYXllcikubWFwKChpZCkgPT4gdGhpcy5fdGlsZXNbaWRdLnRpbGVJRCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcclxuICAgICAgICAgICAgY29vcmQucG9zTWF0cml4ID0gdGhpcy50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KGNvb3JkLnRvVW53cmFwcGVkKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29vcmRzO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc1RyYW5zaXRpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5oYXNUcmFuc2l0aW9uKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNSYXN0ZXJUeXBlKHRoaXMuX3NvdXJjZS50eXBlKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpbGUuZmFkZUVuZFRpbWUgIT09IHVuZGVmaW5lZCAmJiB0aWxlLmZhZGVFbmRUaW1lID49IGJyb3dzZXIubm93KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIgc3RhdGUgZm9yIGEgZmVhdHVyZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgc2V0RmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyPzogc3RyaW5nLCBmZWF0dXJlSWQ6IG51bWJlciB8IHN0cmluZywgc3RhdGU6IE9iamVjdCkge1xyXG4gICAgICAgIHNvdXJjZUxheWVyID0gc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcclxuICAgICAgICB0aGlzLl9zdGF0ZS51cGRhdGVTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZUlkLCBzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzdGF0ZSBrZXkgZm9yIGEgZmVhdHVyZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlRmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyPzogc3RyaW5nLCBmZWF0dXJlSWQ/OiBudW1iZXIgfCBzdHJpbmcsIGtleT86IHN0cmluZykge1xyXG4gICAgICAgIHNvdXJjZUxheWVyID0gc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcclxuICAgICAgICB0aGlzLl9zdGF0ZS5yZW1vdmVGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXIsIGZlYXR1cmVJZCwga2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZW50aXJlIHN0YXRlIG9iamVjdCBmb3IgYSBmZWF0dXJlXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBnZXRGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI/OiBzdHJpbmcsIGZlYXR1cmVJZDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgc291cmNlTGF5ZXIgPSBzb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZS5nZXRTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZUlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNldCBvZiBrZXlzIHRoYXQgdGhlIHRpbGUgZGVwZW5kcyBvbi4gVGhpcyBhbGxvd3MgdGlsZXMgdG9cclxuICAgICAqIGJlIHJlbG9hZGVkIHdoZW4gdGhlaXIgZGVwZW5kZW5jaWVzIGNoYW5nZS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHNldERlcGVuZGVuY2llcyh0aWxlS2V5OiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBkZXBlbmRlbmNpZXM6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUtleV07XHJcbiAgICAgICAgaWYgKHRpbGUpIHtcclxuICAgICAgICAgICAgdGlsZS5zZXREZXBlbmRlbmNpZXMobmFtZXNwYWNlLCBkZXBlbmRlbmNpZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbG9hZHMgYWxsIHRpbGVzIHRoYXQgZGVwZW5kIG9uIHRoZSBnaXZlbiBrZXlzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcmVsb2FkVGlsZXNGb3JEZXBlbmRlbmNpZXMobmFtZXNwYWNlczogQXJyYXk8c3RyaW5nPiwga2V5czogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcclxuICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGVwZW5kZW5jeShuYW1lc3BhY2VzLCBrZXlzKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkVGlsZShpZCwgJ3JlbG9hZGluZycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NhY2hlLmZpbHRlcih0aWxlID0+ICF0aWxlLmhhc0RlcGVuZGVuY3kobmFtZXNwYWNlcywga2V5cykpO1xyXG4gICAgfVxyXG59XHJcblxyXG5Tb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZyA9IDEwO1xyXG5Tb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcgPSAzO1xyXG5cclxuZnVuY3Rpb24gY29tcGFyZVRpbGVJZChhOiBPdmVyc2NhbGVkVGlsZUlELCBiOiBPdmVyc2NhbGVkVGlsZUlEKTogbnVtYmVyIHtcclxuICAgIC8vIERpZmZlcmVudCBjb3BpZXMgb2YgdGhlIHdvcmxkIGFyZSBzb3J0ZWQgYmFzZWQgb24gdGhlaXIgZGlzdGFuY2UgdG8gdGhlIGNlbnRlci5cclxuICAgIC8vIFdyYXAgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gdW5zaWduZWQgZGlzdGFuY2VzIGJ5IHJlc2VydmluZyBvZGQgbnVtYmVyIGZvciBjb3BpZXNcclxuICAgIC8vIHdpdGggbmVnYXRpdmUgd3JhcCBhbmQgZXZlbiBudW1iZXJzIGZvciBjb3BpZXMgd2l0aCBwb3NpdGl2ZSB3cmFwLlxyXG4gICAgY29uc3QgYVdyYXAgPSBNYXRoLmFicyhhLndyYXAgKiAyKSAtICsoYS53cmFwIDwgMCk7XHJcbiAgICBjb25zdCBiV3JhcCA9IE1hdGguYWJzKGIud3JhcCAqIDIpIC0gKyhiLndyYXAgPCAwKTtcclxuICAgIHJldHVybiBhLm92ZXJzY2FsZWRaIC0gYi5vdmVyc2NhbGVkWiB8fCBiV3JhcCAtIGFXcmFwIHx8IGIuY2Fub25pY2FsLnkgLSBhLmNhbm9uaWNhbC55IHx8IGIuY2Fub25pY2FsLnggLSBhLmNhbm9uaWNhbC54O1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1Jhc3RlclR5cGUodHlwZSkge1xyXG4gICAgcmV0dXJuIHR5cGUgPT09ICdyYXN0ZXInIHx8IHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3ZpZGVvJztcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU291cmNlQ2FjaGU7XHJcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vd2luZG93JztcbmltcG9ydCBtYXBib3hnbCBmcm9tICcuLi8uLi8nO1xuXG5pbXBvcnQgdHlwZSB7V29ya2VySW50ZXJmYWNlfSBmcm9tICcuLi93ZWJfd29ya2VyJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCk6IFdvcmtlckludGVyZmFjZSB7XG4gICAgcmV0dXJuIChuZXcgd2luZG93LldvcmtlcihtYXBib3hnbC53b3JrZXJVcmwpOiBhbnkpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFdlYldvcmtlciBmcm9tICcuL3dlYl93b3JrZXInO1xuaW1wb3J0IHR5cGUge1dvcmtlckludGVyZmFjZX0gZnJvbSAnLi93ZWJfd29ya2VyJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4vYnJvd3Nlcic7XG5cbmV4cG9ydCBjb25zdCBQUkVMT0FEX1BPT0xfSUQgPSAnbWFwYm94Z2xfcHJlbG9hZGVkX3dvcmtlcl9wb29sJztcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgd29ya2VyIHBvb2wuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb3JrZXJQb29sIHtcbiAgICBzdGF0aWMgd29ya2VyQ291bnQ6IG51bWJlcjtcblxuICAgIGFjdGl2ZToge1tfOiBudW1iZXIgfCBzdHJpbmddOiBib29sZWFufTtcbiAgICB3b3JrZXJzOiBBcnJheTxXb3JrZXJJbnRlcmZhY2U+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0ge307XG4gICAgfVxuXG4gICAgYWNxdWlyZShtYXBJZDogbnVtYmVyIHwgc3RyaW5nKTogQXJyYXk8V29ya2VySW50ZXJmYWNlPiB7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICAvLyBMYXppbHkgbG9vayB1cCB0aGUgdmFsdWUgb2YgbWFwYm94Z2wud29ya2VyQ291bnQgc28gdGhhdFxuICAgICAgICAgICAgLy8gY2xpZW50IGNvZGUgaGFzIGhhZCBhIGNoYW5jZSB0byBzZXQgaXQuXG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLndvcmtlcnMubGVuZ3RoIDwgV29ya2VyUG9vbC53b3JrZXJDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMud29ya2Vycy5wdXNoKG5ldyBXZWJXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZVttYXBJZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgcmVsZWFzZShtYXBJZDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVttYXBJZF07XG4gICAgICAgIGlmICh0aGlzLm51bUFjdGl2ZSgpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgICAgICAgICAgIHcudGVybWluYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IChudWxsOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNQcmVsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWN0aXZlW1BSRUxPQURfUE9PTF9JRF07XG4gICAgfVxuXG4gICAgbnVtQWN0aXZlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZSkubGVuZ3RoO1xuICAgIH1cbn1cblxuY29uc3QgYXZhaWxhYmxlTG9naWNhbFByb2Nlc3NvcnMgPSBNYXRoLmZsb29yKGJyb3dzZXIuaGFyZHdhcmVDb25jdXJyZW5jeSAvIDIpO1xuV29ya2VyUG9vbC53b3JrZXJDb3VudCA9IE1hdGgubWF4KE1hdGgubWluKGF2YWlsYWJsZUxvZ2ljYWxQcm9jZXNzb3JzLCA2KSwgMSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgV29ya2VyUG9vbCwge1BSRUxPQURfUE9PTF9JRH0gZnJvbSAnLi93b3JrZXJfcG9vbCc7XG5cbmxldCBnbG9iYWxXb3JrZXJQb29sO1xuXG4vKipcbiAqIENyZWF0ZXMgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybnMgdGhlIHNpbmdsZSwgZ2xvYmFsIFdvcmtlclBvb2wgaW5zdGFuY2VcbiAqIHRvIGJlIHNoYXJlZCBhY3Jvc3MgZWFjaCBNYXBcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEdsb2JhbFdvcmtlclBvb2wgKCkge1xuICAgIGlmICghZ2xvYmFsV29ya2VyUG9vbCkge1xuICAgICAgICBnbG9iYWxXb3JrZXJQb29sID0gbmV3IFdvcmtlclBvb2woKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbFdvcmtlclBvb2w7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV3YXJtKCkge1xuICAgIGNvbnN0IHdvcmtlclBvb2wgPSBnZXRHbG9iYWxXb3JrZXJQb29sKCk7XG4gICAgd29ya2VyUG9vbC5hY3F1aXJlKFBSRUxPQURfUE9PTF9JRCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclByZXdhcm1lZFJlc291cmNlcygpIHtcbiAgICBjb25zdCBwb29sID0gZ2xvYmFsV29ya2VyUG9vbDtcbiAgICBpZiAocG9vbCkge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHBvb2wgb25seSBpZiBhbGwgbWFwcyB0aGF0IHJlZmVyZW5jZWQgdGhlIHByZWxvYWRlZCBnbG9iYWwgd29ya2VyIHBvb2wgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gICAgICAgIGlmIChwb29sLmlzUHJlbG9hZGVkKCkgJiYgcG9vbC5udW1BY3RpdmUoKSA9PT0gMSkge1xuICAgICAgICAgICAgcG9vbC5yZWxlYXNlKFBSRUxPQURfUE9PTF9JRCk7XG4gICAgICAgICAgICBnbG9iYWxXb3JrZXJQb29sID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGNsZWFyIFdlYldvcmtlcnMgc2luY2UgdGhlcmUgYXJlIGFjdGl2ZSBNYXAgaW5zdGFuY2VzIHRoYXQgc3RpbGwgcmVmZXJlbmNlIGl0LiBUaGUgcHJlLXdhcm1lZCBXZWJXb3JrZXIgcG9vbCBjYW4gb25seSBiZSBjbGVhcmVkIHdoZW4gYWxsIG1hcCBpbnN0YW5jZXMgaGF2ZSBiZWVuIHJlbW92ZWQgd2l0aCBtYXAucmVtb3ZlKCknKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIlxuaW1wb3J0IHJlZlByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3JlZl9wcm9wZXJ0aWVzJztcblxuZnVuY3Rpb24gZGVyZWYobGF5ZXIsIHBhcmVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIGxheWVyKSB7XG4gICAgICAgIGlmIChrICE9PSAncmVmJykge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gbGF5ZXJba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZQcm9wZXJ0aWVzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgaWYgKGsgaW4gcGFyZW50KSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBwYXJlbnRba107XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlcmVmTGF5ZXJzO1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgc29tZSBvZiB3aGljaCBtYXkgY29udGFpbiBgcmVmYCBwcm9wZXJ0aWVzXG4gKiB3aG9zZSB2YWx1ZSBpcyB0aGUgYGlkYCBvZiBhbm90aGVyIHByb3BlcnR5LCByZXR1cm4gYSBuZXcgYXJyYXkgd2hlcmVcbiAqIHN1Y2ggbGF5ZXJzIGhhdmUgYmVlbiBhdWdtZW50ZWQgd2l0aCB0aGUgJ3R5cGUnLCAnc291cmNlJywgZXRjLiBwcm9wZXJ0aWVzXG4gKiBmcm9tIHRoZSBwYXJlbnQgbGF5ZXIsIGFuZCB0aGUgYHJlZmAgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcG9ydGlvbnNcbiAqIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHJldHVybnMge0FycmF5PExheWVyPn1cbiAqL1xuZnVuY3Rpb24gZGVyZWZMYXllcnMobGF5ZXJzKSB7XG4gICAgbGF5ZXJzID0gbGF5ZXJzLnNsaWNlKCk7XG5cbiAgICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcFtsYXllcnNbaV0uaWRdID0gbGF5ZXJzW2ldO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgncmVmJyBpbiBsYXllcnNbaV0pIHtcbiAgICAgICAgICAgIGxheWVyc1tpXSA9IGRlcmVmKGxheWVyc1tpXSwgbWFwW2xheWVyc1tpXS5yZWZdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG59XG4iLCJpbXBvcnQgbGF0ZXN0IGZyb20gJy4vcmVmZXJlbmNlL2xhdGVzdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVtcHR5U3R5bGUoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSB7fTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBsYXRlc3RbJyR2ZXJzaW9uJ107XG4gICAgZm9yIChjb25zdCBzdHlsZUtleSBpbiBsYXRlc3RbJyRyb290J10pIHtcbiAgICAgICAgY29uc3Qgc3BlYyA9IGxhdGVzdFsnJHJvb3QnXVtzdHlsZUtleV07XG5cbiAgICAgICAgaWYgKHNwZWMucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoc3R5bGVLZXkgPT09ICd2ZXJzaW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmVyc2lvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN0eWxlW3N0eWxlS2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlO1xufVxuIiwiXG5pbXBvcnQgaXNFcXVhbCBmcm9tICcuL3V0aWwvZGVlcF9lcXVhbCc7XG5cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFN0eWxlJywgYXJnczogW3N0eWxlc2hlZXRdIH1cbiAgICAgKi9cbiAgICBzZXRTdHlsZTogJ3NldFN0eWxlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnYWRkTGF5ZXInLCBhcmdzOiBbbGF5ZXIsICdiZWZvcmVMYXllcklkJ10gfVxuICAgICAqL1xuICAgIGFkZExheWVyOiAnYWRkTGF5ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdyZW1vdmVMYXllcicsIGFyZ3M6IFsnbGF5ZXJJZCddIH1cbiAgICAgKi9cbiAgICByZW1vdmVMYXllcjogJ3JlbW92ZUxheWVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRQYWludFByb3BlcnR5OiAnc2V0UGFpbnRQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheW91dFByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldExheW91dFByb3BlcnR5OiAnc2V0TGF5b3V0UHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRGaWx0ZXInLCBhcmdzOiBbJ2xheWVySWQnLCBmaWx0ZXJdIH1cbiAgICAgKi9cbiAgICBzZXRGaWx0ZXI6ICdzZXRGaWx0ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdhZGRTb3VyY2UnLCBhcmdzOiBbJ3NvdXJjZUlkJywgc291cmNlXSB9XG4gICAgICovXG4gICAgYWRkU291cmNlOiAnYWRkU291cmNlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAncmVtb3ZlU291cmNlJywgYXJnczogWydzb3VyY2VJZCddIH1cbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2U6ICdyZW1vdmVTb3VyY2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRHZW9KU09OU291cmNlRGF0YScsIGFyZ3M6IFsnc291cmNlSWQnLCBkYXRhXSB9XG4gICAgICovXG4gICAgc2V0R2VvSlNPTlNvdXJjZURhdGE6ICdzZXRHZW9KU09OU291cmNlRGF0YScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheWVyWm9vbVJhbmdlJywgYXJnczogWydsYXllcklkJywgMCwgMjJdIH1cbiAgICAgKi9cbiAgICBzZXRMYXllclpvb21SYW5nZTogJ3NldExheWVyWm9vbVJhbmdlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5ZXJQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRMYXllclByb3BlcnR5OiAnc2V0TGF5ZXJQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldENlbnRlcicsIGFyZ3M6IFtbbG9uLCBsYXRdXSB9XG4gICAgICovXG4gICAgc2V0Q2VudGVyOiAnc2V0Q2VudGVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0Wm9vbScsIGFyZ3M6IFt6b29tXSB9XG4gICAgICovXG4gICAgc2V0Wm9vbTogJ3NldFpvb20nLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRCZWFyaW5nJywgYXJnczogW2JlYXJpbmddIH1cbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nOiAnc2V0QmVhcmluZycsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFBpdGNoJywgYXJnczogW3BpdGNoXSB9XG4gICAgICovXG4gICAgc2V0UGl0Y2g6ICdzZXRQaXRjaCcsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFNwcml0ZScsIGFyZ3M6IFsnc3ByaXRlVXJsJ10gfVxuICAgICAqL1xuICAgIHNldFNwcml0ZTogJ3NldFNwcml0ZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEdseXBocycsIGFyZ3M6IFsnZ2x5cGhzVXJsJ10gfVxuICAgICAqL1xuICAgIHNldEdseXBoczogJ3NldEdseXBocycsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFRyYW5zaXRpb24nLCBhcmdzOiBbdHJhbnNpdGlvbl0gfVxuICAgICAqL1xuICAgIHNldFRyYW5zaXRpb246ICdzZXRUcmFuc2l0aW9uJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGlnaHRpbmcnLCBhcmdzOiBbbGlnaHRQcm9wZXJ0aWVzXSB9XG4gICAgICovXG4gICAgc2V0TGlnaHQ6ICdzZXRMaWdodCdcblxufTtcblxuZnVuY3Rpb24gYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZFNvdXJjZSwgYXJnczogW3NvdXJjZUlkLCBhZnRlcltzb3VyY2VJZF1dfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVTb3VyY2UsIGFyZ3M6IFtzb3VyY2VJZF19KTtcbiAgICBzb3VyY2VzUmVtb3ZlZFtzb3VyY2VJZF0gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICByZW1vdmVTb3VyY2Uoc291cmNlSWQsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG4gICAgYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpO1xufVxuXG5mdW5jdGlvbiBjYW5VcGRhdGVHZW9KU09OKGJlZm9yZSwgYWZ0ZXIsIHNvdXJjZUlkKSB7XG4gICAgbGV0IHByb3A7XG4gICAgZm9yIChwcm9wIGluIGJlZm9yZVtzb3VyY2VJZF0pIHtcbiAgICAgICAgaWYgKCFiZWZvcmVbc291cmNlSWRdLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AgIT09ICdkYXRhJyAmJiAhaXNFcXVhbChiZWZvcmVbc291cmNlSWRdW3Byb3BdLCBhZnRlcltzb3VyY2VJZF1bcHJvcF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChwcm9wIGluIGFmdGVyW3NvdXJjZUlkXSkge1xuICAgICAgICBpZiAoIWFmdGVyW3NvdXJjZUlkXS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmIChwcm9wICE9PSAnZGF0YScgJiYgIWlzRXF1YWwoYmVmb3JlW3NvdXJjZUlkXVtwcm9wXSwgYWZ0ZXJbc291cmNlSWRdW3Byb3BdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkaWZmU291cmNlcyhiZWZvcmUsIGFmdGVyLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwge307XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCB7fTtcblxuICAgIGxldCBzb3VyY2VJZDtcblxuICAgIC8vIGxvb2sgZm9yIHNvdXJjZXMgdG8gcmVtb3ZlXG4gICAgZm9yIChzb3VyY2VJZCBpbiBiZWZvcmUpIHtcbiAgICAgICAgaWYgKCFiZWZvcmUuaGFzT3duUHJvcGVydHkoc291cmNlSWQpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHNvdXJjZXMgdG8gYWRkL3VwZGF0ZVxuICAgIGZvciAoc291cmNlSWQgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgIGFkZFNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVbc291cmNlSWRdLCBhZnRlcltzb3VyY2VJZF0pKSB7XG4gICAgICAgICAgICBpZiAoYmVmb3JlW3NvdXJjZUlkXS50eXBlID09PSAnZ2VvanNvbicgJiYgYWZ0ZXJbc291cmNlSWRdLnR5cGUgPT09ICdnZW9qc29uJyAmJiBjYW5VcGRhdGVHZW9KU09OKGJlZm9yZSwgYWZ0ZXIsIHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0R2VvSlNPTlNvdXJjZURhdGEsIGFyZ3M6IFtzb3VyY2VJZCwgYWZ0ZXJbc291cmNlSWRdLmRhdGFdfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vIHVwZGF0ZSBjb21tYW5kLCBtdXN0IHJlbW92ZSB0aGVuIGFkZFxuICAgICAgICAgICAgICAgIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmUsIGFmdGVyLCBjb21tYW5kcywgbGF5ZXJJZCwga2xhc3MsIGNvbW1hbmQpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwge307XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCB7fTtcblxuICAgIGxldCBwcm9wO1xuXG4gICAgZm9yIChwcm9wIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVbcHJvcF0sIGFmdGVyW3Byb3BdKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZCwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyW3Byb3BdLCBrbGFzc119KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQsIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlcltwcm9wXSwga2xhc3NdfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBsdWNrSWQobGF5ZXIpIHtcbiAgICByZXR1cm4gbGF5ZXIuaWQ7XG59XG5mdW5jdGlvbiBpbmRleEJ5SWQoZ3JvdXAsIGxheWVyKSB7XG4gICAgZ3JvdXBbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgcmV0dXJuIGdyb3VwO1xufVxuXG5mdW5jdGlvbiBkaWZmTGF5ZXJzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzKSB7XG4gICAgYmVmb3JlID0gYmVmb3JlIHx8IFtdO1xuICAgIGFmdGVyID0gYWZ0ZXIgfHwgW107XG5cbiAgICAvLyBvcmRlciBvZiBsYXllcnMgYnkgaWRcbiAgICBjb25zdCBiZWZvcmVPcmRlciA9IGJlZm9yZS5tYXAocGx1Y2tJZCk7XG4gICAgY29uc3QgYWZ0ZXJPcmRlciA9IGFmdGVyLm1hcChwbHVja0lkKTtcblxuICAgIC8vIGluZGV4IG9mIGxheWVyIGJ5IGlkXG4gICAgY29uc3QgYmVmb3JlSW5kZXggPSBiZWZvcmUucmVkdWNlKGluZGV4QnlJZCwge30pO1xuICAgIGNvbnN0IGFmdGVySW5kZXggPSBhZnRlci5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG5cbiAgICAvLyB0cmFjayBvcmRlciBvZiBsYXllcnMgYXMgaWYgdGhleSBoYXZlIGJlZW4gbXV0YXRlZFxuICAgIGNvbnN0IHRyYWNrZXIgPSBiZWZvcmVPcmRlci5zbGljZSgpO1xuXG4gICAgLy8gbGF5ZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGRvIG5vdCBuZWVkIHRvIGJlIGRpZmZlZFxuICAgIGNvbnN0IGNsZWFuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIGxldCBpLCBkLCBsYXllcklkLCBiZWZvcmVMYXllciwgYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZCwgcHJvcDtcblxuICAgIC8vIHJlbW92ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwLCBkID0gMDsgaSA8IGJlZm9yZU9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxheWVySWQgPSBiZWZvcmVPcmRlcltpXTtcbiAgICAgICAgaWYgKCFhZnRlckluZGV4Lmhhc093blByb3BlcnR5KGxheWVySWQpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF19KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIuaW5kZXhPZihsYXllcklkLCBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkL3Jlb3JkZXIgbGF5ZXJzXG4gICAgZm9yIChpID0gMCwgZCA9IDA7IGkgPCBhZnRlck9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIHdvcmsgYmFja3dhcmRzIGFzIGluc2VydCBpcyBiZWZvcmUgYW4gZXhpc3RpbmcgbGF5ZXJcbiAgICAgICAgbGF5ZXJJZCA9IGFmdGVyT3JkZXJbYWZ0ZXJPcmRlci5sZW5ndGggLSAxIC0gaV07XG5cbiAgICAgICAgaWYgKHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSAxIC0gaV0gPT09IGxheWVySWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChiZWZvcmVJbmRleC5oYXNPd25Qcm9wZXJ0eShsYXllcklkKSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYXllciBiZWZvcmUgd2UgaW5zZXJ0IGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF19KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCwgdHJhY2tlci5sZW5ndGggLSBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGxheWVyIGF0IGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSBpXTtcbiAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5hZGRMYXllciwgYXJnczogW2FmdGVySW5kZXhbbGF5ZXJJZF0sIGluc2VydEJlZm9yZUxheWVySWRdfSk7XG4gICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIubGVuZ3RoIC0gaSwgMCwgbGF5ZXJJZCk7XG4gICAgICAgIGNsZWFuW2xheWVySWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgbGF5ZXJzXG4gICAgZm9yIChpID0gMDsgaSA8IGFmdGVyT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGFmdGVyT3JkZXJbaV07XG4gICAgICAgIGJlZm9yZUxheWVyID0gYmVmb3JlSW5kZXhbbGF5ZXJJZF07XG4gICAgICAgIGFmdGVyTGF5ZXIgPSBhZnRlckluZGV4W2xheWVySWRdO1xuXG4gICAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlIGlmIHByZXZpb3VzbHkgYWRkZWQgKG5ldyBvciBtb3ZlZClcbiAgICAgICAgaWYgKGNsZWFuW2xheWVySWRdIHx8IGlzRXF1YWwoYmVmb3JlTGF5ZXIsIGFmdGVyTGF5ZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBJZiBzb3VyY2UsIHNvdXJjZS1sYXllciwgb3IgdHlwZSBoYXZlIGNoYW5nZXMsIHRoZW4gcmVtb3ZlIHRoZSBsYXllclxuICAgICAgICAvLyBhbmQgYWRkIGl0IGJhY2sgJ2Zyb20gc2NyYXRjaCcuXG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVMYXllci5zb3VyY2UsIGFmdGVyTGF5ZXIuc291cmNlKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllclsnc291cmNlLWxheWVyJ10sIGFmdGVyTGF5ZXJbJ3NvdXJjZS1sYXllciddKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci50eXBlLCBhZnRlckxheWVyLnR5cGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF19KTtcbiAgICAgICAgICAgIC8vIHdlIGFkZCB0aGUgbGF5ZXIgYmFjayBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpdCB3YXMgYWxyZWFkeSBpbiwgc29cbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byB1cGRhdGUgdGhlIGB0cmFja2VyYFxuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sYXN0SW5kZXhPZihsYXllcklkKSArIDFdO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5hZGRMYXllciwgYXJnczogW2FmdGVyTGF5ZXIsIGluc2VydEJlZm9yZUxheWVySWRdfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxheW91dCwgcGFpbnQsIGZpbHRlciwgbWluem9vbSwgbWF4em9vbVxuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIubGF5b3V0LCBhZnRlckxheWVyLmxheW91dCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0TGF5b3V0UHJvcGVydHkpO1xuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIucGFpbnQsIGFmdGVyTGF5ZXIucGFpbnQsIGNvbW1hbmRzLCBsYXllcklkLCBudWxsLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIuZmlsdGVyLCBhZnRlckxheWVyLmZpbHRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0RmlsdGVyLCBhcmdzOiBbbGF5ZXJJZCwgYWZ0ZXJMYXllci5maWx0ZXJdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLm1pbnpvb20sIGFmdGVyTGF5ZXIubWluem9vbSkgfHwgIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWF4em9vbSwgYWZ0ZXJMYXllci5tYXh6b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclpvb21SYW5nZSwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5tYXh6b29tXX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGFsbCBvdGhlciBsYXllciBwcm9wcywgaW5jbHVkaW5nIHBhaW50LipcbiAgICAgICAgZm9yIChwcm9wIGluIGJlZm9yZUxheWVyKSB7XG4gICAgICAgICAgICBpZiAoIWJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclByb3BlcnR5LCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJMYXllcltwcm9wXV19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gYWZ0ZXJMYXllcikge1xuICAgICAgICAgICAgaWYgKCFhZnRlckxheWVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclByb3BlcnR5LCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJMYXllcltwcm9wXV19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEaWZmIHR3byBzdHlsZXNoZWV0XG4gKlxuICogQ3JlYXRlcyBzZW1hbnRpY2x5IGF3YXJlIGRpZmZzIHRoYXQgY2FuIGVhc2lseSBiZSBhcHBsaWVkIGF0IHJ1bnRpbWUuXG4gKiBPcGVyYXRpb25zIHByb2R1Y2VkIGJ5IHRoZSBkaWZmIGNsb3NlbHkgcmVzZW1ibGUgdGhlIG1hcGJveC1nbC1qcyBBUEkuIEFueVxuICogZXJyb3IgY3JlYXRpbmcgdGhlIGRpZmYgd2lsbCBmYWxsIGJhY2sgdG8gdGhlICdzZXRTdHlsZScgb3BlcmF0aW9uLlxuICpcbiAqIEV4YW1wbGUgZGlmZjpcbiAqIFtcbiAqICAgICB7IGNvbW1hbmQ6ICdzZXRDb25zdGFudCcsIGFyZ3M6IFsnQHdhdGVyJywgJyMwMDAwRkYnXSB9LFxuICogICAgIHsgY29tbWFuZDogJ3NldFBhaW50UHJvcGVydHknLCBhcmdzOiBbJ2JhY2tncm91bmQnLCAnYmFja2dyb3VuZC1jb2xvcicsICdibGFjayddIH1cbiAqIF1cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbYmVmb3JlXSBzdHlsZXNoZWV0IHRvIGNvbXBhcmUgZnJvbVxuICogQHBhcmFtIHsqfSBhZnRlciBzdHlsZXNoZWV0IHRvIGNvbXBhcmUgdG9cbiAqIEByZXR1cm5zIEFycmF5IGxpc3Qgb2YgY2hhbmdlc1xuICovXG5mdW5jdGlvbiBkaWZmU3R5bGVzKGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICBpZiAoIWJlZm9yZSkgcmV0dXJuIFt7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXX1dO1xuXG4gICAgbGV0IGNvbW1hbmRzID0gW107XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byB0b3AtbGV2ZWwgcHJvcGVydGllc1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnZlcnNpb24sIGFmdGVyLnZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gW3tjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5jZW50ZXIsIGFmdGVyLmNlbnRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0Q2VudGVyLCBhcmdzOiBbYWZ0ZXIuY2VudGVyXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuem9vbSwgYWZ0ZXIuem9vbSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0Wm9vbSwgYXJnczogW2FmdGVyLnpvb21dfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5iZWFyaW5nLCBhZnRlci5iZWFyaW5nKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRCZWFyaW5nLCBhcmdzOiBbYWZ0ZXIuYmVhcmluZ119KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnBpdGNoLCBhZnRlci5waXRjaCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0UGl0Y2gsIGFyZ3M6IFthZnRlci5waXRjaF19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnNwcml0ZSwgYWZ0ZXIuc3ByaXRlKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRTcHJpdGUsIGFyZ3M6IFthZnRlci5zcHJpdGVdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5nbHlwaHMsIGFmdGVyLmdseXBocykpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0R2x5cGhzLCBhcmdzOiBbYWZ0ZXIuZ2x5cGhzXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUudHJhbnNpdGlvbiwgYWZ0ZXIudHJhbnNpdGlvbikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0VHJhbnNpdGlvbiwgYXJnczogW2FmdGVyLnRyYW5zaXRpb25dfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5saWdodCwgYWZ0ZXIubGlnaHQpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExpZ2h0LCBhcmdzOiBbYWZ0ZXIubGlnaHRdfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgc291cmNlc2BcbiAgICAgICAgLy8gSWYgYSBzb3VyY2UgaXMgdG8gYmUgcmVtb3ZlZCwgd2UgYWxzby0tYmVmb3JlIHRoZSByZW1vdmVTb3VyY2VcbiAgICAgICAgLy8gY29tbWFuZC0tbmVlZCB0byByZW1vdmUgYWxsIHRoZSBzdHlsZSBsYXllcnMgdGhhdCBkZXBlbmQgb24gaXQuXG4gICAgICAgIGNvbnN0IHNvdXJjZXNSZW1vdmVkID0ge307XG5cbiAgICAgICAgLy8gRmlyc3QgY29sbGVjdCB0aGUge2FkZCxyZW1vdmV9U291cmNlIGNvbW1hbmRzXG4gICAgICAgIGNvbnN0IHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMgPSBbXTtcbiAgICAgICAgZGlmZlNvdXJjZXMoYmVmb3JlLnNvdXJjZXMsIGFmdGVyLnNvdXJjZXMsIHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcblxuICAgICAgICAvLyBQdXNoIGEgcmVtb3ZlTGF5ZXIgY29tbWFuZCBmb3IgZWFjaCBzdHlsZSBsYXllciB0aGF0IGRlcGVuZHMgb24gYVxuICAgICAgICAvLyBzb3VyY2UgdGhhdCdzIGJlaW5nIHJlbW92ZWQuXG4gICAgICAgIC8vIEFsc28sIGV4Y2x1ZGUgYW55IHN1Y2ggbGF5ZXJzIHRoZW0gZnJvbSB0aGUgaW5wdXQgdG8gYGRpZmZMYXllcnNgXG4gICAgICAgIC8vIGJlbG93LCBzbyB0aGF0IGRpZmZMYXllcnMgcHJvZHVjZXMgdGhlIGFwcHJvcHJpYXRlIGBhZGRMYXllcnNgXG4gICAgICAgIC8vIGNvbW1hbmRcbiAgICAgICAgY29uc3QgYmVmb3JlTGF5ZXJzID0gW107XG4gICAgICAgIGlmIChiZWZvcmUubGF5ZXJzKSB7XG4gICAgICAgICAgICBiZWZvcmUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVMYXllciwgYXJnczogW2xheWVyLmlkXX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLmNvbmNhdChyZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzKTtcblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgbGF5ZXJzYFxuICAgICAgICBkaWZmTGF5ZXJzKGJlZm9yZUxheWVycywgYWZ0ZXIubGF5ZXJzLCBjb21tYW5kcyk7XG5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBzZXRTdHlsZVxuICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBjb21wdXRlIHN0eWxlIGRpZmY6JywgZSk7XG4gICAgICAgIGNvbW1hbmRzID0gW3tjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdfV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaWZmU3R5bGVzO1xuZXhwb3J0IHtvcGVyYXRpb25zfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNsYXNzIFBhdGhJbnRlcnBvbGF0b3Ige1xuICAgIHBvaW50czogQXJyYXk8UG9pbnQ+O1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIHBhZGRlZExlbmd0aDogbnVtYmVyO1xuICAgIHBhZGRpbmc6IG51bWJlcjtcbiAgICBfZGlzdGFuY2VzOiBBcnJheTxudW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3IocG9pbnRzXzogP0FycmF5PFBvaW50PiwgcGFkZGluZ186ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5yZXNldChwb2ludHNfLCBwYWRkaW5nXyk7XG4gICAgfVxuXG4gICAgcmVzZXQocG9pbnRzXzogP0FycmF5PFBvaW50PiwgcGFkZGluZ186ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHNfIHx8IFtdO1xuXG4gICAgICAgIC8vIENvbXB1dGUgY3VtdWxhdGl2ZSBkaXN0YW5jZSBmcm9tIGZpcnN0IHBvaW50IHRvIGV2ZXJ5IG90aGVyIHBvaW50IGluIHRoZSBzZWdtZW50LlxuICAgICAgICAvLyBMYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0b3RhbCBsZW5ndGggb2YgdGhlIHBhdGhcbiAgICAgICAgdGhpcy5fZGlzdGFuY2VzID0gWzAuMF07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fZGlzdGFuY2VzW2ldID0gdGhpcy5fZGlzdGFuY2VzW2kgLSAxXSArIHRoaXMucG9pbnRzW2ldLmRpc3QodGhpcy5wb2ludHNbaSAtIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZGlzdGFuY2VzW3RoaXMuX2Rpc3RhbmNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gTWF0aC5taW4ocGFkZGluZ18gfHwgMCwgdGhpcy5sZW5ndGggKiAwLjUpO1xuICAgICAgICB0aGlzLnBhZGRlZExlbmd0aCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5wYWRkaW5nICogMi4wO1xuICAgIH1cblxuICAgIGxlcnAodDogbnVtYmVyKTogUG9pbnQge1xuICAgICAgICBhc3NlcnQodGhpcy5wb2ludHMubGVuZ3RoID4gMCk7XG4gICAgICAgIGlmICh0aGlzLnBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvaW50c1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHQgPSBjbGFtcCh0LCAwLCAxKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZWN0IHNlZ21lbnQgW3AwLCBwMV0gd2hlcmUgcDAgPD0geCA8IHAxXG4gICAgICAgIGxldCBjdXJyZW50SW5kZXggPSAxO1xuICAgICAgICBsZXQgZGlzdE9mQ3VycmVudElkeCA9IHRoaXMuX2Rpc3RhbmNlc1tjdXJyZW50SW5kZXhdO1xuICAgICAgICBjb25zdCBkaXN0VG9UYXJnZXQgPSB0ICogdGhpcy5wYWRkZWRMZW5ndGggKyB0aGlzLnBhZGRpbmc7XG5cbiAgICAgICAgd2hpbGUgKGRpc3RPZkN1cnJlbnRJZHggPCBkaXN0VG9UYXJnZXQgJiYgY3VycmVudEluZGV4IDwgdGhpcy5fZGlzdGFuY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzdE9mQ3VycmVudElkeCA9IHRoaXMuX2Rpc3RhbmNlc1srK2N1cnJlbnRJbmRleF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzIG9mIHRoZSBzZWdtZW50XG4gICAgICAgIGNvbnN0IGlkeE9mUHJldlBvaW50ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgY29uc3QgZGlzdE9mUHJldklkeCA9IHRoaXMuX2Rpc3RhbmNlc1tpZHhPZlByZXZQb2ludF07XG4gICAgICAgIGNvbnN0IHNlZ21lbnRMZW5ndGggPSBkaXN0T2ZDdXJyZW50SWR4IC0gZGlzdE9mUHJldklkeDtcbiAgICAgICAgY29uc3Qgc2VnbWVudFQgPSBzZWdtZW50TGVuZ3RoID4gMCA/IChkaXN0VG9UYXJnZXQgLSBkaXN0T2ZQcmV2SWR4KSAvIHNlZ21lbnRMZW5ndGggOiAwO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50c1tpZHhPZlByZXZQb2ludF0ubXVsdCgxLjAgLSBzZWdtZW50VCkuYWRkKHRoaXMucG9pbnRzW2N1cnJlbnRJbmRleF0ubXVsdChzZWdtZW50VCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGF0aEludGVycG9sYXRvcjtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogR3JpZEluZGV4IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRlc3RpbmcgdGhlIGludGVyc2VjdGlvbiBvZlxuICogY2lyY2xlcyBhbmQgcmVjdGFuZ2xlcyBpbiBhIDJkIHBsYW5lLlxuICogSXQgaXMgb3B0aW1pemVkIGZvciByYXBpZCBpbnNlcnRpb24gYW5kIHF1ZXJ5aW5nLlxuICogR3JpZEluZGV4IHNwbGl0cyB0aGUgcGxhbmUgaW50byBhIHNldCBvZiBcImNlbGxzXCIgYW5kIGtlZXBzIHRyYWNrXG4gKiBvZiB3aGljaCBnZW9tZXRyaWVzIGludGVyc2VjdCB3aXRoIGVhY2ggY2VsbC4gQXQgcXVlcnkgdGltZSxcbiAqIGZ1bGwgZ2VvbWV0cnkgY29tcGFyaXNvbnMgYXJlIG9ubHkgZG9uZSBmb3IgaXRlbXMgdGhhdCBzaGFyZVxuICogYXQgbGVhc3Qgb25lIGNlbGwuIEFzIGxvbmcgYXMgdGhlIGdlb21ldHJpZXMgYXJlIHJlbGF0aXZlbHlcbiAqIHVuaWZvcm1seSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIHBsYW5lLCB0aGlzIGdyZWF0bHkgcmVkdWNlc1xuICogdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyBuZWNlc3NhcnkuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgR3JpZEluZGV4IHtcbiAgICBjaXJjbGVLZXlzOiBBcnJheTxhbnk+O1xuICAgIGJveEtleXM6IEFycmF5PGFueT47XG4gICAgYm94Q2VsbHM6IEFycmF5PEFycmF5PG51bWJlcj4+O1xuICAgIGNpcmNsZUNlbGxzOiBBcnJheTxBcnJheTxudW1iZXI+PjtcbiAgICBiYm94ZXM6IEFycmF5PG51bWJlcj47XG4gICAgY2lyY2xlczogQXJyYXk8bnVtYmVyPjtcbiAgICB4Q2VsbENvdW50OiBudW1iZXI7XG4gICAgeUNlbGxDb3VudDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgeFNjYWxlOiBudW1iZXI7XG4gICAgeVNjYWxlOiBudW1iZXI7XG4gICAgYm94VWlkOiBudW1iZXI7XG4gICAgY2lyY2xlVWlkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvciAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNlbGxTaXplOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYm94Q2VsbHMgPSB0aGlzLmJveENlbGxzID0gW107XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGxzID0gdGhpcy5jaXJjbGVDZWxscyA9IFtdO1xuXG4gICAgICAgIC8vIE1vcmUgY2VsbHMgLT4gZmV3ZXIgZ2VvbWV0cmllcyB0byBjaGVjayBwZXIgY2VsbCwgYnV0IGl0ZW1zIHRlbmRcbiAgICAgICAgLy8gdG8gYmUgc3BsaXQgYWNyb3NzIG1vcmUgY2VsbHMuXG4gICAgICAgIC8vIFN3ZWV0IHNwb3QgYWxsb3dzIG1vc3Qgc21hbGwgaXRlbXMgdG8gZml0IGluIG9uZSBjZWxsXG4gICAgICAgIHRoaXMueENlbGxDb3VudCA9IE1hdGguY2VpbCh3aWR0aCAvIGNlbGxTaXplKTtcbiAgICAgICAgdGhpcy55Q2VsbENvdW50ID0gTWF0aC5jZWlsKGhlaWdodCAvIGNlbGxTaXplKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueENlbGxDb3VudCAqIHRoaXMueUNlbGxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBib3hDZWxscy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGNpcmNsZUNlbGxzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2lyY2xlS2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmJveEtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaXJjbGVzID0gW107XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy54U2NhbGUgPSB0aGlzLnhDZWxsQ291bnQgLyB3aWR0aDtcbiAgICAgICAgdGhpcy55U2NhbGUgPSB0aGlzLnlDZWxsQ291bnQgLyBoZWlnaHQ7XG4gICAgICAgIHRoaXMuYm94VWlkID0gMDtcbiAgICAgICAgdGhpcy5jaXJjbGVVaWQgPSAwO1xuICAgIH1cblxuICAgIGtleXNMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJveEtleXMubGVuZ3RoICsgdGhpcy5jaXJjbGVLZXlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpbnNlcnQoa2V5OiBhbnksIHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZm9yRWFjaENlbGwoeDEsIHkxLCB4MiwgeTIsIHRoaXMuX2luc2VydEJveENlbGwsIHRoaXMuYm94VWlkKyspO1xuICAgICAgICB0aGlzLmJveEtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHgxKTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh5MSk7XG4gICAgICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHkyKTtcbiAgICB9XG5cbiAgICBpbnNlcnRDaXJjbGUoa2V5OiBhbnksIHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlcikge1xuICAgICAgICAvLyBJbnNlcnQgY2lyY2xlIGludG8gZ3JpZCBmb3IgYWxsIGNlbGxzIGluIHRoZSBjaXJjdW1zY3JpYmluZyBzcXVhcmVcbiAgICAgICAgLy8gSXQncyBtb3JlIHRoYW4gbmVjZXNzYXJ5IChieSBhIGZhY3RvciBvZiA0L1BJKSwgYnV0IGZhc3QgdG8gaW5zZXJ0XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHggLSByYWRpdXMsIHkgLSByYWRpdXMsIHggKyByYWRpdXMsIHkgKyByYWRpdXMsIHRoaXMuX2luc2VydENpcmNsZUNlbGwsIHRoaXMuY2lyY2xlVWlkKyspO1xuICAgICAgICB0aGlzLmNpcmNsZUtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmNpcmNsZXMucHVzaCh4KTtcbiAgICAgICAgdGhpcy5jaXJjbGVzLnB1c2goeSk7XG4gICAgICAgIHRoaXMuY2lyY2xlcy5wdXNoKHJhZGl1cyk7XG4gICAgfVxuXG4gICAgX2luc2VydEJveENlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHVpZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG4gICAgfVxuXG4gICAgX2luc2VydENpcmNsZUNlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHVpZDogbnVtYmVyKSAge1xuICAgICAgICB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF0ucHVzaCh1aWQpO1xuICAgIH1cblxuICAgIF9xdWVyeSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBoaXRUZXN0OiBib29sZWFuLCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgaWYgKHgyIDwgMCB8fCB4MSA+IHRoaXMud2lkdGggfHwgeTIgPCAwIHx8IHkxID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBoaXRUZXN0ID8gZmFsc2UgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHgxIDw9IDAgJiYgeTEgPD0gMCAmJiB0aGlzLndpZHRoIDw9IHgyICYmIHRoaXMuaGVpZ2h0IDw9IHkyKSB7XG4gICAgICAgICAgICBpZiAoaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgYm94VWlkID0gMDsgYm94VWlkIDwgdGhpcy5ib3hLZXlzLmxlbmd0aDsgYm94VWlkKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5ib3hLZXlzW2JveFVpZF0sXG4gICAgICAgICAgICAgICAgICAgIHgxOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0XSxcbiAgICAgICAgICAgICAgICAgICAgeTE6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgeDI6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgeTI6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAzXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgY2lyY2xlVWlkID0gMDsgY2lyY2xlVWlkIDwgdGhpcy5jaXJjbGVLZXlzLmxlbmd0aDsgY2lyY2xlVWlkKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdGhpcy5jaXJjbGVzW2NpcmNsZVVpZCAqIDNdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLmNpcmNsZXNbY2lyY2xlVWlkICogMyArIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuY2lyY2xlc1tjaXJjbGVVaWQgKiAzICsgMl07XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdLFxuICAgICAgICAgICAgICAgICAgICB4MTogeCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgeTE6IHkgLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIHgyOiB4ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICB5MjogeSArIHJhZGl1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSA/IHJlc3VsdC5maWx0ZXIocHJlZGljYXRlKSA6IHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5QXJncyA9IHtcbiAgICAgICAgICAgICAgICBoaXRUZXN0LFxuICAgICAgICAgICAgICAgIHNlZW5VaWRzOiB7Ym94OiB7fSwgY2lyY2xlOiB7fX1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4MSwgeTEsIHgyLCB5MiwgdGhpcy5fcXVlcnlDZWxsLCByZXN1bHQsIHF1ZXJ5QXJncywgcHJlZGljYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBoaXRUZXN0ID8gcmVzdWx0Lmxlbmd0aCA+IDAgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcXVlcnlDaXJjbGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCBoaXRUZXN0OiBib29sZWFuLCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgLy8gSW5zZXJ0IGNpcmNsZSBpbnRvIGdyaWQgZm9yIGFsbCBjZWxscyBpbiB0aGUgY2lyY3Vtc2NyaWJpbmcgc3F1YXJlXG4gICAgICAgIC8vIEl0J3MgbW9yZSB0aGFuIG5lY2Vzc2FyeSAoYnkgYSBmYWN0b3Igb2YgNC9QSSksIGJ1dCBmYXN0IHRvIGluc2VydFxuICAgICAgICBjb25zdCB4MSA9IHggLSByYWRpdXM7XG4gICAgICAgIGNvbnN0IHgyID0geCArIHJhZGl1cztcbiAgICAgICAgY29uc3QgeTEgPSB5IC0gcmFkaXVzO1xuICAgICAgICBjb25zdCB5MiA9IHkgKyByYWRpdXM7XG4gICAgICAgIGlmICh4MiA8IDAgfHwgeDEgPiB0aGlzLndpZHRoIHx8IHkyIDwgMCB8fCB5MSA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IGZhbHNlIDogW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb3ggcXVlcnkgZWFybHkgZXhpdHMgaWYgdGhlIGJvdW5kaW5nIGJveCBpcyBsYXJnZXIgdGhhbiB0aGUgZ3JpZCwgYnV0IHdlIGRvbid0IGRvXG4gICAgICAgIC8vIHRoZSBlcXVpdmFsZW50IGNhbGN1bGF0aW9uIGZvciBjaXJjbGUgcXVlcmllcyBiZWNhdXNlIGVhcmx5IGV4aXQgaXMgbGVzcyBsaWtlbHlcbiAgICAgICAgLy8gYW5kIHRoZSBjYWxjdWxhdGlvbiBpcyBtb3JlIGV4cGVuc2l2ZVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgcXVlcnlBcmdzID0ge1xuICAgICAgICAgICAgaGl0VGVzdCxcbiAgICAgICAgICAgIGNpcmNsZToge3gsIHksIHJhZGl1c30sXG4gICAgICAgICAgICBzZWVuVWlkczoge2JveDoge30sIGNpcmNsZToge319XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGxDaXJjbGUsIHJlc3VsdCwgcXVlcnlBcmdzLCBwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gaGl0VGVzdCA/IHJlc3VsdC5sZW5ndGggPiAwIDogcmVzdWx0O1xuICAgIH1cblxuICAgIHF1ZXJ5KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IEFycmF5PGFueT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3F1ZXJ5KHgxLCB5MSwgeDIsIHkyLCBmYWxzZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IGJvb2xlYW4gIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9xdWVyeSh4MSwgeTEsIHgyLCB5MiwgdHJ1ZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0Q2lyY2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlciwgcHJlZGljYXRlPzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnlDaXJjbGUoeCwgeSwgcmFkaXVzLCB0cnVlLCBwcmVkaWNhdGUpOiBhbnkpO1xuICAgIH1cblxuICAgIF9xdWVyeUNlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55LCBxdWVyeUFyZ3M6IGFueSwgcHJlZGljYXRlPzogYW55KSB7XG4gICAgICAgIGNvbnN0IHNlZW5VaWRzID0gcXVlcnlBcmdzLnNlZW5VaWRzO1xuICAgICAgICBjb25zdCBib3hDZWxsID0gdGhpcy5ib3hDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoYm94Q2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgYmJveGVzID0gdGhpcy5iYm94ZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJveFVpZCBvZiBib3hDZWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWVuVWlkcy5ib3hbYm94VWlkXSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkcy5ib3hbYm94VWlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGJveFVpZCAqIDQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoeDEgPD0gYmJveGVzW29mZnNldCArIDJdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHkxIDw9IGJib3hlc1tvZmZzZXQgKyAzXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoeTIgPj0gYmJveGVzW29mZnNldCArIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuYm94S2V5c1tib3hVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUFyZ3MuaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5ib3hLZXlzW2JveFVpZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxOiBiYm94ZXNbb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IGJib3hlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI6IGJib3hlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI6IGJib3hlc1tvZmZzZXQgKyAzXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGwgPSB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChjaXJjbGVDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5jaXJjbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaXJjbGVVaWQgb2YgY2lyY2xlQ2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjaXJjbGVVaWQgKiAzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTEsXG4gICAgICAgICAgICAgICAgICAgICAgICB4MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUFyZ3MuaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gY2lyY2xlc1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBjaXJjbGVzW29mZnNldCArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IGNpcmNsZXNbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTogeCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IHkgLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyOiB4ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MjogeSArIHJhZGl1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3F1ZXJ5Q2VsbENpcmNsZSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBjZWxsSW5kZXg6IG51bWJlciwgcmVzdWx0OiBhbnksIHF1ZXJ5QXJnczogYW55LCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY2lyY2xlID0gcXVlcnlBcmdzLmNpcmNsZTtcbiAgICAgICAgY29uc3Qgc2VlblVpZHMgPSBxdWVyeUFyZ3Muc2VlblVpZHM7XG4gICAgICAgIGNvbnN0IGJveENlbGwgPSB0aGlzLmJveENlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChib3hDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiYm94ZXMgPSB0aGlzLmJib3hlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94VWlkIG9mIGJveENlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmJveFtib3hVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmJveFtib3hVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYm94VWlkICogNDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS5yYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUodGhpcy5ib3hLZXlzW2JveFVpZF0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGwgPSB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChjaXJjbGVDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5jaXJjbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaXJjbGVVaWQgb2YgY2lyY2xlQ2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjaXJjbGVVaWQgKiAzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlc0NvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnksXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUucmFkaXVzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZm9yRWFjaENlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgZm46IGFueSwgYXJnMTogYW55LCBhcmcyPzogYW55LCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY3gxID0gdGhpcy5fY29udmVydFRvWENlbGxDb29yZCh4MSk7XG4gICAgICAgIGNvbnN0IGN5MSA9IHRoaXMuX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTEpO1xuICAgICAgICBjb25zdCBjeDIgPSB0aGlzLl9jb252ZXJ0VG9YQ2VsbENvb3JkKHgyKTtcbiAgICAgICAgY29uc3QgY3kyID0gdGhpcy5fY29udmVydFRvWUNlbGxDb29yZCh5Mik7XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IGN4MTsgeCA8PSBjeDI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IGN5MTsgeSA8PSBjeTI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IHRoaXMueENlbGxDb3VudCAqIHkgKyB4O1xuICAgICAgICAgICAgICAgIGlmIChmbi5jYWxsKHRoaXMsIHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIGFyZzEsIGFyZzIsIHByZWRpY2F0ZSkpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jb252ZXJ0VG9YQ2VsbENvb3JkKHg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy54Q2VsbENvdW50IC0gMSwgTWF0aC5mbG9vcih4ICogdGhpcy54U2NhbGUpKSk7XG4gICAgfVxuXG4gICAgX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnlDZWxsQ291bnQgLSAxLCBNYXRoLmZsb29yKHkgKiB0aGlzLnlTY2FsZSkpKTtcbiAgICB9XG5cbiAgICBfY2lyY2xlc0NvbGxpZGUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgcjE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgcjI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkeCA9IHgyIC0geDE7XG4gICAgICAgIGNvbnN0IGR5ID0geTIgLSB5MTtcbiAgICAgICAgY29uc3QgYm90aFJhZGlpID0gcjEgKyByMjtcbiAgICAgICAgcmV0dXJuIChib3RoUmFkaWkgKiBib3RoUmFkaWkpID4gKGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICB9XG5cbiAgICBfY2lyY2xlQW5kUmVjdENvbGxpZGUoY2lyY2xlWDogbnVtYmVyLCBjaXJjbGVZOiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGhhbGZSZWN0V2lkdGggPSAoeDIgLSB4MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WCA9IE1hdGguYWJzKGNpcmNsZVggLSAoeDEgKyBoYWxmUmVjdFdpZHRoKSk7XG4gICAgICAgIGlmIChkaXN0WCA+IChoYWxmUmVjdFdpZHRoICsgcmFkaXVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFsZlJlY3RIZWlnaHQgPSAoeTIgLSB5MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WSA9IE1hdGguYWJzKGNpcmNsZVkgLSAoeTEgKyBoYWxmUmVjdEhlaWdodCkpO1xuICAgICAgICBpZiAoZGlzdFkgPiAoaGFsZlJlY3RIZWlnaHQgKyByYWRpdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzdFggPD0gaGFsZlJlY3RXaWR0aCB8fCBkaXN0WSA8PSBoYWxmUmVjdEhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkeCA9IGRpc3RYIC0gaGFsZlJlY3RXaWR0aDtcbiAgICAgICAgY29uc3QgZHkgPSBkaXN0WSAtIGhhbGZSZWN0SGVpZ2h0O1xuICAgICAgICByZXR1cm4gKGR4ICogZHggKyBkeSAqIGR5IDw9IChyYWRpdXMgKiByYWRpdXMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdyaWRJbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHttYXQ0LCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuL3N5bWJvbF9zaXplJztcbmltcG9ydCB7YWRkRHluYW1pY0F0dHJpYnV0ZXN9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3JlbmRlci9wYWludGVyJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB0eXBlIHtcbiAgICBHbHlwaE9mZnNldEFycmF5LFxuICAgIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSxcbiAgICBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXlcbn0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcyc7XG5pbXBvcnQge1dyaXRpbmdNb2RlfSBmcm9tICcuLi9zeW1ib2wvc2hhcGluZyc7XG5cbmV4cG9ydCB7dXBkYXRlTGluZUxhYmVscywgaGlkZUdseXBocywgZ2V0TGFiZWxQbGFuZU1hdHJpeCwgZ2V0R2xDb29yZE1hdHJpeCwgcHJvamVjdCwgZ2V0UGVyc3BlY3RpdmVSYXRpbywgcGxhY2VGaXJzdEFuZExhc3RHbHlwaCwgcGxhY2VHbHlwaEFsb25nTGluZSwgeHlUcmFuc2Zvcm1NYXQ0fTtcblxuLypcbiAqICMgT3ZlcnZpZXcgb2YgY29vcmRpbmF0ZSBzcGFjZXNcbiAqXG4gKiAjIyBUaWxlIGNvb3JkaW5hdGUgc3BhY2VzXG4gKiBFYWNoIGxhYmVsIGhhcyBhbiBhbmNob3IuIFNvbWUgbGFiZWxzIGhhdmUgY29ycmVzcG9uZGluZyBsaW5lIGdlb21ldHJpZXMuXG4gKiBUaGUgcG9pbnRzIGZvciBib3RoIGFuY2hvcnMgYW5kIGxpbmVzIGFyZSBzdG9yZWQgaW4gdGlsZSB1bml0cy4gRWFjaCB0aWxlIGhhcyBpdCdzIG93blxuICogY29vcmRpbmF0ZSBzcGFjZSBnb2luZyBmcm9tICgwLCAwKSBhdCB0aGUgdG9wIGxlZnQgdG8gKEVYVEVOVCwgRVhURU5UKSBhdCB0aGUgYm90dG9tIHJpZ2h0LlxuICpcbiAqICMjIEdMIGNvb3JkaW5hdGUgc3BhY2VcbiAqIEF0IHRoZSBlbmQgb2YgZXZlcnl0aGluZywgdGhlIHZlcnRleCBzaGFkZXIgbmVlZHMgdG8gcHJvZHVjZSBhIHBvc2l0aW9uIGluIEdMIGNvb3JkaW5hdGUgc3BhY2UsXG4gKiB3aGljaCBpcyAoLTEsIDEpIGF0IHRoZSB0b3AgbGVmdCBhbmQgKDEsIC0xKSBpbiB0aGUgYm90dG9tIHJpZ2h0LlxuICpcbiAqICMjIE1hcCBwaXhlbCBjb29yZGluYXRlIHNwYWNlc1xuICogRWFjaCB0aWxlIGhhcyBhIHBpeGVsIGNvb3JkaW5hdGUgc3BhY2UuIEl0J3MganVzdCB0aGUgdGlsZSB1bml0cyBzY2FsZWQgc28gdGhhdCBvbmUgdW5pdCBpc1xuICogd2hhdGV2ZXIgY291bnRzIGFzIDEgcGl4ZWwgYXQgdGhlIGN1cnJlbnQgem9vbS5cbiAqIFRoaXMgc3BhY2UgaXMgdXNlZCBmb3IgcGl0Y2gtYWxpZ25tZW50PW1hcCwgcm90YXRpb24tYWxpZ25tZW50PW1hcFxuICpcbiAqICMjIFJvdGF0ZWQgbWFwIHBpeGVsIGNvb3JkaW5hdGUgc3BhY2VzXG4gKiBMaWtlIHRoZSBhYm92ZSwgYnV0IHJvdGF0ZWQgc28gYXhpcyBvZiB0aGUgc3BhY2UgYXJlIGFsaWduZWQgd2l0aCB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgdGlsZS5cbiAqIFRoaXMgc3BhY2UgaXMgdXNlZCBmb3IgcGl0Y2gtYWxpZ25tZW50PW1hcCwgcm90YXRpb24tYWxpZ25tZW50PXZpZXdwb3J0XG4gKlxuICogIyMgVmlld3BvcnQgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZVxuICogKDAsIDApIGlzIGF0IHRoZSB0b3AgbGVmdCBvZiB0aGUgY2FudmFzIGFuZCAocGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQpIGlzIGF0IHRoZSBib3R0b20gcmlnaHQgY29ybmVyXG4gKiBvZiB0aGUgY2FudmFzLiBUaGlzIHNwYWNlIGlzIHVzZWQgZm9yIHBpdGNoLWFsaWdubWVudD12aWV3cG9ydFxuICpcbiAqXG4gKiAjIFZlcnRleCBwcm9qZWN0aW9uXG4gKiBJdCBnb2VzIHJvdWdobHkgbGlrZSB0aGlzOlxuICogMS4gcHJvamVjdCB0aGUgYW5jaG9yIGFuZCBsaW5lIGZyb20gdGlsZSB1bml0cyBpbnRvIHRoZSBjb3JyZWN0IGxhYmVsIGNvb3JkaW5hdGUgc3BhY2VcbiAqICAgICAgLSBtYXAgcGl4ZWwgc3BhY2UgICAgICAgICAgIHBpdGNoLWFsaWdubWVudD1tYXAgICAgICAgICByb3RhdGlvbi1hbGlnbm1lbnQ9bWFwXG4gKiAgICAgIC0gcm90YXRlZCBtYXAgcGl4ZWwgc3BhY2UgICBwaXRjaC1hbGlnbm1lbnQ9bWFwICAgICAgICAgcm90YXRpb24tYWxpZ25tZW50PXZpZXdwb3J0XG4gKiAgICAgIC0gdmlld3BvcnQgcGl4ZWwgc3BhY2UgICAgICBwaXRjaC1hbGlnbm1lbnQ9dmlld3BvcnQgICAgcm90YXRpb24tYWxpZ25tZW50PSpcbiAqIDIuIGlmIHRoZSBsYWJlbCBmb2xsb3dzIGEgbGluZSwgZmluZCB0aGUgcG9pbnQgYWxvbmcgdGhlIGxpbmUgdGhhdCBpcyB0aGUgY29ycmVjdCBkaXN0YW5jZSBmcm9tIHRoZSBhbmNob3IuXG4gKiAzLiBhZGQgdGhlIGdseXBoJ3MgY29ybmVyIG9mZnNldCB0byB0aGUgcG9pbnQgZnJvbSBzdGVwIDNcbiAqIDQuIGNvbnZlcnQgZnJvbSB0aGUgbGFiZWwgY29vcmRpbmF0ZSBzcGFjZSB0byBnbCBjb29yZGluYXRlc1xuICpcbiAqIEZvciBob3Jpem9udGFsIGxhYmVscyB3ZSB3YW50IHRvIGRvIHN0ZXAgMSBpbiB0aGUgc2hhZGVyIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChubyBjcHUgd29yaykuXG4gKiAgICAgIFRoaXMgaXMgd2hhdCBgdV9sYWJlbF9wbGFuZV9tYXRyaXhgIGlzIHVzZWQgZm9yLlxuICogRm9yIGxhYmVscyBhbGlnbmVkIHdpdGggbGluZXMgd2UgaGF2ZSB0byBzdGVwcyAxIGFuZCAyIG9uIHRoZSBjcHUgc2luY2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIGxpbmUgZ2VvbWV0cnkuXG4gKiAgICAgIFRoaXMgaXMgd2hhdCBgdXBkYXRlTGluZUxhYmVscyguLi4pYCBkb2VzLlxuICogICAgICBTaW5jZSB0aGUgY29udmVyc2lvbiBpcyBoYW5kbGVkIG9uIHRoZSBjcHUgd2UganVzdCBzZXQgYHVfbGFiZWxfcGxhbmVfbWF0cml4YCB0byBhbiBpZGVudGl0eSBtYXRyaXguXG4gKlxuICogU3RlcHMgMyBhbmQgNCBhcmUgZG9uZSBpbiB0aGUgc2hhZGVycyBmb3IgYWxsIGxhYmVscy5cbiAqL1xuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCBmb3IgY29udmVydGluZyBmcm9tIHRpbGUgdW5pdHMgdG8gdGhlIGNvcnJlY3QgbGFiZWwgY29vcmRpbmF0ZSBzcGFjZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TGFiZWxQbGFuZU1hdHJpeChwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpIHtcbiAgICBjb25zdCBtID0gbWF0NC5jcmVhdGUoKTtcbiAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEgLyBwaXhlbHNUb1RpbGVVbml0cywgMSAvIHBpeGVsc1RvVGlsZVVuaXRzLCAxXSk7XG4gICAgICAgIGlmICghcm90YXRlV2l0aE1hcCkge1xuICAgICAgICAgICAgbWF0NC5yb3RhdGVaKG0sIG0sIHRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KG0sIHRyYW5zZm9ybS5sYWJlbFBsYW5lTWF0cml4LCBwb3NNYXRyaXgpO1xuICAgIH1cbiAgICByZXR1cm4gbTtcbn1cblxuLypcbiAqIFJldHVybnMgYSBtYXRyaXggZm9yIGNvbnZlcnRpbmcgZnJvbSB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlIHRvIGdsIGNvb3Jkcy5cbiAqL1xuZnVuY3Rpb24gZ2V0R2xDb29yZE1hdHJpeChwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpIHtcbiAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgIGNvbnN0IG0gPSBtYXQ0LmNsb25lKHBvc01hdHJpeCk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3BpeGVsc1RvVGlsZVVuaXRzLCBwaXhlbHNUb1RpbGVVbml0cywgMV0pO1xuICAgICAgICBpZiAoIXJvdGF0ZVdpdGhNYXApIHtcbiAgICAgICAgICAgIG1hdDQucm90YXRlWihtLCBtLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLmdsQ29vcmRNYXRyaXg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9qZWN0KHBvaW50OiBQb2ludCwgbWF0cml4OiBtYXQ0KSB7XG4gICAgY29uc3QgcG9zID0gW3BvaW50LngsIHBvaW50LnksIDAsIDFdO1xuICAgIHh5VHJhbnNmb3JtTWF0NChwb3MsIHBvcywgbWF0cml4KTtcbiAgICBjb25zdCB3ID0gcG9zWzNdO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiBuZXcgUG9pbnQocG9zWzBdIC8gdywgcG9zWzFdIC8gdyksXG4gICAgICAgIHNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYTogd1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldFBlcnNwZWN0aXZlUmF0aW8oY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTogbnVtYmVyLCBzaWduZWREaXN0YW5jZUZyb21DYW1lcmE6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIDAuNSArIDAuNSAqIChjYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhKTtcbn1cblxuZnVuY3Rpb24gaXNWaXNpYmxlKGFuY2hvclBvczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgY2xpcHBpbmdCdWZmZXI6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCB4ID0gYW5jaG9yUG9zWzBdIC8gYW5jaG9yUG9zWzNdO1xuICAgIGNvbnN0IHkgPSBhbmNob3JQb3NbMV0gLyBhbmNob3JQb3NbM107XG4gICAgY29uc3QgaW5QYWRkZWRWaWV3cG9ydCA9IChcbiAgICAgICAgeCA+PSAtY2xpcHBpbmdCdWZmZXJbMF0gJiZcbiAgICAgICAgeCA8PSBjbGlwcGluZ0J1ZmZlclswXSAmJlxuICAgICAgICB5ID49IC1jbGlwcGluZ0J1ZmZlclsxXSAmJlxuICAgICAgICB5IDw9IGNsaXBwaW5nQnVmZmVyWzFdKTtcbiAgICByZXR1cm4gaW5QYWRkZWRWaWV3cG9ydDtcbn1cblxuLypcbiAqICBVcGRhdGUgdGhlIGBkeW5hbWljTGF5b3V0VmVydGV4QnVmZmVyYCBmb3IgdGhlIGJ1ZmZlciB3aXRoIHRoZSBjb3JyZWN0IGdseXBoIHBvc2l0aW9ucyBmb3IgdGhlIGN1cnJlbnQgbWFwIHZpZXcuXG4gKiAgVGhpcyBpcyBvbmx5IHJ1biBvbiBsYWJlbHMgdGhhdCBhcmUgYWxpZ25lZCB3aXRoIGxpbmVzLiBIb3Jpem9udGFsIGxhYmVscyBhcmUgaGFuZGxlZCBlbnRpcmVseSBpbiB0aGUgc2hhZGVyLlxuICovXG5mdW5jdGlvbiB1cGRhdGVMaW5lTGFiZWxzKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGV4dDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xDb29yZE1hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwVXByaWdodDogYm9vbGVhbikge1xuXG4gICAgY29uc3Qgc2l6ZURhdGEgPSBpc1RleHQgPyBidWNrZXQudGV4dFNpemVEYXRhIDogYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICBjb25zdCBwYXJ0aWFsbHlFdmFsdWF0ZWRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCBwYWludGVyLnRyYW5zZm9ybS56b29tKTtcblxuICAgIGNvbnN0IGNsaXBwaW5nQnVmZmVyID0gWzI1NiAvIHBhaW50ZXIud2lkdGggKiAyICsgMSwgMjU2IC8gcGFpbnRlci5oZWlnaHQgKiAyICsgMV07XG5cbiAgICBjb25zdCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBpc1RleHQgP1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgOlxuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG5cbiAgICBjb25zdCBsaW5lVmVydGV4QXJyYXkgPSBidWNrZXQubGluZVZlcnRleEFycmF5O1xuICAgIGNvbnN0IHBsYWNlZFN5bWJvbHMgPSBpc1RleHQgPyBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheSA6IGJ1Y2tldC5pY29uLnBsYWNlZFN5bWJvbEFycmF5O1xuXG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSBwYWludGVyLnRyYW5zZm9ybS53aWR0aCAvIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodDtcblxuICAgIGxldCB1c2VWZXJ0aWNhbCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwbGFjZWRTeW1ib2xzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gcGxhY2VkU3ltYm9scy5nZXQocyk7XG5cbiAgICAgICAgLy8gRG9uJ3QgZG8gY2FsY3VsYXRpb25zIGZvciB2ZXJ0aWNhbCBnbHlwaHMgdW5sZXNzIHRoZSBwcmV2aW91cyBzeW1ib2wgd2FzIGhvcml6b250YWxcbiAgICAgICAgLy8gYW5kIHdlIGRldGVybWluZWQgdGhhdCB2ZXJ0aWNhbCBnbHlwaHMgd2VyZSBuZWNlc3NhcnkuXG4gICAgICAgIC8vIEFsc28gZG9uJ3QgZG8gY2FsY3VsYXRpb25zIGZvciBzeW1ib2xzIHRoYXQgYXJlIGNvbGxpZGVkIGFuZCBmdWxseSBmYWRlZCBvdXRcbiAgICAgICAgaWYgKHN5bWJvbC5oaWRkZW4gfHwgc3ltYm9sLndyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCAmJiAhdXNlVmVydGljYWwpIHtcbiAgICAgICAgICAgIGhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF3a3dhcmQuLi4gYnV0IHdlJ3JlIGNvdW50aW5nIG9uIHRoZSBwYWlyZWQgXCJ2ZXJ0aWNhbFwiIHN5bWJvbCBjb21pbmcgaW1tZWRpYXRlbHkgYWZ0ZXIgaXRzIGhvcml6b250YWwgY291bnRlcnBhcnRcbiAgICAgICAgdXNlVmVydGljYWwgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBhbmNob3JQb3MgPSBbc3ltYm9sLmFuY2hvclgsIHN5bWJvbC5hbmNob3JZLCAwLCAxXTtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGFuY2hvclBvcywgYW5jaG9yUG9zLCBwb3NNYXRyaXgpO1xuXG4gICAgICAgIC8vIERvbid0IGJvdGhlciBjYWxjdWxhdGluZyB0aGUgY29ycmVjdCBwb2ludCBmb3IgaW52aXNpYmxlIGxhYmVscy5cbiAgICAgICAgaWYgKCFpc1Zpc2libGUoYW5jaG9yUG9zLCBjbGlwcGluZ0J1ZmZlcikpIHtcbiAgICAgICAgICAgIGhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FtZXJhVG9BbmNob3JEaXN0YW5jZSA9IGFuY2hvclBvc1szXTtcbiAgICAgICAgY29uc3QgcGVyc3BlY3RpdmVSYXRpbyA9IGdldFBlcnNwZWN0aXZlUmF0aW8ocGFpbnRlci50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSwgY2FtZXJhVG9BbmNob3JEaXN0YW5jZSk7XG5cbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoc2l6ZURhdGEsIHBhcnRpYWxseUV2YWx1YXRlZFNpemUsIHN5bWJvbCk7XG4gICAgICAgIGNvbnN0IHBpdGNoU2NhbGVkRm9udFNpemUgPSBwaXRjaFdpdGhNYXAgPyBmb250U2l6ZSAvIHBlcnNwZWN0aXZlUmF0aW8gOiBmb250U2l6ZSAqIHBlcnNwZWN0aXZlUmF0aW87XG5cbiAgICAgICAgY29uc3QgdGlsZUFuY2hvclBvaW50ID0gbmV3IFBvaW50KHN5bWJvbC5hbmNob3JYLCBzeW1ib2wuYW5jaG9yWSk7XG4gICAgICAgIGNvbnN0IGFuY2hvclBvaW50ID0gcHJvamVjdCh0aWxlQW5jaG9yUG9pbnQsIGxhYmVsUGxhbmVNYXRyaXgpLnBvaW50O1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uQ2FjaGUgPSB7fTtcblxuICAgICAgICBjb25zdCBwbGFjZVVuZmxpcHBlZDogYW55ID0gcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBwaXRjaFNjYWxlZEZvbnRTaXplLCBmYWxzZSAvKnVuZmxpcHBlZCovLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LFxuICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksIGxpbmVWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvKTtcblxuICAgICAgICB1c2VWZXJ0aWNhbCA9IHBsYWNlVW5mbGlwcGVkLnVzZVZlcnRpY2FsO1xuXG4gICAgICAgIGlmIChwbGFjZVVuZmxpcHBlZC5ub3RFbm91Z2hSb29tIHx8IHVzZVZlcnRpY2FsIHx8XG4gICAgICAgICAgICAocGxhY2VVbmZsaXBwZWQubmVlZHNGbGlwcGluZyAmJlxuICAgICAgICAgICAgIHBsYWNlR2x5cGhzQWxvbmdMaW5lKHN5bWJvbCwgcGl0Y2hTY2FsZWRGb250U2l6ZSwgdHJ1ZSAvKmZsaXBwZWQqLywga2VlcFVwcmlnaHQsIHBvc01hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCxcbiAgICAgICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksIGxpbmVWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvKS5ub3RFbm91Z2hSb29tKSkge1xuICAgICAgICAgICAgaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVGV4dCkge1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBsYWNlRmlyc3RBbmRMYXN0R2x5cGgoZm9udFNjYWxlOiBudW1iZXIsIGdseXBoT2Zmc2V0QXJyYXk6IEdseXBoT2Zmc2V0QXJyYXksIGxpbmVPZmZzZXRYOiBudW1iZXIsIGxpbmVPZmZzZXRZOiBudW1iZXIsIGZsaXA6IGJvb2xlYW4sIGFuY2hvclBvaW50OiBQb2ludCwgdGlsZUFuY2hvclBvaW50OiBQb2ludCwgc3ltYm9sOiBhbnksIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4OiBtYXQ0LCBwcm9qZWN0aW9uQ2FjaGU6IGFueSkge1xuICAgIGNvbnN0IGdseXBoRW5kSW5kZXggPSBzeW1ib2wuZ2x5cGhTdGFydEluZGV4ICsgc3ltYm9sLm51bUdseXBocztcbiAgICBjb25zdCBsaW5lU3RhcnRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleDtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wubGluZUxlbmd0aDtcblxuICAgIGNvbnN0IGZpcnN0R2x5cGhPZmZzZXQgPSBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoc3ltYm9sLmdseXBoU3RhcnRJbmRleCk7XG4gICAgY29uc3QgbGFzdEdseXBoT2Zmc2V0ID0gZ2x5cGhPZmZzZXRBcnJheS5nZXRvZmZzZXRYKGdseXBoRW5kSW5kZXggLSAxKTtcblxuICAgIGNvbnN0IGZpcnN0UGxhY2VkR2x5cGggPSBwbGFjZUdseXBoQWxvbmdMaW5lKGZvbnRTY2FsZSAqIGZpcnN0R2x5cGhPZmZzZXQsIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlKTtcbiAgICBpZiAoIWZpcnN0UGxhY2VkR2x5cGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbGFzdFBsYWNlZEdseXBoID0gcGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBsYXN0R2x5cGhPZmZzZXQsIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlKTtcbiAgICBpZiAoIWxhc3RQbGFjZWRHbHlwaClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4ge2ZpcnN0OiBmaXJzdFBsYWNlZEdseXBoLCBsYXN0OiBsYXN0UGxhY2VkR2x5cGh9O1xufVxuXG5mdW5jdGlvbiByZXF1aXJlc09yaWVudGF0aW9uQ2hhbmdlKHdyaXRpbmdNb2RlLCBmaXJzdFBvaW50LCBsYXN0UG9pbnQsIGFzcGVjdFJhdGlvKSB7XG4gICAgaWYgKHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsKSB7XG4gICAgICAgIC8vIE9uIHRvcCBvZiBjaG9vc2luZyB3aGV0aGVyIHRvIGZsaXAsIGNob29zZSB3aGV0aGVyIHRvIHJlbmRlciB0aGlzIHZlcnNpb24gb2YgdGhlIGdseXBocyBvciB0aGUgYWx0ZXJuYXRlXG4gICAgICAgIC8vIHZlcnRpY2FsIGdseXBocy4gV2UgY2FuJ3QganVzdCBmaWx0ZXIgb3V0IHZlcnRpY2FsIGdseXBocyBpbiB0aGUgaG9yaXpvbnRhbCByYW5nZSBiZWNhdXNlIHRoZSBob3Jpem9udGFsXG4gICAgICAgIC8vIGFuZCB2ZXJ0aWNhbCB2ZXJzaW9ucyBjYW4gaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgcHJvamVjdGlvbnMgd2hpY2ggY291bGQgbGVhZCB0byBhbmdsZXMgd2hlcmUgYm90aCBvclxuICAgICAgICAvLyBuZWl0aGVyIHNob3dlZC5cbiAgICAgICAgY29uc3QgcmlzZSA9IE1hdGguYWJzKGxhc3RQb2ludC55IC0gZmlyc3RQb2ludC55KTtcbiAgICAgICAgY29uc3QgcnVuID0gTWF0aC5hYnMobGFzdFBvaW50LnggLSBmaXJzdFBvaW50LngpICogYXNwZWN0UmF0aW87XG4gICAgICAgIGlmIChyaXNlID4gcnVuKSB7XG4gICAgICAgICAgICByZXR1cm4ge3VzZVZlcnRpY2FsOiB0cnVlfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwgPyBmaXJzdFBvaW50LnkgPCBsYXN0UG9pbnQueSA6IGZpcnN0UG9pbnQueCA+IGxhc3RQb2ludC54KSB7XG4gICAgICAgIC8vIEluY2x1ZGVzIFwiaG9yaXpvbnRhbE9ubHlcIiBjYXNlIGZvciBsYWJlbHMgd2l0aG91dCB2ZXJ0aWNhbCBnbHlwaHNcbiAgICAgICAgcmV0dXJuIHtuZWVkc0ZsaXBwaW5nOiB0cnVlfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBmb250U2l6ZSwgZmxpcCwga2VlcFVwcmlnaHQsIHBvc01hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHByb2plY3Rpb25DYWNoZSwgYXNwZWN0UmF0aW8pIHtcbiAgICBjb25zdCBmb250U2NhbGUgPSBmb250U2l6ZSAvIDI0O1xuICAgIGNvbnN0IGxpbmVPZmZzZXRYID0gc3ltYm9sLmxpbmVPZmZzZXRYICogZm9udFNjYWxlO1xuICAgIGNvbnN0IGxpbmVPZmZzZXRZID0gc3ltYm9sLmxpbmVPZmZzZXRZICogZm9udFNjYWxlO1xuXG4gICAgbGV0IHBsYWNlZEdseXBocztcbiAgICBpZiAoc3ltYm9sLm51bUdseXBocyA+IDEpIHtcbiAgICAgICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgICAgICBjb25zdCBsaW5lU3RhcnRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleDtcbiAgICAgICAgY29uc3QgbGluZUVuZEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLmxpbmVMZW5ndGg7XG5cbiAgICAgICAgLy8gUGxhY2UgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBnbHlwaCBpbiB0aGUgbGFiZWwgZmlyc3QsIHNvIHdlIGNhbiBmaWd1cmUgb3V0XG4gICAgICAgIC8vIHRoZSBvdmVyYWxsIG9yaWVudGF0aW9uIG9mIHRoZSBsYWJlbCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgZmxpcHBlZCBpbiBrZWVwVXByaWdodCBtb2RlXG4gICAgICAgIGNvbnN0IGZpcnN0QW5kTGFzdEdseXBoID0gcGxhY2VGaXJzdEFuZExhc3RHbHlwaChmb250U2NhbGUsIGdseXBoT2Zmc2V0QXJyYXksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSk7XG4gICAgICAgIGlmICghZmlyc3RBbmRMYXN0R2x5cGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7bm90RW5vdWdoUm9vbTogdHJ1ZX07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IHByb2plY3QoZmlyc3RBbmRMYXN0R2x5cGguZmlyc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuICAgICAgICBjb25zdCBsYXN0UG9pbnQgPSBwcm9qZWN0KGZpcnN0QW5kTGFzdEdseXBoLmxhc3QucG9pbnQsIGdsQ29vcmRNYXRyaXgpLnBvaW50O1xuXG4gICAgICAgIGlmIChrZWVwVXByaWdodCAmJiAhZmxpcCkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZW50YXRpb25DaGFuZ2UgPSByZXF1aXJlc09yaWVudGF0aW9uQ2hhbmdlKHN5bWJvbC53cml0aW5nTW9kZSwgZmlyc3RQb2ludCwgbGFzdFBvaW50LCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICBpZiAob3JpZW50YXRpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZW50YXRpb25DaGFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwbGFjZWRHbHlwaHMgPSBbZmlyc3RBbmRMYXN0R2x5cGguZmlyc3RdO1xuICAgICAgICBmb3IgKGxldCBnbHlwaEluZGV4ID0gc3ltYm9sLmdseXBoU3RhcnRJbmRleCArIDE7IGdseXBoSW5kZXggPCBnbHlwaEVuZEluZGV4IC0gMTsgZ2x5cGhJbmRleCsrKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBmaXJzdCBhbmQgbGFzdCBnbHlwaCBmaXQgb24gdGhlIGxpbmUsIHdlJ3JlIHN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgZ2x5cGhzIGNhbiBiZSBwbGFjZWRcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICAgIHBsYWNlZEdseXBocy5wdXNoKHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZ2x5cGhPZmZzZXRBcnJheS5nZXRvZmZzZXRYKGdseXBoSW5kZXgpLCBsaW5lT2Zmc2V0WCwgbGluZU9mZnNldFksIGZsaXAsIGFuY2hvclBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHN5bWJvbC5zZWdtZW50LFxuICAgICAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcGxhY2VkR2x5cGhzLnB1c2goZmlyc3RBbmRMYXN0R2x5cGgubGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBhIHNpbmdsZSBnbHlwaCB0byBwbGFjZVxuICAgICAgICAvLyBTbywgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmxpcCBiYXNlZCBvbiBwcm9qZWN0ZWQgYW5nbGUgb2YgdGhlIGxpbmUgc2VnbWVudCBpdCdzIG9uXG4gICAgICAgIGlmIChrZWVwVXByaWdodCAmJiAhZmxpcCkge1xuICAgICAgICAgICAgY29uc3QgYSA9IHByb2plY3QodGlsZUFuY2hvclBvaW50LCBwb3NNYXRyaXgpLnBvaW50O1xuICAgICAgICAgICAgY29uc3QgdGlsZVZlcnRleEluZGV4ID0gKHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5zZWdtZW50ICsgMSk7XG4gICAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgICAgICBjb25zdCB0aWxlU2VnbWVudEVuZCA9IG5ldyBQb2ludChsaW5lVmVydGV4QXJyYXkuZ2V0eCh0aWxlVmVydGV4SW5kZXgpLCBsaW5lVmVydGV4QXJyYXkuZ2V0eSh0aWxlVmVydGV4SW5kZXgpKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZFZlcnRleCA9IHByb2plY3QodGlsZVNlZ21lbnRFbmQsIHBvc01hdHJpeCk7XG4gICAgICAgICAgICAvLyBXZSBrbm93IHRoZSBhbmNob3Igd2lsbCBiZSBpbiB0aGUgdmlld3BvcnQsIGJ1dCB0aGUgZW5kIG9mIHRoZSBsaW5lIHNlZ21lbnQgbWF5IGJlXG4gICAgICAgICAgICAvLyBiZWhpbmQgdGhlIHBsYW5lIG9mIHRoZSBjYW1lcmEsIGluIHdoaWNoIGNhc2Ugd2UgY2FuIHVzZSBhIHBvaW50IGF0IGFueSBhcmJpdHJhcnkgKGNsb3NlcilcbiAgICAgICAgICAgIC8vIHBvaW50IG9uIHRoZSBzZWdtZW50LlxuICAgICAgICAgICAgY29uc3QgYiA9IChwcm9qZWN0ZWRWZXJ0ZXguc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhID4gMCkgP1xuICAgICAgICAgICAgICAgIHByb2plY3RlZFZlcnRleC5wb2ludCA6XG4gICAgICAgICAgICAgICAgcHJvamVjdFRydW5jYXRlZExpbmVTZWdtZW50KHRpbGVBbmNob3JQb2ludCwgdGlsZVNlZ21lbnRFbmQsIGEsIDEsIHBvc01hdHJpeCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlID0gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZShzeW1ib2wud3JpdGluZ01vZGUsIGEsIGIsIGFzcGVjdFJhdGlvKTtcbiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnRhdGlvbkNoYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgIGNvbnN0IHNpbmdsZUdseXBoID0gcGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoc3ltYm9sLmdseXBoU3RhcnRJbmRleCksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgICAgICBzeW1ib2wubGluZVN0YXJ0SW5kZXgsIHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5saW5lTGVuZ3RoLCBsaW5lVmVydGV4QXJyYXksIGxhYmVsUGxhbmVNYXRyaXgsIHByb2plY3Rpb25DYWNoZSk7XG4gICAgICAgIGlmICghc2luZ2xlR2x5cGgpXG4gICAgICAgICAgICByZXR1cm4ge25vdEVub3VnaFJvb206IHRydWV9O1xuXG4gICAgICAgIHBsYWNlZEdseXBocyA9IFtzaW5nbGVHbHlwaF07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBnbHlwaDogYW55IG9mIHBsYWNlZEdseXBocykge1xuICAgICAgICBhZGREeW5hbWljQXR0cmlidXRlcyhkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGdseXBoLnBvaW50LCBnbHlwaC5hbmdsZSk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFRydW5jYXRlZExpbmVTZWdtZW50KHByZXZpb3VzVGlsZVBvaW50OiBQb2ludCwgY3VycmVudFRpbGVQb2ludDogUG9pbnQsIHByZXZpb3VzUHJvamVjdGVkUG9pbnQ6IFBvaW50LCBtaW5pbXVtTGVuZ3RoOiBudW1iZXIsIHByb2plY3Rpb25NYXRyaXg6IG1hdDQpIHtcbiAgICAvLyBXZSBhcmUgYXNzdW1pbmcgXCJwcmV2aW91c1RpbGVQb2ludFwiIHdvbid0IHByb2plY3QgdG8gYSBwb2ludCB3aXRoaW4gb25lIHVuaXQgb2YgdGhlIGNhbWVyYSBwbGFuZVxuICAgIC8vIElmIGl0IGRpZCwgdGhhdCB3b3VsZCBtZWFuIG91ciBsYWJlbCBleHRlbmRlZCBhbGwgdGhlIHdheSBvdXQgZnJvbSB3aXRoaW4gdGhlIHZpZXdwb3J0IHRvIGEgKHZlcnkgZGlzdGFudClcbiAgICAvLyBwb2ludCBuZWFyIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLiBXZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHJlbmRlciB0aGUgbGFiZWwgYW55d2F5IG9uY2UgaXQgY3Jvc3NlZCB0aGVcbiAgICAvLyBwbGFuZSBvZiB0aGUgY2FtZXJhLlxuICAgIGNvbnN0IHByb2plY3RlZFVuaXRWZXJ0ZXggPSBwcm9qZWN0KHByZXZpb3VzVGlsZVBvaW50LmFkZChwcmV2aW91c1RpbGVQb2ludC5zdWIoY3VycmVudFRpbGVQb2ludCkuX3VuaXQoKSksIHByb2plY3Rpb25NYXRyaXgpLnBvaW50O1xuICAgIGNvbnN0IHByb2plY3RlZFVuaXRTZWdtZW50ID0gcHJldmlvdXNQcm9qZWN0ZWRQb2ludC5zdWIocHJvamVjdGVkVW5pdFZlcnRleCk7XG5cbiAgICByZXR1cm4gcHJldmlvdXNQcm9qZWN0ZWRQb2ludC5hZGQocHJvamVjdGVkVW5pdFNlZ21lbnQuX211bHQobWluaW11bUxlbmd0aCAvIHByb2plY3RlZFVuaXRTZWdtZW50Lm1hZygpKSk7XG59XG5cbmZ1bmN0aW9uIHBsYWNlR2x5cGhBbG9uZ0xpbmUob2Zmc2V0WDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0WTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JQb2ludDogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVBbmNob3JQb2ludDogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclNlZ21lbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4OiBtYXQ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uQ2FjaGU6IHtbXzogbnVtYmVyXTogUG9pbnR9KSB7XG5cbiAgICBjb25zdCBjb21iaW5lZE9mZnNldFggPSBmbGlwID9cbiAgICAgICAgb2Zmc2V0WCAtIGxpbmVPZmZzZXRYIDpcbiAgICAgICAgb2Zmc2V0WCArIGxpbmVPZmZzZXRYO1xuXG4gICAgbGV0IGRpciA9IGNvbWJpbmVkT2Zmc2V0WCA+IDAgPyAxIDogLTE7XG5cbiAgICBsZXQgYW5nbGUgPSAwO1xuICAgIGlmIChmbGlwKSB7XG4gICAgICAgIC8vIFRoZSBsYWJlbCBuZWVkcyB0byBiZSBmbGlwcGVkIHRvIGtlZXAgdGV4dCB1cHJpZ2h0LlxuICAgICAgICAvLyBJdGVyYXRlIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbi5cbiAgICAgICAgZGlyICo9IC0xO1xuICAgICAgICBhbmdsZSA9IE1hdGguUEk7XG4gICAgfVxuXG4gICAgaWYgKGRpciA8IDApIGFuZ2xlICs9IE1hdGguUEk7XG5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gZGlyID4gMCA/XG4gICAgICAgIGxpbmVTdGFydEluZGV4ICsgYW5jaG9yU2VnbWVudCA6XG4gICAgICAgIGxpbmVTdGFydEluZGV4ICsgYW5jaG9yU2VnbWVudCArIDE7XG5cbiAgICBsZXQgY3VycmVudCA9IGFuY2hvclBvaW50O1xuICAgIGxldCBwcmV2ID0gYW5jaG9yUG9pbnQ7XG4gICAgbGV0IGRpc3RhbmNlVG9QcmV2ID0gMDtcbiAgICBsZXQgY3VycmVudFNlZ21lbnREaXN0YW5jZSA9IDA7XG4gICAgY29uc3QgYWJzT2Zmc2V0WCA9IE1hdGguYWJzKGNvbWJpbmVkT2Zmc2V0WCk7XG4gICAgY29uc3QgcGF0aFZlcnRpY2VzID0gW107XG5cbiAgICB3aGlsZSAoZGlzdGFuY2VUb1ByZXYgKyBjdXJyZW50U2VnbWVudERpc3RhbmNlIDw9IGFic09mZnNldFgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ICs9IGRpcjtcblxuICAgICAgICAvLyBvZmZzZXQgZG9lcyBub3QgZml0IG9uIHRoZSBwcm9qZWN0ZWQgbGluZVxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgbGluZVN0YXJ0SW5kZXggfHwgY3VycmVudEluZGV4ID49IGxpbmVFbmRJbmRleClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHByZXYgPSBjdXJyZW50O1xuICAgICAgICBwYXRoVmVydGljZXMucHVzaChjdXJyZW50KTtcblxuICAgICAgICBjdXJyZW50ID0gcHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWZXJ0ZXggPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgoY3VycmVudEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkoY3VycmVudEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gcHJvamVjdChjdXJyZW50VmVydGV4LCBsYWJlbFBsYW5lTWF0cml4KTtcbiAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF0gPSBwcm9qZWN0aW9uLnBvaW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdmVydGV4IGlzIGJlaGluZCB0aGUgcGxhbmUgb2YgdGhlIGNhbWVyYSwgc28gd2UgY2FuJ3QgcHJvamVjdCBpdFxuICAgICAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlJ2xsIGNyZWF0ZSBhIHZlcnRleCBhbG9uZyB0aGUgbGluZSB0aGF0J3MgZmFyIGVub3VnaCB0byBpbmNsdWRlIHRoZSBnbHlwaFxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTGluZVZlcnRleEluZGV4ID0gY3VycmVudEluZGV4IC0gZGlyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVGlsZVBvaW50ID0gZGlzdGFuY2VUb1ByZXYgPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICB0aWxlQW5jaG9yUG9pbnQgOlxuICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgocHJldmlvdXNMaW5lVmVydGV4SW5kZXgpLCBsaW5lVmVydGV4QXJyYXkuZ2V0eShwcmV2aW91c0xpbmVWZXJ0ZXhJbmRleCkpO1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGNhY2hlIGJlY2F1c2UgdGhlIG5ldyB2ZXJ0ZXggbWlnaHQgbm90IGJlIGZhciBlbm91Z2ggb3V0IGZvciBmdXR1cmUgZ2x5cGhzIG9uIHRoZSBzYW1lIHNlZ21lbnRcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcHJvamVjdFRydW5jYXRlZExpbmVTZWdtZW50KHByZXZpb3VzVGlsZVBvaW50LCBjdXJyZW50VmVydGV4LCBwcmV2LCBhYnNPZmZzZXRYIC0gZGlzdGFuY2VUb1ByZXYgKyAxLCBsYWJlbFBsYW5lTWF0cml4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3RhbmNlVG9QcmV2ICs9IGN1cnJlbnRTZWdtZW50RGlzdGFuY2U7XG4gICAgICAgIGN1cnJlbnRTZWdtZW50RGlzdGFuY2UgPSBwcmV2LmRpc3QoY3VycmVudCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHBvaW50IGlzIG9uIHRoZSBjdXJyZW50IHNlZ21lbnQuIEludGVycG9sYXRlIHRvIGZpbmQgaXQuXG4gICAgY29uc3Qgc2VnbWVudEludGVycG9sYXRpb25UID0gKGFic09mZnNldFggLSBkaXN0YW5jZVRvUHJldikgLyBjdXJyZW50U2VnbWVudERpc3RhbmNlO1xuICAgIGNvbnN0IHByZXZUb0N1cnJlbnQgPSBjdXJyZW50LnN1YihwcmV2KTtcbiAgICBjb25zdCBwID0gcHJldlRvQ3VycmVudC5tdWx0KHNlZ21lbnRJbnRlcnBvbGF0aW9uVCkuX2FkZChwcmV2KTtcblxuICAgIC8vIG9mZnNldCB0aGUgcG9pbnQgZnJvbSB0aGUgbGluZSB0byB0ZXh0LW9mZnNldCBhbmQgaWNvbi1vZmZzZXRcbiAgICBwLl9hZGQocHJldlRvQ3VycmVudC5fdW5pdCgpLl9wZXJwKCkuX211bHQobGluZU9mZnNldFkgKiBkaXIpKTtcblxuICAgIGNvbnN0IHNlZ21lbnRBbmdsZSA9IGFuZ2xlICsgTWF0aC5hdGFuMihjdXJyZW50LnkgLSBwcmV2LnksIGN1cnJlbnQueCAtIHByZXYueCk7XG5cbiAgICBwYXRoVmVydGljZXMucHVzaChwKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiBwLFxuICAgICAgICBhbmdsZTogc2VnbWVudEFuZ2xlLFxuICAgICAgICBwYXRoOiBwYXRoVmVydGljZXNcbiAgICB9O1xufVxuXG5jb25zdCBoaWRkZW5HbHlwaEF0dHJpYnV0ZXMgPSBuZXcgRmxvYXQzMkFycmF5KFstSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLUluZmluaXR5LCAtSW5maW5pdHksIDAsIC1JbmZpbml0eSwgLUluZmluaXR5LCAwLCAtSW5maW5pdHksIC1JbmZpbml0eSwgMF0pO1xuXG4vLyBIaWRlIHRoZW0gYnkgbW92aW5nIHRoZW0gb2Zmc2NyZWVuLiBXZSBzdGlsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoZSBidWZmZXJcbi8vIGJlY2F1c2UgdGhlIGR5bmFtaWMgYnVmZmVyIGlzIHBhaXJlZCB3aXRoIGEgc3RhdGljIGJ1ZmZlciB0aGF0IGRvZXNuJ3QgZ2V0IHVwZGF0ZWQuXG5mdW5jdGlvbiBoaWRlR2x5cGhzKG51bTogbnVtYmVyLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXk6IFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZHluYW1pY0xheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LnJlc2l6ZShvZmZzZXQgKyA0KTtcbiAgICAgICAgLy8gU2luY2UgYWxsIGhpZGRlbiBnbHlwaHMgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCB3ZSBjYW4gYnVpbGQgdXAgdGhlIGFycmF5IGZhc3RlciB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gRmxvYXQzMkFycmF5LnNldFxuICAgICAgICAvLyBmb3IgZWFjaCBzZXQgb2YgZm91ciB2ZXJ0aWNlcywgaW5zdGVhZCBvZiBjYWxsaW5nIGFkZER5bmFtaWNBdHRyaWJ1dGVzIGZvciBlYWNoIHZlcnRleC5cbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmZsb2F0MzIuc2V0KGhpZGRlbkdseXBoQXR0cmlidXRlcywgb2Zmc2V0ICogMyk7XG4gICAgfVxufVxuXG4vLyBGb3IgbGluZSBsYWJlbCBsYXlvdXQsIHdlJ3JlIG5vdCB1c2luZyB6IG91dHB1dCBhbmQgb3VyIHcgaW5wdXQgaXMgYWx3YXlzIDFcbi8vIFRoaXMgY3VzdG9tIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbiBpZ25vcmVzIHRob3NlIGNvbXBvbmVudHMgdG8gbWFrZSBwcm9qZWN0aW9uIGZhc3RlclxuZnVuY3Rpb24geHlUcmFuc2Zvcm1NYXQ0KG91dDogdmVjNCwgYTogdmVjNCwgbTogbWF0NCkge1xuICAgIGNvbnN0IHggPSBhWzBdLCB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IGNsaXBMaW5lIGZyb20gJy4vY2xpcF9saW5lJztcbmltcG9ydCBQYXRoSW50ZXJwb2xhdG9yIGZyb20gJy4vcGF0aF9pbnRlcnBvbGF0b3InO1xuXG5pbXBvcnQgKiBhcyBpbnRlcnNlY3Rpb25UZXN0cyBmcm9tICcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cyc7XG5pbXBvcnQgR3JpZCBmcm9tICcuL2dyaWRfaW5kZXgnO1xuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuLi9zeW1ib2wvb25lX2VtJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgcHJvamVjdGlvbiBmcm9tICcuLi9zeW1ib2wvcHJvamVjdGlvbic7XG5cbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHtTaW5nbGVDb2xsaXNpb25Cb3h9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IHR5cGUge1xuICAgIEdseXBoT2Zmc2V0QXJyYXksXG4gICAgU3ltYm9sTGluZVZlcnRleEFycmF5XG59IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuXG4vLyBXaGVuIGEgc3ltYm9sIGNyb3NzZXMgdGhlIGVkZ2UgdGhhdCBjYXVzZXMgaXQgdG8gYmUgaW5jbHVkZWQgaW5cbi8vIGNvbGxpc2lvbiBkZXRlY3Rpb24sIGl0IHdpbGwgY2F1c2UgY2hhbmdlcyBpbiB0aGUgc3ltYm9scyBhcm91bmRcbi8vIGl0LiBUaGlzIGNvbnN0YW50IHNwZWNpZmllcyBob3cgbWFueSBwaXhlbHMgdG8gcGFkIHRoZSBlZGdlIG9mXG4vLyB0aGUgdmlld3BvcnQgZm9yIGNvbGxpc2lvbiBkZXRlY3Rpb24gc28gdGhhdCB0aGUgYnVsayBvZiB0aGUgY2hhbmdlc1xuLy8gb2NjdXIgb2Zmc2NyZWVuLiBNYWtpbmcgdGhpcyBjb25zdGFudCBncmVhdGVyIGluY3JlYXNlcyBsYWJlbFxuLy8gc3RhYmlsaXR5LCBidXQgaXQncyBleHBlbnNpdmUuXG5jb25zdCB2aWV3cG9ydFBhZGRpbmcgPSAxMDA7XG5cbi8qKlxuICogQSBjb2xsaXNpb24gaW5kZXggdXNlZCB0byBwcmV2ZW50IHN5bWJvbHMgZnJvbSBvdmVybGFwcGluZy4gSXQga2VlcCB0cmFja3Mgb2ZcbiAqIHdoZXJlIHByZXZpb3VzIHN5bWJvbHMgaGF2ZSBiZWVuIHBsYWNlZCBhbmQgaXMgdXNlZCB0byBjaGVjayBpZiBhIG5ld1xuICogc3ltYm9sIG92ZXJsYXBzIHdpdGggYW55IHByZXZpb3VzbHkgYWRkZWQgc3ltYm9scy5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIHN0ZXBzIHRvIGluc2VydGlvbjogZmlyc3QgcGxhY2VDb2xsaXNpb25Cb3gvQ2lyY2xlcyBjaGVja3MgaWZcbiAqIHRoZXJlJ3Mgcm9vbSBmb3IgYSBzeW1ib2wsIHRoZW4gaW5zZXJ0Q29sbGlzaW9uQm94L0NpcmNsZXMgYWN0dWFsbHkgcHV0cyB0aGVcbiAqIHN5bWJvbCBpbiB0aGUgaW5kZXguIFRoZSB0d28gc3RlcCBwcm9jZXNzIGFsbG93cyBwYWlyZWQgc3ltYm9scyB0byBiZSBpbnNlcnRlZFxuICogdG9nZXRoZXIgZXZlbiBpZiB0aGV5IG92ZXJsYXAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29sbGlzaW9uSW5kZXgge1xuICAgIGdyaWQ6IEdyaWQ7XG4gICAgaWdub3JlZEdyaWQ6IEdyaWQ7XG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm07XG4gICAgcGl0Y2hmYWN0b3I6IG51bWJlcjtcbiAgICBzY3JlZW5SaWdodEJvdW5kYXJ5OiBudW1iZXI7XG4gICAgc2NyZWVuQm90dG9tQm91bmRhcnk6IG51bWJlcjtcbiAgICBncmlkUmlnaHRCb3VuZGFyeTogbnVtYmVyO1xuICAgIGdyaWRCb3R0b21Cb3VuZGFyeTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICBncmlkOiBHcmlkID0gbmV3IEdyaWQodHJhbnNmb3JtLndpZHRoICsgMiAqIHZpZXdwb3J0UGFkZGluZywgdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIDI1KSxcbiAgICAgICAgaWdub3JlZEdyaWQ6IEdyaWQgPSBuZXcgR3JpZCh0cmFuc2Zvcm0ud2lkdGggKyAyICogdmlld3BvcnRQYWRkaW5nLCB0cmFuc2Zvcm0uaGVpZ2h0ICsgMiAqIHZpZXdwb3J0UGFkZGluZywgMjUpXG4gICAgKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHRoaXMuaWdub3JlZEdyaWQgPSBpZ25vcmVkR3JpZDtcbiAgICAgICAgdGhpcy5waXRjaGZhY3RvciA9IE1hdGguY29zKHRyYW5zZm9ybS5fcGl0Y2gpICogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG5cbiAgICAgICAgdGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5ID0gdHJhbnNmb3JtLndpZHRoICsgdmlld3BvcnRQYWRkaW5nO1xuICAgICAgICB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5ID0gdHJhbnNmb3JtLmhlaWdodCArIHZpZXdwb3J0UGFkZGluZztcbiAgICAgICAgdGhpcy5ncmlkUmlnaHRCb3VuZGFyeSA9IHRyYW5zZm9ybS53aWR0aCArIDIgKiB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5ID0gdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmc7XG4gICAgfVxuXG4gICAgcGxhY2VDb2xsaXNpb25Cb3goY29sbGlzaW9uQm94OiBTaW5nbGVDb2xsaXNpb25Cb3gsIGFsbG93T3ZlcmxhcDogYm9vbGVhbiwgdGV4dFBpeGVsUmF0aW86IG51bWJlciwgcG9zTWF0cml4OiBtYXQ0LCBjb2xsaXNpb25Hcm91cFByZWRpY2F0ZT86IGFueSk6IHsgYm94OiBBcnJheTxudW1iZXI+LCBvZmZzY3JlZW46IGJvb2xlYW4gfSB7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZFBvaW50ID0gdGhpcy5wcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhwb3NNYXRyaXgsIGNvbGxpc2lvbkJveC5hbmNob3JQb2ludFgsIGNvbGxpc2lvbkJveC5hbmNob3JQb2ludFkpO1xuICAgICAgICBjb25zdCB0aWxlVG9WaWV3cG9ydCA9IHRleHRQaXhlbFJhdGlvICogcHJvamVjdGVkUG9pbnQucGVyc3BlY3RpdmVSYXRpbztcbiAgICAgICAgY29uc3QgdGxYID0gY29sbGlzaW9uQm94LngxICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICBjb25zdCB0bFkgPSBjb2xsaXNpb25Cb3gueTEgKiB0aWxlVG9WaWV3cG9ydCArIHByb2plY3RlZFBvaW50LnBvaW50Lnk7XG4gICAgICAgIGNvbnN0IGJyWCA9IGNvbGxpc2lvbkJveC54MiAqIHRpbGVUb1ZpZXdwb3J0ICsgcHJvamVjdGVkUG9pbnQucG9pbnQueDtcbiAgICAgICAgY29uc3QgYnJZID0gY29sbGlzaW9uQm94LnkyICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC55O1xuXG4gICAgICAgIGlmICghdGhpcy5pc0luc2lkZUdyaWQodGxYLCB0bFksIGJyWCwgYnJZKSB8fFxuICAgICAgICAgICAgKCFhbGxvd092ZXJsYXAgJiYgdGhpcy5ncmlkLmhpdFRlc3QodGxYLCB0bFksIGJyWCwgYnJZLCBjb2xsaXNpb25Hcm91cFByZWRpY2F0ZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJveDogW10sXG4gICAgICAgICAgICAgICAgb2Zmc2NyZWVuOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBib3g6IFt0bFgsIHRsWSwgYnJYLCBiclldLFxuICAgICAgICAgICAgb2Zmc2NyZWVuOiB0aGlzLmlzT2Zmc2NyZWVuKHRsWCwgdGxZLCBiclgsIGJyWSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwbGFjZUNvbGxpc2lvbkNpcmNsZXMoYWxsb3dPdmVybGFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2w6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVZlcnRleEFycmF5OiBTeW1ib2xMaW5lVmVydGV4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoT2Zmc2V0QXJyYXk6IEdseXBoT2Zmc2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUb1NjcmVlbk1hdHJpeD86IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25DaXJjbGVzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlPzogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVQaXhlbERpYW1ldGVyOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRQaXhlbFBhZGRpbmc6IG51bWJlcik6IHsgY2lyY2xlczogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuLCBjb2xsaXNpb25EZXRlY3RlZDogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHRpbGVVbml0QW5jaG9yUG9pbnQgPSBuZXcgUG9pbnQoc3ltYm9sLmFuY2hvclgsIHN5bWJvbC5hbmNob3JZKTtcbiAgICAgICAgY29uc3Qgc2NyZWVuQW5jaG9yUG9pbnQgPSBwcm9qZWN0aW9uLnByb2plY3QodGlsZVVuaXRBbmNob3JQb2ludCwgcG9zTWF0cml4KTtcbiAgICAgICAgY29uc3QgcGVyc3BlY3RpdmVSYXRpbyA9IHByb2plY3Rpb24uZ2V0UGVyc3BlY3RpdmVSYXRpbyh0aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLCBzY3JlZW5BbmNob3JQb2ludC5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEpO1xuICAgICAgICBjb25zdCBsYWJlbFBsYW5lRm9udFNpemUgPSBwaXRjaFdpdGhNYXAgPyBmb250U2l6ZSAvIHBlcnNwZWN0aXZlUmF0aW8gOiBmb250U2l6ZSAqIHBlcnNwZWN0aXZlUmF0aW87XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVGb250U2NhbGUgPSBsYWJlbFBsYW5lRm9udFNpemUgLyBPTkVfRU07XG5cbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZUFuY2hvclBvaW50ID0gcHJvamVjdGlvbi5wcm9qZWN0KHRpbGVVbml0QW5jaG9yUG9pbnQsIGxhYmVsUGxhbmVNYXRyaXgpLnBvaW50O1xuXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25DYWNoZSA9IHt9O1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0WCA9IHN5bWJvbC5saW5lT2Zmc2V0WCAqIGxhYmVsUGxhbmVGb250U2NhbGU7XG4gICAgICAgIGNvbnN0IGxpbmVPZmZzZXRZID0gc3ltYm9sLmxpbmVPZmZzZXRZICogbGFiZWxQbGFuZUZvbnRTY2FsZTtcblxuICAgICAgICBjb25zdCBmaXJzdEFuZExhc3RHbHlwaCA9IHByb2plY3Rpb24ucGxhY2VGaXJzdEFuZExhc3RHbHlwaChcbiAgICAgICAgICAgIGxhYmVsUGxhbmVGb250U2NhbGUsXG4gICAgICAgICAgICBnbHlwaE9mZnNldEFycmF5LFxuICAgICAgICAgICAgbGluZU9mZnNldFgsXG4gICAgICAgICAgICBsaW5lT2Zmc2V0WSxcbiAgICAgICAgICAgIC8qZmxpcCovIGZhbHNlLFxuICAgICAgICAgICAgbGFiZWxQbGFuZUFuY2hvclBvaW50LFxuICAgICAgICAgICAgdGlsZVVuaXRBbmNob3JQb2ludCxcbiAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICBwcm9qZWN0aW9uQ2FjaGUpO1xuXG4gICAgICAgIGxldCBjb2xsaXNpb25EZXRlY3RlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaW5HcmlkID0gZmFsc2U7XG4gICAgICAgIGxldCBlbnRpcmVseU9mZnNjcmVlbiA9IHRydWU7XG5cbiAgICAgICAgaWYgKGZpcnN0QW5kTGFzdEdseXBoKSB7XG4gICAgICAgICAgICBjb25zdCByYWRpdXMgPSBjaXJjbGVQaXhlbERpYW1ldGVyICogMC41ICogcGVyc3BlY3RpdmVSYXRpbyArIHRleHRQaXhlbFBhZGRpbmc7XG4gICAgICAgICAgICBjb25zdCBzY3JlZW5QbGFuZU1pbiA9IG5ldyBQb2ludCgtdmlld3BvcnRQYWRkaW5nLCAtdmlld3BvcnRQYWRkaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmVlblBsYW5lTWF4ID0gbmV3IFBvaW50KHRoaXMuc2NyZWVuUmlnaHRCb3VuZGFyeSwgdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeSk7XG4gICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0b3IgPSBuZXcgUGF0aEludGVycG9sYXRvcigpO1xuXG4gICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYSBwcm9qZWN0ZWQgcGF0aCBmcm9tIHByb2plY3RlZCBsaW5lIHZlcnRpY2VzLiBBbmNob3IgcG9pbnRzIGFyZSBpZ25vcmVkIGFuZCByZW1vdmVkXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGZpcnN0QW5kTGFzdEdseXBoLmZpcnN0O1xuICAgICAgICAgICAgY29uc3QgbGFzdCA9IGZpcnN0QW5kTGFzdEdseXBoLmxhc3Q7XG5cbiAgICAgICAgICAgIGxldCBwcm9qZWN0ZWRQYXRoID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZmlyc3QucGF0aC5sZW5ndGggLSAxOyBpID49IDE7IGktLSkge1xuICAgICAgICAgICAgICAgIHByb2plY3RlZFBhdGgucHVzaChmaXJzdC5wYXRoW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGFzdC5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdGVkUGF0aC5wdXNoKGxhc3QucGF0aFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQocHJvamVjdGVkUGF0aC5sZW5ndGggPj0gMik7XG5cbiAgICAgICAgICAgIC8vIFRvbGVyYXRlIGEgc2xpZ2h0bHkgbG9uZ2VyIGRpc3RhbmNlIHRoYW4gb25lIGRpYW1ldGVyIGJldHdlZW4gdHdvIGFkamFjZW50IGNpcmNsZXNcbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZURpc3QgPSByYWRpdXMgKiAyLjU7XG5cbiAgICAgICAgICAgIC8vIFRoZSBwYXRoIG1pZ2h0IG5lZWQgdG8gYmUgY29udmVydGVkIGludG8gc2NyZWVuIHNwYWNlIGlmIGEgcGl0Y2hlZCBtYXAgaXMgdXNlZCBhcyB0aGUgbGFiZWwgc3BhY2VcbiAgICAgICAgICAgIGlmIChsYWJlbFRvU2NyZWVuTWF0cml4KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuU3BhY2VQYXRoID0gcHJvamVjdGVkUGF0aC5tYXAocCA9PiBwcm9qZWN0aW9uLnByb2plY3QocCwgbGFiZWxUb1NjcmVlbk1hdHJpeCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHRyeSB0byBwbGFjZSBjb2xsaXNpb24gY2lyY2xlcyBpZiBldmVuIG9mIHRoZSBwb2ludHMgaXMgYmVoaW5kIHRoZSBjYW1lcmEuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHBsYXVzaWJsZSBzY2VuYXJpbyB3aXRoIGJpZyBjYW1lcmEgcGl0Y2ggYW5nbGVzXG4gICAgICAgICAgICAgICAgaWYgKHNjcmVlblNwYWNlUGF0aC5zb21lKHBvaW50ID0+IHBvaW50LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA8PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ZWRQYXRoID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGVkUGF0aCA9IHNjcmVlblNwYWNlUGF0aC5tYXAocCA9PiBwLnBvaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzZWdtZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAocHJvamVjdGVkUGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVpY2tseSBjaGVjayBpZiB0aGUgcGF0aCBpcyBmdWxseSBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgcGFkZGVkIGNvbGxpc2lvbiByZWdpb24uXG4gICAgICAgICAgICAgICAgLy8gRm9yIG92ZXJsYXBwaW5nIHBhdGhzIHdlJ2xsIG9ubHkgY3JlYXRlIGNvbGxpc2lvbiBjaXJjbGVzIGZvciB0aGUgdmlzaWJsZSBzZWdtZW50c1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pblBvaW50ID0gcHJvamVjdGVkUGF0aFswXS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvaW50ID0gcHJvamVjdGVkUGF0aFswXS5jbG9uZSgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9qZWN0ZWRQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pblBvaW50LnggPSBNYXRoLm1pbihtaW5Qb2ludC54LCBwcm9qZWN0ZWRQYXRoW2ldLngpO1xuICAgICAgICAgICAgICAgICAgICBtaW5Qb2ludC55ID0gTWF0aC5taW4obWluUG9pbnQueSwgcHJvamVjdGVkUGF0aFtpXS55KTtcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnQueCA9IE1hdGgubWF4KG1heFBvaW50LngsIHByb2plY3RlZFBhdGhbaV0ueCk7XG4gICAgICAgICAgICAgICAgICAgIG1heFBvaW50LnkgPSBNYXRoLm1heChtYXhQb2ludC55LCBwcm9qZWN0ZWRQYXRoW2ldLnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtaW5Qb2ludC54ID49IHNjcmVlblBsYW5lTWluLnggJiYgbWF4UG9pbnQueCA8PSBzY3JlZW5QbGFuZU1heC54ICYmXG4gICAgICAgICAgICAgICAgICAgIG1pblBvaW50LnkgPj0gc2NyZWVuUGxhbmVNaW4ueSAmJiBtYXhQb2ludC55IDw9IHNjcmVlblBsYW5lTWF4LnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVhZCBmdWxseSB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzID0gW3Byb2plY3RlZFBhdGhdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4UG9pbnQueCA8IHNjcmVlblBsYW5lTWluLnggfHwgbWluUG9pbnQueCA+IHNjcmVlblBsYW5lTWF4LnggfHxcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnQueSA8IHNjcmVlblBsYW5lTWluLnkgfHwgbWluUG9pbnQueSA+IHNjcmVlblBsYW5lTWF4LnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90IHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWdtZW50cyA9IGNsaXBMaW5lKFtwcm9qZWN0ZWRQYXRoXSwgc2NyZWVuUGxhbmVNaW4ueCwgc2NyZWVuUGxhbmVNaW4ueSwgc2NyZWVuUGxhbmVNYXgueCwgc2NyZWVuUGxhbmVNYXgueSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdtZW50cykge1xuICAgICAgICAgICAgICAgIC8vIGludGVycG9sYXRlIHBvc2l0aW9ucyBmb3IgY29sbGlzaW9uIGNpcmNsZXMuIEFkZCBhIHNtYWxsIHBhZGRpbmcgdG8gYm90aCBlbmRzIG9mIHRoZSBzZWdtZW50XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHNlZy5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0b3IucmVzZXQoc2VnLCByYWRpdXMgKiAwLjI1KTtcblxuICAgICAgICAgICAgICAgIGxldCBudW1DaXJjbGVzID0gMDtcblxuICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0b3IubGVuZ3RoIDw9IDAuNSAqIHJhZGl1cykge1xuICAgICAgICAgICAgICAgICAgICBudW1DaXJjbGVzID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBudW1DaXJjbGVzID0gTWF0aC5jZWlsKGludGVycG9sYXRvci5wYWRkZWRMZW5ndGggLyBjaXJjbGVEaXN0KSArIDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1DaXJjbGVzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGkgLyBNYXRoLm1heChudW1DaXJjbGVzIC0gMSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNpcmNsZVBvc2l0aW9uID0gaW50ZXJwb2xhdG9yLmxlcnAodCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHZpZXdwb3J0IHBhZGRpbmcgdG8gdGhlIHBvc2l0aW9uIGFuZCBwZXJmb3JtIGluaXRpYWwgY29sbGlzaW9uIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlclggPSBjaXJjbGVQb3NpdGlvbi54ICsgdmlld3BvcnRQYWRkaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW50ZXJZID0gY2lyY2xlUG9zaXRpb24ueSArIHZpZXdwb3J0UGFkZGluZztcblxuICAgICAgICAgICAgICAgICAgICBwbGFjZWRDb2xsaXNpb25DaXJjbGVzLnB1c2goY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCAwKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB4MSA9IGNlbnRlclggLSByYWRpdXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHkxID0gY2VudGVyWSAtIHJhZGl1cztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeDIgPSBjZW50ZXJYICsgcmFkaXVzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5MiA9IGNlbnRlclkgKyByYWRpdXM7XG5cbiAgICAgICAgICAgICAgICAgICAgZW50aXJlbHlPZmZzY3JlZW4gPSBlbnRpcmVseU9mZnNjcmVlbiAmJiB0aGlzLmlzT2Zmc2NyZWVuKHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgICAgICAgICAgICAgICAgaW5HcmlkID0gaW5HcmlkIHx8IHRoaXMuaXNJbnNpZGVHcmlkKHgxLCB5MSwgeDIsIHkyKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG93T3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5oaXRUZXN0Q2lyY2xlKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgY29sbGlzaW9uR3JvdXBQcmVkaWNhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZWFybHkgZXhpdCBpZiB3ZSdyZSBzaG93aW5nIHRoZSBkZWJ1ZyBjaXJjbGVzIGJlY2F1c2Ugd2Ugc3RpbGwgd2FudCB0byBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBjaXJjbGVzIGFyZSBpbiB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25EZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93Q29sbGlzaW9uQ2lyY2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uRGV0ZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2lyY2xlczogKCghc2hvd0NvbGxpc2lvbkNpcmNsZXMgJiYgY29sbGlzaW9uRGV0ZWN0ZWQpIHx8ICFpbkdyaWQpID8gW10gOiBwbGFjZWRDb2xsaXNpb25DaXJjbGVzLFxuICAgICAgICAgICAgb2Zmc2NyZWVuOiBlbnRpcmVseU9mZnNjcmVlbixcbiAgICAgICAgICAgIGNvbGxpc2lvbkRldGVjdGVkXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVjYXVzZSB0aGUgZ2VvbWV0cmllcyBpbiB0aGUgQ29sbGlzaW9uSW5kZXggYXJlIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHNoYXBlIG9mXG4gICAgICogc3ltYm9scyBvbiB0aGUgbWFwLCB3ZSB1c2UgdGhlIENvbGxpc2lvbkluZGV4IHRvIGxvb2sgdXAgdGhlIHN5bWJvbCBwYXJ0IG9mXG4gICAgICogYHF1ZXJ5UmVuZGVyZWRGZWF0dXJlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzKHZpZXdwb3J0UXVlcnlHZW9tZXRyeTogQXJyYXk8UG9pbnQ+KSB7XG4gICAgICAgIGlmICh2aWV3cG9ydFF1ZXJ5R2VvbWV0cnkubGVuZ3RoID09PSAwIHx8ICh0aGlzLmdyaWQua2V5c0xlbmd0aCgpID09PSAwICYmIHRoaXMuaWdub3JlZEdyaWQua2V5c0xlbmd0aCgpID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBbXTtcbiAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHZpZXdwb3J0UXVlcnlHZW9tZXRyeSkge1xuICAgICAgICAgICAgY29uc3QgZ3JpZFBvaW50ID0gbmV3IFBvaW50KHBvaW50LnggKyB2aWV3cG9ydFBhZGRpbmcsIHBvaW50LnkgKyB2aWV3cG9ydFBhZGRpbmcpO1xuICAgICAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGdyaWRQb2ludC54KTtcbiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBncmlkUG9pbnQueSk7XG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgZ3JpZFBvaW50LngpO1xuICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGdyaWRQb2ludC55KTtcbiAgICAgICAgICAgIHF1ZXJ5LnB1c2goZ3JpZFBvaW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5ncmlkLnF1ZXJ5KG1pblgsIG1pblksIG1heFgsIG1heFkpXG4gICAgICAgICAgICAuY29uY2F0KHRoaXMuaWdub3JlZEdyaWQucXVlcnkobWluWCwgbWluWSwgbWF4WCwgbWF4WSkpO1xuXG4gICAgICAgIGNvbnN0IHNlZW5GZWF0dXJlcyA9IHt9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVLZXkgPSBmZWF0dXJlLmtleTtcbiAgICAgICAgICAgIC8vIFNraXAgYWxyZWFkeSBzZWVuIGZlYXR1cmVzLlxuICAgICAgICAgICAgaWYgKHNlZW5GZWF0dXJlc1tmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzZWVuRmVhdHVyZXNbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXSA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlZW5GZWF0dXJlc1tmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdW2ZlYXR1cmVLZXkuZmVhdHVyZUluZGV4XSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBxdWVyeSBpbnRlcnNlY3RzIHdpdGggdGhlIGZlYXR1cmUgYm94XG4gICAgICAgICAgICAvLyBcIkNvbGxpc2lvbiBDaXJjbGVzXCIgZm9yIGxpbmUgbGFiZWxzIGFyZSB0cmVhdGVkIGFzIGJveGVzIGhlcmVcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlJ3Mgbm8gYWN0dWFsIGNvbGxpc2lvbiB0YWtpbmcgcGxhY2UsIHRoZSBjaXJjbGUgdnMuIHNxdWFyZVxuICAgICAgICAgICAgLy8gZGlzdGluY3Rpb24gZG9lc24ndCBtYXR0ZXIgYXMgbXVjaCwgYW5kIGJveCBnZW9tZXRyeSBpcyBlYXNpZXJcbiAgICAgICAgICAgIC8vIHRvIHdvcmsgd2l0aC5cbiAgICAgICAgICAgIGNvbnN0IGJib3ggPSBbXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KGZlYXR1cmUueDEsIGZlYXR1cmUueTEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChmZWF0dXJlLngyLCBmZWF0dXJlLnkxKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MiwgZmVhdHVyZS55MiksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KGZlYXR1cmUueDEsIGZlYXR1cmUueTIpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3Rpb25UZXN0cy5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24ocXVlcnksIGJib3gpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZW5GZWF0dXJlc1tmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdW2ZlYXR1cmVLZXkuZmVhdHVyZUluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0W2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXS5wdXNoKGZlYXR1cmVLZXkuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaW5zZXJ0Q29sbGlzaW9uQm94KGNvbGxpc2lvbkJveDogQXJyYXk8bnVtYmVyPiwgaWdub3JlUGxhY2VtZW50OiBib29sZWFuLCBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXIsIGZlYXR1cmVJbmRleDogbnVtYmVyLCBjb2xsaXNpb25Hcm91cElEOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IGlnbm9yZVBsYWNlbWVudCA/IHRoaXMuaWdub3JlZEdyaWQgOiB0aGlzLmdyaWQ7XG5cbiAgICAgICAgY29uc3Qga2V5ID0ge2J1Y2tldEluc3RhbmNlSWQsIGZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXBJRH07XG4gICAgICAgIGdyaWQuaW5zZXJ0KGtleSwgY29sbGlzaW9uQm94WzBdLCBjb2xsaXNpb25Cb3hbMV0sIGNvbGxpc2lvbkJveFsyXSwgY29sbGlzaW9uQm94WzNdKTtcbiAgICB9XG5cbiAgICBpbnNlcnRDb2xsaXNpb25DaXJjbGVzKGNvbGxpc2lvbkNpcmNsZXM6IEFycmF5PG51bWJlcj4sIGlnbm9yZVBsYWNlbWVudDogYm9vbGVhbiwgYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyLCBmZWF0dXJlSW5kZXg6IG51bWJlciwgY29sbGlzaW9uR3JvdXBJRDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSBpZ25vcmVQbGFjZW1lbnQgPyB0aGlzLmlnbm9yZWRHcmlkIDogdGhpcy5ncmlkO1xuXG4gICAgICAgIGNvbnN0IGtleSA9IHtidWNrZXRJbnN0YW5jZUlkLCBmZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwSUR9O1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbGxpc2lvbkNpcmNsZXMubGVuZ3RoOyBrICs9IDQpIHtcbiAgICAgICAgICAgIGdyaWQuaW5zZXJ0Q2lyY2xlKGtleSwgY29sbGlzaW9uQ2lyY2xlc1trXSwgY29sbGlzaW9uQ2lyY2xlc1trICsgMV0sIGNvbGxpc2lvbkNpcmNsZXNbayArIDJdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2plY3RBbmRHZXRQZXJzcGVjdGl2ZVJhdGlvKHBvc01hdHJpeDogbWF0NCwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcCA9IFt4LCB5LCAwLCAxXTtcbiAgICAgICAgcHJvamVjdGlvbi54eVRyYW5zZm9ybU1hdDQocCwgcCwgcG9zTWF0cml4KTtcbiAgICAgICAgY29uc3QgYSA9IG5ldyBQb2ludChcbiAgICAgICAgICAgICgoKHBbMF0gLyBwWzNdICsgMSkgLyAyKSAqIHRoaXMudHJhbnNmb3JtLndpZHRoKSArIHZpZXdwb3J0UGFkZGluZyxcbiAgICAgICAgICAgICgoKC1wWzFdIC8gcFszXSArIDEpIC8gMikgKiB0aGlzLnRyYW5zZm9ybS5oZWlnaHQpICsgdmlld3BvcnRQYWRkaW5nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb2ludDogYSxcbiAgICAgICAgICAgIC8vIFNlZSBwZXJzcGVjdGl2ZSByYXRpbyBjb21tZW50IGluIHN5bWJvbF9zZGYudmVydGV4XG4gICAgICAgICAgICAvLyBXZSdyZSBkb2luZyBjb2xsaXNpb24gZGV0ZWN0aW9uIGluIHZpZXdwb3J0IHNwYWNlIHNvIHdlIG5lZWRcbiAgICAgICAgICAgIC8vIHRvIHNjYWxlIGRvd24gYm94ZXMgaW4gdGhlIGRpc3RhbmNlXG4gICAgICAgICAgICBwZXJzcGVjdGl2ZVJhdGlvOiAwLjUgKyAwLjUgKiAodGhpcy50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIHBbM10pXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaXNPZmZzY3JlZW4oeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikge1xuICAgICAgICByZXR1cm4geDIgPCB2aWV3cG9ydFBhZGRpbmcgfHwgeDEgPj0gdGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5IHx8IHkyIDwgdmlld3BvcnRQYWRkaW5nIHx8IHkxID4gdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeTtcbiAgICB9XG5cbiAgICBpc0luc2lkZUdyaWQoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikge1xuICAgICAgICByZXR1cm4geDIgPj0gMCAmJiB4MSA8IHRoaXMuZ3JpZFJpZ2h0Qm91bmRhcnkgJiYgeTIgPj0gMCAmJiB5MSA8IHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5O1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBSZXR1cm5zIGEgbWF0cml4IGZvciB0cmFuc2Zvcm1pbmcgY29sbGlzaW9uIHNoYXBlcyB0byB2aWV3cG9ydCBjb29yZGluYXRlIHNwYWNlLlxuICAgICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gcmVuZGVyIGUuZy4gY29sbGlzaW9uIGNpcmNsZXMgb24gdGhlIHNjcmVlbi5cbiAgICAqICAgZXhhbXBsZSB0cmFuc2Zvcm1hdGlvbjogY2xpcFBvcyA9IGdsQ29vcmRNYXRyaXggKiB2aWV3cG9ydE1hdHJpeCAqIGNpcmNsZV9wb3NcbiAgICAqL1xuICAgIGdldFZpZXdwb3J0TWF0cml4KCk6IG1hdDQge1xuICAgICAgICBjb25zdCBtID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFstdmlld3BvcnRQYWRkaW5nLCAtdmlld3BvcnRQYWRkaW5nLCAwLjBdKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb25JbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuXG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkJztcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBpeGVsIHZhbHVlIGF0IGEgdGhlIGdpdmVuIHpvb20gbGV2ZWwgdG8gdGlsZSB1bml0cy5cbiAqXG4gKiBUaGUgc2hhZGVycyBtb3N0bHkgY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgaW4gdGlsZSB1bml0cyBzbyBzdHlsZVxuICogcHJvcGVydGllcyBuZWVkIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHBpeGVscyB0byB0aWxlIHVuaXRzIHVzaW5nIHRoaXMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGEgdHJhbnNsYXRpb24gYnkgMzAgcGl4ZWxzIGF0IHpvb20gNi41IHdpbGwgYmUgYVxuICogdHJhbnNsYXRpb24gYnkgcGl4ZWxzVG9UaWxlVW5pdHMoMzAsIDYuNSkgdGlsZSB1bml0cy5cbiAqXG4gKiBAcmV0dXJucyB2YWx1ZSBpbiB0aWxlIHVuaXRzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyfSwgcGl4ZWxWYWx1ZTogbnVtYmVyLCB6OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwaXhlbFZhbHVlICogKEVYVEVOVCAvICh0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgeiAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKSkpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbGxpc2lvbkluZGV4IGZyb20gJy4vY29sbGlzaW9uX2luZGV4JztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuL3N5bWJvbF9zaXplJztcbmltcG9ydCAqIGFzIHByb2plY3Rpb24gZnJvbSAnLi9wcm9qZWN0aW9uJztcbmltcG9ydCB7Z2V0QW5jaG9ySnVzdGlmaWNhdGlvbiwgZXZhbHVhdGVWYXJpYWJsZU9mZnNldH0gZnJvbSAnLi9zeW1ib2xfbGF5b3V0JztcbmltcG9ydCB7Z2V0QW5jaG9yQWxpZ25tZW50LCBXcml0aW5nTW9kZX0gZnJvbSAnLi9zaGFwaW5nJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcic7XG5cbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUnO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0LCB7Q29sbGlzaW9uQXJyYXlzLCBTaW5nbGVDb2xsaXNpb25Cb3h9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQnO1xuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5LCBDb2xsaXNpb25WZXJ0ZXhBcnJheSwgU3ltYm9sSW5zdGFuY2V9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHR5cGUgRmVhdHVyZUluZGV4IGZyb20gJy4uL2RhdGEvZmVhdHVyZV9pbmRleCc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuaW1wb3J0IHR5cGUge1RleHRBbmNob3J9IGZyb20gJy4vc3ltYm9sX2xheW91dCc7XG5cbmNsYXNzIE9wYWNpdHlTdGF0ZSB7XG4gICAgb3BhY2l0eTogbnVtYmVyO1xuICAgIHBsYWNlZDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcihwcmV2U3RhdGU6ID9PcGFjaXR5U3RhdGUsIGluY3JlbWVudDogbnVtYmVyLCBwbGFjZWQ6IGJvb2xlYW4sIHNraXBGYWRlOiA/Ym9vbGVhbikge1xuICAgICAgICBpZiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwcmV2U3RhdGUub3BhY2l0eSArIChwcmV2U3RhdGUucGxhY2VkID8gaW5jcmVtZW50IDogLWluY3JlbWVudCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSA9IChza2lwRmFkZSAmJiBwbGFjZWQpID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGFjZWQgPSBwbGFjZWQ7XG4gICAgfVxuICAgIGlzSGlkZGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGFjaXR5ID09PSAwICYmICF0aGlzLnBsYWNlZDtcbiAgICB9XG59XG5cbmNsYXNzIEpvaW50T3BhY2l0eVN0YXRlIHtcbiAgICB0ZXh0OiBPcGFjaXR5U3RhdGU7XG4gICAgaWNvbjogT3BhY2l0eVN0YXRlO1xuICAgIGNvbnN0cnVjdG9yKHByZXZTdGF0ZTogP0pvaW50T3BhY2l0eVN0YXRlLCBpbmNyZW1lbnQ6IG51bWJlciwgcGxhY2VkVGV4dDogYm9vbGVhbiwgcGxhY2VkSWNvbjogYm9vbGVhbiwgc2tpcEZhZGU6ID9ib29sZWFuKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IG5ldyBPcGFjaXR5U3RhdGUocHJldlN0YXRlID8gcHJldlN0YXRlLnRleHQgOiBudWxsLCBpbmNyZW1lbnQsIHBsYWNlZFRleHQsIHNraXBGYWRlKTtcbiAgICAgICAgdGhpcy5pY29uID0gbmV3IE9wYWNpdHlTdGF0ZShwcmV2U3RhdGUgPyBwcmV2U3RhdGUuaWNvbiA6IG51bGwsIGluY3JlbWVudCwgcGxhY2VkSWNvbiwgc2tpcEZhZGUpO1xuICAgIH1cbiAgICBpc0hpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5pc0hpZGRlbigpICYmIHRoaXMuaWNvbi5pc0hpZGRlbigpO1xuICAgIH1cbn1cblxuY2xhc3MgSm9pbnRQbGFjZW1lbnQge1xuICAgIHRleHQ6IGJvb2xlYW47XG4gICAgaWNvbjogYm9vbGVhbjtcbiAgICAvLyBza2lwRmFkZSA9IG91dHNpZGUgdmlld3BvcnQsIGJ1dCB3aXRoaW4gQ29sbGlzaW9uSW5kZXg6OnZpZXdwb3J0UGFkZGluZyBweCBvZiB0aGUgZWRnZVxuICAgIC8vIEJlY2F1c2UgdGhlc2Ugc3ltYm9scyBhcmVuJ3Qgb25zY3JlZW4geWV0LCB3ZSBjYW4gc2tpcCB0aGUgXCJmYWRlIGluXCIgYW5pbWF0aW9uLFxuICAgIC8vIGFuZCBpZiBhIHN1YnNlcXVlbnQgdmlld3BvcnQgY2hhbmdlIGJyaW5ncyB0aGVtIGludG8gdmlldywgdGhleSdsbCBiZSBmdWxseVxuICAgIC8vIHZpc2libGUgcmlnaHQgYXdheS5cbiAgICBza2lwRmFkZTogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0OiBib29sZWFuLCBpY29uOiBib29sZWFuLCBza2lwRmFkZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmljb24gPSBpY29uO1xuICAgICAgICB0aGlzLnNraXBGYWRlID0gc2tpcEZhZGU7XG4gICAgfVxufVxuXG5jbGFzcyBDb2xsaXNpb25DaXJjbGVBcnJheSB7XG4gICAgLy8gU3RvcmVzIGNvbGxpc2lvbiBjaXJjbGVzIGFuZCBwbGFjZW1lbnQgbWF0cmljZXMgb2YgYSBidWNrZXQgZm9yIGRlYnVnIHJlbmRlcmluZy5cbiAgICBpbnZQcm9qTWF0cml4OiBtYXQ0O1xuICAgIHZpZXdwb3J0TWF0cml4OiBtYXQ0O1xuICAgIGNpcmNsZXM6IEFycmF5PG51bWJlcj47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbnZQcm9qTWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydE1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIHRoaXMuY2lyY2xlcyA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJldGFpbmVkUXVlcnlEYXRhIHtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAgZmVhdHVyZUluZGV4OiBGZWF0dXJlSW5kZXg7XG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyO1xuICAgIGJ1Y2tldEluZGV4OiBudW1iZXI7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIGZlYXR1cmVTb3J0T3JkZXI6ID9BcnJheTxudW1iZXI+XG4gICAgY29uc3RydWN0b3IoYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogRmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICB0aGlzLmJ1Y2tldEluc3RhbmNlSWQgPSBidWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleCA9IGZlYXR1cmVJbmRleDtcbiAgICAgICAgdGhpcy5zb3VyY2VMYXllckluZGV4ID0gc291cmNlTGF5ZXJJbmRleDtcbiAgICAgICAgdGhpcy5idWNrZXRJbmRleCA9IGJ1Y2tldEluZGV4O1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICB9XG59XG5cbnR5cGUgQ29sbGlzaW9uR3JvdXAgPSB7IElEOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSB9O1xuXG5jbGFzcyBDb2xsaXNpb25Hcm91cHMge1xuICAgIGNvbGxpc2lvbkdyb3Vwczoge1tncm91cE5hbWU6IHN0cmluZ106IENvbGxpc2lvbkdyb3VwfTtcbiAgICBtYXhHcm91cElEOiBudW1iZXI7XG4gICAgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zID0gY3Jvc3NTb3VyY2VDb2xsaXNpb25zO1xuICAgICAgICB0aGlzLm1heEdyb3VwSUQgPSAwO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3VwcyA9IHt9O1xuICAgIH1cblxuICAgIGdldChzb3VyY2VJRDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFRoZSBwcmVkaWNhdGUvZ3JvdXBJRCBtZWNoYW5pc20gYWxsb3dzIGZvciBhcmJpdHJhcnkgZ3JvdXBpbmcsXG4gICAgICAgIC8vIGJ1dCB0aGUgY3VycmVudCBpbnRlcmZhY2UgZGVmaW5lcyBvbmUgc291cmNlID09IG9uZSBncm91cCB3aGVuXG4gICAgICAgIC8vIGNyb3NzU291cmNlQ29sbGlzaW9ucyA9PSB0cnVlLlxuICAgICAgICBpZiAoIXRoaXMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sbGlzaW9uR3JvdXBzW3NvdXJjZUlEXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRHcm91cElEID0gKyt0aGlzLm1heEdyb3VwSUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25Hcm91cHNbc291cmNlSURdID0ge1xuICAgICAgICAgICAgICAgICAgICBJRDogbmV4dEdyb3VwSUQsXG4gICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZTogKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5jb2xsaXNpb25Hcm91cElEID09PSBuZXh0R3JvdXBJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaXNpb25Hcm91cHNbc291cmNlSURdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtJRDogMCwgcHJlZGljYXRlOiBudWxsfTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlVmFyaWFibGVMYXlvdXRTaGlmdChhbmNob3I6IFRleHRBbmNob3IsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLCB0ZXh0Qm94U2NhbGU6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufSA9IGdldEFuY2hvckFsaWdubWVudChhbmNob3IpO1xuICAgIGNvbnN0IHNoaWZ0WCA9IC0oaG9yaXpvbnRhbEFsaWduIC0gMC41KSAqIHdpZHRoO1xuICAgIGNvbnN0IHNoaWZ0WSA9IC0odmVydGljYWxBbGlnbiAtIDAuNSkgKiBoZWlnaHQ7XG4gICAgY29uc3Qgb2Zmc2V0ID0gZXZhbHVhdGVWYXJpYWJsZU9mZnNldChhbmNob3IsIHRleHRPZmZzZXQpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIHNoaWZ0WCArIG9mZnNldFswXSAqIHRleHRCb3hTY2FsZSxcbiAgICAgICAgc2hpZnRZICsgb2Zmc2V0WzFdICogdGV4dEJveFNjYWxlXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gc2hpZnRWYXJpYWJsZUNvbGxpc2lvbkJveChjb2xsaXNpb25Cb3g6IFNpbmdsZUNvbGxpc2lvbkJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdFg6IG51bWJlciwgc2hpZnRZOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbiwgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlOiBudW1iZXIpIHtcbiAgICBjb25zdCB7eDEsIHgyLCB5MSwgeTIsIGFuY2hvclBvaW50WCwgYW5jaG9yUG9pbnRZfSA9IGNvbGxpc2lvbkJveDtcbiAgICBjb25zdCByb3RhdGVkT2Zmc2V0ID0gbmV3IFBvaW50KHNoaWZ0WCwgc2hpZnRZKTtcbiAgICBpZiAocm90YXRlV2l0aE1hcCkge1xuICAgICAgICByb3RhdGVkT2Zmc2V0Ll9yb3RhdGUocGl0Y2hXaXRoTWFwID8gYW5nbGUgOiAtYW5nbGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4MTogeDEgKyByb3RhdGVkT2Zmc2V0LngsXG4gICAgICAgIHkxOiB5MSArIHJvdGF0ZWRPZmZzZXQueSxcbiAgICAgICAgeDI6IHgyICsgcm90YXRlZE9mZnNldC54LFxuICAgICAgICB5MjogeTIgKyByb3RhdGVkT2Zmc2V0LnksXG4gICAgICAgIC8vIHN5bWJvbCBhbmNob3IgcG9pbnQgc3RheXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB0ZXh0LWFuY2hvclxuICAgICAgICBhbmNob3JQb2ludFgsXG4gICAgICAgIGFuY2hvclBvaW50WVxuICAgIH07XG59XG5cbmV4cG9ydCB0eXBlIFZhcmlhYmxlT2Zmc2V0ID0ge1xuICAgIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBhbmNob3I6IFRleHRBbmNob3IsXG4gICAgdGV4dEJveFNjYWxlOiBudW1iZXIsXG4gICAgcHJldkFuY2hvcj86IFRleHRBbmNob3Jcbn07XG5cbnR5cGUgVGlsZUxheWVyUGFyYW1ldGVycyA9IHtcbiAgICBidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICBsYXlvdXQ6IGFueSxcbiAgICBwb3NNYXRyaXg6IG1hdDQsXG4gICAgdGV4dExhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgbGFiZWxUb1NjcmVlbk1hdHJpeDogbWF0NCxcbiAgICBzY2FsZTogbnVtYmVyLFxuICAgIHRleHRQaXhlbFJhdGlvOiBudW1iZXIsXG4gICAgaG9sZGluZ0ZvckZhZGU6IGJvb2xlYW4sXG4gICAgY29sbGlzaW9uQm94QXJyYXk6ID9Db2xsaXNpb25Cb3hBcnJheSxcbiAgICBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZTogYW55LFxuICAgIGNvbGxpc2lvbkdyb3VwOiBhbnlcbn07XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldFBhcnQgPSB7XG4gICAgc29ydEtleT86IG51bWJlciB8IHZvaWQsXG4gICAgc3ltYm9sSW5zdGFuY2VTdGFydDogbnVtYmVyLFxuICAgIHN5bWJvbEluc3RhbmNlRW5kOiBudW1iZXIsXG4gICAgcGFyYW1ldGVyczogVGlsZUxheWVyUGFyYW1ldGVyc1xufTtcblxuZXhwb3J0IHR5cGUgQ3Jvc3NUaWxlSUQgPSBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCBjbGFzcyBQbGFjZW1lbnQge1xuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xuICAgIGNvbGxpc2lvbkluZGV4OiBDb2xsaXNpb25JbmRleDtcbiAgICBwbGFjZW1lbnRzOiB7IFtfOiBDcm9zc1RpbGVJRF06IEpvaW50UGxhY2VtZW50IH07XG4gICAgb3BhY2l0aWVzOiB7IFtfOiBDcm9zc1RpbGVJRF06IEpvaW50T3BhY2l0eVN0YXRlIH07XG4gICAgdmFyaWFibGVPZmZzZXRzOiB7W186IENyb3NzVGlsZUlEXTogVmFyaWFibGVPZmZzZXQgfTtcbiAgICBwbGFjZWRPcmllbnRhdGlvbnM6IHtbXzogQ3Jvc3NUaWxlSURdOiBudW1iZXIgfTtcbiAgICBjb21taXRUaW1lOiBudW1iZXI7XG4gICAgcHJldlpvb21BZGp1c3RtZW50OiBudW1iZXI7XG4gICAgbGFzdFBsYWNlbWVudENoYW5nZVRpbWU6IG51bWJlcjtcbiAgICBzdGFsZTogYm9vbGVhbjtcbiAgICBmYWRlRHVyYXRpb246IG51bWJlcjtcbiAgICByZXRhaW5lZFF1ZXJ5RGF0YToge1tfOiBudW1iZXJdOiBSZXRhaW5lZFF1ZXJ5RGF0YX07XG4gICAgY29sbGlzaW9uR3JvdXBzOiBDb2xsaXNpb25Hcm91cHM7XG4gICAgcHJldlBsYWNlbWVudDogP1BsYWNlbWVudDtcbiAgICB6b29tQXRMYXN0UmVjZW5jeUNoZWNrOiBudW1iZXI7XG4gICAgY29sbGlzaW9uQ2lyY2xlQXJyYXlzOiB7W2FueV06IENvbGxpc2lvbkNpcmNsZUFycmF5fTtcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybTogVHJhbnNmb3JtLCBmYWRlRHVyYXRpb246IG51bWJlciwgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuLCBwcmV2UGxhY2VtZW50PzogUGxhY2VtZW50KSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtLmNsb25lKCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uSW5kZXggPSBuZXcgQ29sbGlzaW9uSW5kZXgodGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB0aGlzLnBsYWNlbWVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5vcGFjaXRpZXMgPSB7fTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHMgPSB7fTtcbiAgICAgICAgdGhpcy5zdGFsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbW1pdFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmZhZGVEdXJhdGlvbiA9IGZhZGVEdXJhdGlvbjtcbiAgICAgICAgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3VwcyA9IG5ldyBDb2xsaXNpb25Hcm91cHMoY3Jvc3NTb3VyY2VDb2xsaXNpb25zKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXMgPSB7fTtcblxuICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQgPSBwcmV2UGxhY2VtZW50O1xuICAgICAgICBpZiAocHJldlBsYWNlbWVudCkge1xuICAgICAgICAgICAgcHJldlBsYWNlbWVudC5wcmV2UGxhY2VtZW50ID0gdW5kZWZpbmVkOyAvLyBPbmx5IGhvbGQgb24gdG8gb25lIHBsYWNlbWVudCBiYWNrXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGdldEJ1Y2tldFBhcnRzKHJlc3VsdHM6IEFycmF5PEJ1Y2tldFBhcnQ+LCBzdHlsZUxheWVyOiBTdHlsZUxheWVyLCB0aWxlOiBUaWxlLCBzb3J0QWNyb3NzVGlsZXM6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sQnVja2V0ID0gKCh0aWxlLmdldEJ1Y2tldChzdHlsZUxheWVyKTogYW55KTogU3ltYm9sQnVja2V0KTtcbiAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZUluZGV4ID0gdGlsZS5sYXRlc3RGZWF0dXJlSW5kZXg7XG4gICAgICAgIGlmICghc3ltYm9sQnVja2V0IHx8ICFidWNrZXRGZWF0dXJlSW5kZXggfHwgc3R5bGVMYXllci5pZCAhPT0gc3ltYm9sQnVja2V0LmxheWVySWRzWzBdKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvbGxpc2lvbkJveEFycmF5ID0gdGlsZS5jb2xsaXNpb25Cb3hBcnJheTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBzeW1ib2xCdWNrZXQubGF5ZXJzWzBdLmxheW91dDtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHRoaXMudHJhbnNmb3JtLnpvb20gLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgIGNvbnN0IHRleHRQaXhlbFJhdGlvID0gdGlsZS50aWxlU2l6ZSAvIEVYVEVOVDtcblxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZS50aWxlSUQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgcGl4ZWxzVG9UaWxlcyA9IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHRoaXMudHJhbnNmb3JtLnpvb20pO1xuXG4gICAgICAgIGNvbnN0IHRleHRMYWJlbFBsYW5lTWF0cml4ID0gcHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4KHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXAsXG4gICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcCxcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVzKTtcblxuICAgICAgICBsZXQgbGFiZWxUb1NjcmVlbk1hdHJpeCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHBpdGNoV2l0aE1hcCkge1xuICAgICAgICAgICAgY29uc3QgZ2xNYXRyaXggPSBwcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgoXG4gICAgICAgICAgICAgICAgcG9zTWF0cml4LFxuICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcCxcbiAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZXMpO1xuXG4gICAgICAgICAgICBsYWJlbFRvU2NyZWVuTWF0cml4ID0gbWF0NC5tdWx0aXBseShbXSwgdGhpcy50cmFuc2Zvcm0ubGFiZWxQbGFuZU1hdHJpeCwgZ2xNYXRyaXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIHBsYWNlbWVudCBsaXZlcywgd2UgaGF2ZSB0byBob2xkIG9udG8gdGhpcyBidWNrZXQnc1xuICAgICAgICAvLyBtYXRjaGluZyBGZWF0dXJlSW5kZXgvZGF0YSBmb3IgcXVlcnlpbmcgcHVycG9zZXNcbiAgICAgICAgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZF0gPSBuZXcgUmV0YWluZWRRdWVyeURhdGEoXG4gICAgICAgICAgICBzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZCxcbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEJ1Y2tldC5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgc3ltYm9sQnVja2V0LmluZGV4LFxuICAgICAgICAgICAgdGlsZS50aWxlSURcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgYnVja2V0OiBzeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICBsYXlvdXQsXG4gICAgICAgICAgICBwb3NNYXRyaXgsXG4gICAgICAgICAgICB0ZXh0TGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgICAgIGxhYmVsVG9TY3JlZW5NYXRyaXgsXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICAgIHRleHRQaXhlbFJhdGlvLFxuICAgICAgICAgICAgaG9sZGluZ0ZvckZhZGU6IHRpbGUuaG9sZGluZ0ZvckZhZGUoKSxcbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgcGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemU6IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShzeW1ib2xCdWNrZXQudGV4dFNpemVEYXRhLCB0aGlzLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgIGNvbGxpc2lvbkdyb3VwOiB0aGlzLmNvbGxpc2lvbkdyb3Vwcy5nZXQoc3ltYm9sQnVja2V0LnNvdXJjZUlEKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzb3J0QWNyb3NzVGlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmFuZ2Ugb2Ygc3ltYm9sQnVja2V0LnNvcnRLZXlSYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7c29ydEtleSwgc3ltYm9sSW5zdGFuY2VTdGFydCwgc3ltYm9sSW5zdGFuY2VFbmR9ID0gcmFuZ2U7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtzb3J0S2V5LCBzeW1ib2xJbnN0YW5jZVN0YXJ0LCBzeW1ib2xJbnN0YW5jZUVuZCwgcGFyYW1ldGVyc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZVN0YXJ0OiAwLFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlRW5kOiBzeW1ib2xCdWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF0dGVtcHRBbmNob3JQbGFjZW1lbnQoYW5jaG9yOiBUZXh0QW5jaG9yLCB0ZXh0Qm94OiBTaW5nbGVDb2xsaXNpb25Cb3gsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJveFNjYWxlOiBudW1iZXIsIHJvdGF0ZVdpdGhNYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sIHRleHRQaXhlbFJhdGlvOiBudW1iZXIsIHBvc01hdHJpeDogbWF0NCwgY29sbGlzaW9uR3JvdXA6IENvbGxpc2lvbkdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsbG93T3ZlcmxhcDogYm9vbGVhbiwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgb3JpZW50YXRpb246IG51bWJlciwgaWNvbkJveDogP1NpbmdsZUNvbGxpc2lvbkJveCk6ID97IHNoaWZ0OiBQb2ludCwgcGxhY2VkR2x5cGhCb3hlczogeyBib3g6IEFycmF5PG51bWJlcj4sIG9mZnNjcmVlbjogYm9vbGVhbiB9IH0gIHtcblxuICAgICAgICBjb25zdCB0ZXh0T2Zmc2V0ID0gW3N5bWJvbEluc3RhbmNlLnRleHRPZmZzZXQwLCBzeW1ib2xJbnN0YW5jZS50ZXh0T2Zmc2V0MV07XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gY2FsY3VsYXRlVmFyaWFibGVMYXlvdXRTaGlmdChhbmNob3IsIHdpZHRoLCBoZWlnaHQsIHRleHRPZmZzZXQsIHRleHRCb3hTY2FsZSk7XG5cbiAgICAgICAgY29uc3QgcGxhY2VkR2x5cGhCb3hlcyA9IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goXG4gICAgICAgICAgICBzaGlmdFZhcmlhYmxlQ29sbGlzaW9uQm94KFxuICAgICAgICAgICAgICAgIHRleHRCb3gsIHNoaWZ0LngsIHNoaWZ0LnksXG4gICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB0aGlzLnRyYW5zZm9ybS5hbmdsZSksXG4gICAgICAgICAgICB0ZXh0QWxsb3dPdmVybGFwLCB0ZXh0UGl4ZWxSYXRpbywgcG9zTWF0cml4LCBjb2xsaXNpb25Hcm91cC5wcmVkaWNhdGUpO1xuXG4gICAgICAgIGlmIChpY29uQm94KSB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZWRJY29uQm94ZXMgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KFxuICAgICAgICAgICAgICAgIHNoaWZ0VmFyaWFibGVDb2xsaXNpb25Cb3goXG4gICAgICAgICAgICAgICAgICAgIGljb25Cb3gsIHNoaWZ0LngsIHNoaWZ0LnksXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZVdpdGhNYXAsIHBpdGNoV2l0aE1hcCwgdGhpcy50cmFuc2Zvcm0uYW5nbGUpLFxuICAgICAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG4gICAgICAgICAgICBpZiAocGxhY2VkSWNvbkJveGVzLmJveC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGFjZWRHbHlwaEJveGVzLmJveC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJldkFuY2hvcjtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgbGFiZWwgd2FzIHBsYWNlZCBpbiB0aGUgcHJldmlvdXMgcGxhY2VtZW50LCByZWNvcmQgdGhlIGFuY2hvciBwb3NpdGlvblxuICAgICAgICAgICAgLy8gdG8gYWxsb3cgdXMgdG8gYW5pbWF0ZSB0aGUgdHJhbnNpdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMucHJldlBsYWNlbWVudCAmJlxuICAgICAgICAgICAgICAgIHRoaXMucHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2UGxhY2VtZW50LnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2UGxhY2VtZW50LnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdLnRleHQpIHtcbiAgICAgICAgICAgICAgICBwcmV2QW5jaG9yID0gdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0uYW5jaG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0KHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEICE9PSAwKTtcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICAgICAgdGV4dEJveFNjYWxlLFxuICAgICAgICAgICAgICAgIHByZXZBbmNob3JcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsIGFuY2hvciwgc3ltYm9sSW5zdGFuY2UsIG9yaWVudGF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZE9yaWVudGF0aW9uKGJ1Y2tldCwgb3JpZW50YXRpb24sIHN5bWJvbEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBvcmllbnRhdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtzaGlmdCwgcGxhY2VkR2x5cGhCb3hlc307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwbGFjZUxheWVyQnVja2V0UGFydChidWNrZXRQYXJ0OiBPYmplY3QsIHNlZW5Dcm9zc1RpbGVJRHM6IHsgW3N0cmluZyB8IG51bWJlcl06IGJvb2xlYW4gfSwgc2hvd0NvbGxpc2lvbkJveGVzOiBib29sZWFuKSB7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgYnVja2V0LFxuICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICAgICAgcG9zTWF0cml4LFxuICAgICAgICAgICAgdGV4dExhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICBsYWJlbFRvU2NyZWVuTWF0cml4LFxuICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW8sXG4gICAgICAgICAgICBob2xkaW5nRm9yRmFkZSxcbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgcGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsXG4gICAgICAgICAgICBjb2xsaXNpb25Hcm91cFxuICAgICAgICB9ID0gYnVja2V0UGFydC5wYXJhbWV0ZXJzO1xuXG4gICAgICAgIGNvbnN0IHRleHRPcHRpb25hbCA9IGxheW91dC5nZXQoJ3RleHQtb3B0aW9uYWwnKTtcbiAgICAgICAgY29uc3QgaWNvbk9wdGlvbmFsID0gbGF5b3V0LmdldCgnaWNvbi1vcHRpb25hbCcpO1xuICAgICAgICBjb25zdCB0ZXh0QWxsb3dPdmVybGFwID0gbGF5b3V0LmdldCgndGV4dC1hbGxvdy1vdmVybGFwJyk7XG4gICAgICAgIGNvbnN0IGljb25BbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCdpY29uLWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3Qgcm90YXRlV2l0aE1hcCA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnO1xuICAgICAgICBjb25zdCBwaXRjaFdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgaGFzSWNvblRleHRGaXQgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgIT09ICdub25lJztcbiAgICAgICAgY29uc3Qgek9yZGVyQnlWaWV3cG9ydFkgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtei1vcmRlcicpID09PSAndmlld3BvcnQteSc7XG5cbiAgICAgICAgLy8gVGhpcyBsb2dpYyBpcyBzaW1pbGFyIHRvIHRoZSBcImRlZmF1bHRPcGFjaXR5U3RhdGVcIiBsb2dpYyBiZWxvdyBpbiB1cGRhdGVCdWNrZXRPcGFjaXRpZXNcbiAgICAgICAgLy8gSWYgd2Uga25vdyBhIHN5bWJvbCBpcyBhbHdheXMgc3VwcG9zZWQgdG8gc2hvdywgZm9yY2UgaXQgdG8gYmUgbWFya2VkIHZpc2libGUgZXZlbiBpZlxuICAgICAgICAvLyBpdCB3YXNuJ3QgcGxhY2VkIGludG8gdGhlIGNvbGxpc2lvbiBpbmRleCAoYmVjYXVzZSBzb21lIG9yIGFsbCBvZiBpdCB3YXMgb3V0c2lkZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gb2YgdGhlIGNvbGxpc2lvbiBncmlkKS5cbiAgICAgICAgLy8gVGhlcmUgaXMgYSBzdWJ0bGUgZWRnZSBjYXNlIGhlcmUgd2UncmUgYWNjZXB0aW5nOlxuICAgICAgICAvLyAgU3ltYm9sIEEgaGFzIHRleHQtYWxsb3ctb3ZlcmxhcDogdHJ1ZSwgaWNvbi1hbGxvdy1vdmVybGFwOiB0cnVlLCBpY29uLW9wdGlvbmFsOiBmYWxzZVxuICAgICAgICAvLyAgQSdzIGljb24gaXMgb3V0c2lkZSB0aGUgZ3JpZCwgc28gZG9lc24ndCBnZXQgcGxhY2VkXG4gICAgICAgIC8vICBBJ3MgdGV4dCB3b3VsZCBiZSBpbnNpZGUgZ3JpZCwgYnV0IGRvZXNuJ3QgZ2V0IHBsYWNlZCBiZWNhdXNlIG9mIGljb24tb3B0aW9uYWw6IGZhbHNlXG4gICAgICAgIC8vICBXZSBzdGlsbCBzaG93IEEgYmVjYXVzZSBvZiB0aGUgYWxsb3ctb3ZlcmxhcCBzZXR0aW5ncy5cbiAgICAgICAgLy8gIFN5bWJvbCBCIGhhcyBhbGxvdy1vdmVybGFwOiBmYWxzZSwgYW5kIGdldHMgcGxhY2VkIHdoZXJlIEEncyB0ZXh0IHdvdWxkIGJlXG4gICAgICAgIC8vICBPbiBwYW5uaW5nIGluLCB0aGVyZSBpcyBhIHNob3J0IHBlcmlvZCB3aGVuIFN5bWJvbCBCIGFuZCBTeW1ib2wgQSB3aWxsIG92ZXJsYXBcbiAgICAgICAgLy8gIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2Ygb3VyIG5vcm1hbCBwb2xpY3kgb2YgXCJmYWRlIGluIG9uIHBhblwiLCBidXQgc2hvdWxkIGxvb2sgbGlrZSBhbnkgb3RoZXJcbiAgICAgICAgLy8gIGNvbGxpc2lvbiBhbmQgaG9wZWZ1bGx5IG5vdCBiZSB0b28gbm90aWNlYWJsZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy83MTcyXG4gICAgICAgIGNvbnN0IGFsd2F5c1Nob3dUZXh0ID0gdGV4dEFsbG93T3ZlcmxhcCAmJiAoaWNvbkFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc0ljb25EYXRhKCkgfHwgaWNvbk9wdGlvbmFsKTtcbiAgICAgICAgY29uc3QgYWx3YXlzU2hvd0ljb24gPSBpY29uQWxsb3dPdmVybGFwICYmICh0ZXh0QWxsb3dPdmVybGFwIHx8ICFidWNrZXQuaGFzVGV4dERhdGEoKSB8fCB0ZXh0T3B0aW9uYWwpO1xuXG4gICAgICAgIGlmICghYnVja2V0LmNvbGxpc2lvbkFycmF5cyAmJiBjb2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICAgICAgYnVja2V0LmRlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXMoY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhY2VTeW1ib2wgPSAoc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBjb2xsaXNpb25BcnJheXM6IENvbGxpc2lvbkFycmF5cykgPT4ge1xuICAgICAgICAgICAgaWYgKHNlZW5Dcm9zc1RpbGVJRHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaG9sZGluZ0ZvckZhZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIGFsbCBzeW1ib2xzIGZyb20gdGhpcyB0aWxlIGFzIFwibm90IHBsYWNlZFwiLCBidXQgZG9uJ3QgYWRkIHRvIHNlZW5Dcm9zc1RpbGVJRHMsIGJlY2F1c2Ugd2UgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBrbm93IHlldCBpZiB3ZSBoYXZlIGEgZHVwbGljYXRlIGluIGEgcGFyZW50IHRpbGUgdGhhdCBfc2hvdWxkXyBiZSBwbGFjZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IG5ldyBKb2ludFBsYWNlbWVudChmYWxzZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwbGFjZVRleHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwbGFjZUljb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBvZmZzY3JlZW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHNoaWZ0ID0gbnVsbDtcblxuICAgICAgICAgICAgbGV0IHBsYWNlZCA9IHtib3g6IG51bGwsIG9mZnNjcmVlbjogbnVsbH07XG4gICAgICAgICAgICBsZXQgcGxhY2VkVmVydGljYWxUZXh0ID0ge2JveDogbnVsbCwgb2Zmc2NyZWVuOiBudWxsfTtcblxuICAgICAgICAgICAgbGV0IHBsYWNlZEdseXBoQm94ZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHBsYWNlZEdseXBoQ2lyY2xlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcGxhY2VkSWNvbkJveGVzID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB0ZXh0RmVhdHVyZUluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGljb25GZWF0dXJlSW5kZXggPSAwO1xuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnRleHRGZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0ZXh0RmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLnRleHRGZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbEluc3RhbmNlLnVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgdGV4dEZlYXR1cmVJbmRleCA9IHN5bWJvbEluc3RhbmNlLmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0RmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxUZXh0RmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGV4dEJveCA9IGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94O1xuICAgICAgICAgICAgaWYgKHRleHRCb3gpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVByZXZpb3VzT3JpZW50YXRpb25JZk5vdFBsYWNlZCA9IChpc1BsYWNlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNPcmllbnRhdGlvbiA9IFdyaXRpbmdNb2RlLmhvcml6b250YWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAhaXNQbGFjZWQgJiYgdGhpcy5wcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2UGxhY2VkT3JpZW50YXRpb24gPSB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2UGxhY2VkT3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBwcmV2UGxhY2VkT3JpZW50YXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNPcmllbnRhdGlvbiA9IHByZXZQbGFjZWRPcmllbnRhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkT3JpZW50YXRpb24oYnVja2V0LCBwcmV2aW91c09yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzT3JpZW50YXRpb247XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlVGV4dEZvclBsYWNlbWVudE1vZGVzID0gKHBsYWNlSG9yaXpvbnRhbEZuLCBwbGFjZVZlcnRpY2FsRm4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA+IDAgJiYgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwbGFjZW1lbnRNb2RlIG9mIGJ1Y2tldC53cml0aW5nTW9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VtZW50TW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkID0gcGxhY2VWZXJ0aWNhbEZuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZFZlcnRpY2FsVGV4dCA9IHBsYWNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWQgPSBwbGFjZUhvcml6b250YWxGbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkICYmIHBsYWNlZC5ib3ggJiYgcGxhY2VkLmJveC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkID0gcGxhY2VIb3Jpem9udGFsRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VCb3ggPSAoY29sbGlzaW9uVGV4dEJveCwgb3JpZW50YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlZEZlYXR1cmUgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KGNvbGxpc2lvblRleHRCb3gsIHRleHRBbGxvd092ZXJsYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW8sIHBvc01hdHJpeCwgY29sbGlzaW9uR3JvdXAucHJlZGljYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWRGZWF0dXJlICYmIHBsYWNlZEZlYXR1cmUuYm94ICYmIHBsYWNlZEZlYXR1cmUuYm94Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQsIG9yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gb3JpZW50YXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VkRmVhdHVyZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUhvcml6b250YWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VCb3godGV4dEJveCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VWZXJ0aWNhbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsVGV4dEJveCA9IGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3g7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiB2ZXJ0aWNhbFRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VCb3godmVydGljYWxUZXh0Qm94LCBXcml0aW5nTW9kZS52ZXJ0aWNhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2JveDogbnVsbCwgb2Zmc2NyZWVuOiBudWxsfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHRGb3JQbGFjZW1lbnRNb2RlcyhwbGFjZUhvcml6b250YWwsIHBsYWNlVmVydGljYWwpO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcmV2aW91c09yaWVudGF0aW9uSWZOb3RQbGFjZWQocGxhY2VkICYmIHBsYWNlZC5ib3ggJiYgcGxhY2VkLmJveC5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBsYXlvdXQuZ2V0KCd0ZXh0LXZhcmlhYmxlLWFuY2hvcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3ltYm9sIHdhcyBpbiB0aGUgbGFzdCBwbGFjZW1lbnQsIHNoaWZ0IHRoZSBwcmV2aW91c2x5IHVzZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5jaG9yIHRvIHRoZSBmcm9udCBvZiB0aGUgYW5jaG9yIGxpc3QsIG9ubHkgaWYgdGhlIHByZXZpb3VzIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBpbiB0aGUgYW5jaG9yIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldlBsYWNlbWVudCAmJiB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk9mZnNldHMgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JzLmluZGV4T2YocHJldk9mZnNldHMuYW5jaG9yKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzID0gYW5jaG9ycy5maWx0ZXIoYW5jaG9yID0+IGFuY2hvciAhPT0gcHJldk9mZnNldHMuYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnVuc2hpZnQocHJldk9mZnNldHMuYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlQm94Rm9yVmFyaWFibGVBbmNob3JzID0gKGNvbGxpc2lvblRleHRCb3gsIGNvbGxpc2lvbkljb25Cb3gsIG9yaWVudGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNvbGxpc2lvblRleHRCb3gueDIgLSBjb2xsaXNpb25UZXh0Qm94LngxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gY29sbGlzaW9uVGV4dEJveC55MiAtIGNvbGxpc2lvblRleHRCb3gueTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Qm94U2NhbGUgPSBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U2NhbGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlSWNvbkJveCA9IGhhc0ljb25UZXh0Rml0ICYmICFpY29uQWxsb3dPdmVybGFwID8gY29sbGlzaW9uSWNvbkJveCA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGFjZWRCb3g6ID97IGJveDogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuIH0gID0ge2JveDogW10sIG9mZnNjcmVlbjogZmFsc2V9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50QXR0ZW1wdHMgPSB0ZXh0QWxsb3dPdmVybGFwID8gYW5jaG9ycy5sZW5ndGggKiAyIDogYW5jaG9ycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlbWVudEF0dGVtcHRzOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNob3IgPSBhbmNob3JzW2kgJSBhbmNob3JzLmxlbmd0aF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb3dPdmVybGFwID0gKGkgPj0gYW5jaG9ycy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXR0ZW1wdEFuY2hvclBsYWNlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yLCBjb2xsaXNpb25UZXh0Qm94LCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Qm94U2NhbGUsIHJvdGF0ZVdpdGhNYXAsIHBpdGNoV2l0aE1hcCwgdGV4dFBpeGVsUmF0aW8sIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uR3JvdXAsIGFsbG93T3ZlcmxhcCwgc3ltYm9sSW5zdGFuY2UsIGJ1Y2tldCwgb3JpZW50YXRpb24sIHZhcmlhYmxlSWNvbkJveCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZEJveCA9IHJlc3VsdC5wbGFjZWRHbHlwaEJveGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkQm94ICYmIHBsYWNlZEJveC5ib3ggJiYgcGxhY2VkQm94LmJveC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IHJlc3VsdC5zaGlmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VkQm94O1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlSG9yaXpvbnRhbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFjZUJveEZvclZhcmlhYmxlQW5jaG9ycyh0ZXh0Qm94LCBjb2xsaXNpb25BcnJheXMuaWNvbkJveCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VWZXJ0aWNhbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsVGV4dEJveCA9IGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3g7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YXNQbGFjZWQgPSBwbGFjZWQgJiYgcGxhY2VkLmJveCAmJiBwbGFjZWQuYm94Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAhd2FzUGxhY2VkICYmIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA+IDAgJiYgdmVydGljYWxUZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlQm94Rm9yVmFyaWFibGVBbmNob3JzKHZlcnRpY2FsVGV4dEJveCwgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsSWNvbkJveCwgV3JpdGluZ01vZGUudmVydGljYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtib3g6IG51bGwsIG9mZnNjcmVlbjogbnVsbH07XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0Rm9yUGxhY2VtZW50TW9kZXMocGxhY2VIb3Jpem9udGFsLCBwbGFjZVZlcnRpY2FsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSBwbGFjZWQuYm94O1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gcGxhY2VkLm9mZnNjcmVlbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPcmllbnRhdGlvbiA9IHVwZGF0ZVByZXZpb3VzT3JpZW50YXRpb25JZk5vdFBsYWNlZChwbGFjZWQgJiYgcGxhY2VkLmJveCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGdldCBwbGFjZWQsIHdlIHN0aWxsIG5lZWQgdG8gY29weSBvdXIgcG9zaXRpb24gZnJvbSB0aGUgbGFzdCBwbGFjZW1lbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhZGUgYW5pbWF0aW9uc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYWNlVGV4dCAmJiB0aGlzLnByZXZQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPZmZzZXQgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gcHJldk9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsIHByZXZPZmZzZXQuYW5jaG9yLCBzeW1ib2xJbnN0YW5jZSwgcHJldk9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwbGFjZWRHbHlwaEJveGVzID0gcGxhY2VkO1xuICAgICAgICAgICAgcGxhY2VUZXh0ID0gcGxhY2VkR2x5cGhCb3hlcyAmJiBwbGFjZWRHbHlwaEJveGVzLmJveCAmJiBwbGFjZWRHbHlwaEJveGVzLmJveC5sZW5ndGggPiAwO1xuXG4gICAgICAgICAgICBvZmZzY3JlZW4gPSBwbGFjZWRHbHlwaEJveGVzICYmIHBsYWNlZEdseXBoQm94ZXMub2Zmc2NyZWVuO1xuXG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWRTeW1ib2wgPSBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShidWNrZXQudGV4dFNpemVEYXRhLCBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSwgcGxhY2VkU3ltYm9sKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRQaXhlbFBhZGRpbmcgPSBsYXlvdXQuZ2V0KCd0ZXh0LXBhZGRpbmcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaXJjbGVQaXhlbERpYW1ldGVyID0gc3ltYm9sSW5zdGFuY2UuY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXI7XG5cbiAgICAgICAgICAgICAgICBwbGFjZWRHbHlwaENpcmNsZXMgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQ2lyY2xlcyh0ZXh0QWxsb3dPdmVybGFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkU3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmxpbmVWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5nbHlwaE9mZnNldEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NNYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0TGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsVG9TY3JlZW5NYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Hcm91cC5wcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVQaXhlbERpYW1ldGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFBpeGVsUGFkZGluZyk7XG5cbiAgICAgICAgICAgICAgICBhc3NlcnQoIXBsYWNlZEdseXBoQ2lyY2xlcy5jaXJjbGVzLmxlbmd0aCB8fCAoIXBsYWNlZEdseXBoQ2lyY2xlcy5jb2xsaXNpb25EZXRlY3RlZCB8fCBzaG93Q29sbGlzaW9uQm94ZXMpKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0ZXh0LWFsbG93LW92ZXJsYXAgaXMgc2V0LCBmb3JjZSBcInBsYWNlZENpcmNsZXNcIiB0byB0cnVlXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlb3J5IHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIGNpcmNsZSBwbGFjZWRcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIGJ1dCBmb3Igbm93IHF1aXJrcyBpbiB0ZXh0LWFuY2hvclxuICAgICAgICAgICAgICAgIC8vIGFuZCB0ZXh0LW9mZnNldCBtYXkgcHJldmVudCB0aGF0IGZyb20gYmVpbmcgdHJ1ZS5cbiAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSB0ZXh0QWxsb3dPdmVybGFwIHx8IChwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlcy5sZW5ndGggPiAwICYmICFwbGFjZWRHbHlwaENpcmNsZXMuY29sbGlzaW9uRGV0ZWN0ZWQpO1xuICAgICAgICAgICAgICAgIG9mZnNjcmVlbiA9IG9mZnNjcmVlbiAmJiBwbGFjZWRHbHlwaENpcmNsZXMub2Zmc2NyZWVuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLmljb25GZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpY29uRmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLmljb25GZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMuaWNvbkJveCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VJY29uRmVhdHVyZSA9IGljb25Cb3ggPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGlmdGVkSWNvbkJveCA9IGhhc0ljb25UZXh0Rml0ICYmIHNoaWZ0ID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0VmFyaWFibGVDb2xsaXNpb25Cb3goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkJveCwgc2hpZnQueCwgc2hpZnQueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQm94O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkJveChzaGlmdGVkSWNvbkJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbGxvd092ZXJsYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChwbGFjZWRWZXJ0aWNhbFRleHQgJiYgcGxhY2VkVmVydGljYWxUZXh0LmJveCAmJiBwbGFjZWRWZXJ0aWNhbFRleHQuYm94Lmxlbmd0aCAmJiBjb2xsaXNpb25BcnJheXMudmVydGljYWxJY29uQm94KSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZEljb25Cb3hlcyA9IHBsYWNlSWNvbkZlYXR1cmUoY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsSWNvbkJveCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlSWNvbiA9IHBsYWNlZEljb25Cb3hlcy5ib3gubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWRJY29uQm94ZXMgPSBwbGFjZUljb25GZWF0dXJlKGNvbGxpc2lvbkFycmF5cy5pY29uQm94KTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VkSWNvbkJveGVzLmJveC5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvZmZzY3JlZW4gPSBvZmZzY3JlZW4gJiYgcGxhY2VkSWNvbkJveGVzLm9mZnNjcmVlbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaWNvbldpdGhvdXRUZXh0ID0gdGV4dE9wdGlvbmFsIHx8XG4gICAgICAgICAgICAgICAgKHN5bWJvbEluc3RhbmNlLm51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzID09PSAwICYmIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0V2l0aG91dEljb24gPSBpY29uT3B0aW9uYWwgfHwgc3ltYm9sSW5zdGFuY2UubnVtSWNvblZlcnRpY2VzID09PSAwO1xuXG4gICAgICAgICAgICAvLyBDb21iaW5lIHRoZSBzY2FsZXMgZm9yIGljb25zIGFuZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKCFpY29uV2l0aG91dFRleHQgJiYgIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgICAgIHBsYWNlSWNvbiA9IHBsYWNlVGV4dCA9IHBsYWNlSWNvbiAmJiBwbGFjZVRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0ZXh0V2l0aG91dEljb24pIHtcbiAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSBwbGFjZUljb24gJiYgcGxhY2VUZXh0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaWNvbldpdGhvdXRUZXh0KSB7XG4gICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VJY29uICYmIHBsYWNlVGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBsYWNlVGV4dCAmJiBwbGFjZWRHbHlwaEJveGVzICYmIHBsYWNlZEdseXBoQm94ZXMuYm94KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBsYWNlZFZlcnRpY2FsVGV4dCAmJiBwbGFjZWRWZXJ0aWNhbFRleHQuYm94ICYmIHZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChwbGFjZWRHbHlwaEJveGVzLmJveCwgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgdmVydGljYWxUZXh0RmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3gocGxhY2VkR2x5cGhCb3hlcy5ib3gsIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsIHRleHRGZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwLklEKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwbGFjZUljb24gJiYgcGxhY2VkSWNvbkJveGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3gocGxhY2VkSWNvbkJveGVzLmJveCwgbGF5b3V0LmdldCgnaWNvbi1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgaWNvbkZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXAuSUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsYWNlZEdseXBoQ2lyY2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25DaXJjbGVzKHBsYWNlZEdseXBoQ2lyY2xlcy5jaXJjbGVzLCBsYXlvdXQuZ2V0KCd0ZXh0LWlnbm9yZS1wbGFjZW1lbnQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLCB0ZXh0RmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2lyY2xlQXJyYXkgPSB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1tpZF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR3JvdXAgY29sbGlzaW9uIGNpcmNsZXMgdG9nZXRoZXIgYnkgYnVja2V0LiBDaXJjbGVzIGNhbid0IGJlIHB1c2hlZCBmb3J3YXJkIGZvciByZW5kZXJpbmcgeWV0IGFzIHRoZSBzeW1ib2wgcGxhY2VtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBhIGJ1Y2tldCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZSBiZWZvcmUgdGhlIGNvbW1pdC1mdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNpcmNsZUFycmF5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVBcnJheSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2lkXSA9IG5ldyBDb2xsaXNpb25DaXJjbGVBcnJheSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZUFycmF5LmNpcmNsZXMucHVzaChwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlc1tpICsgMF0pOyAgICAgICAgICAgICAgLy8geFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlQXJyYXkuY2lyY2xlcy5wdXNoKHBsYWNlZEdseXBoQ2lyY2xlcy5jaXJjbGVzW2kgKyAxXSk7ICAgICAgICAgICAgICAvLyB5XG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVBcnJheS5jaXJjbGVzLnB1c2gocGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXNbaSArIDJdKTsgICAgICAgICAgICAgIC8vIHJhZGl1c1xuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlQXJyYXkuY2lyY2xlcy5wdXNoKHBsYWNlZEdseXBoQ2lyY2xlcy5jb2xsaXNpb25EZXRlY3RlZCA/IDEgOiAwKTsgICAvLyBjb2xsaXNpb25EZXRlY3RlZC1mbGFnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFzc2VydChzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCAhPT0gMCk7XG4gICAgICAgICAgICBhc3NlcnQoYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQgIT09IDApO1xuXG4gICAgICAgICAgICB0aGlzLnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50UGxhY2VtZW50KHBsYWNlVGV4dCB8fCBhbHdheXNTaG93VGV4dCwgcGxhY2VJY29uIHx8IGFsd2F5c1Nob3dJY29uLCBvZmZzY3JlZW4gfHwgYnVja2V0Lmp1c3RSZWxvYWRlZCk7XG4gICAgICAgICAgICBzZWVuQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHpPcmRlckJ5Vmlld3BvcnRZKSB7XG4gICAgICAgICAgICBhc3NlcnQoYnVja2V0UGFydC5zeW1ib2xJbnN0YW5jZVN0YXJ0ID09PSAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluZGV4ZXMgPSBidWNrZXQuZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3ltYm9sSW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluZGV4ID0gc3ltYm9sSW5kZXhlc1tpXTtcbiAgICAgICAgICAgICAgICBwbGFjZVN5bWJvbChidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChzeW1ib2xJbmRleCksIGJ1Y2tldC5jb2xsaXNpb25BcnJheXNbc3ltYm9sSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBidWNrZXRQYXJ0LnN5bWJvbEluc3RhbmNlU3RhcnQ7IGkgPCBidWNrZXRQYXJ0LnN5bWJvbEluc3RhbmNlRW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwbGFjZVN5bWJvbChidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChpKSwgYnVja2V0LmNvbGxpc2lvbkFycmF5c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvd0NvbGxpc2lvbkJveGVzICYmIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkIGluIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVBcnJheSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgdmlld3BvcnQgYW5kIGludmVyc2UgcHJvamVjdGlvbiBtYXRyaWNlcyBwZXIgYnVja2V0XG4gICAgICAgICAgICBtYXQ0LmludmVydChjaXJjbGVBcnJheS5pbnZQcm9qTWF0cml4LCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgY2lyY2xlQXJyYXkudmlld3BvcnRNYXRyaXggPSB0aGlzLmNvbGxpc2lvbkluZGV4LmdldFZpZXdwb3J0TWF0cml4KCk7XG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuanVzdFJlbG9hZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgbWFya1VzZWRKdXN0aWZpY2F0aW9uKGJ1Y2tldDogU3ltYm9sQnVja2V0LCBwbGFjZWRBbmNob3I6IFRleHRBbmNob3IsIHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgb3JpZW50YXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBqdXN0aWZpY2F0aW9ucyA9IHtcbiAgICAgICAgICAgIFwibGVmdFwiOiBzeW1ib2xJbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgXCJjZW50ZXJcIjogc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgXCJyaWdodFwiOiBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBhdXRvSW5kZXg7XG4gICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpIHtcbiAgICAgICAgICAgIGF1dG9JbmRleCA9IHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXV0b0luZGV4ID0ganVzdGlmaWNhdGlvbnNbZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbihwbGFjZWRBbmNob3IpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSBbXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleFxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0b0luZGV4ID49IDAgJiYgaW5kZXggIT09IGF1dG9JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbXVsdGlwbGUganVzdGlmaWNhdGlvbnMgYW5kIHRoaXMgb25lIGlzbid0IGl0OiBzaGlmdCBvZmZzY3JlZW5cbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5jcm9zc1RpbGVJRCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGNob3NlbiBqdXN0aWZpY2F0aW9uIG9yIHRoZSBqdXN0aWZpY2F0aW9uIGlzIGhhcmR3aXJlZDogdXNlIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChpbmRleCkuY3Jvc3NUaWxlSUQgPSBzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtYXJrVXNlZE9yaWVudGF0aW9uKGJ1Y2tldDogU3ltYm9sQnVja2V0LCBvcmllbnRhdGlvbjogbnVtYmVyLCBzeW1ib2xJbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IChvcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCB8fCBvcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbE9ubHkpID8gb3JpZW50YXRpb24gOiAwO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IG9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCA/IG9yaWVudGF0aW9uIDogMDtcblxuICAgICAgICBjb25zdCBob3Jpem9udGFsSW5kZXhlcyA9IFtcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgaG9yaXpvbnRhbEluZGV4ZXMpIHtcbiAgICAgICAgICAgIGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChpbmRleCkucGxhY2VkT3JpZW50YXRpb24gPSBob3Jpem9udGFsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KSB7XG4gICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLnBsYWNlZE9yaWVudGF0aW9uID0gdmVydGljYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21taXQobm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb21taXRUaW1lID0gbm93O1xuICAgICAgICB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPSB0aGlzLnRyYW5zZm9ybS56b29tO1xuXG4gICAgICAgIGNvbnN0IHByZXZQbGFjZW1lbnQgPSB0aGlzLnByZXZQbGFjZW1lbnQ7XG4gICAgICAgIGxldCBwbGFjZW1lbnRDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5wcmV2Wm9vbUFkanVzdG1lbnQgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC56b29tQWRqdXN0bWVudCh0aGlzLnRyYW5zZm9ybS56b29tKSA6IDA7XG4gICAgICAgIGNvbnN0IGluY3JlbWVudCA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50LnN5bWJvbEZhZGVDaGFuZ2Uobm93KSA6IDE7XG5cbiAgICAgICAgY29uc3QgcHJldk9wYWNpdGllcyA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50Lm9wYWNpdGllcyA6IHt9O1xuICAgICAgICBjb25zdCBwcmV2T2Zmc2V0cyA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0cyA6IHt9O1xuICAgICAgICBjb25zdCBwcmV2T3JpZW50YXRpb25zID0gcHJldlBsYWNlbWVudCA/IHByZXZQbGFjZW1lbnQucGxhY2VkT3JpZW50YXRpb25zIDoge307XG5cbiAgICAgICAgLy8gYWRkIHRoZSBvcGFjaXRpZXMgZnJvbSB0aGUgY3VycmVudCBwbGFjZW1lbnQsIGFuZCBjb3B5IHRoZWlyIGN1cnJlbnQgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIHBsYWNlbWVudFxuICAgICAgICBmb3IgKGNvbnN0IGNyb3NzVGlsZUlEIGluIHRoaXMucGxhY2VtZW50cykge1xuICAgICAgICAgICAgY29uc3Qgam9pbnRQbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudHNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBwcmV2T3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmIChwcmV2T3BhY2l0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShwcmV2T3BhY2l0eSwgaW5jcmVtZW50LCBqb2ludFBsYWNlbWVudC50ZXh0LCBqb2ludFBsYWNlbWVudC5pY29uKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDaGFuZ2VkID0gcGxhY2VtZW50Q2hhbmdlZCB8fFxuICAgICAgICAgICAgICAgICAgICBqb2ludFBsYWNlbWVudC50ZXh0ICE9PSBwcmV2T3BhY2l0eS50ZXh0LnBsYWNlZCB8fFxuICAgICAgICAgICAgICAgICAgICBqb2ludFBsYWNlbWVudC5pY29uICE9PSBwcmV2T3BhY2l0eS5pY29uLnBsYWNlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIGluY3JlbWVudCwgam9pbnRQbGFjZW1lbnQudGV4dCwgam9pbnRQbGFjZW1lbnQuaWNvbiwgam9pbnRQbGFjZW1lbnQuc2tpcEZhZGUpO1xuICAgICAgICAgICAgICAgIHBsYWNlbWVudENoYW5nZWQgPSBwbGFjZW1lbnRDaGFuZ2VkIHx8IGpvaW50UGxhY2VtZW50LnRleHQgfHwgam9pbnRQbGFjZW1lbnQuaWNvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvcHkgYW5kIHVwZGF0ZSB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgcGxhY2VtZW50IHRoYXQgYXJlbid0IGluIHRoZSBjdXJyZW50IHBsYWNlbWVudCBidXQgaGF2ZW4ndCBmaW5pc2hlZCBmYWRpbmdcbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiBwcmV2T3BhY2l0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2T3BhY2l0eSA9IHByZXZPcGFjaXRpZXNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqb2ludE9wYWNpdHkgPSBuZXcgSm9pbnRPcGFjaXR5U3RhdGUocHJldk9wYWNpdHksIGluY3JlbWVudCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW50T3BhY2l0eS5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IGpvaW50T3BhY2l0eTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50Q2hhbmdlZCA9IHBsYWNlbWVudENoYW5nZWQgfHwgcHJldk9wYWNpdHkudGV4dC5wbGFjZWQgfHwgcHJldk9wYWNpdHkuaWNvbi5wbGFjZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3Jvc3NUaWxlSUQgaW4gcHJldk9mZnNldHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52YXJpYWJsZU9mZnNldHNbY3Jvc3NUaWxlSURdICYmIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSAmJiAhdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tjcm9zc1RpbGVJRF0gPSBwcmV2T2Zmc2V0c1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNyb3NzVGlsZUlEIGluIHByZXZPcmllbnRhdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbY3Jvc3NUaWxlSURdICYmIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSAmJiAhdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tjcm9zc1RpbGVJRF0gPSBwcmV2T3JpZW50YXRpb25zW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgaXMgdGhlIHRpbWUgb2YgdGhlIGxhc3QgY29tbWl0KCkgdGhhdFxuICAgICAgICAvLyByZXN1bHRlZCBpbiBhIHBsYWNlbWVudCBjaGFuZ2UgLS0gaW4gb3RoZXIgd29yZHMsIHRoZSBzdGFydCB0aW1lIG9mXG4gICAgICAgIC8vIHRoZSBsYXN0IHN5bWJvbCBmYWRlIGFuaW1hdGlvblxuICAgICAgICBhc3NlcnQoIXByZXZQbGFjZW1lbnQgfHwgcHJldlBsYWNlbWVudC5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHBsYWNlbWVudENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgPSBub3c7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lID0gcHJldlBsYWNlbWVudCA/IHByZXZQbGFjZW1lbnQubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgOiBub3c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVMYXllck9wYWNpdGllcyhzdHlsZUxheWVyOiBTdHlsZUxheWVyLCB0aWxlczogQXJyYXk8VGlsZT4pIHtcbiAgICAgICAgY29uc3Qgc2VlbkNyb3NzVGlsZUlEcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgICAgICBpZiAoc3ltYm9sQnVja2V0ICYmIHRpbGUubGF0ZXN0RmVhdHVyZUluZGV4ICYmIHN0eWxlTGF5ZXIuaWQgPT09IHN5bWJvbEJ1Y2tldC5sYXllcklkc1swXSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQnVja2V0T3BhY2l0aWVzKHN5bWJvbEJ1Y2tldCwgc2VlbkNyb3NzVGlsZUlEcywgdGlsZS5jb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVCdWNrZXRPcGFjaXRpZXMoYnVja2V0OiBTeW1ib2xCdWNrZXQsIHNlZW5Dcm9zc1RpbGVJRHM6IHsgW3N0cmluZyB8IG51bWJlcl06IGJvb2xlYW4gfSwgY29sbGlzaW9uQm94QXJyYXk6ID9Db2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHREYXRhKCkpIGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5jbGVhcigpO1xuICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25EYXRhKCkpIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheS5jbGVhcigpO1xuICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkpIGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LmNsZWFyKCk7XG4gICAgICAgIGlmIChidWNrZXQuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSkgYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlT3BhY2l0eVN0YXRlID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHRleHRBbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3QgaWNvbkFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZVBsYWNlbWVudCA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG4gICAgICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IGhhc0ljb25UZXh0Rml0ID0gbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZSc7XG4gICAgICAgIC8vIElmIGFsbG93LW92ZXJsYXAgaXMgdHJ1ZSwgd2UgY2FuIHNob3cgc3ltYm9scyBiZWZvcmUgcGxhY2VtZW50IHJ1bnMgb24gdGhlbVxuICAgICAgICAvLyBCdXQgd2UgaGF2ZSB0byB3YWl0IGZvciBwbGFjZW1lbnQgaWYgd2UgcG90ZW50aWFsbHkgZGVwZW5kIG9uIGEgcGFpcmVkIGljb24vdGV4dFxuICAgICAgICAvLyB3aXRoIGFsbG93LW92ZXJsYXA6IGZhbHNlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzcwMzJcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wYWNpdHlTdGF0ZSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCAwLFxuICAgICAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAgJiYgKGljb25BbGxvd092ZXJsYXAgfHwgIWJ1Y2tldC5oYXNJY29uRGF0YSgpIHx8IGxheW91dC5nZXQoJ2ljb24tb3B0aW9uYWwnKSksXG4gICAgICAgICAgICAgICAgaWNvbkFsbG93T3ZlcmxhcCAmJiAodGV4dEFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc1RleHREYXRhKCkgfHwgbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpKSxcbiAgICAgICAgICAgICAgICB0cnVlKTtcblxuICAgICAgICBpZiAoIWJ1Y2tldC5jb2xsaXNpb25BcnJheXMgJiYgY29sbGlzaW9uQm94QXJyYXkgJiYgKChidWNrZXQuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSB8fCBidWNrZXQuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSkpKSB7XG4gICAgICAgICAgICBidWNrZXQuZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhjb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRPcGFjaXRpZXMgPSAoaWNvbk9yVGV4dCwgbnVtVmVydGljZXM6IG51bWJlciwgb3BhY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZlcnRpY2VzIC8gNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWNvbk9yVGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuZW1wbGFjZUJhY2sob3BhY2l0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KHMpO1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICAgICAgICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgICAgICAgICBjcm9zc1RpbGVJRFxuICAgICAgICAgICAgfSA9IHN5bWJvbEluc3RhbmNlO1xuXG4gICAgICAgICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IHNlZW5Dcm9zc1RpbGVJRHNbY3Jvc3NUaWxlSURdO1xuXG4gICAgICAgICAgICBsZXQgb3BhY2l0eVN0YXRlID0gdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eVN0YXRlID0gZHVwbGljYXRlT3BhY2l0eVN0YXRlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghb3BhY2l0eVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eVN0YXRlID0gZGVmYXVsdE9wYWNpdHlTdGF0ZTtcbiAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgc3RhdGUgc28gdGhhdCBmdXR1cmUgcGxhY2VtZW50cyB1c2UgaXQgYXMgYSBzdGFydGluZyBwb2ludFxuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IG9wYWNpdHlTdGF0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VlbkNyb3NzVGlsZUlEc1tjcm9zc1RpbGVJRF0gPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNUZXh0ID0gbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMgPiAwIHx8IG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA+IDA7XG4gICAgICAgICAgICBjb25zdCBoYXNJY29uID0gc3ltYm9sSW5zdGFuY2UubnVtSWNvblZlcnRpY2VzID4gMDtcblxuICAgICAgICAgICAgY29uc3QgcGxhY2VkT3JpZW50YXRpb24gPSB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsSGlkZGVuID0gcGxhY2VkT3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsO1xuICAgICAgICAgICAgY29uc3QgdmVydGljYWxIaWRkZW4gPSBwbGFjZWRPcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCB8fCBwbGFjZWRPcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbE9ubHk7XG5cbiAgICAgICAgICAgIGlmIChoYXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2VkT3BhY2l0eSA9IHBhY2tPcGFjaXR5KG9wYWNpdHlTdGF0ZS50ZXh0KTtcbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCB0ZXh0IGZhZGVzIGluL291dCBvbiBjb2xsaXNpb24gdGhlIHNhbWUgd2F5IGFzIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsIHRleHQuIFN3aXRjaCBiZXR3ZWVuIHZlcnRpY2FsL2hvcml6b250YWwgc2hvdWxkIGJlIGluc3RhbnRhbmVvdXNcbiAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsT3BhY2l0eSA9IGhvcml6b250YWxIaWRkZW4gPyBQQUNLRURfSElEREVOX09QQUNJVFkgOiBwYWNrZWRPcGFjaXR5O1xuICAgICAgICAgICAgICAgIGFkZE9wYWNpdGllcyhidWNrZXQudGV4dCwgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMsIGhvcml6b250YWxPcGFjaXR5KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbE9wYWNpdHkgPSB2ZXJ0aWNhbEhpZGRlbiA/IFBBQ0tFRF9ISURERU5fT1BBQ0lUWSA6IHBhY2tlZE9wYWNpdHk7XG4gICAgICAgICAgICAgICAgYWRkT3BhY2l0aWVzKGJ1Y2tldC50ZXh0LCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMsIHZlcnRpY2FsT3BhY2l0eSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGxhYmVsIGlzIGNvbXBsZXRlbHkgZmFkZWQsIG1hcmsgaXQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0cyBwb3NpdGlvbiBhdCByZW5kZXIgdGltZS4gSWYgdGhpcyBsYXllciBoYXMgdmFyaWFibGUgcGxhY2VtZW50LCBzaGlmdCB0aGUgdmFyaW91c1xuICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBpbnN0YW5jZXMgYXBwcm9wcmlhdGVseSBzbyB0aGF0IHN5bWJvbHMgZnJvbSBidWNrZXRzIHRoYXQgaGF2ZSB5ZXQgdG8gYmUgcGxhY2VkXG4gICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sSGlkZGVuID0gb3BhY2l0eVN0YXRlLnRleHQuaXNIaWRkZW4oKTtcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgICAgICAgICBdLmZvckVhY2goaW5kZXggPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5oaWRkZW4gPSBzeW1ib2xIaWRkZW4gfHwgaG9yaXpvbnRhbEhpZGRlbiA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLmhpZGRlbiA9IHN5bWJvbEhpZGRlbiB8fCB2ZXJ0aWNhbEhpZGRlbiA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPZmZzZXQgPSB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgaWYgKHByZXZPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0LCBwcmV2T2Zmc2V0LmFuY2hvciwgc3ltYm9sSW5zdGFuY2UsIHBsYWNlZE9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2T3JpZW50YXRpb24gPSB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgaWYgKHByZXZPcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsICdsZWZ0Jywgc3ltYm9sSW5zdGFuY2UsIHByZXZPcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQsIHByZXZPcmllbnRhdGlvbiwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0ljb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZWRPcGFjaXR5ID0gcGFja09wYWNpdHkob3BhY2l0eVN0YXRlLmljb24pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlSG9yaXpvbnRhbCA9ICEoaGFzSWNvblRleHRGaXQgJiYgc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXggJiYgaG9yaXpvbnRhbEhpZGRlbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UucGxhY2VkSWNvblN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9wYWNpdHkgPSB1c2VIb3Jpem9udGFsID8gcGFja2VkT3BhY2l0eSA6IFBBQ0tFRF9ISURERU5fT1BBQ0lUWTtcbiAgICAgICAgICAgICAgICAgICAgYWRkT3BhY2l0aWVzKGJ1Y2tldC5pY29uLCBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMsIGhvcml6b250YWxPcGFjaXR5KTtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHN5bWJvbEluc3RhbmNlLnBsYWNlZEljb25TeW1ib2xJbmRleCkuaGlkZGVuID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChvcGFjaXR5U3RhdGUuaWNvbi5pc0hpZGRlbigpOiBhbnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsT3BhY2l0eSA9ICF1c2VIb3Jpem9udGFsID8gcGFja2VkT3BhY2l0eSA6IFBBQ0tFRF9ISURERU5fT1BBQ0lUWTtcbiAgICAgICAgICAgICAgICAgICAgYWRkT3BhY2l0aWVzKGJ1Y2tldC5pY29uLCBzeW1ib2xJbnN0YW5jZS5udW1WZXJ0aWNhbEljb25WZXJ0aWNlcywgdmVydGljYWxPcGFjaXR5KTtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KS5oaWRkZW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wYWNpdHlTdGF0ZS5pY29uLmlzSGlkZGVuKCk6IGFueSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkgfHwgYnVja2V0Lmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSBidWNrZXQuY29sbGlzaW9uQXJyYXlzW3NdO1xuICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNoaWZ0ID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnRleHRCb3ggfHwgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlUGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVPZmZzZXQgPSB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBzaG93IGVpdGhlciB0aGUgY3VycmVudGx5IHBsYWNlZCBwb3NpdGlvbiBvciB0aGUgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsbHkgcGxhY2VkIHBvc2l0aW9uIChzbyB5b3UgY2FuIHZpc3VhbGl6ZSB3aGF0IGNvbGxpc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IG1hZGUgdGhlIHN5bWJvbCBkaXNhcHBlYXIsIGFuZCB0aGUgbW9zdCBsaWtlbHkgcGxhY2UgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW1ib2wgdG8gY29tZSBiYWNrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0U2hpZnQodmFyaWFibGVPZmZzZXQuYW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVPZmZzZXQuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC50ZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC50ZXh0Qm94U2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRlV2l0aE1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQuX3JvdGF0ZShwaXRjaFdpdGhNYXAgPyB0aGlzLnRyYW5zZm9ybS5hbmdsZSA6IC10aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBvZmZzZXQgLT4gdGhpcyBzeW1ib2wgaGFzbid0IGJlZW4gcGxhY2VkIHNpbmNlIGNvbWluZyBvbi1zY3JlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gc2luZ2xlIGJveCBpcyBwYXJ0aWN1bGFybHkgbWVhbmluZ2Z1bCBhbmQgYWxsIG9mIHRoZW0gd291bGQgYmUgdG9vIG5vaXN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgY2VudGVyIGJveCBqdXN0IHRvIHNob3cgc29tZXRoaW5nJ3MgdGhlcmUsIGJ1dCBtYXJrIGl0IFwibm90IHVzZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhidWNrZXQudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgb3BhY2l0eVN0YXRlLnRleHQucGxhY2VkLCAhdXNlZCB8fCBob3Jpem9udGFsSGlkZGVuLCBzaGlmdC54LCBzaGlmdC55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG9wYWNpdHlTdGF0ZS50ZXh0LnBsYWNlZCwgIXVzZWQgfHwgdmVydGljYWxIaWRkZW4sIHNoaWZ0LngsIHNoaWZ0LnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxJY29uVXNlZCA9IEJvb2xlYW4oIXZlcnRpY2FsSGlkZGVuICYmIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3gpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMuaWNvbkJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0Lmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG9wYWNpdHlTdGF0ZS5pY29uLnBsYWNlZCwgdmVydGljYWxJY29uVXNlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJY29uVGV4dEZpdCA/IHNoaWZ0LnggOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ljb25UZXh0Rml0ID8gc2hpZnQueSA6IDApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBvcGFjaXR5U3RhdGUuaWNvbi5wbGFjZWQsICF2ZXJ0aWNhbEljb25Vc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ljb25UZXh0Rml0ID8gc2hpZnQueCA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSWNvblRleHRGaXQgPyBzaGlmdC55IDogMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuc29ydEZlYXR1cmVzKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluZWRRdWVyeURhdGFbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdKSB7XG4gICAgICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXS5mZWF0dXJlU29ydE9yZGVyID0gYnVja2V0LmZlYXR1cmVTb3J0T3JkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHREYXRhKCkgJiYgYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uRGF0YSgpICYmIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWNrZXQuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSAmJiBidWNrZXQuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkgJiYgYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aCA9PT0gYnVja2V0LnRleHQubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoIC8gNCk7XG4gICAgICAgIGFzc2VydChidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkubGVuZ3RoID09PSBidWNrZXQuaWNvbi5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggLyA0KTtcblxuICAgICAgICAvLyBQdXNoIGdlbmVyYXRlZCBjb2xsaXNpb24gY2lyY2xlcyB0byB0aGUgYnVja2V0IGZvciBkZWJ1ZyByZW5kZXJpbmdcbiAgICAgICAgaWYgKGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkIGluIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXTtcblxuICAgICAgICAgICAgYnVja2V0LnBsYWNlbWVudEludlByb2pNYXRyaXggPSBpbnN0YW5jZS5pbnZQcm9qTWF0cml4O1xuICAgICAgICAgICAgYnVja2V0LnBsYWNlbWVudFZpZXdwb3J0TWF0cml4ID0gaW5zdGFuY2Uudmlld3BvcnRNYXRyaXg7XG4gICAgICAgICAgICBidWNrZXQuY29sbGlzaW9uQ2lyY2xlQXJyYXkgPSBpbnN0YW5jZS5jaXJjbGVzO1xuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXNbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3ltYm9sRmFkZUNoYW5nZShub3c6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWRlRHVyYXRpb24gPT09IDAgP1xuICAgICAgICAgICAgMSA6XG4gICAgICAgICAgICAoKG5vdyAtIHRoaXMuY29tbWl0VGltZSkgLyB0aGlzLmZhZGVEdXJhdGlvbiArIHRoaXMucHJldlpvb21BZGp1c3RtZW50KTtcbiAgICB9XG5cbiAgICB6b29tQWRqdXN0bWVudCh6b29tOiBudW1iZXIpIHtcbiAgICAgICAgLy8gV2hlbiB6b29taW5nIG91dCBxdWlja2x5LCBsYWJlbHMgY2FuIG92ZXJsYXAgZWFjaCBvdGhlci4gVGhpc1xuICAgICAgICAvLyBhZGp1c3RtZW50IGlzIHVzZWQgdG8gcmVkdWNlIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHBsYWNlbWVudCBjYWxjdWxhdGlvbnNcbiAgICAgICAgLy8gYW5kIHRvIHJlZHVjZSB0aGUgZmFkZSBkdXJhdGlvbiB3aGVuIHpvb21pbmcgb3V0IHF1aWNrbHkuIERpc2NvdmVyaW5nIHRoZVxuICAgICAgICAvLyBjb2xsaXNpb25zIG1vcmUgcXVpY2tseSBhbmQgZmFkaW5nIHRoZW0gbW9yZSBxdWlja2x5IHJlZHVjZXMgdGhlIHVud2FudGVkIGVmZmVjdC5cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh0aGlzLnRyYW5zZm9ybS56b29tIC0gem9vbSkgLyAxLjUpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb25zKG5vdzogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWxlIHx8XG4gICAgICAgICAgICBub3cgLSB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIDwgdGhpcy5mYWRlRHVyYXRpb247XG4gICAgfVxuXG4gICAgc3RpbGxSZWNlbnQobm93OiBudW1iZXIsIHpvb206IG51bWJlcikge1xuICAgICAgICAvLyBUaGUgYWRqdXN0bWVudCBtYWtlcyBwbGFjZW1lbnQgbW9yZSBmcmVxdWVudCB3aGVuIHpvb21pbmcuXG4gICAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGFwcGxpZXMgdGhlIGFkanVzdG1lbnQgb25seSBhZnRlciB0aGUgbWFwIGhhc1xuICAgICAgICAvLyBzdG9wcGVkIHpvb21pbmcuIFRoaXMgYXZvaWRzIGFkZGluZyBleHRyYSBqYW5rIHdoaWxlIHpvb21pbmcuXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uQWRqdXN0bWVudCA9IHRoaXMuem9vbUF0TGFzdFJlY2VuY3lDaGVjayA9PT0gem9vbSA/XG4gICAgICAgICAgICAoMSAtIHRoaXMuem9vbUFkanVzdG1lbnQoem9vbSkpIDpcbiAgICAgICAgICAgIDE7XG4gICAgICAgIHRoaXMuem9vbUF0TGFzdFJlY2VuY3lDaGVjayA9IHpvb207XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWl0VGltZSArIHRoaXMuZmFkZUR1cmF0aW9uICogZHVyYXRpb25BZGp1c3RtZW50ID4gbm93O1xuICAgIH1cblxuICAgIHNldFN0YWxlKCkge1xuICAgICAgICB0aGlzLnN0YWxlID0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGNvbGxpc2lvblZlcnRleEFycmF5OiBDb2xsaXNpb25WZXJ0ZXhBcnJheSwgcGxhY2VkOiBib29sZWFuLCBub3RVc2VkOiBib29sZWFuIHwgbnVtYmVyLCBzaGlmdFg/OiBudW1iZXIsIHNoaWZ0WT86IG51bWJlcikge1xuICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBsYWNlZCA/IDEgOiAwLCBub3RVc2VkID8gMSA6IDAsIHNoaWZ0WCB8fCAwLCBzaGlmdFkgfHwgMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCwgc2hpZnRYIHx8IDAsIHNoaWZ0WSB8fCAwKTtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xuICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBsYWNlZCA/IDEgOiAwLCBub3RVc2VkID8gMSA6IDAsIHNoaWZ0WCB8fCAwLCBzaGlmdFkgfHwgMCk7XG59XG5cbi8vIEFsbCBmb3VyIHZlcnRpY2VzIGZvciBhIGdseXBoIHdpbGwgaGF2ZSB0aGUgc2FtZSBvcGFjaXR5IHN0YXRlXG4vLyBTbyB3ZSBwYWNrIHRoZSBvcGFjaXR5IGludG8gYSB1aW50OCwgYW5kIHRoZW4gcmVwZWF0IGl0IGZvdXIgdGltZXNcbi8vIHRvIG1ha2UgYSBzaW5nbGUgdWludDMyIHRoYXQgd2UgY2FuIHVwbG9hZCBmb3IgZWFjaCBnbHlwaCBpbiB0aGVcbi8vIGxhYmVsLlxuY29uc3Qgc2hpZnQyNSA9IE1hdGgucG93KDIsIDI1KTtcbmNvbnN0IHNoaWZ0MjQgPSBNYXRoLnBvdygyLCAyNCk7XG5jb25zdCBzaGlmdDE3ID0gTWF0aC5wb3coMiwgMTcpO1xuY29uc3Qgc2hpZnQxNiA9IE1hdGgucG93KDIsIDE2KTtcbmNvbnN0IHNoaWZ0OSA9IE1hdGgucG93KDIsIDkpO1xuY29uc3Qgc2hpZnQ4ID0gTWF0aC5wb3coMiwgOCk7XG5jb25zdCBzaGlmdDEgPSBNYXRoLnBvdygyLCAxKTtcbmZ1bmN0aW9uIHBhY2tPcGFjaXR5KG9wYWNpdHlTdGF0ZTogT3BhY2l0eVN0YXRlKTogbnVtYmVyIHtcbiAgICBpZiAob3BhY2l0eVN0YXRlLm9wYWNpdHkgPT09IDAgJiYgIW9wYWNpdHlTdGF0ZS5wbGFjZWQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChvcGFjaXR5U3RhdGUub3BhY2l0eSA9PT0gMSAmJiBvcGFjaXR5U3RhdGUucGxhY2VkKSB7XG4gICAgICAgIHJldHVybiA0Mjk0OTY3Mjk1O1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRCaXQgPSBvcGFjaXR5U3RhdGUucGxhY2VkID8gMSA6IDA7XG4gICAgY29uc3Qgb3BhY2l0eUJpdHMgPSBNYXRoLmZsb29yKG9wYWNpdHlTdGF0ZS5vcGFjaXR5ICogMTI3KTtcbiAgICByZXR1cm4gb3BhY2l0eUJpdHMgKiBzaGlmdDI1ICsgdGFyZ2V0Qml0ICogc2hpZnQyNCArXG4gICAgICAgIG9wYWNpdHlCaXRzICogc2hpZnQxNyArIHRhcmdldEJpdCAqIHNoaWZ0MTYgK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0OSArIHRhcmdldEJpdCAqIHNoaWZ0OCArXG4gICAgICAgIG9wYWNpdHlCaXRzICogc2hpZnQxICsgdGFyZ2V0Qml0O1xufVxuXG5jb25zdCBQQUNLRURfSElEREVOX09QQUNJVFkgPSAwO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcblxuaW1wb3J0IHtQbGFjZW1lbnR9IGZyb20gJy4uL3N5bWJvbC9wbGFjZW1lbnQnO1xuXG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4vc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIHtCdWNrZXRQYXJ0fSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcblxuY2xhc3MgTGF5ZXJQbGFjZW1lbnQge1xuICAgIF9zb3J0QWNyb3NzVGlsZXM6IGJvb2xlYW47XG4gICAgX2N1cnJlbnRUaWxlSW5kZXg6IG51bWJlcjtcbiAgICBfY3VycmVudFBhcnRJbmRleDogbnVtYmVyO1xuICAgIF9zZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH07XG4gICAgX2J1Y2tldFBhcnRzOiBBcnJheTxCdWNrZXRQYXJ0PjtcblxuICAgIGNvbnN0cnVjdG9yKHN0eWxlTGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5fc29ydEFjcm9zc1RpbGVzID0gc3R5bGVMYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtei1vcmRlcicpICE9PSAndmlld3BvcnQteScgJiZcbiAgICAgICAgICAgIHN0eWxlTGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5JykuY29uc3RhbnRPcigxKSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9jdXJyZW50UGFydEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcyA9IHt9O1xuICAgICAgICB0aGlzLl9idWNrZXRQYXJ0cyA9IFtdO1xuICAgIH1cblxuICAgIGNvbnRpbnVlUGxhY2VtZW50KHRpbGVzOiBBcnJheTxUaWxlPiwgcGxhY2VtZW50OiBQbGFjZW1lbnQsIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgc3R5bGVMYXllcjogU3R5bGVMYXllciwgc2hvdWxkUGF1c2VQbGFjZW1lbnQ6ICgpID0+IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCBidWNrZXRQYXJ0cyA9IHRoaXMuX2J1Y2tldFBhcnRzO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50VGlsZUluZGV4IDwgdGlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbdGhpcy5fY3VycmVudFRpbGVJbmRleF07XG4gICAgICAgICAgICBwbGFjZW1lbnQuZ2V0QnVja2V0UGFydHMoYnVja2V0UGFydHMsIHN0eWxlTGF5ZXIsIHRpbGUsIHRoaXMuX3NvcnRBY3Jvc3NUaWxlcyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXgrKztcbiAgICAgICAgICAgIGlmIChzaG91bGRQYXVzZVBsYWNlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc29ydEFjcm9zc1RpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0QWNyb3NzVGlsZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGJ1Y2tldFBhcnRzLnNvcnQoKGEsIGIpID0+ICgoYS5zb3J0S2V5OiBhbnkpOiBudW1iZXIpIC0gKChiLnNvcnRLZXk6IGFueSk6IG51bWJlcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnJlbnRQYXJ0SW5kZXggPCBidWNrZXRQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldFBhcnQgPSBidWNrZXRQYXJ0c1t0aGlzLl9jdXJyZW50UGFydEluZGV4XTtcbiAgICAgICAgICAgIHBsYWNlbWVudC5wbGFjZUxheWVyQnVja2V0UGFydChidWNrZXRQYXJ0LCB0aGlzLl9zZWVuQ3Jvc3NUaWxlSURzLCBzaG93Q29sbGlzaW9uQm94ZXMpO1xuXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50UGFydEluZGV4Kys7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUGF1c2VQbGFjZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmNsYXNzIFBhdXNlYWJsZVBsYWNlbWVudCB7XG4gICAgcGxhY2VtZW50OiBQbGFjZW1lbnQ7XG4gICAgX2RvbmU6IGJvb2xlYW47XG4gICAgX2N1cnJlbnRQbGFjZW1lbnRJbmRleDogbnVtYmVyO1xuICAgIF9mb3JjZUZ1bGxQbGFjZW1lbnQ6IGJvb2xlYW47XG4gICAgX3Nob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbjtcbiAgICBfaW5Qcm9ncmVzc0xheWVyOiA/TGF5ZXJQbGFjZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2Zvcm06IFRyYW5zZm9ybSwgb3JkZXI6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgZm9yY2VGdWxsUGxhY2VtZW50OiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBmYWRlRHVyYXRpb246IG51bWJlcixcbiAgICAgICAgICAgICAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgcHJldlBsYWNlbWVudD86IFBsYWNlbWVudCkge1xuXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gbmV3IFBsYWNlbWVudCh0cmFuc2Zvcm0sIGZhZGVEdXJhdGlvbiwgY3Jvc3NTb3VyY2VDb2xsaXNpb25zLCBwcmV2UGxhY2VtZW50KTtcbiAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4ID0gb3JkZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5fZm9yY2VGdWxsUGxhY2VtZW50ID0gZm9yY2VGdWxsUGxhY2VtZW50O1xuICAgICAgICB0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgPSBzaG93Q29sbGlzaW9uQm94ZXM7XG4gICAgICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpc0RvbmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb25lO1xuICAgIH1cblxuICAgIGNvbnRpbnVlUGxhY2VtZW50KG9yZGVyOiBBcnJheTxzdHJpbmc+LCBsYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn0sIGxheWVyVGlsZXM6IHtbXzogc3RyaW5nXTogQXJyYXk8VGlsZT59KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGJyb3dzZXIubm93KCk7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkUGF1c2VQbGFjZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGFwc2VkVGltZSA9IGJyb3dzZXIubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9yY2VGdWxsUGxhY2VtZW50ID8gZmFsc2UgOiBlbGFwc2VkVGltZSA+IDI7XG4gICAgICAgIH07XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gb3JkZXJbdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50Wm9vbSA9IHRoaXMucGxhY2VtZW50LmNvbGxpc2lvbkluZGV4LnRyYW5zZm9ybS56b29tO1xuICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnICYmXG4gICAgICAgICAgICAgICAgKCFsYXllci5taW56b29tIHx8IGxheWVyLm1pbnpvb20gPD0gcGxhY2VtZW50Wm9vbSkgJiZcbiAgICAgICAgICAgICAgICAoIWxheWVyLm1heHpvb20gfHwgbGF5ZXIubWF4em9vbSA+IHBsYWNlbWVudFpvb20pKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2luUHJvZ3Jlc3NMYXllcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pblByb2dyZXNzTGF5ZXIgPSBuZXcgTGF5ZXJQbGFjZW1lbnQoKChsYXllcjogYW55KTogU3ltYm9sU3R5bGVMYXllcikpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdXNlUGxhY2VtZW50ID0gdGhpcy5faW5Qcm9ncmVzc0xheWVyLmNvbnRpbnVlUGxhY2VtZW50KGxheWVyVGlsZXNbbGF5ZXIuc291cmNlXSwgdGhpcy5wbGFjZW1lbnQsIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcywgbGF5ZXIsIHNob3VsZFBhdXNlUGxhY2VtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXVzZVBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluaXNoIHBsYWNpbmcgYWxsIGxheWVycyB3aXRoaW4gMm1zLFxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgY2FuIGtlZXAgcmVuZGVyaW5nIHdpdGggYSBwYXJ0aWFsIHBsYWNlbWVudFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCByZXN1bWUgaGVyZSBvbiB0aGUgbmV4dCBmcmFtZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2luUHJvZ3Jlc3NMYXllcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb21taXQobm93OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29tbWl0KG5vdyk7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlbWVudDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhdXNlYWJsZVBsYWNlbWVudDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQnO1xuXG5pbXBvcnQge1N5bWJvbEluc3RhbmNlQXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7U3ltYm9sSW5zdGFuY2V9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZSc7XG5cbi8qXG4gICAgVGhlIENyb3NzVGlsZVN5bWJvbEluZGV4IGdlbmVyYWxseSB3b3JrcyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0XG4gICAgYSBjb25jZXB0dWFsIFwidW5pcXVlIHN5bWJvbFwiIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSB0ZXh0IG9mXG4gICAgdGhlIGxhYmVsIGNvbWJpbmVkIHdpdGggdGhlIGFuY2hvciBwb2ludC4gVGhlIGdvYWwgaXMgdG8gYXNzaWduXG4gICAgdGhlc2UgY29uY2VwdHVhbCBcInVuaXF1ZSBzeW1ib2xzXCIgYSBzaGFyZWQgY3Jvc3NUaWxlSUQgdGhhdCBjYW4gYmVcbiAgICB1c2VkIGJ5IFBsYWNlbWVudCB0byBrZWVwIGZhZGluZyBvcGFjaXR5IHN0YXRlcyBjb25zaXN0ZW50IGFuZCB0b1xuICAgIGRlZHVwbGljYXRlIGxhYmVscy5cblxuICAgIFRoZSBDcm9zc1RpbGVTeW1ib2xJbmRleCBpbmRleGVzIGFsbCB0aGUgY3VycmVudCBzeW1ib2wgaW5zdGFuY2VzIGFuZFxuICAgIHRoZWlyIGNyb3NzVGlsZUlEcy4gV2hlbiBhIHN5bWJvbCBidWNrZXQgZ2V0cyBhZGRlZCBvciB1cGRhdGVkLCB0aGVcbiAgICBpbmRleCBhc3NpZ25zIGEgY3Jvc3NUaWxlSUQgdG8gZWFjaCBvZiBpdCdzIHN5bWJvbCBpbnN0YW5jZXMgYnkgZWl0aGVyXG4gICAgbWF0Y2hpbmcgaXQgd2l0aCBhbiBleGlzdGluZyBpZCBvciBhc3NpZ25pbmcgYSBuZXcgb25lLlxuKi9cblxuLy8gUm91bmQgYW5jaG9yIHBvc2l0aW9ucyB0byByb3VnaGx5IDQgcGl4ZWwgZ3JpZFxuY29uc3Qgcm91bmRpbmdGYWN0b3IgPSA1MTIgLyBFWFRFTlQgLyAyO1xuXG5jbGFzcyBUaWxlTGF5ZXJJbmRleCB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIGluZGV4ZWRTeW1ib2xJbnN0YW5jZXM6IHtbXzogbnVtYmVyXTogQXJyYXk8e1xuICAgICAgICBjcm9zc1RpbGVJRDogbnVtYmVyLFxuICAgICAgICBjb29yZDoge1xuICAgICAgICAgICAgeDogbnVtYmVyLFxuICAgICAgICAgICAgeTogbnVtYmVyXG4gICAgICAgIH1cbiAgICB9Pn07XG4gICAgYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBzeW1ib2xJbnN0YW5jZXM6IFN5bWJvbEluc3RhbmNlQXJyYXksIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzID0ge307XG4gICAgICAgIHRoaXMuYnVja2V0SW5zdGFuY2VJZCA9IGJ1Y2tldEluc3RhbmNlSWQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHN5bWJvbEluc3RhbmNlLmtleTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNba2V5XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyB0aWxlIG1heSBoYXZlIG11bHRpcGxlIHN5bWJvbCBpbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBrZXlcbiAgICAgICAgICAgIC8vIFN0b3JlIGVhY2ggb25lIGFsb25nIHdpdGggaXRzIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNba2V5XS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjcm9zc1RpbGVJRDogc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQsXG4gICAgICAgICAgICAgICAgY29vcmQ6IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoc3ltYm9sSW5zdGFuY2UsIHRpbGVJRClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udmVydHMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBpbnB1dCBzeW1ib2wgaW5zdGFuY2UgaW50byBjb29yZGluYXRlcyB0aGF0IGJlIGNhbiBjb21wYXJlZFxuICAgIC8vIGFnYWluc3Qgb3RoZXIgc3ltYm9scyBpbiB0aGlzIGluZGV4LiBDb29yZGluYXRlcyBhcmU6XG4gICAgLy8gKDEpIHdvcmxkLWJhc2VkIChzbyBhZnRlciBjb252ZXJzaW9uIHRoZSBzb3VyY2UgdGlsZSBpcyBpcnJlbGV2YW50KVxuICAgIC8vICgyKSBjb252ZXJ0ZWQgdG8gdGhlIHotc2NhbGUgb2YgdGhpcyBUaWxlTGF5ZXJJbmRleFxuICAgIC8vICgzKSBkb3duLXNhbXBsZWQgYnkgXCJyb3VuZGluZ0ZhY3RvclwiIGZyb20gdGlsZSBjb29yZGluYXRlIHByZWNpc2lvbiBpbiBvcmRlciB0byBiZVxuICAgIC8vICAgICBtb3JlIHRvbGVyYW50IG9mIHNtYWxsIGRpZmZlcmVuY2VzIGJldHdlZW4gdGlsZXMuXG4gICAgZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBjaGlsZFRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IGNoaWxkVGlsZUlELmNhbm9uaWNhbC56IC0gdGhpcy50aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gcm91bmRpbmdGYWN0b3IgLyBNYXRoLnBvdygyLCB6RGlmZmVyZW5jZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBNYXRoLmZsb29yKChjaGlsZFRpbGVJRC5jYW5vbmljYWwueCAqIEVYVEVOVCArIHN5bWJvbEluc3RhbmNlLmFuY2hvclgpICogc2NhbGUpLFxuICAgICAgICAgICAgeTogTWF0aC5mbG9vcigoY2hpbGRUaWxlSUQuY2Fub25pY2FsLnkgKiBFWFRFTlQgKyBzeW1ib2xJbnN0YW5jZS5hbmNob3JZKSAqIHNjYWxlKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZpbmRNYXRjaGVzKHN5bWJvbEluc3RhbmNlczogU3ltYm9sSW5zdGFuY2VBcnJheSwgbmV3VGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzOiB7W2Nyb3NzVGlsZUlEOiBudW1iZXJdOiBib29sZWFufSkge1xuICAgICAgICBjb25zdCB0b2xlcmFuY2UgPSB0aGlzLnRpbGVJRC5jYW5vbmljYWwueiA8IG5ld1RpbGVJRC5jYW5vbmljYWwueiA/IDEgOiBNYXRoLnBvdygyLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwueiAtIG5ld1RpbGVJRC5jYW5vbmljYWwueik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIGlmIChzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGFzIGEgbWF0Y2gsIHNraXBcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kZXhlZEluc3RhbmNlcyA9IHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1tzeW1ib2xJbnN0YW5jZS5rZXldO1xuICAgICAgICAgICAgaWYgKCFpbmRleGVkSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gc3ltYm9sIHdpdGggdGhpcyBrZXkgaW4gdGhpcyBidWNrZXRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2NhbGVkU3ltYm9sQ29vcmQgPSB0aGlzLmdldFNjYWxlZENvb3JkaW5hdGVzKHN5bWJvbEluc3RhbmNlLCBuZXdUaWxlSUQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRoaXNUaWxlU3ltYm9sIG9mIGluZGV4ZWRJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYW55IHN5bWJvbCB3aXRoIHRoZSBzYW1lIGtleXMgd2hvc2UgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiAxXG4gICAgICAgICAgICAgICAgLy8gZ3JpZCB1bml0LiAod2l0aCBhIDRweCBncmlkLCB0aGlzIGNvdmVycyBhIDEycHggYnkgMTJweCBhcmVhKVxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzVGlsZVN5bWJvbC5jb29yZC54IC0gc2NhbGVkU3ltYm9sQ29vcmQueCkgPD0gdG9sZXJhbmNlICYmXG4gICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKHRoaXNUaWxlU3ltYm9sLmNvb3JkLnkgLSBzY2FsZWRTeW1ib2xDb29yZC55KSA8PSB0b2xlcmFuY2UgJiZcbiAgICAgICAgICAgICAgICAgICAgIXpvb21Dcm9zc1RpbGVJRHNbdGhpc1RpbGVTeW1ib2wuY3Jvc3NUaWxlSURdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgbWFya2VkIG91cnNlbHZlcyBkdXBsaWNhdGUgYWdhaW5zdCB0aGlzIHBhcmVudCBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGxldCBhbnkgb3RoZXIgc3ltYm9scyBhdCB0aGUgc2FtZSB6b29tIGxldmVsIGR1cGxpY2F0ZSBhZ2FpbnN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIHBhcmVudCAoc2VlIGlzc3VlICM1OTkzKVxuICAgICAgICAgICAgICAgICAgICB6b29tQ3Jvc3NUaWxlSURzW3RoaXNUaWxlU3ltYm9sLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEID0gdGhpc1RpbGVTeW1ib2wuY3Jvc3NUaWxlSUQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlSURzIHtcbiAgICBtYXhDcm9zc1RpbGVJRDogbnVtYmVyO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1heENyb3NzVGlsZUlEID0gMDtcbiAgICB9XG4gICAgZ2VuZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiArK3RoaXMubWF4Q3Jvc3NUaWxlSUQ7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4IHtcbiAgICBpbmRleGVzOiB7W3pvb206IHN0cmluZyB8IG51bWJlcl06IHtbdGlsZUlkOiBzdHJpbmcgfCBudW1iZXJdOiBUaWxlTGF5ZXJJbmRleH19O1xuICAgIHVzZWRDcm9zc1RpbGVJRHM6IHtbem9vbTogc3RyaW5nIHwgbnVtYmVyXToge1tjcm9zc1RpbGVJRDogbnVtYmVyXTogYm9vbGVhbn19O1xuICAgIGxuZzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaW5kZXhlcyA9IHt9O1xuICAgICAgICB0aGlzLnVzZWRDcm9zc1RpbGVJRHMgPSB7fTtcbiAgICAgICAgdGhpcy5sbmcgPSAwO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogU29tZXRpbWVzIHdoZW4gYSB1c2VyIHBhbnMgYWNyb3NzIHRoZSBhbnRpbWVyaWRpYW4gdGhlIGxvbmdpdHVkZSB2YWx1ZSBnZXRzIHdyYXBwZWQuXG4gICAgICogVG8gcHJldmVudCBsYWJlbHMgZnJvbSBmbGFzaGluZyBvdXQgYW5kIGluIHdlIGFkanVzdCB0aGUgdGlsZUlEIHZhbHVlcyBpbiB0aGUgaW5kZXhlc1xuICAgICAqIHNvIHRoYXQgdGhleSBtYXRjaCB0aGUgbmV3IHdyYXBwZWQgdmVyc2lvbiBvZiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGhhbmRsZVdyYXBKdW1wKGxuZzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHdyYXBEZWx0YSA9IE1hdGgucm91bmQoKGxuZyAtIHRoaXMubG5nKSAvIDM2MCk7XG4gICAgICAgIGlmICh3cmFwRGVsdGEgIT09IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgem9vbSBpbiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1t6b29tXTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdab29tSW5kZXggPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB6b29tSW5kZXhlcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIHRpbGVJRCdzIHdyYXAgYW5kIGFkZCBpdCB0byBhIG5ldyBpbmRleFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHpvb21JbmRleGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGluZGV4LnRpbGVJRCA9IGluZGV4LnRpbGVJRC51bndyYXBUbyhpbmRleC50aWxlSUQud3JhcCArIHdyYXBEZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1pvb21JbmRleFtpbmRleC50aWxlSUQua2V5XSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZXNbem9vbV0gPSBuZXdab29tSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sbmcgPSBsbmc7XG4gICAgfVxuXG4gICAgYWRkQnVja2V0KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgYnVja2V0OiBTeW1ib2xCdWNrZXQsIGNyb3NzVGlsZUlEczogQ3Jvc3NUaWxlSURzKSB7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXSAmJlxuICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XS5idWNrZXRJbnN0YW5jZUlkID09PVxuICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdyZSByZXBsYWNpbmcgdGhpcyBidWNrZXQgd2l0aCBhbiB1cGRhdGVkIHZlcnNpb25cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBidWNrZXQncyBcInVzZWQgY3Jvc3NUaWxlSURzXCIgbm93IHNvIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgbmV3IGJ1Y2tldCBjYW4gY2xhaW0gdGhlbS5cbiAgICAgICAgICAgICAgICAvLyBUaGUgb2xkIGluZGV4IGVudHJpZXMgdGhlbXNlbHZlcyBzdGljayBhcm91bmQgdW50aWxcbiAgICAgICAgICAgICAgICAvLyAncmVtb3ZlU3RhbGVCdWNrZXRzJyBpcyBjYWxsZWQuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVCdWNrZXRDcm9zc1RpbGVJRHModGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gYnVja2V0LnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudXNlZENyb3NzVGlsZUlEc1t0aWxlSUQub3ZlcnNjYWxlZFpdKSB7XG4gICAgICAgICAgICB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvb21Dcm9zc1RpbGVJRHMgPSB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHpvb20gaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgICAgICBjb25zdCB6b29tSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1t6b29tXTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIoem9vbSkgPiB0aWxlSUQub3ZlcnNjYWxlZFopIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHpvb21JbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSW5kZXggPSB6b29tSW5kZXhlc1tpZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4LnRpbGVJRC5pc0NoaWxkT2YodGlsZUlEKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJbmRleC5maW5kTWF0Y2hlcyhidWNrZXQuc3ltYm9sSW5zdGFuY2VzLCB0aWxlSUQsIHpvb21Dcm9zc1RpbGVJRHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb29yZCA9IHRpbGVJRC5zY2FsZWRUbyhOdW1iZXIoem9vbSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gem9vbUluZGV4ZXNbcGFyZW50Q29vcmQua2V5XTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5kZXguZmluZE1hdGNoZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcywgdGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gYnVja2V0LnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEKSB7XG4gICAgICAgICAgICAgICAgLy8gc3ltYm9sIGRpZCBub3QgbWF0Y2ggYW55IGtub3duIHN5bWJvbCwgYXNzaWduIGEgbmV3IGlkXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSBjcm9zc1RpbGVJRHMuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICB6b29tQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ZXNbdGlsZUlELm92ZXJzY2FsZWRaXVt0aWxlSUQua2V5XSA9IG5ldyBUaWxlTGF5ZXJJbmRleCh0aWxlSUQsIGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMsIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW1vdmVCdWNrZXRDcm9zc1RpbGVJRHMoem9vbTogc3RyaW5nIHwgbnVtYmVyLCByZW1vdmVkQnVja2V0OiBUaWxlTGF5ZXJJbmRleCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZW1vdmVkQnVja2V0LmluZGV4ZWRTeW1ib2xJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ltYm9sSW5zdGFuY2Ugb2YgcmVtb3ZlZEJ1Y2tldC5pbmRleGVkU3ltYm9sSW5zdGFuY2VzWyhrZXk6IGFueSldKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlZENyb3NzVGlsZUlEc1t6b29tXVtzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVTdGFsZUJ1Y2tldHMoY3VycmVudElEczogeyBbc3RyaW5nIHwgbnVtYmVyXTogYm9vbGVhbiB9KSB7XG4gICAgICAgIGxldCB0aWxlc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCB6IGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbel07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRpbGVLZXkgaW4gem9vbUluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRJRHNbem9vbUluZGV4ZXNbdGlsZUtleV0uYnVja2V0SW5zdGFuY2VJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVCdWNrZXRDcm9zc1RpbGVJRHMoeiwgem9vbUluZGV4ZXNbdGlsZUtleV0pO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgem9vbUluZGV4ZXNbdGlsZUtleV07XG4gICAgICAgICAgICAgICAgICAgIHRpbGVzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlc0NoYW5nZWQ7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc1RpbGVTeW1ib2xJbmRleCB7XG4gICAgbGF5ZXJJbmRleGVzOiB7W2xheWVySWQ6IHN0cmluZ106IENyb3NzVGlsZVN5bWJvbExheWVySW5kZXh9O1xuICAgIGNyb3NzVGlsZUlEczogQ3Jvc3NUaWxlSURzO1xuICAgIG1heEJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcjtcbiAgICBidWNrZXRzSW5DdXJyZW50UGxhY2VtZW50OiB7W186IG51bWJlcl06IGJvb2xlYW59O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJJbmRleGVzID0ge307XG4gICAgICAgIHRoaXMuY3Jvc3NUaWxlSURzID0gbmV3IENyb3NzVGlsZUlEcygpO1xuICAgICAgICB0aGlzLm1heEJ1Y2tldEluc3RhbmNlSWQgPSAwO1xuICAgICAgICB0aGlzLmJ1Y2tldHNJbkN1cnJlbnRQbGFjZW1lbnQgPSB7fTtcbiAgICB9XG5cbiAgICBhZGRMYXllcihzdHlsZUxheWVyOiBTdHlsZUxheWVyLCB0aWxlczogQXJyYXk8VGlsZT4sIGxuZzogbnVtYmVyKSB7XG4gICAgICAgIGxldCBsYXllckluZGV4ID0gdGhpcy5sYXllckluZGV4ZXNbc3R5bGVMYXllci5pZF07XG4gICAgICAgIGlmIChsYXllckluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxheWVySW5kZXggPSB0aGlzLmxheWVySW5kZXhlc1tzdHlsZUxheWVyLmlkXSA9IG5ldyBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY3VycmVudEJ1Y2tldElEcyA9IHt9O1xuXG4gICAgICAgIGxheWVySW5kZXguaGFuZGxlV3JhcEp1bXAobG5nKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldCB8fCBzdHlsZUxheWVyLmlkICE9PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICghc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZCA9ICsrdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJbmRleC5hZGRCdWNrZXQodGlsZS50aWxlSUQsIHN5bWJvbEJ1Y2tldCwgdGhpcy5jcm9zc1RpbGVJRHMpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudEJ1Y2tldElEc1tzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheWVySW5kZXgucmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRCdWNrZXRJRHMpKSB7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ltYm9sQnVja2V0c0NoYW5nZWQ7XG4gICAgfVxuXG4gICAgcHJ1bmVVbnVzZWRMYXllcnModXNlZExheWVyczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCB1c2VkTGF5ZXJNYXAgPSB7fTtcbiAgICAgICAgdXNlZExheWVycy5mb3JFYWNoKCh1c2VkTGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHVzZWRMYXllck1hcFt1c2VkTGF5ZXJdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLmxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKCF1c2VkTGF5ZXJNYXBbbGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sYXllckluZGV4ZXNbbGF5ZXJJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb3NzVGlsZVN5bWJvbEluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHsgUkdCQUltYWdlIH0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllcic7XG5pbXBvcnQgY3JlYXRlU3R5bGVMYXllciBmcm9tICcuL2NyZWF0ZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgbG9hZFNwcml0ZSBmcm9tICcuL2xvYWRfc3ByaXRlJztcbmltcG9ydCBJbWFnZU1hbmFnZXJGYWN0b3J5IGZyb20gJy4uL3JlbmRlci9pbWFnZV9tYW5hZ2VyX2ZhY3RvcnknO1xuaW1wb3J0IEdseXBoTWFuYWdlckZhY3RvcnkgZnJvbSAnLi4vcmVuZGVyL2dseXBoX21hbmFnZXJfZmFjdG9yeSc7XG5pbXBvcnQgSW1hZ2VNYW5hZ2VyIGZyb20gJy4uL3JlbmRlci9pbWFnZV9tYW5hZ2VyJztcbmltcG9ydCBHbHlwaE1hbmFnZXIgZnJvbSAnLi4vcmVuZGVyL2dseXBoX21hbmFnZXInO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4vbGlnaHQnO1xuaW1wb3J0IExpbmVBdGxhcyBmcm9tICcuLi9yZW5kZXIvbGluZV9hdGxhcyc7XG5pbXBvcnQge3BpY2ssIGNsb25lLCBleHRlbmQsIGRlZXBFcXVhbCwgZmlsdGVyT2JqZWN0LCBtYXBPYmplY3R9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQge2dldEpTT04sIGdldFJlZmVycmVyLCBtYWtlUmVxdWVzdCwgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXgnO1xuaW1wb3J0IHtpc01hcGJveFVSTH0gZnJvbSAnLi4vdXRpbC9tYXBib3gnO1xuaW1wb3J0IERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyJztcbmltcG9ydCB7dmFsaWRhdGVTdHlsZSwgZW1pdFZhbGlkYXRpb25FcnJvcnMgYXMgX2VtaXRWYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlJztcbmltcG9ydCB7XG4gICAgZ2V0VHlwZSBhcyBnZXRTb3VyY2VUeXBlLFxuICAgIHNldFR5cGUgYXMgc2V0U291cmNlVHlwZSxcbiAgICB0eXBlIFNvdXJjZUNsYXNzXG59IGZyb20gJy4uL3NvdXJjZS9zb3VyY2UnO1xuaW1wb3J0IHtxdWVyeVJlbmRlcmVkRmVhdHVyZXMsIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzLCBxdWVyeVNvdXJjZUZlYXR1cmVzfSBmcm9tICcuLi9zb3VyY2UvcXVlcnlfZmVhdHVyZXMnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IEdlb0pTT05Tb3VyY2UgZnJvbSAnLi4vc291cmNlL2dlb2pzb25fc291cmNlJztcbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0JztcbmltcG9ydCBnZXRXb3JrZXJQb29sIGZyb20gJy4uL3V0aWwvZ2xvYmFsX3dvcmtlcl9wb29sJztcbmltcG9ydCBkZXJlZiBmcm9tICcuLi9zdHlsZS1zcGVjL2RlcmVmJztcbmltcG9ydCBlbXB0eVN0eWxlIGZyb20gJy4uL3N0eWxlLXNwZWMvZW1wdHknO1xuaW1wb3J0IGRpZmZTdHlsZXMsIHtvcGVyYXRpb25zIGFzIGRpZmZPcGVyYXRpb25zfSBmcm9tICcuLi9zdHlsZS1zcGVjL2RpZmYnO1xuaW1wb3J0IHtcbiAgICByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlLFxuICAgIGV2ZW50ZWQgYXMgcnRsVGV4dFBsdWdpbkV2ZW50ZWQsXG4gICAgdHJpZ2dlclBsdWdpbkNvbXBsZXRpb25FdmVudFxufSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luJztcbmltcG9ydCBQYXVzZWFibGVQbGFjZW1lbnQgZnJvbSAnLi9wYXVzZWFibGVfcGxhY2VtZW50JztcbmltcG9ydCBab29tSGlzdG9yeSBmcm9tICcuL3pvb21faGlzdG9yeSc7XG5pbXBvcnQgQ3Jvc3NUaWxlU3ltYm9sSW5kZXggZnJvbSAnLi4vc3ltYm9sL2Nyb3NzX3RpbGVfc3ltYm9sX2luZGV4JztcbmltcG9ydCB7dmFsaWRhdGVDdXN0b21TdHlsZUxheWVyfSBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XG5cbi8vIFdlJ3JlIHNraXBwaW5nIHZhbGlkYXRpb24gZXJyb3JzIHdpdGggdGhlIGBzb3VyY2UuY2FudmFzYCBpZGVudGlmaWVyIGluIG9yZGVyXG4vLyB0byBjb250aW51ZSB0byBhbGxvdyBjYW52YXMgc291cmNlcyB0byBiZSBhZGRlZCBhdCBydW50aW1lL3VwZGF0ZWQgaW5cbi8vIHNtYXJ0IHNldFN0eWxlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvcHVsbC82NDI0KTpcbmNvbnN0IGVtaXRWYWxpZGF0aW9uRXJyb3JzID0gKGV2ZW50ZWQ6IEV2ZW50ZWQsIGVycm9yczogPyRSZWFkT25seUFycmF5PHttZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI/OiBzdHJpbmd9PikgPT5cbiAgICBfZW1pdFZhbGlkYXRpb25FcnJvcnMoZXZlbnRlZCwgZXJyb3JzICYmIGVycm9ycy5maWx0ZXIoZXJyb3IgPT4gZXJyb3IuaWRlbnRpZmllciAhPT0gJ3NvdXJjZS5jYW52YXMnKSk7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4vc3R5bGVfaW1hZ2UnO1xuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4vc3R5bGVfZ2x5cGgnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjayc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSB7UGxhY2VtZW50fSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcbmltcG9ydCB0eXBlIHtSZXF1ZXN0UGFyYW1ldGVycywgUmVzcG9uc2VDYWxsYmFja30gZnJvbSAnLi4vdXRpbC9hamF4JztcbmltcG9ydCB0eXBlIHtHZW9KU09OfSBmcm9tICdAbWFwYm94L2dlb2pzb24tdHlwZXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIExheWVyU3BlY2lmaWNhdGlvbixcbiAgICBGaWx0ZXJTcGVjaWZpY2F0aW9uLFxuICAgIFN0eWxlU3BlY2lmaWNhdGlvbixcbiAgICBMaWdodFNwZWNpZmljYXRpb24sXG4gICAgU291cmNlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcbmltcG9ydCB0eXBlIHtDdXN0b21MYXllckludGVyZmFjZX0gZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge1ZhbGlkYXRvcn0gZnJvbSAnLi92YWxpZGF0ZV9zdHlsZSc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5jb25zdCBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucyA9IHBpY2soZGlmZk9wZXJhdGlvbnMsIFtcbiAgICAnYWRkTGF5ZXInLFxuICAgICdyZW1vdmVMYXllcicsXG4gICAgJ3NldFBhaW50UHJvcGVydHknLFxuICAgICdzZXRMYXlvdXRQcm9wZXJ0eScsXG4gICAgJ3NldEZpbHRlcicsXG4gICAgJ2FkZFNvdXJjZScsXG4gICAgJ3JlbW92ZVNvdXJjZScsXG4gICAgJ3NldExheWVyWm9vbVJhbmdlJyxcbiAgICAnc2V0TGlnaHQnLFxuICAgICdzZXRUcmFuc2l0aW9uJyxcbiAgICAnc2V0R2VvSlNPTlNvdXJjZURhdGEnLFxuICAgICdzZXRHbHlwaHMnLFxuICAgICdzZXRTcHJpdGUnLFxuXSk7XG5cbmNvbnN0IGlnbm9yZWREaWZmT3BlcmF0aW9ucyA9IHBpY2soZGlmZk9wZXJhdGlvbnMsIFtcbiAgICAnc2V0Q2VudGVyJyxcbiAgICAnc2V0Wm9vbScsXG4gICAgJ3NldEJlYXJpbmcnLFxuICAgICdzZXRQaXRjaCdcbl0pO1xuXG5jb25zdCBlbXB0eSA9IGVtcHR5U3R5bGUoKTtcblxuZXhwb3J0IHR5cGUgU3R5bGVPcHRpb25zID0ge1xuICAgIHZhbGlkYXRlPzogYm9vbGVhbixcbiAgICBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk/OiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIFN0eWxlU2V0dGVyT3B0aW9ucyA9IHtcbiAgICB2YWxpZGF0ZT86IGJvb2xlYW5cbn07XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0eWxlIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgbWFwOiBNYXA7XG4gICAgc3R5bGVzaGVldDogU3R5bGVTcGVjaWZpY2F0aW9uO1xuICAgIGRpc3BhdGNoZXI6IERpc3BhdGNoZXI7XG4gICAgaW1hZ2VNYW5hZ2VyRmFjdG9yeTogSW1hZ2VNYW5hZ2VyRmFjdG9yeTtcbiAgICBnbHlwaE1hbmFnZXJGYWN0b3J5OiBHbHlwaE1hbmFnZXJGYWN0b3J5O1xuICAgIGxpbmVBdGxhczogTGluZUF0bGFzO1xuICAgIGxpZ2h0OiBMaWdodDtcblxuICAgIF9yZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcbiAgICBfc3ByaXRlUmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX3Nwcml0ZXM6IHsgW3N0cmluZ106IHN0cmluZyB9O1xuICAgIF9nbHlwaHM6IHsgW3N0cmluZ106IHN0cmluZyB9O1xuICAgIF9sYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn07XG4gICAgX3NlcmlhbGl6ZWRMYXllcnM6IHtbXzogc3RyaW5nXTogT2JqZWN0fTtcbiAgICBfb3JkZXI6IEFycmF5PHN0cmluZz47XG4gICAgc291cmNlQ2FjaGVzOiB7W186IHN0cmluZ106IFNvdXJjZUNhY2hlfTtcbiAgICB6b29tSGlzdG9yeTogWm9vbUhpc3Rvcnk7XG4gICAgX2xvYWRlZDogYm9vbGVhbjtcbiAgICBfcnRsVGV4dFBsdWdpbkNhbGxiYWNrOiBGdW5jdGlvbjtcbiAgICBfY2hhbmdlZDogYm9vbGVhbjtcbiAgICBfdXBkYXRlZFNvdXJjZXM6IHtbXzogc3RyaW5nXTogJ2NsZWFyJyB8ICdyZWxvYWQnfTtcbiAgICBfdXBkYXRlZExheWVyczoge1tfOiBzdHJpbmddOiB0cnVlfTtcbiAgICBfcmVtb3ZlZExheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfTtcbiAgICBfY2hhbmdlZEltYWdlczoge1tfOiBzdHJpbmddOiB0cnVlfTtcbiAgICBfdXBkYXRlZFBhaW50UHJvcHM6IHtbbGF5ZXI6IHN0cmluZ106IHRydWV9O1xuICAgIF9sYXllck9yZGVyQ2hhbmdlZDogYm9vbGVhbjtcbiAgICBfYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY3Jvc3NUaWxlU3ltYm9sSW5kZXg6IENyb3NzVGlsZVN5bWJvbEluZGV4O1xuICAgIHBhdXNlYWJsZVBsYWNlbWVudDogUGF1c2VhYmxlUGxhY2VtZW50O1xuICAgIHBsYWNlbWVudDogUGxhY2VtZW50O1xuICAgIHo6IG51bWJlcjtcblxuICAgIC8vIGV4cG9zZWQgdG8gYWxsb3cgc3R1YmJpbmcgYnkgdW5pdCB0ZXN0c1xuICAgIHN0YXRpYyBnZXRTb3VyY2VUeXBlOiB0eXBlb2YgZ2V0U291cmNlVHlwZTtcbiAgICBzdGF0aWMgc2V0U291cmNlVHlwZTogdHlwZW9mIHNldFNvdXJjZVR5cGU7XG4gICAgc3RhdGljIHJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2U6IHR5cGVvZiByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlO1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IFN0eWxlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGdldFdvcmtlclBvb2woKSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3RzID0ge307XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeSA9IG5ldyBJbWFnZU1hbmFnZXJGYWN0b3J5KCk7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5zZXRFdmVudGVkUGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlckZhY3RvcnkgPSBuZXcgR2x5cGhNYW5hZ2VyRmFjdG9yeShtYXAuX3JlcXVlc3RNYW5hZ2VyLCBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSk7XG4gICAgICAgIHRoaXMuX3Nwcml0ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fZ2x5cGhzID0ge307XG4gICAgICAgIHRoaXMubGluZUF0bGFzID0gbmV3IExpbmVBdGxhcygyNTYsIDUxMik7XG4gICAgICAgIHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXggPSBuZXcgQ3Jvc3NUaWxlU3ltYm9sSW5kZXgoKTtcblxuICAgICAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fc2VyaWFsaXplZExheWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9vcmRlciAgPSBbXTtcbiAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXMgPSB7fTtcbiAgICAgICAgdGhpcy56b29tSGlzdG9yeSA9IG5ldyBab29tSGlzdG9yeSgpO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzID0gW107XG5cbiAgICAgICAgdGhpcy5fcmVzZXRVcGRhdGVzKCk7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc2V0UmVmZXJyZXInLCBnZXRSZWZlcnJlcigpKTtcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5fcnRsVGV4dFBsdWdpbkNhbGxiYWNrID0gU3R5bGUucmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIHBsdWdpblN0YXR1czogZXZlbnQucGx1Z2luU3RhdHVzLFxuICAgICAgICAgICAgICAgIHBsdWdpblVSTDogZXZlbnQucGx1Z2luVVJMXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc3luY1JUTFBsdWdpblN0YXRlJywgc3RhdGUsIChlcnIsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50KGVycik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsQ29tcGxldGUgPSByZXN1bHRzLmV2ZXJ5KChlbGVtKSA9PiBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbENvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNlbGYuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2VDYWNoZXNbaWRdLnJlbG9hZCgpOyAvLyBTaG91bGQgYmUgYSBuby1vcCBpZiB0aGUgcGx1Z2luIGxvYWRzIGJlZm9yZSBhbnkgdGlsZXMgbG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbignZGF0YScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGFUeXBlICE9PSAnc291cmNlJyB8fCBldmVudC5zb3VyY2VEYXRhVHlwZSAhPT0gJ21ldGFkYXRhJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tldmVudC5zb3VyY2VJZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgIGlmICghc291cmNlIHx8ICFzb3VyY2UudmVjdG9yTGF5ZXJJZHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuc291cmNlID09PSBzb3VyY2UuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkVVJMKHVybDogc3RyaW5nLCBvcHRpb25zOiB7XG4gICAgICAgIHZhbGlkYXRlPzogYm9vbGVhbixcbiAgICAgICAgYWNjZXNzVG9rZW4/OiBzdHJpbmdcbiAgICB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSB0eXBlb2Ygb3B0aW9ucy52YWxpZGF0ZSA9PT0gJ2Jvb2xlYW4nID9cbiAgICAgICAgICAgIG9wdGlvbnMudmFsaWRhdGUgOiAhaXNNYXBib3hVUkwodXJsKTtcblxuICAgICAgICB1cmwgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplU3R5bGVVUkwodXJsLCBvcHRpb25zLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlN0eWxlKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdCA9IGdldEpTT04ocmVxdWVzdCwgKGVycm9yOiA/RXJyb3IsIGpzb246ID9PYmplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycm9yKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGpzb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkKGpzb24sIHZhbGlkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZEpTT04oanNvbjogU3R5bGVTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcblxuICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gYnJvd3Nlci5mcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xvYWQoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShqc29uKSksIG9wdGlvbnMudmFsaWRhdGUgIT09IGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZEVtcHR5KCkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICAgICAgdGhpcy5fbG9hZChlbXB0eSwgZmFsc2UpO1xuICAgIH1cblxuICAgIF9sb2FkKGpzb246IFN0eWxlU3BlY2lmaWNhdGlvbiwgdmFsaWRhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbGlkYXRlICYmIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlU3R5bGUoanNvbikpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBqc29uO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4ganNvbi5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFNvdXJjZShpZCwganNvbi5zb3VyY2VzW2lkXSwge3ZhbGlkYXRlOiBmYWxzZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpzb24uc3ByaXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkU3ByaXRlKGpzb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LnNldExvYWRlZCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBqc29uLmdseXBocyA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICBjb25zdCBnbHlwaHNPYmogPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGpzb24uc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICBnbHlwaHNPYmpbaWRdID0ganNvbi5nbHlwaHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdseXBoc09ialsnaW1hZ2VfbWFuYWdlcl9kZWZhdWx0J109anNvbi5nbHlwaHM7XG4gICAgICAgICAgICAgICAganNvbi5nbHlwaHMgPSBnbHlwaHNPYmo7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VJZCBpbiBqc29uLmdseXBocykge1xuICAgICAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXJGYWN0b3J5LnNldFVSTChqc29uLmdseXBoc1tzb3VyY2VJZF0sIHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2dseXBoc1tzb3VyY2VJZF0gPSBqc29uLmdseXBoc1tzb3VyY2VJZF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXllcnMgPSBkZXJlZih0aGlzLnN0eWxlc2hlZXQubGF5ZXJzKTtcblxuICAgICAgICB0aGlzLl9vcmRlciA9IGxheWVycy5tYXAoKGxheWVyKSA9PiBsYXllci5pZCk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgICAgICBsYXllciA9IGNyZWF0ZVN0eWxlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7bGF5ZXI6IHtpZDogbGF5ZXIuaWR9fSk7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldExheWVycycsIHRoaXMuX3NlcmlhbGl6ZUxheWVycyh0aGlzLl9vcmRlcikpO1xuXG4gICAgICAgIHRoaXMubGlnaHQgPSBuZXcgTGlnaHQodGhpcy5zdHlsZXNoZWV0LmxpZ2h0KTtcblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdzdHlsZS5sb2FkJykpO1xuICAgIH1cblxuICAgIF9sb2FkU3ByaXRlKGpzb24pIHtcbiAgICAgICAgY29uc3QgY2IgPSAoc291cmNlSWQsIGltYWdlcywgZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zcHJpdGVzW3NvdXJjZUlkXSA9IHR5cGVvZiBqc29uLnNwcml0ZSA9PT0gXCJzdHJpbmdcIiA/IGpzb24uc3ByaXRlIDoganNvbi5zcHJpdGVbc291cmNlSWRdO1xuICAgICAgICAgICAgdGhpcy5fc3ByaXRlUmVxdWVzdHNbc291cmNlSWRdID0gbnVsbDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zcHJpdGVSZXF1ZXN0c1tzb3VyY2VJZF07XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWFnZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGltYWdlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlckZhY3RvcnkuYWRkSW1hZ2UoaWQsIGltYWdlc1tpZF0sIHNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlckZhY3Rvcnkuc2V0TG9hZGVkKHRydWUsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2F2YWlsYWJsZUltYWdlcyA9IHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5saXN0SW1hZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwic2V0SW1hZ2VzXCIsIHRoaXMuX2F2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KFwiZGF0YVwiLCB7IGRhdGFUeXBlOiBcInN0eWxlXCIgfSkpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uc3ByaXRlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBzcHJpdGVCYWsgPSBqc29uLnNwcml0ZTtcbiAgICAgICAgICAgIGNvbnN0IF9zcHJpdGVSZXF1ZXN0ID0gbG9hZFNwcml0ZShqc29uLnNwcml0ZSwgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCAoZXJyLCBpbWFnZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcHJpdGVPYmogPSB7J2ltYWdlX21hbmFnZXJfZGVmYXVsdCc6anNvbi5zcHJpdGV9O1xuICAgICAgICAgICAgICAgIGNiKCdpbWFnZV9tYW5hZ2VyX2RlZmF1bHQnLCBpbWFnZXMsIGVycik7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBqc29uLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ByaXRlT2JqW2lkXSA9IHNwcml0ZUJhaztcbiAgICAgICAgICAgICAgICAgICAgY2IoaWQsIGltYWdlcywgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAganNvbi5zcHJpdGUgPSBzcHJpdGVPYmo7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3RzWydpbWFnZV9tYW5hZ2VyX2RlZmF1bHQnXSA9IF9zcHJpdGVSZXF1ZXN0O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlSWQgaW4ganNvbi5zcHJpdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IF9zcHJpdGVSZXF1ZXN0ID0gbG9hZFNwcml0ZShqc29uLnNwcml0ZVtzb3VyY2VJZF0sIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlciwgKGVyciwgaW1hZ2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2Ioc291cmNlSWQsIGltYWdlcywgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fc3ByaXRlUmVxdWVzdHNbc291cmNlSWRdID0gX3Nwcml0ZVJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0U3ByaXRlKHNwcml0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3ByaXRlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRTcHJpdGUoa2V5LCBzcHJpdGVzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFNwcml0ZU9iamVjdChzb3VyY2VJZCwgc3ByaXRlSW1hZ2UgLCBzcHJpdGVKc29uKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKHNwcml0ZUltYWdlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzcHJpdGVKc29uKSB7XG4gICAgICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgeCwgeSwgc2RmLCBwaXhlbFJhdGlvfSA9IHNwcml0ZUpzb25baWRdO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoLCBoZWlnaHR9KTtcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KGltYWdlRGF0YSwgZGF0YSwge3gsIHl9LCB7eDogMCwgeTogMH0sIHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgICAgICAgICByZXN1bHRbaWRdID0ge2RhdGEsIHBpeGVsUmF0aW8sIHNkZn07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5hZGRJbWFnZShpZCwgcmVzdWx0W2lkXSwgc291cmNlSWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFNwcml0ZShzb3VyY2VJZCwgc3ByaXRlKSB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LmltYWdlTWFuYWdlcnNbc291cmNlSWRdKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlckZhY3RvcnkuaW1hZ2VNYW5hZ2Vyc1tzb3VyY2VJZF0gPSBuZXcgSW1hZ2VNYW5hZ2VyKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlSWQgIT09IFwiaW1hZ2VfbWFuYWdlcl9kZWZhdWx0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlckZhY3RvcnkuaW1hZ2VNYW5hZ2Vyc1tzb3VyY2VJZF0uZGVmYXVsdEltYWdlTWFuZ2VyICA9IHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5pbWFnZU1hbmFnZXJzW1wiaW1hZ2VfbWFuYWdlcl9kZWZhdWx0XCJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9zcHJpdGVSZXF1ZXN0ID0gbG9hZFNwcml0ZShzcHJpdGUsIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlciwgKGVyciwgaW1hZ2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zcHJpdGVzW3NvdXJjZUlkXSA9IHNwcml0ZTtcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3RzW3NvdXJjZUlkXSA9IG51bGw7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fc3ByaXRlUmVxdWVzdHNbc291cmNlSWRdO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBpbWFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LmFkZEltYWdlKGlkLCBpbWFnZXNbaWRdLCBzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlckZhY3Rvcnkuc2V0TG9hZGVkKHRydWUsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoXCJkYXRhXCIsIHsgZGF0YVR5cGU6IFwic3R5bGVcIiB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zcHJpdGVSZXF1ZXN0c1tzb3VyY2VJZF0gPSBfc3ByaXRlUmVxdWVzdDtcbiAgICB9XG4gICAgc2V0R2x5cGhzKGdseXBocykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBnbHlwaHMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkR2x5cGhzKGtleSwgZ2x5cGhzW2tleV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEdseXBocyhzb3VyY2VJZCwgZ2x5cGhzKSB7XG4gICAgICAgIHRoaXMuX2dseXBoc1tzb3VyY2VJZF0gPSBnbHlwaHM7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyRmFjdG9yeS5zZXRVUkwoZ2x5cGhzLCBzb3VyY2VJZCk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlTGF5ZXIobGF5ZXI6IFN0eWxlTGF5ZXIpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICBpZiAoIXNvdXJjZUNhY2hlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGxheWVyLnNvdXJjZUxheWVyO1xuICAgICAgICBpZiAoIXNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAnZ2VvanNvbicgfHwgKHNvdXJjZS52ZWN0b3JMYXllcklkcyAmJiBzb3VyY2UudmVjdG9yTGF5ZXJJZHMuaW5kZXhPZihzb3VyY2VMYXllcikgPT09IC0xKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgU291cmNlIGxheWVyIFwiJHtzb3VyY2VMYXllcn1cIiBgICtcbiAgICAgICAgICAgICAgICBgZG9lcyBub3QgZXhpc3Qgb24gc291cmNlIFwiJHtzb3VyY2UuaWR9XCIgYCArXG4gICAgICAgICAgICAgICAgYGFzIHNwZWNpZmllZCBieSBzdHlsZSBsYXllciBcIiR7bGF5ZXIuaWR9XCJgXG4gICAgICAgICAgICApKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkU291cmNlcykubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpXG4gICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlQ2FjaGVzW2lkXS5sb2FkZWQoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKCF0aGlzLmltYWdlTWFuYWdlckZhY3RvcnkuaXNBbGxMb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfc2VyaWFsaXplTGF5ZXJzKGlkczogQXJyYXk8c3RyaW5nPik6IEFycmF5PE9iamVjdD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkTGF5ZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLnB1c2gobGF5ZXIuc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkTGF5ZXJzO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5saWdodCAmJiB0aGlzLmxpZ2h0Lmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXllcnNbaWRdLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9jaGVja0xvYWRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3R5bGUgaXMgbm90IGRvbmUgbG9hZGluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbHkgcXVldWVkIHN0eWxlIHVwZGF0ZXMgaW4gYSBiYXRjaCBhbmQgcmVjYWxjdWxhdGUgem9vbS1kZXBlbmRlbnQgcGFpbnQgcHJvcGVydGllcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbmdlZCA9IHRoaXMuX2NoYW5nZWQ7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSWRzID0gT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZExheWVycyk7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkSWRzID0gT2JqZWN0LmtleXModGhpcy5fcmVtb3ZlZExheWVycyk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkSWRzLmxlbmd0aCB8fCByZW1vdmVkSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdvcmtlckxheWVycyh1cGRhdGVkSWRzLCByZW1vdmVkSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdXBkYXRlZFNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl91cGRhdGVkU291cmNlc1tpZF07XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGFjdGlvbiA9PT0gJ3JlbG9hZCcgfHwgYWN0aW9uID09PSAnY2xlYXInKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAncmVsb2FkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRTb3VyY2UoaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY2xlYXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyU291cmNlKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcygpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXS51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5saWdodC51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcblxuICAgICAgICAgICAgdGhpcy5fcmVzZXRVcGRhdGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tzb3VyY2VJZF0udXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcblxuICAgICAgICAgICAgbGF5ZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycywgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgIGlmICghbGF5ZXIuaXNIaWRkZW4ocGFyYW1ldGVycy56b29tKSAmJiBsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdLnVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saWdodC5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgdGhpcy56ID0gcGFyYW1ldGVycy56b29tO1xuXG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEFwcGx5IGFueSBxdWV1ZWQgaW1hZ2UgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBfdXBkYXRlVGlsZXNGb3JDaGFuZ2VkSW1hZ2VzKCkge1xuICAgICAgICBjb25zdCBjaGFuZ2VkSW1hZ2VzID0gT2JqZWN0LmtleXModGhpcy5fY2hhbmdlZEltYWdlcyk7XG4gICAgICAgIGlmIChjaGFuZ2VkSW1hZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbbmFtZV0ucmVsb2FkVGlsZXNGb3JEZXBlbmRlbmNpZXMoWydpY29ucycsICdwYXR0ZXJucyddLCBjaGFuZ2VkSW1hZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRJbWFnZXMgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVXb3JrZXJMYXllcnModXBkYXRlZElkczogQXJyYXk8c3RyaW5nPiwgcmVtb3ZlZElkczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCd1cGRhdGVMYXllcnMnLCB7XG4gICAgICAgICAgICBsYXllcnM6IHRoaXMuX3NlcmlhbGl6ZUxheWVycyh1cGRhdGVkSWRzKSxcbiAgICAgICAgICAgIHJlbW92ZWRJZHNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3Jlc2V0VXBkYXRlcygpIHtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZWRMYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlZExheWVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzID0ge307XG4gICAgICAgIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzID0ge307XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlZEltYWdlcyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIHN0eWxlJ3Mgc3RhdGUgdG8gbWF0Y2ggdGhlIGdpdmVuIHN0eWxlIEpTT04sIHBlcmZvcm1pbmcgb25seVxuICAgICAqIHRoZSBuZWNlc3NhcnkgbXV0YXRpb25zLlxuICAgICAqXG4gICAgICogTWF5IHRocm93IGFuIEVycm9yICgnVW5pbXBsZW1lbnRlZDogTUVUSE9EJykgaWYgdGhlIG1hcGJveC1nbC1zdHlsZS1zcGVjXG4gICAgICogZGlmZiBhbGdvcml0aG0gcHJvZHVjZXMgYW4gb3BlcmF0aW9uIHRoYXQgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFueSBjaGFuZ2VzIHdlcmUgbWFkZTsgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRTdGF0ZShuZXh0U3RhdGU6IFN0eWxlU3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGlmIChlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZVN0eWxlKG5leHRTdGF0ZSkpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbmV4dFN0YXRlID0gY2xvbmUobmV4dFN0YXRlKTtcbiAgICAgICAgbmV4dFN0YXRlLmxheWVycyA9IGRlcmVmKG5leHRTdGF0ZS5sYXllcnMpO1xuXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBkaWZmU3R5bGVzKHRoaXMuc2VyaWFsaXplKCksIG5leHRTdGF0ZSlcbiAgICAgICAgICAgIC5maWx0ZXIob3AgPT4gIShvcC5jb21tYW5kIGluIGlnbm9yZWREaWZmT3BlcmF0aW9ucykpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZE9wcyA9IGNoYW5nZXMuZmlsdGVyKG9wID0+ICEob3AuY29tbWFuZCBpbiBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucykpO1xuICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQ6ICR7dW5pbXBsZW1lbnRlZE9wcy5tYXAob3AgPT4gb3AuY29tbWFuZCkuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFuZ2VzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgICAgICAgICBpZiAob3AuY29tbWFuZCA9PT0gJ3NldFRyYW5zaXRpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gYHRyYW5zaXRpb25gIGlzIGFsd2F5cyByZWFkIGRpcmVjdGx5IG9mZiBvZlxuICAgICAgICAgICAgICAgIC8vIGB0aGlzLnN0eWxlc2hlZXRgLCB3aGljaCB3ZSB1cGRhdGUgYmVsb3dcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAodGhpczogYW55KVtvcC5jb21tYW5kXS5hcHBseSh0aGlzLCBvcC5hcmdzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gbmV4dFN0YXRlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFkZEltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlLCBzb3VyY2VJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmdldEltYWdlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ0FuIGltYWdlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LmFkZEltYWdlKGlkLCBpbWFnZSwgc291cmNlSWQpO1xuICAgICAgICB0aGlzLl9hZnRlckltYWdlVXBkYXRlZChpZCk7XG4gICAgfVxuXG4gICAgdXBkYXRlSW1hZ2UoaWQ6IHN0cmluZywgaW1hZ2U6IFN0eWxlSW1hZ2UsIHNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LnVwZGF0ZUltYWdlKGlkLCBpbWFnZSwgc291cmNlSWQpO1xuICAgIH1cblxuICAgIGdldEltYWdlKGlkOiBzdHJpbmcsIHNvdXJjZUlkOiBzdHJpbmcpOiA/U3R5bGVJbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlTWFuYWdlckZhY3RvcnkuZ2V0SW1hZ2UoaWQsIHNvdXJjZUlkKTtcbiAgICB9XG5cbiAgICByZW1vdmVJbWFnZShpZDogc3RyaW5nLCBzb3VyY2VJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXRJbWFnZShpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdObyBpbWFnZSB3aXRoIHRoaXMgbmFtZSBleGlzdHMuJykpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltYWdlTWFuYWdlckZhY3RvcnkucmVtb3ZlSW1hZ2UoaWQsIHNvdXJjZUlkKTtcbiAgICAgICAgdGhpcy5fYWZ0ZXJJbWFnZVVwZGF0ZWQoaWQpO1xuICAgIH1cblxuICAgIF9hZnRlckltYWdlVXBkYXRlZChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZUltYWdlcyA9IHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5saXN0SW1hZ2VzKCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWRJbWFnZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldEltYWdlcycsIHRoaXMuX2F2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgfVxuXG4gICAgbGlzdEltYWdlcyhzb3VyY2VJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5saXN0SW1hZ2VzKHNvdXJjZUlkKTtcbiAgICB9XG5cbiAgICBhZGRTb3VyY2UoaWQ6IHN0cmluZywgc291cmNlOiBTb3VyY2VTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZUNhY2hlc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzb3VyY2UudHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdHlwZSBwcm9wZXJ0eSBtdXN0IGJlIGRlZmluZWQsIGJ1dCBvbmx5IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyB3ZXJlIGdpdmVuOiAke09iamVjdC5rZXlzKHNvdXJjZSkuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tYXAuX21hcENSUyAmJlxuICAgICAgICAgICAgc291cmNlLnR5cGUgPT09IFwiZ2VvanNvblwiICYmXG4gICAgICAgICAgICBzb3VyY2UuZGF0YSAmJlxuICAgICAgICAgICAgIXNvdXJjZS5kYXRhLmN1c3RvbXByaiAmJlxuICAgICAgICAgICAgIXNvdXJjZS5jdXN0b21wcmpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzb3VyY2UuY3VzdG9tcHJqID0gdGhpcy5tYXAuY3VzdG9tQ29udmVydFBvaW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVpbHRJbnMgPSBbJ3ZlY3RvcicsICdyYXN0ZXInLCAnZ2VvanNvbicsICd2aWRlbycsICdpbWFnZSddO1xuICAgICAgICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9IGJ1aWx0SW5zLmluZGV4T2Yoc291cmNlLnR5cGUpID49IDA7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSAmJiB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLnNvdXJjZSwgYHNvdXJjZXMuJHtpZH1gLCBzb3VyY2UsIG51bGwsIG9wdGlvbnMpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMubWFwICYmIHRoaXMubWFwLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcpIChzb3VyY2U6IGFueSkuY29sbGVjdFJlc291cmNlVGltaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tpZF0gPSBuZXcgU291cmNlQ2FjaGUoaWQsIHNvdXJjZSwgdGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgc291cmNlQ2FjaGUuc3R5bGUgPSB0aGlzO1xuICAgICAgICBzb3VyY2VDYWNoZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsICgpID0+ICh7XG4gICAgICAgICAgICBpc1NvdXJjZUxvYWRlZDogdGhpcy5sb2FkZWQoKSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlQ2FjaGUuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBzb3VyY2VJZDogaWRcbiAgICAgICAgfSkpO1xuICAgICAgICBzb3VyY2VDYWNoZS5vbkFkZCh0aGlzLm1hcCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHNvdXJjZSBmcm9tIHRoaXMgc3R5bGVzaGVldCwgZ2l2ZW4gaXRzIGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgc291cmNlIHRvIHJlbW92ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBzb3VyY2UgaXMgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gSURcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBUaGUge0BsaW5rIE1hcH0gb2JqZWN0LlxuICAgICAqL1xuICAgIHJlbW92ZVNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc291cmNlQ2FjaGVzW2lkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGF5ZXJzW2xheWVySWRdLnNvdXJjZSA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgU291cmNlIFwiJHtpZH1cIiBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBsYXllciBcIiR7bGF5ZXJJZH1cIiBpcyB1c2luZyBpdC5gKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkU291cmNlc1tpZF07XG4gICAgICAgIHNvdXJjZUNhY2hlLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge3NvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnLCBkYXRhVHlwZTonc291cmNlJywgc291cmNlSWQ6IGlkfSkpO1xuICAgICAgICBzb3VyY2VDYWNoZS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICBzb3VyY2VDYWNoZS5jbGVhclRpbGVzKCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlLm9uUmVtb3ZlKSBzb3VyY2VDYWNoZS5vblJlbW92ZSh0aGlzLm1hcCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogU2V0IHRoZSBkYXRhIG9mIGEgR2VvSlNPTiBzb3VyY2UsIGdpdmVuIGl0cyBpZC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgc291cmNlXG4gICAgKiBAcGFyYW0ge0dlb0pTT058c3RyaW5nfSBkYXRhIEdlb0pTT04gc291cmNlXG4gICAgKi9cbiAgICBzZXRHZW9KU09OU291cmNlRGF0YShpZDogc3RyaW5nLCBkYXRhOiBHZW9KU09OIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgYXNzZXJ0KHRoaXMuc291cmNlQ2FjaGVzW2lkXSAhPT0gdW5kZWZpbmVkLCAnVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICBjb25zdCBnZW9qc29uU291cmNlOiBHZW9KU09OU291cmNlID0gKHRoaXMuc291cmNlQ2FjaGVzW2lkXS5nZXRTb3VyY2UoKTogYW55KTtcbiAgICAgICAgYXNzZXJ0KGdlb2pzb25Tb3VyY2UudHlwZSA9PT0gJ2dlb2pzb24nKTtcblxuICAgICAgICBnZW9qc29uU291cmNlLnNldERhdGEoZGF0YSk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNvdXJjZSBieSBpZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIGRlc2lyZWQgc291cmNlXG4gICAgICogQHJldHVybnMge09iamVjdH0gc291cmNlXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkOiBzdHJpbmcpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VDYWNoZXNbaWRdICYmIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5nZXRTb3VyY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYXllciB0byB0aGUgbWFwIHN0eWxlLiBUaGUgbGF5ZXIgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxheWVyIHdpdGhcbiAgICAgKiBJRCBgYmVmb3JlYCwgb3IgYXBwZW5kZWQgaWYgYGJlZm9yZWAgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IEN1c3RvbUxheWVySW50ZXJmYWNlfSBsYXllck9iamVjdCBUaGUgc3R5bGUgbGF5ZXIgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlXSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgYmVmb3JlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU3R5bGUgc2V0dGVyIG9wdGlvbnMuXG4gICAgICogQHJldHVybnMge01hcH0gVGhlIHtAbGluayBNYXB9IG9iamVjdC5cbiAgICAgKi9cbiAgICBhZGRMYXllcihsYXllck9iamVjdDogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UsIGJlZm9yZT86IHN0cmluZywgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBpZCA9IGxheWVyT2JqZWN0LmlkO1xuXG4gICAgICAgIGlmICh0aGlzLmdldExheWVyKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgTGF5ZXIgd2l0aCBpZCBcIiR7aWR9XCIgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBtYXBgKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxheWVyO1xuICAgICAgICBpZiAobGF5ZXJPYmplY3QudHlwZSA9PT0gJ2N1c3RvbScpIHtcblxuICAgICAgICAgICAgaWYgKGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlQ3VzdG9tU3R5bGVMYXllcihsYXllck9iamVjdCkpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxheWVyID0gY3JlYXRlU3R5bGVMYXllcihsYXllck9iamVjdCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGF5ZXJPYmplY3Quc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKGlkLCBsYXllck9iamVjdC5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGxheWVyT2JqZWN0ID0gY2xvbmUobGF5ZXJPYmplY3QpO1xuICAgICAgICAgICAgICAgIGxheWVyT2JqZWN0ID0gKGV4dGVuZChsYXllck9iamVjdCwge3NvdXJjZTogaWR9KTogYW55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhpcyBsYXllciBpcyBub3QgaW4gdGhlIHN0eWxlLmxheWVycyBhcnJheSwgc28gd2UgcGFzcyBhbiBpbXBvc3NpYmxlIGFycmF5IGluZGV4XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5sYXllcixcbiAgICAgICAgICAgICAgICBgbGF5ZXJzLiR7aWR9YCwgbGF5ZXJPYmplY3QsIHthcnJheUluZGV4OiAtMX0sIG9wdGlvbnMpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxheWVyID0gY3JlYXRlU3R5bGVMYXllcihsYXllck9iamVjdCk7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUxheWVyKGxheWVyKTtcblxuICAgICAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7bGF5ZXI6IHtpZH19KTtcbiAgICAgICAgICAgIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnNbbGF5ZXIuaWRdID0gbGF5ZXIuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IGJlZm9yZSA/IHRoaXMuX29yZGVyLmluZGV4T2YoYmVmb3JlKSA6IHRoaXMuX29yZGVyLmxlbmd0aDtcbiAgICAgICAgaWYgKGJlZm9yZSAmJiBpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYExheWVyIHdpdGggaWQgXCIke2JlZm9yZX1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIG1hcC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKGluZGV4LCAwLCBpZCk7XG4gICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9sYXllcnNbaWRdID0gbGF5ZXI7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdICYmIGxheWVyLnNvdXJjZSAmJiBsYXllci50eXBlICE9PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgLy8gSWYsIGluIHRoZSBjdXJyZW50IGJhdGNoLCB3ZSBoYXZlIGFscmVhZHkgcmVtb3ZlZCB0aGlzIGxheWVyXG4gICAgICAgICAgICAvLyBhbmQgd2UgYXJlIG5vdyByZS1hZGRpbmcgaXQgd2l0aCBhIGRpZmZlcmVudCBgdHlwZWAsIHRoZW4gd2VcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgKHJhdGhlciB0aGFuIGp1c3QgcmVsb2FkKSB0aGUgdW5kZXJ5bGluZyBzb3VyY2Unc1xuICAgICAgICAgICAgLy8gdGlsZXMuICBPdGhlcndpc2UsIHRpbGVzIG1hcmtlZCAncmVsb2FkaW5nJyB3aWxsIGhhdmUgYnVja2V0cyAvXG4gICAgICAgICAgICAvLyBidWZmZXJzIHRoYXQgYXJlIHNldCB1cCBmb3IgdGhlIF9wcmV2aW91c18gdmVyc2lvbiBvZiB0aGlzXG4gICAgICAgICAgICAvLyBsYXllciwgY2F1c2luZywgZS5nLjpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zNjMzXG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fcmVtb3ZlZExheWVyc1tpZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcmVtb3ZlZExheWVyc1tpZF07XG4gICAgICAgICAgICBpZiAocmVtb3ZlZC50eXBlICE9PSBsYXllci50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9ICdjbGVhcic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAncmVsb2FkJztcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdLnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuXG4gICAgICAgIGlmIChsYXllci5vbkFkZCkge1xuICAgICAgICAgICAgbGF5ZXIub25BZGQodGhpcy5tYXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBsYXllciB0byBhIGRpZmZlcmVudCB6LXBvc2l0aW9uLiBUaGUgbGF5ZXIgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxheWVyIHdpdGhcbiAgICAgKiBJRCBgYmVmb3JlYCwgb3IgYXBwZW5kZWQgaWYgYGJlZm9yZWAgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgIElEIG9mIHRoZSBsYXllciB0byBtb3ZlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtiZWZvcmVdIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmVcbiAgICAgKi9cbiAgICBtb3ZlTGF5ZXIoaWQ6IHN0cmluZywgYmVmb3JlPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2lkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgbW92ZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PT0gYmVmb3JlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX29yZGVyLmluZGV4T2YoaWQpO1xuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gYmVmb3JlID8gdGhpcy5fb3JkZXIuaW5kZXhPZihiZWZvcmUpIDogdGhpcy5fb3JkZXIubGVuZ3RoO1xuICAgICAgICBpZiAoYmVmb3JlICYmIG5ld0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgTGF5ZXIgd2l0aCBpZCBcIiR7YmVmb3JlfVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgbWFwLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKG5ld0luZGV4LCAwLCBpZCk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgbGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgZnJvbSB0aGUgc3R5bGUuXG4gICAgICpcbiAgICAgKiBJZiBubyBzdWNoIGxheWVyIGV4aXN0cywgYW4gYGVycm9yYCBldmVudCBpcyBmaXJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgbGF5ZXIgdG8gcmVtb3ZlXG4gICAgICogQGZpcmVzIGVycm9yXG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXIoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2lkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX29yZGVyLmluZGV4T2YoaWQpO1xuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdID0gbGF5ZXI7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fc2VyaWFsaXplZExheWVyc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkTGF5ZXJzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW2lkXTtcblxuICAgICAgICBpZiAobGF5ZXIub25SZW1vdmUpIHtcbiAgICAgICAgICAgIGxheWVyLm9uUmVtb3ZlKHRoaXMubWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgc3R5bGUgbGF5ZXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBpZGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZCBvZiB0aGUgZGVzaXJlZCBsYXllclxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBhIGxheWVyLCBpZiBvbmUgd2l0aCB0aGUgZ2l2ZW4gYGlkYCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXRMYXllcihpZDogc3RyaW5nKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2hlY2tzIGlmIGEgc3BlY2lmaWMgbGF5ZXIgaXMgcHJlc2VudCB3aXRoaW4gdGhlIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWQgb2YgdGhlIGRlc2lyZWQgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYSBib29sZWFuIHNwZWNpZnlpbmcgaWYgdGhlIGdpdmVuIGxheWVyIGlzIHByZXNlbnRcbiAgICAgKi9cbiAgICBoYXNMYXllcihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpZCBpbiB0aGlzLl9sYXllcnM7XG4gICAgfVxuXG4gICAgc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZDogc3RyaW5nLCBtaW56b29tOiA/bnVtYmVyLCBtYXh6b29tOiA/bnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGhhdmUgem9vbSBleHRlbnQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllci5taW56b29tID09PSBtaW56b29tICYmIGxheWVyLm1heHpvb20gPT09IG1heHpvb20pIHJldHVybjtcblxuICAgICAgICBpZiAobWluem9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5taW56b29tID0gbWluem9vbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4em9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5tYXh6b29tID0gbWF4em9vbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgc2V0RmlsdGVyKGxheWVySWQ6IHN0cmluZywgZmlsdGVyOiA/RmlsdGVyU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVlcEVxdWFsKGxheWVyLmZpbHRlciwgZmlsdGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF5ZXIuZmlsdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUuZmlsdGVyLCBgbGF5ZXJzLiR7bGF5ZXIuaWR9LmZpbHRlcmAsIGZpbHRlciwgbnVsbCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheWVyLmZpbHRlciA9IGNsb25lKGZpbHRlcik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsYXllcidzIGZpbHRlciBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgdGhlIGxheWVyIHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIGxheWVyJ3MgZmlsdGVyLCBpZiBhbnlcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXIobGF5ZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5nZXRMYXllcihsYXllcikuZmlsdGVyKTtcbiAgICB9XG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXBFcXVhbChsYXllci5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKSwgdmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgbGF5ZXIuc2V0TGF5b3V0UHJvcGVydHkobmFtZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5b3V0IHByb3BlcnR5J3MgdmFsdWUgZnJvbSBhIGdpdmVuIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgdGhlIGxheWVyIHRvIGluc3BlY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5XG4gICAgICogQHJldHVybnMgeyp9IHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllci5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRQYWludFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBzdHlsZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwRXF1YWwobGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eShuYW1lKSwgdmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmVxdWlyZXNSZWxheW91dCA9IGxheWVyLnNldFBhaW50UHJvcGVydHkobmFtZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAocmVxdWlyZXNSZWxheW91dCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW2xheWVySWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRQYWludFByb3BlcnR5KGxheWVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXllcihsYXllcikuZ2V0UGFpbnRQcm9wZXJ0eShuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRGZWF0dXJlU3RhdGUodGFyZ2V0OiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bWJlcjsgfSwgc3RhdGU6IE9iamVjdCkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRhcmdldC5zb3VyY2U7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gdGFyZ2V0LnNvdXJjZUxheWVyO1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW3NvdXJjZUlkXTtcblxuICAgICAgICBpZiAoc291cmNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHtzb3VyY2VJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50eXBlO1xuICAgICAgICBpZiAoc291cmNlVHlwZSA9PT0gJ2dlb2pzb24nICYmIHNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBHZW9KU09OIHNvdXJjZXMgY2Fubm90IGhhdmUgYSBzb3VyY2VMYXllciBwYXJhbWV0ZXIuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgIXNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0LmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLmApKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzb3VyY2VDYWNoZS5zZXRGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXIsIHRhcmdldC5pZCwgc3RhdGUpO1xuICAgIH1cblxuICAgIHJlbW92ZUZlYXR1cmVTdGF0ZSh0YXJnZXQ6IHsgc291cmNlOiBzdHJpbmc7IHNvdXJjZUxheWVyPzogc3RyaW5nOyBpZD86IHN0cmluZyB8IG51bWJlcjsgfSwga2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGFyZ2V0LnNvdXJjZTtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tzb3VyY2VJZF07XG5cbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2UgJyR7c291cmNlSWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50eXBlO1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InID8gdGFyZ2V0LnNvdXJjZUxheWVyIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiAhc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2VMYXllciBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgdmVjdG9yIHNvdXJjZSB0eXBlcy5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSAmJiAodHlwZW9mIHRhcmdldC5pZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHRhcmdldC5pZCAhPT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBBIGZlYXR1cmUgaWQgaXMgcmVxdWlyZWQgdG8gcmVtb3ZlIGl0cyBzcGVjaWZpYyBzdGF0ZSBwcm9wZXJ0eS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc291cmNlQ2FjaGUucmVtb3ZlRmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyLCB0YXJnZXQuaWQsIGtleSk7XG4gICAgfVxuXG4gICAgZ2V0RmVhdHVyZVN0YXRlKHRhcmdldDogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudW1iZXI7IH0pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0YXJnZXQuc291cmNlO1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IHRhcmdldC5zb3VyY2VMYXllcjtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tzb3VyY2VJZF07XG5cbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2UgJyR7c291cmNlSWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCkudHlwZTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldC5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgZmVhdHVyZSBpZCBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZC5gKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlLmdldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgdGFyZ2V0LmlkKTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHtkdXJhdGlvbjogMzAwLCBkZWxheTogMH0sIHRoaXMuc3R5bGVzaGVldCAmJiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbik7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gZmlsdGVyT2JqZWN0KHtcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMuc3R5bGVzaGVldC52ZXJzaW9uLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5zdHlsZXNoZWV0Lm5hbWUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5zdHlsZXNoZWV0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgbGlnaHQ6IHRoaXMuc3R5bGVzaGVldC5saWdodCxcbiAgICAgICAgICAgIGNlbnRlcjogdGhpcy5zdHlsZXNoZWV0LmNlbnRlcixcbiAgICAgICAgICAgIHpvb206IHRoaXMuc3R5bGVzaGVldC56b29tLFxuICAgICAgICAgICAgYmVhcmluZzogdGhpcy5zdHlsZXNoZWV0LmJlYXJpbmcsXG4gICAgICAgICAgICBwaXRjaDogdGhpcy5zdHlsZXNoZWV0LnBpdGNoLFxuICAgICAgICAgICAgc3ByaXRlOiB0aGlzLl9zcHJpdGVzLFxuICAgICAgICAgICAgZ2x5cGhzOiB0aGlzLl9nbHlwaHMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHNvdXJjZXM6IG1hcE9iamVjdCh0aGlzLnNvdXJjZUNhY2hlcywgKHNvdXJjZSkgPT4gc291cmNlLnNlcmlhbGl6ZSgpKSxcbiAgICAgICAgICAgIGxheWVyczogdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHRoaXMuX29yZGVyKVxuICAgICAgICB9LCAodmFsdWUpID0+IHsgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7IH0pO1xuICAgIH1cblxuICAgIF91cGRhdGVMYXllcihsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzW2xheWVyLmlkXSA9IHRydWU7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UgJiYgIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gJiZcbiAgICAgICAgICAgIC8vU2tpcCBmb3IgcmFzdGVyIGxheWVycyAoaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzc4NjUpXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdLmdldFNvdXJjZSgpLnR5cGUgIT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gJ3JlbG9hZCc7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2ZsYXR0ZW5BbmRTb3J0UmVuZGVyZWRGZWF0dXJlcyhzb3VyY2VSZXN1bHRzOiBBcnJheTxhbnk+KSB7XG4gICAgICAgIC8vIEZlYXR1cmUgb3JkZXIgaXMgY29tcGxpY2F0ZWQuXG4gICAgICAgIC8vIFRoZSBvcmRlciBiZXR3ZWVuIGZlYXR1cmVzIGluIHR3byAyRCBsYXllcnMgaXMgYWx3YXlzIGRldGVybWluZWQgYnkgbGF5ZXIgb3JkZXIuXG4gICAgICAgIC8vIFRoZSBvcmRlciBiZXR3ZWVuIGZlYXR1cmVzIGluIHR3byAzRCBsYXllcnMgaXMgYWx3YXlzIGRldGVybWluZWQgYnkgZGVwdGguXG4gICAgICAgIC8vIFRoZSBvcmRlciBiZXR3ZWVuIGEgZmVhdHVyZSBpbiBhIDJEIGxheWVyIGFuZCBhIDNEIGxheWVyIGlzIHRyaWNreTpcbiAgICAgICAgLy8gICAgICBNb3N0IG9mdGVuIGxheWVyIG9yZGVyIGRldGVybWluZXMgdGhlIGZlYXR1cmUgb3JkZXIgaW4gdGhpcyBjYXNlLiBJZlxuICAgICAgICAvLyAgICAgIGEgbGluZSBsYXllciBpcyBhYm92ZSBhIGV4dHJ1c2lvbiBsYXllciB0aGUgbGluZSBmZWF0dXJlIHdpbGwgYmUgcmVuZGVyZWRcbiAgICAgICAgLy8gICAgICBhYm92ZSB0aGUgZXh0cnVzaW9uLiBJZiB0aGUgbGluZSBsYXllciBpcyBiZWxvdyB0aGUgZXh0cnVzaW9uIGxheWVyLFxuICAgICAgICAvLyAgICAgIGl0IHdpbGwgYmUgcmVuZGVyZWQgYmVsb3cgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgVGhlcmUgaXMgYSB3ZWlyZCBjYXNlIHRob3VnaC5cbiAgICAgICAgLy8gICAgICBZb3UgaGF2ZSBsYXllcnMgaW4gdGhpcyBvcmRlcjogZXh0cnVzaW9uX2xheWVyX2EsIGxpbmVfbGF5ZXIsIGV4dHJ1c2lvbl9sYXllcl9iXG4gICAgICAgIC8vICAgICAgRWFjaCBsYXllciBoYXMgYSBmZWF0dXJlIHRoYXQgb3ZlcmxhcHMgdGhlIG90aGVyIGZlYXR1cmVzLlxuICAgICAgICAvLyAgICAgIFRoZSBmZWF0dXJlIGluIGV4dHJ1c2lvbl9sYXllcl9hIGlzIGNsb3NlciB0aGFuIHRoZSBmZWF0dXJlIGluIGV4dHJ1c2lvbl9sYXllcl9iIHNvIGl0IGlzIHJlbmRlcmVkIGFib3ZlLlxuICAgICAgICAvLyAgICAgIFRoZSBmZWF0dXJlIGluIGxpbmVfbGF5ZXIgaXMgcmVuZGVyZWQgYWJvdmUgZXh0cnVzaW9uX2xheWVyX2EuXG4gICAgICAgIC8vICAgICAgVGhpcyBtZWFucyB0aGF0IHRoYXQgdGhlIGxpbmVfbGF5ZXIgZmVhdHVyZSBpcyBhYm92ZSB0aGUgZXh0cnVzaW9uX2xheWVyX2IgZmVhdHVyZSBkZXNwaXRlXG4gICAgICAgIC8vICAgICAgaXQgYmVpbmcgaW4gYW4gZWFybGllciBsYXllci5cblxuICAgICAgICBjb25zdCBpc0xheWVyM0QgPSBsYXllcklkID0+IHRoaXMuX2xheWVyc1tsYXllcklkXS50eXBlID09PSAnZmlsbC1leHRydXNpb24nO1xuXG4gICAgICAgIGNvbnN0IGxheWVySW5kZXggPSB7fTtcbiAgICAgICAgY29uc3QgZmVhdHVyZXMzRCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBsID0gdGhpcy5fb3JkZXIubGVuZ3RoIC0gMTsgbCA+PSAwOyBsLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySWQgPSB0aGlzLl9vcmRlcltsXTtcbiAgICAgICAgICAgIGlmIChpc0xheWVyM0QobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgICAgICBsYXllckluZGV4W2xheWVySWRdID0gbDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVJlc3VsdCBvZiBzb3VyY2VSZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyRmVhdHVyZXMgPSBzb3VyY2VSZXN1bHRbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmVXcmFwcGVyIG9mIGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczNELnB1c2goZmVhdHVyZVdyYXBwZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmVhdHVyZXMzRC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYi5pbnRlcnNlY3Rpb25aIC0gYS5pbnRlcnNlY3Rpb25aO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBsID0gdGhpcy5fb3JkZXIubGVuZ3RoIC0gMTsgbCA+PSAwOyBsLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySWQgPSB0aGlzLl9vcmRlcltsXTtcblxuICAgICAgICAgICAgaWYgKGlzTGF5ZXIzRChsYXllcklkKSkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhbGwgM0QgZmVhdHVyZXMgdGhhdCBhcmUgaW4gb3IgYWJvdmUgdGhlIGN1cnJlbnQgbGF5ZXJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gZmVhdHVyZXMzRC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3Btb3N0M0QgPSBmZWF0dXJlczNEW2ldLmZlYXR1cmU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllckluZGV4W3RvcG1vc3QzRC5sYXllci5pZF0gPCBsKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaCh0b3Btb3N0M0QpO1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczNELnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VSZXN1bHQgb2Ygc291cmNlUmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXllckZlYXR1cmVzID0gc291cmNlUmVzdWx0W2xheWVySWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlV3JhcHBlciBvZiBsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaChmZWF0dXJlV3JhcHBlci5mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG5cbiAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMocXVlcnlHZW9tZXRyeTogYW55LCBwYXJhbXM6IGFueSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlciwgJ3F1ZXJ5UmVuZGVyZWRGZWF0dXJlcy5maWx0ZXInLCBwYXJhbXMuZmlsdGVyLCBudWxsLCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5jbHVkZWRTb3VyY2VzID0ge307XG4gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLmxheWVycykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5sYXllcnMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcigncGFyYW1ldGVycy5sYXllcnMgbXVzdCBiZSBhbiBBcnJheS4nKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBvZiBwYXJhbXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGxheWVyIGlzIG5vdCBpbiB0aGUgc3R5bGUubGF5ZXJzIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgcXVlcmllZCBmb3IgZmVhdHVyZXMuYCkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmNsdWRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VSZXN1bHRzID0gW107XG5cbiAgICAgICAgcGFyYW1zLmF2YWlsYWJsZUltYWdlcyA9IHRoaXMuX2F2YWlsYWJsZUltYWdlcztcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVycyAmJiAhaW5jbHVkZWRTb3VyY2VzW2lkXSkgY29udGludWU7XG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplZExheWVycyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICAvLyBJZiBhIHBsYWNlbWVudCBoYXMgcnVuLCBxdWVyeSBhZ2FpbnN0IGl0cyBDb2xsaXNpb25JbmRleFxuICAgICAgICAgICAgLy8gZm9yIHN5bWJvbCByZXN1bHRzLCBhbmQgdHJlYXQgaXQgYXMgYW4gZXh0cmEgc291cmNlIHRvIG1lcmdlXG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZFN5bWJvbHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplZExheWVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXMsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29sbGlzaW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnJldGFpbmVkUXVlcnlEYXRhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9mbGF0dGVuQW5kU29ydFJlbmRlcmVkRmVhdHVyZXMoc291cmNlUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJRDogc3RyaW5nLCBwYXJhbXM6ID97c291cmNlTGF5ZXI6ID9zdHJpbmcsIGZpbHRlcjogP0FycmF5PGFueT4sIHZhbGlkYXRlPzogYm9vbGVhbn0pIHtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlciwgJ3F1ZXJ5U291cmNlRmVhdHVyZXMuZmlsdGVyJywgcGFyYW1zLmZpbHRlciwgbnVsbCwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuc291cmNlQ2FjaGVzW3NvdXJjZUlEXTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlID8gcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VDYWNoZSwgcGFyYW1zKSA6IFtdO1xuICAgIH1cblxuICAgIGFkZFNvdXJjZVR5cGUobmFtZTogc3RyaW5nLCBTb3VyY2VUeXBlOiBTb3VyY2VDbGFzcywgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGlmIChTdHlsZS5nZXRTb3VyY2VUeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBBIHNvdXJjZSB0eXBlIGNhbGxlZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBTdHlsZS5zZXRTb3VyY2VUeXBlKG5hbWUsIFNvdXJjZVR5cGUpO1xuXG4gICAgICAgIGlmICghU291cmNlVHlwZS53b3JrZXJTb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ2xvYWRXb3JrZXJTb3VyY2UnLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdXJsOiBTb3VyY2VUeXBlLndvcmtlclNvdXJjZVVSTFxuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgfVxuXG4gICAgc2V0TGlnaHQobGlnaHRPcHRpb25zOiBMaWdodFNwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGlnaHQgPSB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgICAgIGxldCBfdXBkYXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxpZ2h0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwobGlnaHRPcHRpb25zW2tleV0sIGxpZ2h0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfdXBkYXRlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIG5vdzogYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGV4dGVuZCh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICBkZWxheTogMFxuICAgICAgICAgICAgfSwgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5saWdodC5zZXRMaWdodChsaWdodE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZSh2YWxpZGF0ZTogVmFsaWRhdG9yLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgcHJvcHM6IGFueSwgb3B0aW9uczogeyB2YWxpZGF0ZT86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwgZXh0ZW5kKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSwgcHJvcHMpKSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9zcHJpdGVSZXF1ZXN0cykge1xuICAgICAgICAgICAgdGhpcy5fc3ByaXRlUmVxdWVzdHNba2V5XS5jYW5jZWwoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zcHJpdGVSZXF1ZXN0c1trZXldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3RzID0ge307XG4gICAgICAgIHJ0bFRleHRQbHVnaW5FdmVudGVkLm9mZigncGx1Z2luU3RhdGVDaGFuZ2UnLCB0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2spO1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcjogU3R5bGVMYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLmNsZWFyVGlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBfY2xlYXJTb3VyY2UoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0uY2xlYXJUaWxlcygpO1xuICAgIH1cblxuICAgIF9yZWxvYWRTb3VyY2UoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0ucmVzdW1lKCk7XG4gICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlU291cmNlcyh0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0udXBkYXRlKHRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2VuZXJhdGVDb2xsaXNpb25Cb3hlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlKGlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVQbGFjZW1lbnQodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgZmFkZUR1cmF0aW9uOiBudW1iZXIsIGNyb3NzU291cmNlQ29sbGlzaW9uczogYm9vbGVhbiwgZm9yY2VGdWxsUGxhY2VtZW50OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBwbGFjZW1lbnRDb21taXR0ZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBsYXllclRpbGVzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZUxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSAhPT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIWxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tzdHlsZUxheWVyLnNvdXJjZV07XG4gICAgICAgICAgICAgICAgbGF5ZXJUaWxlc1tzdHlsZUxheWVyLnNvdXJjZV0gPSBzb3VyY2VDYWNoZS5nZXRSZW5kZXJhYmxlSWRzKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGlkKSA9PiBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChpZCkpXG4gICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYi50aWxlSUQub3ZlcnNjYWxlZFogLSBhLnRpbGVJRC5vdmVyc2NhbGVkWikgfHwgKGEudGlsZUlELmlzTGVzc1RoYW4oYi50aWxlSUQpID8gLTEgOiAxKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxheWVyQnVja2V0c0NoYW5nZWQgPSB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4LmFkZExheWVyKHN0eWxlTGF5ZXIsIGxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdLCB0cmFuc2Zvcm0uY2VudGVyLmxuZyk7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkIHx8IGxheWVyQnVja2V0c0NoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleC5wcnVuZVVudXNlZExheWVycyh0aGlzLl9vcmRlcik7XG5cbiAgICAgICAgLy8gQW55dGhpbmcgdGhhdCBjaGFuZ2VzIG91ciBcImluIHByb2dyZXNzXCIgbGF5ZXIgYW5kIHRpbGUgaW5kaWNlcyByZXF1aXJlcyB1c1xuICAgICAgICAvLyB0byBzdGFydCBvdmVyLiBXaGVuIHdlIHN0YXJ0IG92ZXIsIHdlIGRvIGEgZnVsbCBwbGFjZW1lbnQgaW5zdGVhZCBvZiBpbmNyZW1lbnRhbFxuICAgICAgICAvLyB0byBwcmV2ZW50IHN0YXJ2YXRpb24uXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcmVzdGFydCBwbGFjZW1lbnQgdG8ga2VlcCBsYXllciBpbmRpY2VzIGluIHN5bmMuXG4gICAgICAgIC8vIEFsc28gZm9yY2UgZnVsbCBwbGFjZW1lbnQgd2hlbiBmYWRlRHVyYXRpb24gPT09IDAgdG8gZW5zdXJlIHRoYXQgbmV3bHkgbG9hZGVkXG4gICAgICAgIC8vIHRpbGVzIHdpbGwgZnVsbHkgZGlzcGxheSBzeW1ib2xzIGluIHRoZWlyIGZpcnN0IGZyYW1lXG4gICAgICAgIGZvcmNlRnVsbFBsYWNlbWVudCA9IGZvcmNlRnVsbFBsYWNlbWVudCB8fCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCB8fCBmYWRlRHVyYXRpb24gPT09IDA7XG5cbiAgICAgICAgaWYgKGZvcmNlRnVsbFBsYWNlbWVudCB8fCAhdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgfHwgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpICYmICF0aGlzLnBsYWNlbWVudC5zdGlsbFJlY2VudChicm93c2VyLm5vdygpLCB0cmFuc2Zvcm0uem9vbSkpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudCA9IG5ldyBQYXVzZWFibGVQbGFjZW1lbnQodHJhbnNmb3JtLCB0aGlzLl9vcmRlciwgZm9yY2VGdWxsUGxhY2VtZW50LCBzaG93Q29sbGlzaW9uQm94ZXMsIGZhZGVEdXJhdGlvbiwgY3Jvc3NTb3VyY2VDb2xsaXNpb25zLCB0aGlzLnBsYWNlbWVudCk7XG4gICAgICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpKSB7XG4gICAgICAgICAgICAvLyB0aGUgbGFzdCBwbGFjZW1lbnQgZmluaXNoZWQgcnVubmluZywgYnV0IHRoZSBuZXh0IG9uZSBoYXNu4oCZdFxuICAgICAgICAgICAgLy8gc3RhcnRlZCB5ZXQgYmVjYXVzZSBvZiB0aGUgYHN0aWxsUmVjZW50YCBjaGVjayBpbW1lZGlhdGVseVxuICAgICAgICAgICAgLy8gYWJvdmUsIHNvIG1hcmsgaXQgc3RhbGUgdG8gZW5zdXJlIHRoYXQgd2UgcmVxdWVzdCBhbm90aGVyXG4gICAgICAgICAgICAvLyByZW5kZXIgZnJhbWVcbiAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnNldFN0YWxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5jb250aW51ZVBsYWNlbWVudCh0aGlzLl9vcmRlciwgdGhpcy5fbGF5ZXJzLCBsYXllclRpbGVzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5jb21taXQoYnJvd3Nlci5ub3coKSk7XG4gICAgICAgICAgICAgICAgcGxhY2VtZW50Q29tbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN5bWJvbEJ1Y2tldHNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHBsYWNlbWVudCBnZXRzIHNwbGl0IG92ZXIgbXVsdGlwbGUgZnJhbWVzIGl0IGlzIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgLy8gdGhlc2UgYnVja2V0cyB3ZXJlIHByb2Nlc3NlZCBiZWZvcmUgdGhleSB3ZXJlIGNoYW5nZWQgYW5kIHNvIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBsYWNlbWVudCBpcyBhbHJlYWR5IHN0YWxlIHdoaWxlIGl0IGlzIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQucGxhY2VtZW50LnNldFN0YWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhY2VtZW50Q29tbWl0dGVkIHx8IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySUQgb2YgdGhpcy5fb3JkZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZUxheWVyLnR5cGUgIT09ICdzeW1ib2wnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudC51cGRhdGVMYXllck9wYWNpdGllcyhzdHlsZUxheWVyLCBsYXllclRpbGVzW3N0eWxlTGF5ZXIuc291cmNlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBuZWVkc1JlbmRlciBpcyBmYWxzZSB3aGVuIHdlIGhhdmUganVzdCBmaW5pc2hlZCBhIHBsYWNlbWVudCB0aGF0IGRpZG4ndCBjaGFuZ2UgdGhlIHZpc2liaWxpdHkgb2YgYW55IHN5bWJvbHNcbiAgICAgICAgY29uc3QgbmVlZHNSZXJlbmRlciA9ICF0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSB8fCB0aGlzLnBsYWNlbWVudC5oYXNUcmFuc2l0aW9ucyhicm93c2VyLm5vdygpKTtcbiAgICAgICAgcmV0dXJuIG5lZWRzUmVyZW5kZXI7XG4gICAgfVxuXG4gICAgX3JlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxsYmFja3MgZnJvbSB3ZWIgd29ya2Vyc1xuXG4gICAgZ2V0SW1hZ2VzKG1hcElkOiBzdHJpbmcsIHBhcmFtczoge2ljb25zOiBBcnJheTxzdHJpbmc+LCBzb3VyY2U6IHN0cmluZywgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfT4sIHNvdXJjZUlkKSB7XG5cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LmdldEltYWdlcyhwYXJhbXMuaWNvbnMsIGNhbGxiYWNrLCBzb3VyY2VJZCk7XG5cbiAgICAgICAgLy8gQXBwbHkgcXVldWVkIGltYWdlIGNoYW5nZXMgYmVmb3JlIHNldHRpbmcgdGhlIHRpbGUncyBkZXBlbmRlbmNpZXMgc28gdGhhdCB0aGUgdGlsZVxuICAgICAgICAvLyBpcyBub3QgcmVsb2FkZWQgdW5lY2Vzc2FyaWx5LiBXaXRob3V0IHRoaXMgZm9yY2VkIHVwZGF0ZSB0aGUgcmVsb2FkIGNvdWxkIGhhcHBlbiBpbiBjYXNlc1xuICAgICAgICAvLyBsaWtlIHRoaXMgb25lOlxuICAgICAgICAvLyAtIGljb25zIGNvbnRhaW5zIFwibXktaW1hZ2VcIlxuICAgICAgICAvLyAtIGltYWdlTWFuYWdlci5nZXRJbWFnZXMoLi4uKSB0cmlnZ2VycyBgb25zdHlsZWltYWdlbWlzc2luZ2BcbiAgICAgICAgLy8gLSB0aGUgdXNlciBhZGRzIFwibXktaW1hZ2VcIiB3aXRoaW4gdGhlIGNhbGxiYWNrXG4gICAgICAgIC8vIC0gYWRkSW1hZ2UgYWRkcyBcIm15LWltYWdlXCIgdG8gdGhpcy5fY2hhbmdlZEltYWdlc1xuICAgICAgICAvLyAtIHRoZSBuZXh0IGZyYW1lIHRyaWdnZXJzIGEgcmVsb2FkIG9mIHRoaXMgdGlsZSBldmVuIHRob3VnaCBpdCBhbHJlYWR5IGhhcyB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgICAgICAgdGhpcy5fdXBkYXRlVGlsZXNGb3JDaGFuZ2VkSW1hZ2VzKCk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1twYXJhbXMuc291cmNlXTtcbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlKSB7XG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5zZXREZXBlbmRlbmNpZXMocGFyYW1zLnRpbGVJRC5rZXksIHBhcmFtcy50eXBlLCBwYXJhbXMuaWNvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0R2x5cGhzKG1hcElkOiBzdHJpbmcsIHBhcmFtczoge3N0YWNrczoge1tfOiBzdHJpbmddOiBBcnJheTxudW1iZXI+fX0sIGNhbGxiYWNrOiBDYWxsYmFjazx7W186IHN0cmluZ106IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9fT4sIHNvdXJjZUlkKSB7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyRmFjdG9yeS5nZXRHbHlwaHMocGFyYW1zLnN0YWNrcywgY2FsbGJhY2ssIHNvdXJjZUlkKTtcbiAgICB9XG5cbiAgICBnZXRSZXNvdXJjZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWVzdChwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG59XG5cblN0eWxlLmdldFNvdXJjZVR5cGUgPSBnZXRTb3VyY2VUeXBlO1xuU3R5bGUuc2V0U291cmNlVHlwZSA9IHNldFNvdXJjZVR5cGU7XG5TdHlsZS5yZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlID0gcmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZTtcblxuZXhwb3J0IGRlZmF1bHQgU3R5bGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5JztcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMn1cbl0pO1xuIiwiXG4vLyBEaXNhYmxlIEZsb3cgYW5ub3RhdGlvbnMgaGVyZSBiZWNhdXNlIEZsb3cgZG9lc24ndCBzdXBwb3J0IGltcG9ydGluZyBHTFNMIGZpbGVzXG4vKiBlc2xpbnQtZGlzYWJsZSBmbG93dHlwZS9yZXF1aXJlLXZhbGlkLWZpbGUtYW5ub3RhdGlvbiAqL1xuXG5pbXBvcnQgcHJlbHVkZUZyYWcgZnJvbSAnLi9fcHJlbHVkZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBwcmVsdWRlVmVydCBmcm9tICcuL19wcmVsdWRlLnZlcnRleC5nbHNsJztcbmltcG9ydCBiYWNrZ3JvdW5kRnJhZyBmcm9tICcuL2JhY2tncm91bmQuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZFZlcnQgZnJvbSAnLi9iYWNrZ3JvdW5kLnZlcnRleC5nbHNsJztcbmltcG9ydCBiYWNrZ3JvdW5kUGF0dGVybkZyYWcgZnJvbSAnLi9iYWNrZ3JvdW5kX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZFBhdHRlcm5WZXJ0IGZyb20gJy4vYmFja2dyb3VuZF9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBjaXJjbGVGcmFnIGZyb20gJy4vY2lyY2xlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGNpcmNsZVZlcnQgZnJvbSAnLi9jaXJjbGUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGNsaXBwaW5nTWFza0ZyYWcgZnJvbSAnLi9jbGlwcGluZ19tYXNrLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGNsaXBwaW5nTWFza1ZlcnQgZnJvbSAnLi9jbGlwcGluZ19tYXNrLnZlcnRleC5nbHNsJztcbmltcG9ydCBoZWF0bWFwRnJhZyBmcm9tICcuL2hlYXRtYXAuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcFZlcnQgZnJvbSAnLi9oZWF0bWFwLnZlcnRleC5nbHNsJztcbmltcG9ydCBoZWF0bWFwVGV4dHVyZUZyYWcgZnJvbSAnLi9oZWF0bWFwX3RleHR1cmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcFRleHR1cmVWZXJ0IGZyb20gJy4vaGVhdG1hcF90ZXh0dXJlLnZlcnRleC5nbHNsJztcbmltcG9ydCBjb2xsaXNpb25Cb3hGcmFnIGZyb20gJy4vY29sbGlzaW9uX2JveC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjb2xsaXNpb25Cb3hWZXJ0IGZyb20gJy4vY29sbGlzaW9uX2JveC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQ2lyY2xlRnJhZyBmcm9tICcuL2NvbGxpc2lvbl9jaXJjbGUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQ2lyY2xlVmVydCBmcm9tICcuL2NvbGxpc2lvbl9jaXJjbGUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGRlYnVnRnJhZyBmcm9tICcuL2RlYnVnLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGRlYnVnVmVydCBmcm9tICcuL2RlYnVnLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsRnJhZyBmcm9tICcuL2ZpbGwuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbFZlcnQgZnJvbSAnLi9maWxsLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsT3V0bGluZUZyYWcgZnJvbSAnLi9maWxsX291dGxpbmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVWZXJ0IGZyb20gJy4vZmlsbF9vdXRsaW5lLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsT3V0bGluZVBhdHRlcm5GcmFnIGZyb20gJy4vZmlsbF9vdXRsaW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVQYXR0ZXJuVmVydCBmcm9tICcuL2ZpbGxfb3V0bGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsUGF0dGVybkZyYWcgZnJvbSAnLi9maWxsX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbFBhdHRlcm5WZXJ0IGZyb20gJy4vZmlsbF9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uRnJhZyBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxFeHRydXNpb25WZXJ0IGZyb20gJy4vZmlsbF9leHRydXNpb24udmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZpbGxFeHRydXNpb25QYXR0ZXJuRnJhZyBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbEV4dHJ1c2lvblBhdHRlcm5WZXJ0IGZyb20gJy4vZmlsbF9leHRydXNpb25fcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGlsbHNoYWRlUHJlcGFyZUZyYWcgZnJvbSAnLi9oaWxsc2hhZGVfcHJlcGFyZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBoaWxsc2hhZGVQcmVwYXJlVmVydCBmcm9tICcuL2hpbGxzaGFkZV9wcmVwYXJlLnZlcnRleC5nbHNsJztcbmltcG9ydCBoaWxsc2hhZGVGcmFnIGZyb20gJy4vaGlsbHNoYWRlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGhpbGxzaGFkZVZlcnQgZnJvbSAnLi9oaWxsc2hhZGUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGxpbmVGcmFnIGZyb20gJy4vbGluZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBsaW5lVmVydCBmcm9tICcuL2xpbmUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGxpbmVHcmFkaWVudEZyYWcgZnJvbSAnLi9saW5lX2dyYWRpZW50LmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpbmVHcmFkaWVudFZlcnQgZnJvbSAnLi9saW5lX2dyYWRpZW50LnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lUGF0dGVybkZyYWcgZnJvbSAnLi9saW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGluZVBhdHRlcm5WZXJ0IGZyb20gJy4vbGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lU0RGRnJhZyBmcm9tICcuL2xpbmVfc2RmLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpbmVTREZWZXJ0IGZyb20gJy4vbGluZV9zZGYudmVydGV4Lmdsc2wnO1xuaW1wb3J0IHJhc3RlckZyYWcgZnJvbSAnLi9yYXN0ZXIuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgcmFzdGVyVmVydCBmcm9tICcuL3Jhc3Rlci52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc3ltYm9sSWNvbkZyYWcgZnJvbSAnLi9zeW1ib2xfaWNvbi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBzeW1ib2xJY29uVmVydCBmcm9tICcuL3N5bWJvbF9pY29uLnZlcnRleC5nbHNsJztcbmltcG9ydCBzeW1ib2xTREZGcmFnIGZyb20gJy4vc3ltYm9sX3NkZi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBzeW1ib2xTREZWZXJ0IGZyb20gJy4vc3ltYm9sX3NkZi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc3ltYm9sVGV4dEFuZEljb25GcmFnIGZyb20gJy4vc3ltYm9sX3RleHRfYW5kX2ljb24uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc3ltYm9sVGV4dEFuZEljb25WZXJ0IGZyb20gJy4vc3ltYm9sX3RleHRfYW5kX2ljb24udmVydGV4Lmdsc2wnO1xuXG5leHBvcnQgY29uc3QgcHJlbHVkZSA9IGNvbXBpbGUocHJlbHVkZUZyYWcsIHByZWx1ZGVWZXJ0KTtcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kID0gY29tcGlsZShiYWNrZ3JvdW5kRnJhZywgYmFja2dyb3VuZFZlcnQpO1xuZXhwb3J0IGNvbnN0IGJhY2tncm91bmRQYXR0ZXJuID0gY29tcGlsZShiYWNrZ3JvdW5kUGF0dGVybkZyYWcsIGJhY2tncm91bmRQYXR0ZXJuVmVydCk7XG5leHBvcnQgY29uc3QgY2lyY2xlID0gY29tcGlsZShjaXJjbGVGcmFnLCBjaXJjbGVWZXJ0KTtcbmV4cG9ydCBjb25zdCBjbGlwcGluZ01hc2sgPSBjb21waWxlKGNsaXBwaW5nTWFza0ZyYWcsIGNsaXBwaW5nTWFza1ZlcnQpO1xuZXhwb3J0IGNvbnN0IGhlYXRtYXAgPSBjb21waWxlKGhlYXRtYXBGcmFnLCBoZWF0bWFwVmVydCk7XG5leHBvcnQgY29uc3QgaGVhdG1hcFRleHR1cmUgPSBjb21waWxlKGhlYXRtYXBUZXh0dXJlRnJhZywgaGVhdG1hcFRleHR1cmVWZXJ0KTtcbmV4cG9ydCBjb25zdCBjb2xsaXNpb25Cb3ggPSBjb21waWxlKGNvbGxpc2lvbkJveEZyYWcsIGNvbGxpc2lvbkJveFZlcnQpO1xuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkNpcmNsZSA9IGNvbXBpbGUoY29sbGlzaW9uQ2lyY2xlRnJhZywgY29sbGlzaW9uQ2lyY2xlVmVydCk7XG5leHBvcnQgY29uc3QgZGVidWcgPSBjb21waWxlKGRlYnVnRnJhZywgZGVidWdWZXJ0KTtcbmV4cG9ydCBjb25zdCBmaWxsID0gY29tcGlsZShmaWxsRnJhZywgZmlsbFZlcnQpO1xuZXhwb3J0IGNvbnN0IGZpbGxPdXRsaW5lID0gY29tcGlsZShmaWxsT3V0bGluZUZyYWcsIGZpbGxPdXRsaW5lVmVydCk7XG5leHBvcnQgY29uc3QgZmlsbE91dGxpbmVQYXR0ZXJuID0gY29tcGlsZShmaWxsT3V0bGluZVBhdHRlcm5GcmFnLCBmaWxsT3V0bGluZVBhdHRlcm5WZXJ0KTtcbmV4cG9ydCBjb25zdCBmaWxsUGF0dGVybiA9IGNvbXBpbGUoZmlsbFBhdHRlcm5GcmFnLCBmaWxsUGF0dGVyblZlcnQpO1xuZXhwb3J0IGNvbnN0IGZpbGxFeHRydXNpb24gPSBjb21waWxlKGZpbGxFeHRydXNpb25GcmFnLCBmaWxsRXh0cnVzaW9uVmVydCk7XG5leHBvcnQgY29uc3QgZmlsbEV4dHJ1c2lvblBhdHRlcm4gPSBjb21waWxlKGZpbGxFeHRydXNpb25QYXR0ZXJuRnJhZywgZmlsbEV4dHJ1c2lvblBhdHRlcm5WZXJ0KTtcbmV4cG9ydCBjb25zdCBoaWxsc2hhZGVQcmVwYXJlID0gY29tcGlsZShoaWxsc2hhZGVQcmVwYXJlRnJhZywgaGlsbHNoYWRlUHJlcGFyZVZlcnQpO1xuZXhwb3J0IGNvbnN0IGhpbGxzaGFkZSA9IGNvbXBpbGUoaGlsbHNoYWRlRnJhZywgaGlsbHNoYWRlVmVydCk7XG5leHBvcnQgY29uc3QgbGluZSA9IGNvbXBpbGUobGluZUZyYWcsIGxpbmVWZXJ0KTtcbmV4cG9ydCBjb25zdCBsaW5lR3JhZGllbnQgPSBjb21waWxlKGxpbmVHcmFkaWVudEZyYWcsIGxpbmVHcmFkaWVudFZlcnQpO1xuZXhwb3J0IGNvbnN0IGxpbmVQYXR0ZXJuID0gY29tcGlsZShsaW5lUGF0dGVybkZyYWcsIGxpbmVQYXR0ZXJuVmVydCk7XG5leHBvcnQgY29uc3QgbGluZVNERiA9IGNvbXBpbGUobGluZVNERkZyYWcsIGxpbmVTREZWZXJ0KTtcbmV4cG9ydCBjb25zdCByYXN0ZXIgPSBjb21waWxlKHJhc3RlckZyYWcsIHJhc3RlclZlcnQpO1xuZXhwb3J0IGNvbnN0IHN5bWJvbEljb24gPSBjb21waWxlKHN5bWJvbEljb25GcmFnLCBzeW1ib2xJY29uVmVydCk7XG5leHBvcnQgY29uc3Qgc3ltYm9sU0RGID0gY29tcGlsZShzeW1ib2xTREZGcmFnLCBzeW1ib2xTREZWZXJ0KTtcbmV4cG9ydCBjb25zdCBzeW1ib2xUZXh0QW5kSWNvbiA9IGNvbXBpbGUoc3ltYm9sVGV4dEFuZEljb25GcmFnLCBzeW1ib2xUZXh0QW5kSWNvblZlcnQpO1xuXG4vLyBFeHBhbmQgI3ByYWdtYXMgdG8gI2lmZGVmcy5cblxuZnVuY3Rpb24gY29tcGlsZShmcmFnbWVudFNvdXJjZSwgdmVydGV4U291cmNlKSB7XG4gICAgY29uc3QgcmUgPSAvI3ByYWdtYSBtYXBib3g6IChbXFx3XSspIChbXFx3XSspIChbXFx3XSspIChbXFx3XSspL2c7XG5cbiAgICBjb25zdCBzdGF0aWNBdHRyaWJ1dGVzID0gdmVydGV4U291cmNlLm1hdGNoKC9hdHRyaWJ1dGUgKFtcXHddKykgKFtcXHddKykvZyk7XG4gICAgY29uc3QgZnJhZ21lbnRVbmlmb3JtcyA9IGZyYWdtZW50U291cmNlLm1hdGNoKC91bmlmb3JtIChbXFx3XSspIChbXFx3XSspKFtcXHNdKikoW1xcd10qKS9nKTtcbiAgICBjb25zdCB2ZXJ0ZXhVbmlmb3JtcyA9IHZlcnRleFNvdXJjZS5tYXRjaCgvdW5pZm9ybSAoW1xcd10rKSAoW1xcd10rKShbXFxzXSopKFtcXHddKikvZyk7XG4gICAgY29uc3Qgc3RhdGljVW5pZm9ybXMgPSB2ZXJ0ZXhVbmlmb3JtcyA/IHZlcnRleFVuaWZvcm1zLmNvbmNhdChmcmFnbWVudFVuaWZvcm1zKSA6IGZyYWdtZW50VW5pZm9ybXM7XG5cbiAgICBjb25zdCBmcmFnbWVudFByYWdtYXMgPSB7fTtcblxuICAgIGZyYWdtZW50U291cmNlID0gZnJhZ21lbnRTb3VyY2UucmVwbGFjZShyZSwgKG1hdGNoLCBvcGVyYXRpb24sIHByZWNpc2lvbiwgdHlwZSwgbmFtZSkgPT4ge1xuICAgICAgICBmcmFnbWVudFByYWdtYXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnZGVmaW5lJykge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG52YXJ5aW5nICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX07XG4jZWxzZVxudW5pZm9ybSAke3ByZWNpc2lvbn0gJHt0eXBlfSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgIH0gZWxzZSAvKiBpZiAob3BlcmF0aW9uID09PSAnaW5pdGlhbGl6ZScpICovIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4jaWZkZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmVydGV4U291cmNlID0gdmVydGV4U291cmNlLnJlcGxhY2UocmUsIChtYXRjaCwgb3BlcmF0aW9uLCBwcmVjaXNpb24sIHR5cGUsIG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgYXR0clR5cGUgPSB0eXBlID09PSAnZmxvYXQnID8gJ3ZlYzInIDogJ3ZlYzQnO1xuICAgICAgICBjb25zdCB1bnBhY2tUeXBlID0gbmFtZS5tYXRjaCgvY29sb3IvKSA/ICdjb2xvcicgOiBhdHRyVHlwZTtcblxuICAgICAgICBpZiAoZnJhZ21lbnRQcmFnbWFzW25hbWVdKSB7XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnZGVmaW5lJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxudW5pZm9ybSBsb3dwIGZsb2F0IHVfJHtuYW1lfV90O1xuYXR0cmlidXRlICR7cHJlY2lzaW9ufSAke2F0dHJUeXBlfSBhXyR7bmFtZX07XG52YXJ5aW5nICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX07XG4jZWxzZVxudW5pZm9ybSAke3ByZWNpc2lvbn0gJHt0eXBlfSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICB9IGVsc2UgLyogaWYgKG9wZXJhdGlvbiA9PT0gJ2luaXRpYWxpemUnKSAqLyB7XG4gICAgICAgICAgICAgICAgaWYgKHVucGFja1R5cGUgPT09ICd2ZWM0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyB2ZWM0IGF0dHJpYnV0ZXMgYXJlIG9ubHkgdXNlZCBmb3IgY3Jvc3MtZmFkZWQgcHJvcGVydGllcywgYW5kIGFyZSBub3QgcGFja2VkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7bmFtZX0gPSBhXyR7bmFtZX07XG4jZWxzZVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtuYW1lfSA9IHVucGFja19taXhfJHt1bnBhY2tUeXBlfShhXyR7bmFtZX0sIHVfJHtuYW1lfV90KTtcbiNlbHNlXG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnZGVmaW5lJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxudW5pZm9ybSBsb3dwIGZsb2F0IHVfJHtuYW1lfV90O1xuYXR0cmlidXRlICR7cHJlY2lzaW9ufSAke2F0dHJUeXBlfSBhXyR7bmFtZX07XG4jZWxzZVxudW5pZm9ybSAke3ByZWNpc2lvbn0gJHt0eXBlfSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICB9IGVsc2UgLyogaWYgKG9wZXJhdGlvbiA9PT0gJ2luaXRpYWxpemUnKSAqLyB7XG4gICAgICAgICAgICAgICAgaWYgKHVucGFja1R5cGUgPT09ICd2ZWM0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyB2ZWM0IGF0dHJpYnV0ZXMgYXJlIG9ubHkgdXNlZCBmb3IgY3Jvc3MtZmFkZWQgcHJvcGVydGllcywgYW5kIGFyZSBub3QgcGFja2VkXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSBhXyR7bmFtZX07XG4jZWxzZVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIC8qICove1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdW5wYWNrX21peF8ke3VucGFja1R5cGV9KGFfJHtuYW1lfSwgdV8ke25hbWV9X3QpO1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtmcmFnbWVudFNvdXJjZSwgdmVydGV4U291cmNlLCBzdGF0aWNBdHRyaWJ1dGVzLCBzdGF0aWNVbmlmb3Jtc307XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuXG5jbGFzcyBWZXJ0ZXhBcnJheU9iamVjdCB7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgICBib3VuZFByb2dyYW06ID9Qcm9ncmFtPCo+O1xuICAgIGJvdW5kTGF5b3V0VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIGJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzOiBBcnJheTxWZXJ0ZXhCdWZmZXI+O1xuICAgIGJvdW5kSW5kZXhCdWZmZXI6ID9JbmRleEJ1ZmZlcjtcbiAgICBib3VuZFZlcnRleE9mZnNldDogP251bWJlcjtcbiAgICBib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgYm91bmREeW5hbWljVmVydGV4QnVmZmVyMjogP1ZlcnRleEJ1ZmZlcjtcbiAgICB2YW86IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJvdW5kUHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzID0gW107XG4gICAgICAgIHRoaXMuYm91bmRJbmRleEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMudmFvID0gbnVsbDtcbiAgICB9XG5cbiAgICBiaW5kKGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICBwcm9ncmFtOiBQcm9ncmFtPCo+LFxuICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICBwYWludFZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj4sXG4gICAgICAgICBpbmRleEJ1ZmZlcjogP0luZGV4QnVmZmVyLFxuICAgICAgICAgdmVydGV4T2Zmc2V0OiA/bnVtYmVyLFxuICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyOiA/VmVydGV4QnVmZmVyKSB7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgICBsZXQgcGFpbnRCdWZmZXJzRGlmZmVyID0gdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycy5sZW5ndGggIT09IHBhaW50VmVydGV4QnVmZmVycy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFpbnRCdWZmZXJzRGlmZmVyICYmIGkgPCBwYWludFZlcnRleEJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzW2ldICE9PSBwYWludFZlcnRleEJ1ZmZlcnNbaV0pIHtcbiAgICAgICAgICAgICAgICBwYWludEJ1ZmZlcnNEaWZmZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNGcmVzaEJpbmRSZXF1aXJlZCA9IChcbiAgICAgICAgICAgICF0aGlzLnZhbyB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gIT09IHByb2dyYW0gfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgIT09IGxheW91dFZlcnRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgcGFpbnRCdWZmZXJzRGlmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgIT09IGluZGV4QnVmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ICE9PSB2ZXJ0ZXhPZmZzZXQgfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyICE9PSBkeW5hbWljVmVydGV4QnVmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjIgIT09IGR5bmFtaWNWZXJ0ZXhCdWZmZXIyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0IHx8IGlzRnJlc2hCaW5kUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlc2hCaW5kKHByb2dyYW0sIGxheW91dFZlcnRleEJ1ZmZlciwgcGFpbnRWZXJ0ZXhCdWZmZXJzLCBpbmRleEJ1ZmZlciwgdmVydGV4T2Zmc2V0LCBkeW5hbWljVmVydGV4QnVmZmVyLCBkeW5hbWljVmVydGV4QnVmZmVyMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQodGhpcy52YW8pO1xuXG4gICAgICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiB1cGRhdGVkLiBSZWJpbmQgdG8gdXBsb2FkIGRhdGEuXG4gICAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbmRleEJ1ZmZlciAmJiBpbmRleEJ1ZmZlci5keW5hbWljRHJhdykge1xuICAgICAgICAgICAgICAgIGluZGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIyKSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuYmluZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnJlc2hCaW5kKHByb2dyYW06IFByb2dyYW08Kj4sXG4gICAgICAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgICBwYWludFZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj4sXG4gICAgICAgICAgICAgIGluZGV4QnVmZmVyOiA/SW5kZXhCdWZmZXIsXG4gICAgICAgICAgICAgIHZlcnRleE9mZnNldDogP251bWJlcixcbiAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjI6ID9WZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgbGV0IG51bVByZXZBdHRyaWJ1dGVzO1xuICAgICAgICBjb25zdCBudW1OZXh0QXR0cmlidXRlcyA9IHByb2dyYW0ubnVtQXR0cmlidXRlcztcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKGNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbykgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnZhbyA9IGNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgICAgICAgIGNvbnRleHQuYmluZFZlcnRleEFycmF5T0VTLnNldCh0aGlzLnZhbyk7XG4gICAgICAgICAgICBudW1QcmV2QXR0cmlidXRlcyA9IDA7XG5cbiAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBhcmd1bWVudHMgc28gdGhhdCB3ZSBjYW4gdmVyaWZ5IHRoZW0gd2hlbiB0aGUgdmFvIGlzIGJvdW5kIGFnYWluXG4gICAgICAgICAgICB0aGlzLmJvdW5kUHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgICAgICB0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyID0gbGF5b3V0VmVydGV4QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycyA9IHBhaW50VmVydGV4QnVmZmVycztcbiAgICAgICAgICAgIHRoaXMuYm91bmRJbmRleEJ1ZmZlciA9IGluZGV4QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IHZlcnRleE9mZnNldDtcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyID0gZHluYW1pY1ZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyMiA9IGR5bmFtaWNWZXJ0ZXhCdWZmZXIyO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBudW1QcmV2QXR0cmlidXRlcyA9IGNvbnRleHQuY3VycmVudE51bUF0dHJpYnV0ZXMgfHwgMDtcblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBhbGwgYXR0cmlidXRlcyBmcm9tIHRoZSBwcmV2aW91cyBwcm9ncmFtIHRoYXQgYXJlbid0IHVzZWQgaW5cbiAgICAgICAgICAgIC8vIHRoZSBuZXcgcHJvZ3JhbS4gTm90ZTogYXR0cmlidXRlIGluZGljZXMgYXJlICpub3QqIHByb2dyYW0gc3BlY2lmaWMhXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbnVtTmV4dEF0dHJpYnV0ZXM7IGkgPCBudW1QcmV2QXR0cmlidXRlczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gV2ViR0wgYnJlYWtzIGlmIHlvdSBkaXNhYmxlIGF0dHJpYnV0ZSAwLlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjAzMDUyMzFcbiAgICAgICAgICAgICAgICBhc3NlcnQoaSAhPT0gMCk7XG4gICAgICAgICAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICBmb3IgKGNvbnN0IHZlcnRleEJ1ZmZlciBvZiBwYWludFZlcnRleEJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlci5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuZW5hYmxlQXR0cmlidXRlcyhnbCwgcHJvZ3JhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIGZvciAoY29uc3QgdmVydGV4QnVmZmVyIG9mIHBhaW50VmVydGV4QnVmZmVycykge1xuICAgICAgICAgICAgdmVydGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBpbmRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMi5iaW5kKCk7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMi5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuY3VycmVudE51bUF0dHJpYnV0ZXMgPSBudW1OZXh0QXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy52YW8pIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdC5kZWxldGVWZXJ0ZXhBcnJheU9FUyh0aGlzLnZhbyk7XG4gICAgICAgICAgICB0aGlzLnZhbyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlcnRleEFycmF5T2JqZWN0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtwcmVsdWRlfSBmcm9tICcuLi9zaGFkZXJzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQgVmVydGV4QXJyYXlPYmplY3QgZnJvbSAnLi92ZXJ0ZXhfYXJyYXlfb2JqZWN0JztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQnO1xuXG5pbXBvcnQgdHlwZSBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IHR5cGUgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCB0eXBlIENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlJztcbmltcG9ydCB0eXBlIEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybUJpbmRpbmdzLCBVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSB7QmluZGVyVW5pZm9ybX0gZnJvbSAnLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgdHlwZSBEcmF3TW9kZSA9XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0xJTkVTJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnVFJJQU5HTEVTJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORV9TVFJJUCc+O1xuXG5mdW5jdGlvbiBnZXRUb2tlbml6ZWRBdHRyaWJ1dGVzQW5kVW5pZm9ybXMgKGFycmF5OiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcnJheVtpXSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHRva2VuID0gYXJyYXlbaV0uc3BsaXQoJyAnKTtcbiAgICAgICAgcmVzdWx0LnB1c2godG9rZW4ucG9wKCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgUHJvZ3JhbTxVczogVW5pZm9ybUJpbmRpbmdzPiB7XG4gICAgcHJvZ3JhbTogV2ViR0xQcm9ncmFtO1xuICAgIGF0dHJpYnV0ZXM6IHtbXzogc3RyaW5nXTogbnVtYmVyfTtcbiAgICBudW1BdHRyaWJ1dGVzOiBudW1iZXI7XG4gICAgZml4ZWRVbmlmb3JtczogVXM7XG4gICAgYmluZGVyVW5pZm9ybXM6IEFycmF5PEJpbmRlclVuaWZvcm0+O1xuICAgIGZhaWxlZFRvQ3JlYXRlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCxcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgIHNvdXJjZToge2ZyYWdtZW50U291cmNlOiBzdHJpbmcsIHZlcnRleFNvdXJjZTogc3RyaW5nLCBzdGF0aWNBdHRyaWJ1dGVzOiBBcnJheTxzdHJpbmc+LCBzdGF0aWNVbmlmb3JtczogQXJyYXk8c3RyaW5nPn0sXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBmaXhlZFVuaWZvcm1zOiAoQ29udGV4dCwgVW5pZm9ybUxvY2F0aW9ucykgPT4gVXMsXG4gICAgICAgICAgICBzaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGljQXR0ckluZm8gPSBnZXRUb2tlbml6ZWRBdHRyaWJ1dGVzQW5kVW5pZm9ybXMoc291cmNlLnN0YXRpY0F0dHJpYnV0ZXMpO1xuICAgICAgICBjb25zdCBkeW5hbWljQXR0ckluZm8gPSBjb25maWd1cmF0aW9uID8gY29uZmlndXJhdGlvbi5nZXRCaW5kZXJBdHRyaWJ1dGVzKCkgOiBbXTtcbiAgICAgICAgY29uc3QgYWxsQXR0ckluZm8gPSBzdGF0aWNBdHRySW5mby5jb25jYXQoZHluYW1pY0F0dHJJbmZvKTtcblxuICAgICAgICBjb25zdCBzdGF0aWNVbmlmb3Jtc0luZm8gPSBzb3VyY2Uuc3RhdGljVW5pZm9ybXMgPyBnZXRUb2tlbml6ZWRBdHRyaWJ1dGVzQW5kVW5pZm9ybXMoc291cmNlLnN0YXRpY1VuaWZvcm1zKSA6IFtdO1xuICAgICAgICBjb25zdCBkeW5hbWljVW5pZm9ybXNJbmZvID0gY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0QmluZGVyVW5pZm9ybXMoKSA6IFtdO1xuICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlIHVuaWZvcm1zXG4gICAgICAgIGNvbnN0IHVuaWZvcm1MaXN0ID0gc3RhdGljVW5pZm9ybXNJbmZvLmNvbmNhdChkeW5hbWljVW5pZm9ybXNJbmZvKTtcbiAgICAgICAgY29uc3QgYWxsVW5pZm9ybXNJbmZvID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdW5pZm9ybSBvZiB1bmlmb3JtTGlzdCkge1xuICAgICAgICAgICAgaWYgKGFsbFVuaWZvcm1zSW5mby5pbmRleE9mKHVuaWZvcm0pIDwgMCkgYWxsVW5pZm9ybXNJbmZvLnB1c2godW5pZm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZpbmVzID0gY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZGVmaW5lcygpIDogW107XG4gICAgICAgIGlmIChzaG93T3ZlcmRyYXdJbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIGRlZmluZXMucHVzaCgnI2RlZmluZSBPVkVSRFJBV19JTlNQRUNUT1I7Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmcmFnbWVudFNvdXJjZSA9IGRlZmluZXMuY29uY2F0KHByZWx1ZGUuZnJhZ21lbnRTb3VyY2UsIHNvdXJjZS5mcmFnbWVudFNvdXJjZSkuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IHZlcnRleFNvdXJjZSA9IGRlZmluZXMuY29uY2F0KHByZWx1ZGUudmVydGV4U291cmNlLCBzb3VyY2UudmVydGV4U291cmNlKS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICAgICAgaWYgKGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgICAgICAgICAgdGhpcy5mYWlsZWRUb0NyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNvdXJjZSk7XG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZyYWdtZW50U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyksIChnbC5nZXRTaGFkZXJJbmZvTG9nKGZyYWdtZW50U2hhZGVyKTogYW55KSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgICAgIGlmIChnbC5pc0NvbnRleHRMb3N0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkVG9DcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNvdXJjZSk7XG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFNoYWRlclBhcmFtZXRlcih2ZXJ0ZXhTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSwgKGdsLmdldFNoYWRlckluZm9Mb2codmVydGV4U2hhZGVyKTogYW55KSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHZlcnRleFNoYWRlcik7XG5cbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGNvbnN0IHVuaWZvcm1Mb2NhdGlvbnMgPSB7fTtcblxuICAgICAgICB0aGlzLm51bUF0dHJpYnV0ZXMgPSBhbGxBdHRySW5mby5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bUF0dHJpYnV0ZXM7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFsbEF0dHJJbmZvW2ldKSB7XG4gICAgICAgICAgICAgICAgZ2wuYmluZEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgaSwgYWxsQXR0ckluZm9baV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlc1thbGxBdHRySW5mb1tpXV0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2wubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyksIChnbC5nZXRQcm9ncmFtSW5mb0xvZyh0aGlzLnByb2dyYW0pOiBhbnkpKTtcblxuICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICBmb3IgKGxldCBpdCA9IDA7IGl0IDwgYWxsVW5pZm9ybXNJbmZvLmxlbmd0aDsgaXQrKykge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybSA9IGFsbFVuaWZvcm1zSW5mb1tpdF07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSAmJiAhdW5pZm9ybUxvY2F0aW9uc1t1bmlmb3JtXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1Mb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIHVuaWZvcm0pO1xuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybUxvY2F0aW9uc1t1bmlmb3JtXSA9IHVuaWZvcm1Mb2NhdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpeGVkVW5pZm9ybXMgPSBmaXhlZFVuaWZvcm1zKGNvbnRleHQsIHVuaWZvcm1Mb2NhdGlvbnMpO1xuICAgICAgICB0aGlzLmJpbmRlclVuaWZvcm1zID0gY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0VW5pZm9ybXMoY29udGV4dCwgdW5pZm9ybUxvY2F0aW9ucykgOiBbXTtcbiAgICB9XG5cbiAgICBkcmF3KGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICBkcmF3TW9kZTogRHJhd01vZGUsXG4gICAgICAgICBkZXB0aE1vZGU6ICRSZWFkT25seTxEZXB0aE1vZGU+LFxuICAgICAgICAgc3RlbmNpbE1vZGU6ICRSZWFkT25seTxTdGVuY2lsTW9kZT4sXG4gICAgICAgICBjb2xvck1vZGU6ICRSZWFkT25seTxDb2xvck1vZGU+LFxuICAgICAgICAgY3VsbEZhY2VNb2RlOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPixcbiAgICAgICAgIHVuaWZvcm1WYWx1ZXM6IFVuaWZvcm1WYWx1ZXM8VXM+LFxuICAgICAgICAgbGF5ZXJJRDogc3RyaW5nLFxuICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXIsXG4gICAgICAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcixcbiAgICAgICAgIGN1cnJlbnRQcm9wZXJ0aWVzOiBhbnksXG4gICAgICAgICB6b29tOiA/bnVtYmVyLFxuICAgICAgICAgY29uZmlndXJhdGlvbjogP1Byb2dyYW1Db25maWd1cmF0aW9uLFxuICAgICAgICAgZHluYW1pY0xheW91dEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIyOiA/VmVydGV4QnVmZmVyKSB7XG5cbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICh0aGlzLmZhaWxlZFRvQ3JlYXRlKSByZXR1cm47XG5cbiAgICAgICAgY29udGV4dC5wcm9ncmFtLnNldCh0aGlzLnByb2dyYW0pO1xuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShkZXB0aE1vZGUpO1xuICAgICAgICBjb250ZXh0LnNldFN0ZW5jaWxNb2RlKHN0ZW5jaWxNb2RlKTtcbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUoY29sb3JNb2RlKTtcbiAgICAgICAgY29udGV4dC5zZXRDdWxsRmFjZShjdWxsRmFjZU1vZGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiB0aGlzLmZpeGVkVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHRoaXMuZml4ZWRVbmlmb3Jtc1tuYW1lXS5zZXQodW5pZm9ybVZhbHVlc1tuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRVbmlmb3Jtcyhjb250ZXh0LCB0aGlzLmJpbmRlclVuaWZvcm1zLCBjdXJyZW50UHJvcGVydGllcywge3pvb206ICh6b29tOiBhbnkpfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltaXRpdmVTaXplID0ge1xuICAgICAgICAgICAgW2dsLkxJTkVTXTogMixcbiAgICAgICAgICAgIFtnbC5UUklBTkdMRVNdOiAzLFxuICAgICAgICAgICAgW2dsLkxJTkVfU1RSSVBdOiAxXG4gICAgICAgIH1bZHJhd01vZGVdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cy5nZXQoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFvcyA9IHNlZ21lbnQudmFvcyB8fCAoc2VnbWVudC52YW9zID0ge30pO1xuICAgICAgICAgICAgY29uc3QgdmFvOiBWZXJ0ZXhBcnJheU9iamVjdCA9IHZhb3NbbGF5ZXJJRF0gfHwgKHZhb3NbbGF5ZXJJRF0gPSBuZXcgVmVydGV4QXJyYXlPYmplY3QoKSk7XG5cbiAgICAgICAgICAgIHZhby5iaW5kKFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCkgOiBbXSxcbiAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBzZWdtZW50LnZlcnRleE9mZnNldCxcbiAgICAgICAgICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoXG4gICAgICAgICAgICAgICAgZHJhd01vZGUsXG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKiBwcmltaXRpdmVTaXplLFxuICAgICAgICAgICAgICAgIGdsLlVOU0lHTkVEX1NIT1JULFxuICAgICAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlT2Zmc2V0ICogcHJpbWl0aXZlU2l6ZSAqIDIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtO1xuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcclxuaW1wb3J0IHtcclxuICAgIFVuaWZvcm0xaSxcclxuICAgIFVuaWZvcm0xZixcclxuICAgIFVuaWZvcm0yZixcclxuICAgIFVuaWZvcm0zZlxyXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XHJcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xyXG5cclxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcclxuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcclxuaW1wb3J0IHR5cGUge0Nyb3NzRmFkZWR9IGZyb20gJy4uLy4uL3N0eWxlL3Byb3BlcnRpZXMnO1xyXG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzJztcclxuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XHJcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vLi4vc291cmNlL3RpbGUnO1xyXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZSc7XHJcblxyXG50eXBlIEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcclxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxyXG4gICAgJ3VfcGF0dGVybl90bF9hJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfcGF0dGVybl9icl9hJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfcGF0dGVybl90bF9iJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfcGF0dGVybl9icl9iJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcclxuICAgICd1X21peCc6IFVuaWZvcm0xZixcclxuICAgICd1X3BhdHRlcm5fc2l6ZV9hJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfcGF0dGVybl9zaXplX2InOiBVbmlmb3JtMmYsXHJcbiAgICAndV9zY2FsZV9hJzogVW5pZm9ybTFmLFxyXG4gICAgJ3Vfc2NhbGVfYic6IFVuaWZvcm0xZixcclxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXHJcbiAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0xZlxyXG58fTtcclxuXHJcbmV4cG9ydCB0eXBlIFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPSB7fFxyXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcclxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxyXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcclxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxyXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZixcclxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmZcclxufH07XHJcblxyXG5mdW5jdGlvbiBwYXR0ZXJuVW5pZm9ybVZhbHVlcyhjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnMsIHBhaW50ZXI6IFBhaW50ZXIsXHJcbiAgICAgICAgdGlsZTogVGlsZVxyXG4pOiBVbmlmb3JtVmFsdWVzPFBhdHRlcm5Vbmlmb3Jtc1R5cGU+IHtcclxuXHJcbiAgICBjb25zdCB0aWxlUmF0aW8gPSAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pO1xyXG5cclxuICAgIGNvbnN0IG51bVRpbGVzID0gTWF0aC5wb3coMiwgdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xyXG4gICAgY29uc3QgdGlsZVNpemVBdE5lYXJlc3Rab29tID0gdGlsZS50aWxlU2l6ZSAqIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tKSAvIG51bVRpbGVzO1xyXG5cclxuICAgIGNvbnN0IHBpeGVsWCA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqICh0aWxlLnRpbGVJRC5jYW5vbmljYWwueCArIHRpbGUudGlsZUlELndyYXAgKiBudW1UaWxlcyk7XHJcbiAgICBjb25zdCBwaXhlbFkgPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiB0aWxlLnRpbGVJRC5jYW5vbmljYWwueTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgICd1X2ltYWdlJzogMCxcclxuICAgICAgICAndV90ZXhzaXplJzogdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxyXG4gICAgICAgICd1X3NjYWxlJzogW3RpbGVSYXRpbywgY3Jvc3NmYWRlLmZyb21TY2FsZSwgY3Jvc3NmYWRlLnRvU2NhbGVdLFxyXG4gICAgICAgICd1X2ZhZGUnOiBjcm9zc2ZhZGUudCxcclxuICAgICAgICAvLyBzcGxpdCB0aGUgcGl4ZWwgY29vcmQgaW50byB0d28gcGFpcnMgb2YgMTYgYml0IG51bWJlcnMuIFRoZSBnbHNsIHNwZWMgb25seSBndWFyYW50ZWVzIDE2IGJpdHMgb2YgcHJlY2lzaW9uLlxyXG4gICAgICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogW3BpeGVsWCA+PiAxNiwgcGl4ZWxZID4+IDE2XSxcclxuICAgICAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFtwaXhlbFggJiAweEZGRkYsIHBpeGVsWSAmIDB4RkZGRl1cclxuICAgIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJnUGF0dGVyblVuaWZvcm1WYWx1ZXMoaW1hZ2U6IENyb3NzRmFkZWQ8UmVzb2x2ZWRJbWFnZT4sIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycywgcGFpbnRlcjogUGFpbnRlcixcclxuICAgICAgICB0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyfVxyXG4pOiBVbmlmb3JtVmFsdWVzPEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlPiB7XHJcbiAgICBjb25zdCBpbWFnZVBvc0EgPSBwYWludGVyLmltYWdlTWFuYWdlckZhY3RvcnkuZ2V0UGF0dGVybihpbWFnZS5mcm9tLnRvU3RyaW5nKCkpO1xyXG4gICAgY29uc3QgaW1hZ2VQb3NCID0gcGFpbnRlci5pbWFnZU1hbmFnZXJGYWN0b3J5LmdldFBhdHRlcm4oaW1hZ2UudG8udG9TdHJpbmcoKSk7XHJcbiAgICBhc3NlcnQoaW1hZ2VQb3NBICYmIGltYWdlUG9zQik7XHJcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBwYWludGVyLmltYWdlTWFuYWdlckZhY3RvcnkuZ2V0UGl4ZWxTaXplKCk7XHJcblxyXG4gICAgY29uc3QgbnVtVGlsZXMgPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XHJcbiAgICBjb25zdCB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gPSB0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pIC8gbnVtVGlsZXM7XHJcblxyXG4gICAgY29uc3QgcGl4ZWxYID0gdGlsZVNpemVBdE5lYXJlc3Rab29tICogKHRpbGUudGlsZUlELmNhbm9uaWNhbC54ICsgdGlsZS50aWxlSUQud3JhcCAqIG51bVRpbGVzKTtcclxuICAgIGNvbnN0IHBpeGVsWSA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqIHRpbGUudGlsZUlELmNhbm9uaWNhbC55O1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxyXG4gICAgICAgICd1X3BhdHRlcm5fdGxfYSc6IChpbWFnZVBvc0E6IGFueSkudGwsXHJcbiAgICAgICAgJ3VfcGF0dGVybl9icl9hJzogKGltYWdlUG9zQTogYW55KS5icixcclxuICAgICAgICAndV9wYXR0ZXJuX3RsX2InOiAoaW1hZ2VQb3NCOiBhbnkpLnRsLFxyXG4gICAgICAgICd1X3BhdHRlcm5fYnJfYic6IChpbWFnZVBvc0I6IGFueSkuYnIsXHJcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgICAndV9taXgnOiBjcm9zc2ZhZGUudCxcclxuICAgICAgICAndV9wYXR0ZXJuX3NpemVfYSc6IChpbWFnZVBvc0E6IGFueSkuZGlzcGxheVNpemUsXHJcbiAgICAgICAgJ3VfcGF0dGVybl9zaXplX2InOiAoaW1hZ2VQb3NCOiBhbnkpLmRpc3BsYXlTaXplLFxyXG4gICAgICAgICd1X3NjYWxlX2EnOiBjcm9zc2ZhZGUuZnJvbVNjYWxlLFxyXG4gICAgICAgICd1X3NjYWxlX2InOiBjcm9zc2ZhZGUudG9TY2FsZSxcclxuICAgICAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSksXHJcbiAgICAgICAgLy8gc3BsaXQgdGhlIHBpeGVsIGNvb3JkIGludG8gdHdvIHBhaXJzIG9mIDE2IGJpdCBudW1iZXJzLiBUaGUgZ2xzbCBzcGVjIG9ubHkgZ3VhcmFudGVlcyAxNiBiaXRzIG9mIHByZWNpc2lvbi5cclxuICAgICAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFtwaXhlbFggPj4gMTYsIHBpeGVsWSA+PiAxNl0sXHJcbiAgICAgICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBbcGl4ZWxYICYgMHhGRkZGLCBwaXhlbFkgJiAweEZGRkZdXHJcbiAgICB9O1xyXG59XHJcbmV4cG9ydCB7YmdQYXR0ZXJuVW5pZm9ybVZhbHVlcywgcGF0dGVyblVuaWZvcm1WYWx1ZXN9O1xyXG4iLCIvLyBAZmxvd1xyXG5cclxuaW1wb3J0IHtwYXR0ZXJuVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wYXR0ZXJuJztcclxuaW1wb3J0IHtcclxuICAgIFVuaWZvcm0xaSxcclxuICAgIFVuaWZvcm0xZixcclxuICAgIFVuaWZvcm0yZixcclxuICAgIFVuaWZvcm0zZixcclxuICAgIFVuaWZvcm1NYXRyaXg0ZlxyXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XHJcblxyXG5pbXBvcnQge21hdDMsIHZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XHJcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xyXG5cclxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcclxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcclxuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcclxuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XHJcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xyXG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcclxuXHJcbmV4cG9ydCB0eXBlIEZpbGxFeHRydXNpb25Vbmlmb3Jtc1R5cGUgPSB7fFxyXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxyXG4gICAgJ3VfbGlnaHRwb3MnOiBVbmlmb3JtM2YsXHJcbiAgICAndV9saWdodGludGVuc2l0eSc6IFVuaWZvcm0xZixcclxuICAgICd1X2xpZ2h0Y29sb3InOiBVbmlmb3JtM2YsXHJcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IFVuaWZvcm0xZixcclxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWZcclxufH07XHJcblxyXG5leHBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XHJcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXHJcbiAgICAndV9saWdodHBvcyc6IFVuaWZvcm0zZixcclxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogVW5pZm9ybTFmLFxyXG4gICAgJ3VfbGlnaHRjb2xvcic6IFVuaWZvcm0zZixcclxuICAgICd1X2hlaWdodF9mYWN0b3InOiBVbmlmb3JtMWYsXHJcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IFVuaWZvcm0xZixcclxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXM6XHJcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxyXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXHJcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcclxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxyXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtM2YsXHJcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmLFxyXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZlxyXG58fTtcclxuXHJcbmNvbnN0IGZpbGxFeHRydXNpb25Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsRXh0cnVzaW9uVW5pZm9ybXNUeXBlID0+ICh7XHJcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXHJcbiAgICAndV9saWdodHBvcyc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfbGlnaHRwb3MpLFxyXG4gICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0aW50ZW5zaXR5KSxcclxuICAgICd1X2xpZ2h0Y29sb3InOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0Y29sb3IpLFxyXG4gICAgJ3VfdmVydGljYWxfZ3JhZGllbnQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3ZlcnRpY2FsX2dyYWRpZW50KSxcclxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpXHJcbn0pO1xyXG5cclxuY29uc3QgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zVHlwZSA9PiAoe1xyXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxyXG4gICAgJ3VfbGlnaHRwb3MnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0cG9zKSxcclxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodGludGVuc2l0eSksXHJcbiAgICAndV9saWdodGNvbG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodGNvbG9yKSxcclxuICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV92ZXJ0aWNhbF9ncmFkaWVudCksXHJcbiAgICAndV9oZWlnaHRfZmFjdG9yJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9oZWlnaHRfZmFjdG9yKSxcclxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXNcclxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXHJcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcclxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXHJcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfbG93ZXIpLFxyXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcclxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpLFxyXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSlcclxufSk7XHJcblxyXG5jb25zdCBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyA9IChcclxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxyXG4gICAgcGFpbnRlcjogUGFpbnRlcixcclxuICAgIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQ6IGJvb2xlYW4sXHJcbiAgICBvcGFjaXR5OiBudW1iZXJcclxuKTogVW5pZm9ybVZhbHVlczxGaWxsRXh0cnVzaW9uVW5pZm9ybXNUeXBlPiA9PiB7XHJcbiAgICBjb25zdCBsaWdodCA9IHBhaW50ZXIuc3R5bGUubGlnaHQ7XHJcbiAgICBjb25zdCBfbHAgPSBsaWdodC5wcm9wZXJ0aWVzLmdldCgncG9zaXRpb24nKTtcclxuICAgIGNvbnN0IGxpZ2h0UG9zID0gW19scC54LCBfbHAueSwgX2xwLnpdO1xyXG4gICAgY29uc3QgbGlnaHRNYXQgPSBtYXQzLmNyZWF0ZSgpO1xyXG4gICAgaWYgKGxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdhbmNob3InKSA9PT0gJ3ZpZXdwb3J0Jykge1xyXG4gICAgICAgIG1hdDMuZnJvbVJvdGF0aW9uKGxpZ2h0TWF0LCAtcGFpbnRlci50cmFuc2Zvcm0uYW5nbGUpO1xyXG4gICAgfVxyXG4gICAgdmVjMy50cmFuc2Zvcm1NYXQzKGxpZ2h0UG9zLCBsaWdodFBvcywgbGlnaHRNYXQpO1xyXG5cclxuICAgIGNvbnN0IGxpZ2h0Q29sb3IgPSBsaWdodC5wcm9wZXJ0aWVzLmdldCgnY29sb3InKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcclxuICAgICAgICAndV9saWdodHBvcyc6IGxpZ2h0UG9zLFxyXG4gICAgICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogbGlnaHQucHJvcGVydGllcy5nZXQoJ2ludGVuc2l0eScpLFxyXG4gICAgICAgICd1X2xpZ2h0Y29sb3InOiBbbGlnaHRDb2xvci5yLCBsaWdodENvbG9yLmcsIGxpZ2h0Q29sb3IuYl0sXHJcbiAgICAgICAgJ3VfdmVydGljYWxfZ3JhZGllbnQnOiArc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudCxcclxuICAgICAgICAndV9vcGFjaXR5Jzogb3BhY2l0eVxyXG4gICAgfTtcclxufTtcclxuXHJcbmNvbnN0IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcclxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxyXG4gICAgcGFpbnRlcjogUGFpbnRlcixcclxuICAgIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQ6IGJvb2xlYW4sXHJcbiAgICBvcGFjaXR5OiBudW1iZXIsXHJcbiAgICBjb29yZDogT3ZlcnNjYWxlZFRpbGVJRCxcclxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycyxcclxuICAgIHRpbGU6IFRpbGVcclxuKTogVW5pZm9ybVZhbHVlczxGaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zVHlwZT4gPT4ge1xyXG4gICAgcmV0dXJuIGV4dGVuZChmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHkpLFxyXG4gICAgICAgIHBhdHRlcm5Vbmlmb3JtVmFsdWVzKGNyb3NzZmFkZSwgcGFpbnRlciwgdGlsZSksXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAndV9oZWlnaHRfZmFjdG9yJzogLU1hdGgucG93KDIsIGNvb3JkLm92ZXJzY2FsZWRaKSAvIHRpbGUudGlsZVNpemUgLyA4XHJcbiAgICAgICAgfSk7XHJcbn07XHJcblxyXG5leHBvcnQge1xyXG4gICAgZmlsbEV4dHJ1c2lvblVuaWZvcm1zLFxyXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyxcclxuICAgIGZpbGxFeHRydXNpb25Vbmlmb3JtVmFsdWVzLFxyXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtVmFsdWVzXHJcbn07XHJcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7cGF0dGVyblVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vcGF0dGVybic7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcblxuZXhwb3J0IHR5cGUgRmlsbFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuZXhwb3J0IHR5cGUgRmlsbE91dGxpbmVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV93b3JsZCc6IFVuaWZvcm0yZlxufH07XG5cbmV4cG9ydCB0eXBlIEZpbGxQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV93b3JsZCc6IFVuaWZvcm0yZixcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtM2YsXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGZpbGxVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpXG59KTtcblxuY29uc3QgZmlsbFBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsUGF0dGVyblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpXG5cbn0pO1xuXG5jb25zdCBmaWxsT3V0bGluZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZpbGxPdXRsaW5lVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3dvcmxkJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV93b3JsZClcbn0pO1xuXG5jb25zdCBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfd29ybGQnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3dvcmxkKSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpXG59KTtcblxuY29uc3QgZmlsbFVuaWZvcm1WYWx1ZXMgPSAobWF0cml4OiBGbG9hdDMyQXJyYXkpOiBVbmlmb3JtVmFsdWVzPEZpbGxVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4XG59KTtcblxuY29uc3QgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIHRpbGU6IFRpbGVcbik6IFVuaWZvcm1WYWx1ZXM8RmlsbFBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IGV4dGVuZChcbiAgICBmaWxsVW5pZm9ybVZhbHVlcyhtYXRyaXgpLFxuICAgIHBhdHRlcm5Vbmlmb3JtVmFsdWVzKGNyb3NzZmFkZSwgcGFpbnRlciwgdGlsZSlcbik7XG5cbmNvbnN0IGZpbGxPdXRsaW5lVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBkcmF3aW5nQnVmZmVyU2l6ZTogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxGaWxsT3V0bGluZVVuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgJ3Vfd29ybGQnOiBkcmF3aW5nQnVmZmVyU2l6ZVxufSk7XG5cbmNvbnN0IGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnMsXG4gICAgdGlsZTogVGlsZSxcbiAgICBkcmF3aW5nQnVmZmVyU2l6ZTogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxGaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IGV4dGVuZChcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1WYWx1ZXMobWF0cml4LCBwYWludGVyLCBjcm9zc2ZhZGUsIHRpbGUpLFxuICAgIHtcbiAgICAgICAgJ3Vfd29ybGQnOiBkcmF3aW5nQnVmZmVyU2l6ZVxuICAgIH1cbik7XG5cbmV4cG9ydCB7XG4gICAgZmlsbFVuaWZvcm1zLFxuICAgIGZpbGxQYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbE91dGxpbmVVbmlmb3JtcyxcbiAgICBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtcyxcbiAgICBmaWxsVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbE91dGxpbmVVbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIENpcmNsZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuXG5leHBvcnQgdHlwZSBDaXJjbGVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2NhbGVfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm0yZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuY29uc3QgY2lyY2xlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQ2lyY2xlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3Vfc2NhbGVfd2l0aF9tYXAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX3dpdGhfbWFwKSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBjaXJjbGVVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogQ2lyY2xlU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxDaXJjbGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGxldCBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sIGV4dHJ1ZGVTY2FsZTogW251bWJlciwgbnVtYmVyXTtcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnKSB7XG4gICAgICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgIHBpdGNoV2l0aE1hcCA9IHRydWU7XG4gICAgICAgIGV4dHJ1ZGVTY2FsZSA9IFtwaXhlbFJhdGlvLCBwaXhlbFJhdGlvXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwaXRjaFdpdGhNYXAgPSBmYWxzZTtcbiAgICAgICAgZXh0cnVkZVNjYWxlID0gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0cztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgICd1X3NjYWxlX3dpdGhfbWFwJzogKyhsYXllci5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAnbWFwJyksXG4gICAgICAgICd1X21hdHJpeCc6IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICAgICAgY29vcmQucG9zTWF0cml4LFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlLWFuY2hvcicpKSxcbiAgICAgICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiArKHBpdGNoV2l0aE1hcCksXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfZXh0cnVkZV9zY2FsZSc6IGV4dHJ1ZGVTY2FsZVxuICAgIH07XG59O1xuXG5leHBvcnQge2NpcmNsZVVuaWZvcm1zLCBjaXJjbGVVbmlmb3JtVmFsdWVzfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IFVuaWZvcm0xZixcbiAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IFVuaWZvcm0xZixcbiAgICAndV9leHRydWRlX3NjYWxlJzogVW5pZm9ybTJmLFxuICAgICd1X292ZXJzY2FsZV9mYWN0b3InOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBDb2xsaXNpb25DaXJjbGVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9pbnZfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfdmlld3BvcnRfc2l6ZSc6IFVuaWZvcm0yZlxufH07XG5cbmNvbnN0IGNvbGxpc2lvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IENvbGxpc2lvblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxzX3RvX3RpbGVfdW5pdHMpLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X292ZXJzY2FsZV9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X292ZXJzY2FsZV9mYWN0b3IpXG59KTtcblxuY29uc3QgY29sbGlzaW9uQ2lyY2xlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQ29sbGlzaW9uQ2lyY2xlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2ludl9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ludl9tYXRyaXgpLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICd1X3ZpZXdwb3J0X3NpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3ZpZXdwb3J0X3NpemUpXG59KTtcblxuY29uc3QgY29sbGlzaW9uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPENvbGxpc2lvblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSk7XG4gICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB0cmFuc2Zvcm0uem9vbSAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICBjb25zdCBvdmVyc2NhbGVGYWN0b3IgPSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgJ3VfcGl4ZWxzX3RvX3RpbGVfdW5pdHMnOiBwaXhlbFJhdGlvLFxuICAgICAgICAndV9leHRydWRlX3NjYWxlJzogW3RyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0gLyAocGl4ZWxSYXRpbyAqIHNjYWxlKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMV0gLyAocGl4ZWxSYXRpbyAqIHNjYWxlKV0sXG4gICAgICAgICd1X292ZXJzY2FsZV9mYWN0b3InOiBvdmVyc2NhbGVGYWN0b3JcbiAgICB9O1xufTtcblxuY29uc3QgY29sbGlzaW9uQ2lyY2xlVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBpbnZNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybVxuKTogVW5pZm9ybVZhbHVlczxDb2xsaXNpb25DaXJjbGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2ludl9tYXRyaXgnOiBpbnZNYXRyaXgsXG4gICAgICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxcbiAgICAgICAgJ3Vfdmlld3BvcnRfc2l6ZSc6IFt0cmFuc2Zvcm0ud2lkdGgsIHRyYW5zZm9ybS5oZWlnaHRdXG4gICAgfTtcbn07XG5cbmV4cG9ydCB7Y29sbGlzaW9uVW5pZm9ybXMsIGNvbGxpc2lvblVuaWZvcm1WYWx1ZXMsIGNvbGxpc2lvbkNpcmNsZVVuaWZvcm1zLCBjb2xsaXNpb25DaXJjbGVVbmlmb3JtVmFsdWVzfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXg0ZixcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5cbmV4cG9ydCB0eXBlIERlYnVnVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9jb2xvcic6IFVuaWZvcm1Db2xvcixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3ZlcmxheSc6IFVuaWZvcm0xaSxcbiAgICAndV9vdmVybGF5X3NjYWxlJzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgZGVidWdVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBEZWJ1Z1VuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2NvbG9yJzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvciksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X292ZXJsYXknOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X292ZXJsYXkpLFxuICAgICd1X292ZXJsYXlfc2NhbGUnOiAgbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vdmVybGF5X3NjYWxlKSxcbn0pO1xuXG5jb25zdCBkZWJ1Z1VuaWZvcm1WYWx1ZXMgPSAobWF0cml4OiBGbG9hdDMyQXJyYXksIGNvbG9yOiBDb2xvciwgc2NhbGVSYXRpbzogbnVtYmVyID0gMSk6IFVuaWZvcm1WYWx1ZXM8RGVidWdVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X2NvbG9yJzogY29sb3IsXG4gICAgJ3Vfb3ZlcmxheSc6IDAsXG4gICAgJ3Vfb3ZlcmxheV9zY2FsZSc6IHNjYWxlUmF0aW9cbn0pO1xuXG5leHBvcnQge2RlYnVnVW5pZm9ybXMsIGRlYnVnVW5pZm9ybVZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1VuaWZvcm1NYXRyaXg0Zn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuXG5leHBvcnQgdHlwZSBDbGlwcGluZ01hc2tVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZlxufH07XG5cbmNvbnN0IGNsaXBwaW5nTWFza1VuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IENsaXBwaW5nTWFza1VuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KVxufSk7XG5cbmNvbnN0IGNsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXMgPSAobWF0cml4OiBGbG9hdDMyQXJyYXkpOiBVbmlmb3JtVmFsdWVzPENsaXBwaW5nTWFza1VuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXgnOiBtYXRyaXhcbn0pO1xuXG5leHBvcnQge2NsaXBwaW5nTWFza1VuaWZvcm1zLCBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZSc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBIZWF0bWFwU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyJztcblxuZXhwb3J0IHR5cGUgSGVhdG1hcFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9pbnRlbnNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuZXhwb3J0IHR5cGUgSGVhdG1hcFRleHR1cmVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV93b3JsZCc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9jb2xvcl9yYW1wJzogVW5pZm9ybTFpLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBoZWF0bWFwVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogSGVhdG1hcFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X2ludGVuc2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfaW50ZW5zaXR5KSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBoZWF0bWFwVGV4dHVyZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhlYXRtYXBUZXh0dXJlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3dvcmxkJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV93b3JsZCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV9jb2xvcl9yYW1wJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvcl9yYW1wKSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KVxufSk7XG5cbmNvbnN0IGhlYXRtYXBVbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHRpbGU6IFRpbGUsXG4gICAgem9vbTogbnVtYmVyLFxuICAgIGludGVuc2l0eTogbnVtYmVyXG4pOiBVbmlmb3JtVmFsdWVzPEhlYXRtYXBVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB6b29tKSxcbiAgICAndV9pbnRlbnNpdHknOiBpbnRlbnNpdHlcbn0pO1xuXG5jb25zdCBoZWF0bWFwVGV4dHVyZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBsYXllcjogSGVhdG1hcFN0eWxlTGF5ZXIsXG4gICAgdGV4dHVyZVVuaXQ6IG51bWJlcixcbiAgICBjb2xvclJhbXBVbml0OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8SGVhdG1hcFRleHR1cmVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCBtYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgIG1hdDQub3J0aG8obWF0cml4LCAwLCBwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodCwgMCwgMCwgMSk7XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3Vfd29ybGQnOiBbZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XSxcbiAgICAgICAgJ3VfaW1hZ2UnOiB0ZXh0dXJlVW5pdCxcbiAgICAgICAgJ3VfY29sb3JfcmFtcCc6IGNvbG9yUmFtcFVuaXQsXG4gICAgICAgICd1X29wYWNpdHknOiBsYXllci5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpXG4gICAgfTtcbn07XG5cbmV4cG9ydCB7XG4gICAgaGVhdG1hcFVuaWZvcm1zLFxuICAgIGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMsXG4gICAgaGVhdG1hcFVuaWZvcm1WYWx1ZXMsXG4gICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4NGYsXG4gICAgVW5pZm9ybTRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBIaWxsc2hhZGVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBERU1EYXRhIGZyb20gJy4uLy4uL2RhdGEvZGVtX2RhdGEnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IHR5cGUgSGlsbHNoYWRlVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfbGF0cmFuZ2UnOiBVbmlmb3JtMmYsXG4gICAgJ3VfbGlnaHQnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2hhZG93JzogVW5pZm9ybUNvbG9yLFxuICAgICd1X2hpZ2hsaWdodCc6IFVuaWZvcm1Db2xvcixcbiAgICAndV9hY2NlbnQnOiBVbmlmb3JtQ29sb3Jcbnx9O1xuXG5leHBvcnQgdHlwZSBIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfZGltZW5zaW9uJzogVW5pZm9ybTJmLFxuICAgICd1X3pvb20nOiBVbmlmb3JtMWYsXG4gICAgJ3VfdW5wYWNrJzogVW5pZm9ybTRmXG58fTtcblxuY29uc3QgaGlsbHNoYWRlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogSGlsbHNoYWRlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfbGF0cmFuZ2UnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xhdHJhbmdlKSxcbiAgICAndV9saWdodCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfbGlnaHQpLFxuICAgICd1X3NoYWRvdyc6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfc2hhZG93KSxcbiAgICAndV9oaWdobGlnaHQnOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X2hpZ2hsaWdodCksXG4gICAgJ3VfYWNjZW50JzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9hY2NlbnQpXG59KTtcblxuY29uc3QgaGlsbHNoYWRlUHJlcGFyZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhpbGxzaGFkZVByZXBhcmVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV9kaW1lbnNpb24nOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RpbWVuc2lvbiksXG4gICAgJ3Vfem9vbSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfem9vbSksXG4gICAgJ3VfdW5wYWNrJzogbmV3IFVuaWZvcm00Zihjb250ZXh0LCBsb2NhdGlvbnMudV91bnBhY2spXG59KTtcblxuY29uc3QgaGlsbHNoYWRlVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IEhpbGxzaGFkZVN0eWxlTGF5ZXJcbik6IFVuaWZvcm1WYWx1ZXM8SGlsbHNoYWRlVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3Qgc2hhZG93ID0gbGF5ZXIucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiKTtcbiAgICBjb25zdCBoaWdobGlnaHQgPSBsYXllci5wYWludC5nZXQoXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCIpO1xuICAgIGNvbnN0IGFjY2VudCA9IGxheWVyLnBhaW50LmdldChcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIik7XG5cbiAgICBsZXQgYXppbXV0aGFsID0gbGF5ZXIucGFpbnQuZ2V0KCdoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvbicpICogKE1hdGguUEkgLyAxODApO1xuICAgIC8vIG1vZGlmeSBhemltdXRoYWwgYW5nbGUgYnkgbWFwIHJvdGF0aW9uIGlmIGxpZ2h0IGlzIGFuY2hvcmVkIGF0IHRoZSB2aWV3cG9ydFxuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yJykgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgYXppbXV0aGFsIC09IHBhaW50ZXIudHJhbnNmb3JtLmFuZ2xlO1xuICAgIH1cbiAgICBjb25zdCBhbGlnbiA9ICFwYWludGVyLm9wdGlvbnMubW92aW5nO1xuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IHBhaW50ZXIudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeCh0aWxlLnRpbGVJRC50b1Vud3JhcHBlZCgpLCBhbGlnbiksXG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfbGF0cmFuZ2UnOiBnZXRUaWxlTGF0UmFuZ2UocGFpbnRlciwgdGlsZS50aWxlSUQpLFxuICAgICAgICAndV9saWdodCc6IFtsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1leGFnZ2VyYXRpb24nKSwgYXppbXV0aGFsXSxcbiAgICAgICAgJ3Vfc2hhZG93Jzogc2hhZG93LFxuICAgICAgICAndV9oaWdobGlnaHQnOiBoaWdobGlnaHQsXG4gICAgICAgICd1X2FjY2VudCc6IGFjY2VudFxuICAgIH07XG59O1xuXG5jb25zdCBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlcyA9IChcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIGRlbTogREVNRGF0YVxuKTogVW5pZm9ybVZhbHVlczxIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlPiA9PiB7XG5cbiAgICBjb25zdCBzdHJpZGUgPSBkZW0uc3RyaWRlO1xuICAgIGNvbnN0IG1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgLy8gRmxpcCByZW5kZXJpbmcgYXQgeSBheGlzLlxuICAgIG1hdDQub3J0aG8obWF0cml4LCAwLCBFWFRFTlQsIC1FWFRFTlQsIDAsIDAsIDEpO1xuICAgIG1hdDQudHJhbnNsYXRlKG1hdHJpeCwgbWF0cml4LCBbMCwgLUVYVEVOVCwgMF0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9pbWFnZSc6IDEsXG4gICAgICAgICd1X2RpbWVuc2lvbic6IFtzdHJpZGUsIHN0cmlkZV0sXG4gICAgICAgICd1X3pvb20nOiB0aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICd1X3VucGFjayc6IGRlbS5nZXRVbnBhY2tWZWN0b3IoKVxuICAgIH07XG59O1xuXG5mdW5jdGlvbiBnZXRUaWxlTGF0UmFuZ2UocGFpbnRlcjogUGFpbnRlciwgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgLy8gZm9yIHNjYWxpbmcgdGhlIG1hZ25pdHVkZSBvZiBhIHBvaW50cyBzbG9wZSBieSBpdHMgbGF0aXR1ZGVcbiAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIHRpbGVJRC5jYW5vbmljYWwueik7XG4gICAgY29uc3QgeSA9IHRpbGVJRC5jYW5vbmljYWwueTtcbiAgICByZXR1cm4gW1xuICAgICAgICBuZXcgTWVyY2F0b3JDb29yZGluYXRlKDAsIHkgLyB0aWxlc0F0Wm9vbSkudG9MbmdMYXQoKS5sYXQsXG4gICAgICAgIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoMCwgKHkgKyAxKSAvIHRpbGVzQXRab29tKS50b0xuZ0xhdCgpLmxhdF07XG59XG5cbmV4cG9ydCB7XG4gICAgaGlsbHNoYWRlVW5pZm9ybXMsXG4gICAgaGlsbHNoYWRlUHJlcGFyZVVuaWZvcm1zLFxuICAgIGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMsXG4gICAgaGlsbHNoYWRlVW5pZm9ybVByZXBhcmVWYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXInO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIHtDcm9zc0ZhZGVkfSBmcm9tICcuLi8uLi9zdHlsZS9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIExpbmVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuXG5leHBvcnQgdHlwZSBMaW5lVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZlxufH07XG5cbmV4cG9ydCB0eXBlIExpbmVHcmFkaWVudFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV91bml0c190b19waXhlbHMnOiBVbmlmb3JtMmYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfaW1hZ2VfaGVpZ2h0JzogVW5pZm9ybTFmLFxufH07XG5cbmV4cG9ydCB0eXBlIExpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBMaW5lU0RGVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuc2NhbGVfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuc2NhbGVfYic6IFVuaWZvcm0yZixcbiAgICAndV9zZGZnYW1tYSc6IFVuaWZvcm0xZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXhfeV9hJzogVW5pZm9ybTFmLFxuICAgICd1X3RleF95X2InOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWl4JzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgbGluZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IExpbmVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3JhdGlvKSxcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RldmljZV9waXhlbF9yYXRpbyksXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV91bml0c190b19waXhlbHMpXG59KTtcblxuY29uc3QgbGluZUdyYWRpZW50VW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogTGluZUdyYWRpZW50VW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9yYXRpbyksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdW5pdHNfdG9fcGl4ZWxzKSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X2ltYWdlX2hlaWdodCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2VfaGVpZ2h0KSxcbn0pO1xuXG5jb25zdCBsaW5lUGF0dGVyblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IExpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9yYXRpbyksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV91bml0c190b19waXhlbHMpLFxuICAgICd1X3NjYWxlJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZSksXG4gICAgJ3VfZmFkZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZSlcbn0pO1xuXG5jb25zdCBsaW5lU0RGVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogTGluZVNERlVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcmF0aW8pLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV91bml0c190b19waXhlbHMnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3VuaXRzX3RvX3BpeGVscyksXG4gICAgJ3VfcGF0dGVybnNjYWxlX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5zY2FsZV9hKSxcbiAgICAndV9wYXR0ZXJuc2NhbGVfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybnNjYWxlX2IpLFxuICAgICd1X3NkZmdhbW1hJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zZGZnYW1tYSksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV90ZXhfeV9hJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhfeV9hKSxcbiAgICAndV90ZXhfeV9iJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhfeV9iKSxcbiAgICAndV9taXgnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X21peClcbn0pO1xuXG5jb25zdCBsaW5lVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IExpbmVTdHlsZUxheWVyXG4pOiBVbmlmb3JtVmFsdWVzPExpbmVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IGNhbGN1bGF0ZU1hdHJpeChwYWludGVyLCB0aWxlLCBsYXllciksXG4gICAgICAgICd1X3JhdGlvJzogMSAvIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAndV91bml0c190b19waXhlbHMnOiBbXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1swXSxcbiAgICAgICAgICAgIDEgLyB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzFdXG4gICAgICAgIF1cbiAgICB9O1xufTtcblxuY29uc3QgbGluZUdyYWRpZW50VW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IExpbmVTdHlsZUxheWVyLFxuICAgIGltYWdlSGVpZ2h0OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8TGluZUdyYWRpZW50VW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIGV4dGVuZChsaW5lVW5pZm9ybVZhbHVlcyhwYWludGVyLCB0aWxlLCBsYXllciksIHtcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV9pbWFnZV9oZWlnaHQnOiBpbWFnZUhlaWdodCxcbiAgICB9KTtcbn07XG5cbmNvbnN0IGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IExpbmVTdHlsZUxheWVyLFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVyc1xuKTogVW5pZm9ybVZhbHVlczxMaW5lUGF0dGVyblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHRpbGVab29tUmF0aW8gPSBjYWxjdWxhdGVUaWxlUmF0aW8odGlsZSwgdHJhbnNmb3JtKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBjYWxjdWxhdGVNYXRyaXgocGFpbnRlciwgdGlsZSwgbGF5ZXIpLFxuICAgICAgICAndV90ZXhzaXplJzogdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICAvLyBjYW1lcmEgem9vbSByYXRpb1xuICAgICAgICAndV9yYXRpbyc6IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV9zY2FsZSc6IFt0aWxlWm9vbVJhdGlvLCBjcm9zc2ZhZGUuZnJvbVNjYWxlLCBjcm9zc2ZhZGUudG9TY2FsZV0sXG4gICAgICAgICd1X2ZhZGUnOiBjcm9zc2ZhZGUudCxcbiAgICAgICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogW1xuICAgICAgICAgICAgMSAvIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0sXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXVxuICAgICAgICBdXG4gICAgfTtcbn07XG5cbmNvbnN0IGxpbmVTREZVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogTGluZVN0eWxlTGF5ZXIsXG4gICAgZGFzaGFycmF5OiBDcm9zc0ZhZGVkPEFycmF5PG51bWJlcj4+LFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVyc1xuKTogVW5pZm9ybVZhbHVlczxMaW5lU0RGVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3QgbGluZUF0bGFzID0gcGFpbnRlci5saW5lQXRsYXM7XG4gICAgY29uc3QgdGlsZVJhdGlvID0gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGUsIHRyYW5zZm9ybSk7XG5cbiAgICBjb25zdCByb3VuZCA9IGxheWVyLmxheW91dC5nZXQoJ2xpbmUtY2FwJykgPT09ICdyb3VuZCc7XG5cbiAgICBjb25zdCBwb3NBID0gbGluZUF0bGFzLmdldERhc2goZGFzaGFycmF5LmZyb20sIHJvdW5kKTtcbiAgICBjb25zdCBwb3NCID0gbGluZUF0bGFzLmdldERhc2goZGFzaGFycmF5LnRvLCByb3VuZCk7XG5cbiAgICBjb25zdCB3aWR0aEEgPSBwb3NBLndpZHRoICogY3Jvc3NmYWRlLmZyb21TY2FsZTtcbiAgICBjb25zdCB3aWR0aEIgPSBwb3NCLndpZHRoICogY3Jvc3NmYWRlLnRvU2NhbGU7XG5cbiAgICByZXR1cm4gZXh0ZW5kKGxpbmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyKSwge1xuICAgICAgICAndV9wYXR0ZXJuc2NhbGVfYSc6IFt0aWxlUmF0aW8gLyB3aWR0aEEsIC1wb3NBLmhlaWdodCAvIDJdLFxuICAgICAgICAndV9wYXR0ZXJuc2NhbGVfYic6IFt0aWxlUmF0aW8gLyB3aWR0aEIsIC1wb3NCLmhlaWdodCAvIDJdLFxuICAgICAgICAndV9zZGZnYW1tYSc6IGxpbmVBdGxhcy53aWR0aCAvIChNYXRoLm1pbih3aWR0aEEsIHdpZHRoQikgKiAyNTYgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8pIC8gMixcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV90ZXhfeV9hJzogcG9zQS55LFxuICAgICAgICAndV90ZXhfeV9iJzogcG9zQi55LFxuICAgICAgICAndV9taXgnOiBjcm9zc2ZhZGUudFxuICAgIH0pO1xufTtcblxuZnVuY3Rpb24gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGU6IFRpbGUsIHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCB0cmFuc2Zvcm0udGlsZVpvb20pO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVNYXRyaXgocGFpbnRlciwgdGlsZSwgbGF5ZXIpIHtcbiAgICByZXR1cm4gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXG4gICAgICAgIHRpbGUudGlsZUlELnBvc01hdHJpeCxcbiAgICAgICAgdGlsZSxcbiAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZScpLFxuICAgICAgICBsYXllci5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlLWFuY2hvcicpXG4gICAgKTtcbn1cblxuZXhwb3J0IHtcbiAgICBsaW5lVW5pZm9ybXMsXG4gICAgbGluZUdyYWRpZW50VW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm5Vbmlmb3JtcyxcbiAgICBsaW5lU0RGVW5pZm9ybXMsXG4gICAgbGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZUdyYWRpZW50VW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZVNERlVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0JztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcnO1xuaW1wb3J0IHR5cGUgUmFzdGVyU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBSYXN0ZXJVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV90bF9wYXJlbnQnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGVfcGFyZW50JzogVW5pZm9ybTFmLFxuICAgICd1X2J1ZmZlcl9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9mYWRlX3QnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9pbWFnZTAnOiBVbmlmb3JtMWksXG4gICAgJ3VfaW1hZ2UxJzogVW5pZm9ybTFpLFxuICAgICd1X2JyaWdodG5lc3NfbG93JzogVW5pZm9ybTFmLFxuICAgICd1X2JyaWdodG5lc3NfaGlnaCc6IFVuaWZvcm0xZixcbiAgICAndV9zYXR1cmF0aW9uX2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV9jb250cmFzdF9mYWN0b3InOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc3Bpbl93ZWlnaHRzJzogVW5pZm9ybTNmXG58fTtcblxuY29uc3QgcmFzdGVyVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogUmFzdGVyVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3RsX3BhcmVudCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGxfcGFyZW50KSxcbiAgICAndV9zY2FsZV9wYXJlbnQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX3BhcmVudCksXG4gICAgJ3VfYnVmZmVyX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9idWZmZXJfc2NhbGUpLFxuICAgICd1X2ZhZGVfdCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZV90KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9pbWFnZTAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlMCksXG4gICAgJ3VfaW1hZ2UxJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZTEpLFxuICAgICd1X2JyaWdodG5lc3NfbG93JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9icmlnaHRuZXNzX2xvdyksXG4gICAgJ3VfYnJpZ2h0bmVzc19oaWdoJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9icmlnaHRuZXNzX2hpZ2gpLFxuICAgICd1X3NhdHVyYXRpb25fZmFjdG9yJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zYXR1cmF0aW9uX2ZhY3RvciksXG4gICAgJ3VfY29udHJhc3RfZmFjdG9yJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jb250cmFzdF9mYWN0b3IpLFxuICAgICd1X3NwaW5fd2VpZ2h0cyc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc3Bpbl93ZWlnaHRzKVxufSk7XG5cbmNvbnN0IHJhc3RlclVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFyZW50VEw6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFyZW50U2NhbGVCeTogbnVtYmVyLFxuICAgIGZhZGU6IHttaXg6IG51bWJlciwgb3BhY2l0eTogbnVtYmVyfSxcbiAgICBsYXllcjogUmFzdGVyU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxSYXN0ZXJVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3RsX3BhcmVudCc6IHBhcmVudFRMLFxuICAgICd1X3NjYWxlX3BhcmVudCc6IHBhcmVudFNjYWxlQnksXG4gICAgJ3VfYnVmZmVyX3NjYWxlJzogMSxcbiAgICAndV9mYWRlX3QnOiBmYWRlLm1peCxcbiAgICAndV9vcGFjaXR5JzogZmFkZS5vcGFjaXR5ICogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItb3BhY2l0eScpLFxuICAgICd1X2ltYWdlMCc6IDAsXG4gICAgJ3VfaW1hZ2UxJzogMSxcbiAgICAndV9icmlnaHRuZXNzX2xvdyc6IGxheWVyLnBhaW50LmdldCgncmFzdGVyLWJyaWdodG5lc3MtbWluJyksXG4gICAgJ3VfYnJpZ2h0bmVzc19oaWdoJzogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItYnJpZ2h0bmVzcy1tYXgnKSxcbiAgICAndV9zYXR1cmF0aW9uX2ZhY3Rvcic6IHNhdHVyYXRpb25GYWN0b3IobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItc2F0dXJhdGlvbicpKSxcbiAgICAndV9jb250cmFzdF9mYWN0b3InOiBjb250cmFzdEZhY3RvcihsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1jb250cmFzdCcpKSxcbiAgICAndV9zcGluX3dlaWdodHMnOiBzcGluV2VpZ2h0cyhsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1odWUtcm90YXRlJykpXG59KTtcblxuZnVuY3Rpb24gc3BpbldlaWdodHMoYW5nbGUpIHtcbiAgICBhbmdsZSAqPSBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IHMgPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgY29uc3QgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAoMiAqIGMgKyAxKSAvIDMsXG4gICAgICAgICgtTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDMsXG4gICAgICAgIChNYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gM1xuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNvbnRyYXN0RmFjdG9yKGNvbnRyYXN0KSB7XG4gICAgcmV0dXJuIGNvbnRyYXN0ID4gMCA/XG4gICAgICAgIDEgLyAoMSAtIGNvbnRyYXN0KSA6XG4gICAgICAgIDEgKyBjb250cmFzdDtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGlvbkZhY3RvcihzYXR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHNhdHVyYXRpb24gPiAwID9cbiAgICAgICAgMSAtIDEgLyAoMS4wMDEgLSBzYXR1cmF0aW9uKSA6XG4gICAgICAgIC1zYXR1cmF0aW9uO1xufVxuXG5leHBvcnQge3Jhc3RlclVuaWZvcm1zLCByYXN0ZXJVbmlmb3JtVmFsdWVzfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uLy4uL3V0aWwvYnJvd3Nlcic7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dCc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEljb25Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3Vfc2l6ZV90JzogVW5pZm9ybTFmLFxuICAgICd1X3NpemUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IFVuaWZvcm0xZixcbiAgICAndV9waXRjaCc6IFVuaWZvcm0xZixcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogVW5pZm9ybTFpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9mYWRlX2NoYW5nZSc6IFVuaWZvcm0xZixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2Nvb3JkX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9pc190ZXh0JzogVW5pZm9ybTFpLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogVW5pZm9ybTFpLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGV4dHVyZSc6IFVuaWZvcm0xaVxufH07XG5cbmV4cG9ydCB0eXBlIFN5bWJvbFNERlVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9zaXplX3QnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2l6ZSc6IFVuaWZvcm0xZixcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X3BpdGNoJzogVW5pZm9ybTFmLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBVbmlmb3JtMWksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogVW5pZm9ybTFmLFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfY29vcmRfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2lzX3RleHQnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV90ZXh0dXJlJzogVW5pZm9ybTFpLFxuICAgICd1X2dhbW1hX3NjYWxlJzogVW5pZm9ybTFmLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9pc19oYWxvJzogVW5pZm9ybTFpXG58fTtcblxuZXhwb3J0IHR5cGUgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3Vfc2l6ZV90JzogVW5pZm9ybTFmLFxuICAgICd1X3NpemUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IFVuaWZvcm0xZixcbiAgICAndV9waXRjaCc6IFVuaWZvcm0xZixcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogVW5pZm9ybTFpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9mYWRlX2NoYW5nZSc6IFVuaWZvcm0xZixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2Nvb3JkX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9pc190ZXh0JzogVW5pZm9ybTFpLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogVW5pZm9ybTFpLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGV4c2l6ZV9pY29uJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHR1cmUnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4dHVyZV9pY29uJzogVW5pZm9ybTFpLFxuICAgICd1X2dhbW1hX3NjYWxlJzogVW5pZm9ybTFmLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9pc19oYWxvJzogVW5pZm9ybTFpXG58fTtcblxuY29uc3Qgc3ltYm9sSWNvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFN5bWJvbEljb25Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3NpemVfem9vbV9jb25zdGFudCksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpLFxuICAgICd1X3NpemVfdCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZV90KSxcbiAgICAndV9zaXplJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zaXplKSxcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV9waXRjaCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2gpLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3JvdGF0ZV9zeW1ib2wpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAndV9mYWRlX2NoYW5nZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZV9jaGFuZ2UpLFxuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgJ3VfY29vcmRfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9jb29yZF9tYXRyaXgpLFxuICAgICd1X2lzX3RleHQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3RleHQpLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9waXRjaF93aXRoX21hcCksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfdGV4dHVyZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4dHVyZSlcbn0pO1xuXG5jb25zdCBzeW1ib2xTREZVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBTeW1ib2xTREZVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3NpemVfem9vbV9jb25zdGFudCksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpLFxuICAgICd1X3NpemVfdCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZV90KSxcbiAgICAndV9zaXplJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zaXplKSxcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV9waXRjaCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2gpLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3JvdGF0ZV9zeW1ib2wpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAndV9mYWRlX2NoYW5nZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZV9jaGFuZ2UpLFxuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgJ3VfY29vcmRfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9jb29yZF9tYXRyaXgpLFxuICAgICd1X2lzX3RleHQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3RleHQpLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9waXRjaF93aXRoX21hcCksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfdGV4dHVyZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4dHVyZSksXG4gICAgJ3VfZ2FtbWFfc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2dhbW1hX3NjYWxlKSxcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RldmljZV9waXhlbF9yYXRpbyksXG4gICAgJ3VfaXNfaGFsbyc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfaGFsbylcbn0pO1xuXG5jb25zdCBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX3pvb21fY29uc3RhbnQpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAndV9zaXplX3QnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemVfdCksXG4gICAgJ3Vfc2l6ZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZSksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3VfcGl0Y2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoKSxcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9yb3RhdGVfc3ltYm9sKSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2FzcGVjdF9yYXRpbyksXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGVfY2hhbmdlKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9sYWJlbF9wbGFuZV9tYXRyaXgpLFxuICAgICd1X2Nvb3JkX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfY29vcmRfbWF0cml4KSxcbiAgICAndV9pc190ZXh0JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc190ZXh0KSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2hfd2l0aF9tYXApLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3RleHNpemVfaWNvbic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZV9pY29uKSxcbiAgICAndV90ZXh0dXJlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV90ZXh0dXJlKSxcbiAgICAndV90ZXh0dXJlX2ljb24nOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHR1cmVfaWNvbiksXG4gICAgJ3VfZ2FtbWFfc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2dhbW1hX3NjYWxlKSxcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RldmljZV9waXhlbF9yYXRpbyksXG4gICAgJ3VfaXNfaGFsbyc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfaGFsbylcbn0pO1xuXG5jb25zdCBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBmdW5jdGlvblR5cGU6IHN0cmluZyxcbiAgICBzaXplOiA/e3VTaXplVDogbnVtYmVyLCB1U2l6ZTogbnVtYmVyfSxcbiAgICByb3RhdGVJblNoYWRlcjogYm9vbGVhbixcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBsYWJlbFBsYW5lTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGlzVGV4dDogYm9vbGVhbixcbiAgICB0ZXhTaXplOiBbbnVtYmVyLCBudW1iZXJdXG4pOiBVbmlmb3JtVmFsdWVzPFN5bWJvbEljb25Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6ICsoZnVuY3Rpb25UeXBlID09PSAnY29uc3RhbnQnIHx8IGZ1bmN0aW9uVHlwZSA9PT0gJ3NvdXJjZScpLFxuICAgICAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiArKGZ1bmN0aW9uVHlwZSA9PT0gJ2NvbnN0YW50JyB8fCBmdW5jdGlvblR5cGUgPT09ICdjYW1lcmEnKSxcbiAgICAgICAgJ3Vfc2l6ZV90Jzogc2l6ZSA/IHNpemUudVNpemVUIDogMCxcbiAgICAgICAgJ3Vfc2l6ZSc6IHNpemUgPyBzaXplLnVTaXplIDogMCxcbiAgICAgICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICAndV9waXRjaCc6IHRyYW5zZm9ybS5waXRjaCAvIDM2MCAqIDIgKiBNYXRoLlBJLFxuICAgICAgICAndV9yb3RhdGVfc3ltYm9sJzogK3JvdGF0ZUluU2hhZGVyLFxuICAgICAgICAndV9hc3BlY3RfcmF0aW8nOiB0cmFuc2Zvcm0ud2lkdGggLyB0cmFuc2Zvcm0uaGVpZ2h0LFxuICAgICAgICAndV9mYWRlX2NoYW5nZSc6IHBhaW50ZXIub3B0aW9ucy5mYWRlRHVyYXRpb24gPyBwYWludGVyLnN5bWJvbEZhZGVDaGFuZ2UgOiAxLFxuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IGxhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICd1X2Nvb3JkX21hdHJpeCc6IGdsQ29vcmRNYXRyaXgsXG4gICAgICAgICd1X2lzX3RleHQnOiAraXNUZXh0LFxuICAgICAgICAndV9waXRjaF93aXRoX21hcCc6ICtwaXRjaFdpdGhNYXAsXG4gICAgICAgICd1X3RleHNpemUnOiB0ZXhTaXplLFxuICAgICAgICAndV90ZXh0dXJlJzogMFxuICAgIH07XG59O1xuXG5jb25zdCBzeW1ib2xTREZVbmlmb3JtVmFsdWVzID0gKFxuICAgIGZ1bmN0aW9uVHlwZTogc3RyaW5nLFxuICAgIHNpemU6ID97dVNpemVUOiBudW1iZXIsIHVTaXplOiBudW1iZXJ9LFxuICAgIHJvdGF0ZUluU2hhZGVyOiBib29sZWFuLFxuICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgaXNUZXh0OiBib29sZWFuLFxuICAgIHRleFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgaXNIYWxvOiBib29sZWFuXG4pOiBVbmlmb3JtVmFsdWVzPFN5bWJvbFNERlVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgcmV0dXJuIGV4dGVuZChzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyhmdW5jdGlvblR5cGUsIHNpemUsXG4gICAgICAgIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgZ2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplKSwge1xuICAgICAgICAndV9nYW1tYV9zY2FsZSc6IChwaXRjaFdpdGhNYXAgPyBNYXRoLmNvcyh0cmFuc2Zvcm0uX3BpdGNoKSAqIHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIDogMSksXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfaXNfaGFsbyc6ICtpc0hhbG9cbiAgICB9KTtcbn07XG5cbmNvbnN0IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBmdW5jdGlvblR5cGU6IHN0cmluZyxcbiAgICBzaXplOiA/e3VTaXplVDogbnVtYmVyLCB1U2l6ZTogbnVtYmVyfSxcbiAgICByb3RhdGVJblNoYWRlcjogYm9vbGVhbixcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBsYWJlbFBsYW5lTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHRleFNpemVTREY6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgdGV4U2l6ZUljb246IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8U3ltYm9sSWNvblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIHJldHVybiBleHRlbmQoc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyhmdW5jdGlvblR5cGUsIHNpemUsXG4gICAgICAgIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgZ2xDb29yZE1hdHJpeCwgdHJ1ZSwgdGV4U2l6ZVNERiwgdHJ1ZSksIHtcbiAgICAgICAgJ3VfdGV4c2l6ZV9pY29uJzogdGV4U2l6ZUljb24sXG4gICAgICAgICd1X3RleHR1cmVfaWNvbic6IDFcbiAgICB9KTtcbn07XG5cbmV4cG9ydCB7c3ltYm9sSWNvblVuaWZvcm1zLCBzeW1ib2xTREZVbmlmb3Jtcywgc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMsIHN5bWJvbFNERlVuaWZvcm1WYWx1ZXMsIHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybVZhbHVlcywgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3Jtc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2JnUGF0dGVyblVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vcGF0dGVybic7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQnO1xuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcbmltcG9ydCB0eXBlIHtDcm9zc0ZhZGVkfSBmcm9tICcuLi8uLi9zdHlsZS9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlJztcblxuZXhwb3J0IHR5cGUgQmFja2dyb3VuZFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfY29sb3InOiBVbmlmb3JtQ29sb3Jcbnx9O1xuXG5leHBvcnQgdHlwZSBCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9wYXR0ZXJuX3RsX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl9icl9hJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fdGxfYic6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX2JyX2InOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9taXgnOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGF0dGVybl9zaXplX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl9zaXplX2InOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGVfYSc6IFVuaWZvcm0xZixcbiAgICAndV9zY2FsZV9iJzogVW5pZm9ybTFmLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzJzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgYmFja2dyb3VuZFVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEJhY2tncm91bmRVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSksXG4gICAgJ3VfY29sb3InOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbG9yKVxufSk7XG5cbmNvbnN0IGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV9wYXR0ZXJuX3RsX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fdGxfYSksXG4gICAgJ3VfcGF0dGVybl9icl9hJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuX2JyX2EpLFxuICAgICd1X3BhdHRlcm5fdGxfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl90bF9iKSxcbiAgICAndV9wYXR0ZXJuX2JyX2InOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fYnJfYiksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfbWl4JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9taXgpLFxuICAgICd1X3BhdHRlcm5fc2l6ZV9hJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuX3NpemVfYSksXG4gICAgJ3VfcGF0dGVybl9zaXplX2InOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fc2l6ZV9iKSxcbiAgICAndV9zY2FsZV9hJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZV9hKSxcbiAgICAndV9zY2FsZV9iJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZV9iKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RpbGVfdW5pdHNfdG9fcGl4ZWxzKVxufSk7XG5cbmNvbnN0IGJhY2tncm91bmRVbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICBjb2xvcjogQ29sb3Jcbik6IFVuaWZvcm1WYWx1ZXM8QmFja2dyb3VuZFVuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgJ3Vfb3BhY2l0eSc6IG9wYWNpdHksXG4gICAgJ3VfY29sb3InOiBjb2xvclxufSk7XG5cbmNvbnN0IGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBpbWFnZTogQ3Jvc3NGYWRlZDxSZXNvbHZlZEltYWdlPixcbiAgICB0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyfSxcbiAgICBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnNcbik6IFVuaWZvcm1WYWx1ZXM8QmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IGV4dGVuZChcbiAgICBiZ1BhdHRlcm5Vbmlmb3JtVmFsdWVzKGltYWdlLCBjcm9zc2ZhZGUsIHBhaW50ZXIsIHRpbGUpLFxuICAgIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9vcGFjaXR5Jzogb3BhY2l0eVxuICAgIH1cbik7XG5cbmV4cG9ydCB7XG4gICAgYmFja2dyb3VuZFVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZFVuaWZvcm1WYWx1ZXMsXG4gICAgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtmaWxsRXh0cnVzaW9uVW5pZm9ybXMsIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXN9IGZyb20gJy4vZmlsbF9leHRydXNpb25fcHJvZ3JhbSc7XG5pbXBvcnQge2ZpbGxVbmlmb3JtcywgZmlsbFBhdHRlcm5Vbmlmb3JtcywgZmlsbE91dGxpbmVVbmlmb3JtcywgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXN9IGZyb20gJy4vZmlsbF9wcm9ncmFtJztcbmltcG9ydCB7Y2lyY2xlVW5pZm9ybXN9IGZyb20gJy4vY2lyY2xlX3Byb2dyYW0nO1xuaW1wb3J0IHtjb2xsaXNpb25Vbmlmb3JtcywgY29sbGlzaW9uQ2lyY2xlVW5pZm9ybXN9IGZyb20gJy4vY29sbGlzaW9uX3Byb2dyYW0nO1xuaW1wb3J0IHtkZWJ1Z1VuaWZvcm1zfSBmcm9tICcuL2RlYnVnX3Byb2dyYW0nO1xuaW1wb3J0IHtjbGlwcGluZ01hc2tVbmlmb3Jtc30gZnJvbSAnLi9jbGlwcGluZ19tYXNrX3Byb2dyYW0nO1xuaW1wb3J0IHtoZWF0bWFwVW5pZm9ybXMsIGhlYXRtYXBUZXh0dXJlVW5pZm9ybXN9IGZyb20gJy4vaGVhdG1hcF9wcm9ncmFtJztcbmltcG9ydCB7aGlsbHNoYWRlVW5pZm9ybXMsIGhpbGxzaGFkZVByZXBhcmVVbmlmb3Jtc30gZnJvbSAnLi9oaWxsc2hhZGVfcHJvZ3JhbSc7XG5pbXBvcnQge2xpbmVVbmlmb3JtcywgbGluZUdyYWRpZW50VW5pZm9ybXMsIGxpbmVQYXR0ZXJuVW5pZm9ybXMsIGxpbmVTREZVbmlmb3Jtc30gZnJvbSAnLi9saW5lX3Byb2dyYW0nO1xuaW1wb3J0IHtyYXN0ZXJVbmlmb3Jtc30gZnJvbSAnLi9yYXN0ZXJfcHJvZ3JhbSc7XG5pbXBvcnQge3N5bWJvbEljb25Vbmlmb3Jtcywgc3ltYm9sU0RGVW5pZm9ybXMsIHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybXN9IGZyb20gJy4vc3ltYm9sX3Byb2dyYW0nO1xuaW1wb3J0IHtiYWNrZ3JvdW5kVW5pZm9ybXMsIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXN9IGZyb20gJy4vYmFja2dyb3VuZF9wcm9ncmFtJztcblxuZXhwb3J0IGNvbnN0IHByb2dyYW1Vbmlmb3JtcyA9IHtcbiAgICBmaWxsRXh0cnVzaW9uOiBmaWxsRXh0cnVzaW9uVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm46IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbDogZmlsbFVuaWZvcm1zLFxuICAgIGZpbGxQYXR0ZXJuOiBmaWxsUGF0dGVyblVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lOiBmaWxsT3V0bGluZVVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVybjogZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgY2lyY2xlOiBjaXJjbGVVbmlmb3JtcyxcbiAgICBjb2xsaXNpb25Cb3g6IGNvbGxpc2lvblVuaWZvcm1zLFxuICAgIGNvbGxpc2lvbkNpcmNsZTogY29sbGlzaW9uQ2lyY2xlVW5pZm9ybXMsXG4gICAgZGVidWc6IGRlYnVnVW5pZm9ybXMsXG4gICAgY2xpcHBpbmdNYXNrOiBjbGlwcGluZ01hc2tVbmlmb3JtcyxcbiAgICBoZWF0bWFwOiBoZWF0bWFwVW5pZm9ybXMsXG4gICAgaGVhdG1hcFRleHR1cmU6IGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMsXG4gICAgaGlsbHNoYWRlOiBoaWxsc2hhZGVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGVQcmVwYXJlOiBoaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXMsXG4gICAgbGluZTogbGluZVVuaWZvcm1zLFxuICAgIGxpbmVHcmFkaWVudDogbGluZUdyYWRpZW50VW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm46IGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgbGluZVNERjogbGluZVNERlVuaWZvcm1zLFxuICAgIHJhc3RlcjogcmFzdGVyVW5pZm9ybXMsXG4gICAgc3ltYm9sSWNvbjogc3ltYm9sSWNvblVuaWZvcm1zLFxuICAgIHN5bWJvbFNERjogc3ltYm9sU0RGVW5pZm9ybXMsXG4gICAgc3ltYm9sVGV4dEFuZEljb246IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZDogYmFja2dyb3VuZFVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuOiBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7Y29sbGlzaW9uVW5pZm9ybVZhbHVlcywgY29sbGlzaW9uQ2lyY2xlVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL2NvbGxpc2lvbl9wcm9ncmFtJztcblxuaW1wb3J0IHtRdWFkVHJpYW5nbGVBcnJheSwgQ29sbGlzaW9uQ2lyY2xlTGF5b3V0QXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMnO1xuaW1wb3J0IHtjb2xsaXNpb25DaXJjbGVMYXlvdXR9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9hdHRyaWJ1dGVzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQge21hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdDb2xsaXNpb25EZWJ1ZztcblxudHlwZSBUaWxlQmF0Y2ggPSB7XG4gICAgY2lyY2xlQXJyYXk6IEFycmF5PG51bWJlcj4sXG4gICAgY2lyY2xlT2Zmc2V0OiBudW1iZXIsXG4gICAgdHJhbnNmb3JtOiBtYXQ0LFxuICAgIGludlRyYW5zZm9ybTogbWF0NFxufTtcblxubGV0IHF1YWRUcmlhbmdsZXM6ID9RdWFkVHJpYW5nbGVBcnJheTtcblxuZnVuY3Rpb24gZHJhd0NvbGxpc2lvbkRlYnVnKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSwgdHJhbnNsYXRlQW5jaG9yOiAnbWFwJyB8ICd2aWV3cG9ydCcsIGlzVGV4dDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2NvbGxpc2lvbkJveCcpO1xuICAgIGNvbnN0IHRpbGVCYXRjaGVzOiBBcnJheTxUaWxlQmF0Y2g+ID0gW107XG4gICAgbGV0IGNpcmNsZUNvdW50ID0gMDtcbiAgICBsZXQgY2lyY2xlT2Zmc2V0ID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogP1N5bWJvbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcbiAgICAgICAgbGV0IHBvc01hdHJpeCA9IGNvb3JkLnBvc01hdHJpeDtcbiAgICAgICAgaWYgKHRyYW5zbGF0ZVswXSAhPT0gMCB8fCB0cmFuc2xhdGVbMV0gIT09IDApIHtcbiAgICAgICAgICAgIHBvc01hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgdGlsZSwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBpc1RleHQgPyBidWNrZXQudGV4dENvbGxpc2lvbkJveCA6IGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94O1xuICAgICAgICAvLyBHZXQgY29sbGlzaW9uIGNpcmNsZSBkYXRhIG9mIHRoaXMgYnVja2V0XG4gICAgICAgIGNvbnN0IGNpcmNsZUFycmF5OiBBcnJheTxudW1iZXI+ID0gYnVja2V0LmNvbGxpc2lvbkNpcmNsZUFycmF5O1xuICAgICAgICBpZiAoY2lyY2xlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBrbm93IHRoZSBwcm9qZWN0aW9uIG1hdHJpeCB0aGF0IHdhcyB1c2VkIGZvciBwcm9qZWN0aW5nIGNvbGxpc2lvbiBjaXJjbGVzIHRvIHRoZSBzY3JlZW4uXG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHZhcnkgYmV0d2VlbiBidWNrZXRzIGFzIHRoZSBzeW1ib2wgcGxhY2VtZW50IGlzIGEgY29udGlub3VzIHByb2Nlc3MuIFRoaXMgbWF0cml4IGlzXG4gICAgICAgICAgICAvLyByZXF1aXJlZCBmb3IgdHJhbnNmb3JtaW5nIHBvaW50cyBmcm9tIHByZXZpb3VzIHNjcmVlbiBzcGFjZSB0byB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICAgIGNvbnN0IGludlRyYW5zZm9ybSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwb3NNYXRyaXg7XG5cbiAgICAgICAgICAgIG1hdDQubXVsKGludlRyYW5zZm9ybSwgYnVja2V0LnBsYWNlbWVudEludlByb2pNYXRyaXgsIHBhaW50ZXIudHJhbnNmb3JtLmdsQ29vcmRNYXRyaXgpO1xuICAgICAgICAgICAgbWF0NC5tdWwoaW52VHJhbnNmb3JtLCBpbnZUcmFuc2Zvcm0sIGJ1Y2tldC5wbGFjZW1lbnRWaWV3cG9ydE1hdHJpeCk7XG5cbiAgICAgICAgICAgIHRpbGVCYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNpcmNsZUFycmF5LFxuICAgICAgICAgICAgICAgIGNpcmNsZU9mZnNldCxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgaW52VHJhbnNmb3JtXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2lyY2xlQ291bnQgKz0gY2lyY2xlQXJyYXkubGVuZ3RoIC8gNDsgIC8vIDQgdmFsdWVzIHBlciBjaXJjbGVcbiAgICAgICAgICAgIGNpcmNsZU9mZnNldCA9IGNpcmNsZUNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghYnVmZmVycykgY29udGludWU7XG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5MSU5FUyxcbiAgICAgICAgICAgIERlcHRoTW9kZS5kaXNhYmxlZCwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSxcbiAgICAgICAgICAgIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIGNvbGxpc2lvblVuaWZvcm1WYWx1ZXMoXG4gICAgICAgICAgICAgICAgcG9zTWF0cml4LFxuICAgICAgICAgICAgICAgIHBhaW50ZXIudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIHRpbGUpLFxuICAgICAgICAgICAgbGF5ZXIuaWQsIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLCBidWZmZXJzLmluZGV4QnVmZmVyLFxuICAgICAgICAgICAgYnVmZmVycy5zZWdtZW50cywgbnVsbCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSwgbnVsbCwgbnVsbCxcbiAgICAgICAgICAgIGJ1ZmZlcnMuY29sbGlzaW9uVmVydGV4QnVmZmVyKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVGV4dCB8fCAhdGlsZUJhdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgY29sbGlzaW9uIGNpcmNsZXNcbiAgICBjb25zdCBjaXJjbGVQcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjb2xsaXNpb25DaXJjbGUnKTtcblxuICAgIC8vIENvbnN0cnVjdCB2ZXJ0ZXggZGF0YVxuICAgIGNvbnN0IHZlcnRleERhdGEgPSBuZXcgQ29sbGlzaW9uQ2lyY2xlTGF5b3V0QXJyYXkoKTtcbiAgICB2ZXJ0ZXhEYXRhLnJlc2l6ZShjaXJjbGVDb3VudCAqIDQpO1xuICAgIHZlcnRleERhdGEuX3RyaW0oKTtcblxuICAgIGxldCB2ZXJ0ZXhPZmZzZXQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aWxlQmF0Y2hlcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoLmNpcmNsZUFycmF5Lmxlbmd0aCAvIDQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlSWR4ID0gaSAqIDQ7XG4gICAgICAgICAgICBjb25zdCB4ID0gYmF0Y2guY2lyY2xlQXJyYXlbY2lyY2xlSWR4ICsgMF07XG4gICAgICAgICAgICBjb25zdCB5ID0gYmF0Y2guY2lyY2xlQXJyYXlbY2lyY2xlSWR4ICsgMV07XG4gICAgICAgICAgICBjb25zdCByYWRpdXMgPSBiYXRjaC5jaXJjbGVBcnJheVtjaXJjbGVJZHggKyAyXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxpc2lvbiA9IGJhdGNoLmNpcmNsZUFycmF5W2NpcmNsZUlkeCArIDNdO1xuXG4gICAgICAgICAgICAvLyA0IGZsb2F0cyBwZXIgdmVydGV4LCA0IHZlcnRpY2VzIHBlciBxdWFkXG4gICAgICAgICAgICB2ZXJ0ZXhEYXRhLmVtcGxhY2UodmVydGV4T2Zmc2V0KyssIHgsIHksIHJhZGl1cywgY29sbGlzaW9uLCAwKTtcbiAgICAgICAgICAgIHZlcnRleERhdGEuZW1wbGFjZSh2ZXJ0ZXhPZmZzZXQrKywgeCwgeSwgcmFkaXVzLCBjb2xsaXNpb24sIDEpO1xuICAgICAgICAgICAgdmVydGV4RGF0YS5lbXBsYWNlKHZlcnRleE9mZnNldCsrLCB4LCB5LCByYWRpdXMsIGNvbGxpc2lvbiwgMik7XG4gICAgICAgICAgICB2ZXJ0ZXhEYXRhLmVtcGxhY2UodmVydGV4T2Zmc2V0KyssIHgsIHksIHJhZGl1cywgY29sbGlzaW9uLCAzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXF1YWRUcmlhbmdsZXMgfHwgcXVhZFRyaWFuZ2xlcy5sZW5ndGggPCBjaXJjbGVDb3VudCAqIDIpIHtcbiAgICAgICAgcXVhZFRyaWFuZ2xlcyA9IGNyZWF0ZVF1YWRUcmlhbmdsZXMoY2lyY2xlQ291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIocXVhZFRyaWFuZ2xlcywgdHJ1ZSk7XG4gICAgY29uc3QgdmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih2ZXJ0ZXhEYXRhLCBjb2xsaXNpb25DaXJjbGVMYXlvdXQubWVtYmVycywgdHJ1ZSk7XG5cbiAgICAvLyBSZW5kZXIgYmF0Y2hlc1xuICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdGlsZUJhdGNoZXMpIHtcbiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBjb2xsaXNpb25DaXJjbGVVbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgYmF0Y2gudHJhbnNmb3JtLFxuICAgICAgICAgICAgYmF0Y2guaW52VHJhbnNmb3JtLFxuICAgICAgICAgICAgcGFpbnRlci50cmFuc2Zvcm1cbiAgICAgICAgKTtcblxuICAgICAgICBjaXJjbGVQcm9ncmFtLmRyYXcoXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgZ2wuVFJJQU5HTEVTLFxuICAgICAgICAgICAgRGVwdGhNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSxcbiAgICAgICAgICAgIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1zLFxuICAgICAgICAgICAgbGF5ZXIuaWQsXG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICBpbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCBiYXRjaC5jaXJjbGVPZmZzZXQgKiAyLCBiYXRjaC5jaXJjbGVBcnJheS5sZW5ndGgsIGJhdGNoLmNpcmNsZUFycmF5Lmxlbmd0aCAvIDIpLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIHZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWFkVHJpYW5nbGVzKHF1YWRDb3VudDogbnVtYmVyKTogUXVhZFRyaWFuZ2xlQXJyYXkge1xuICAgIGNvbnN0IHRyaUNvdW50ID0gcXVhZENvdW50ICogMjtcbiAgICBjb25zdCBhcnJheSA9IG5ldyBRdWFkVHJpYW5nbGVBcnJheSgpO1xuXG4gICAgYXJyYXkucmVzaXplKHRyaUNvdW50KTtcbiAgICBhcnJheS5fdHJpbSgpO1xuXG4gICAgLy8gVHdvIHRyaWFuZ2xlcyBhbmQgNCB2ZXJ0aWNlcyBwZXIgcXVhZC5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyaUNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgaWR4ID0gaSAqIDY7XG5cbiAgICAgICAgYXJyYXkudWludDE2W2lkeCArIDBdID0gaSAqIDQgKyAwO1xuICAgICAgICBhcnJheS51aW50MTZbaWR4ICsgMV0gPSBpICogNCArIDE7XG4gICAgICAgIGFycmF5LnVpbnQxNltpZHggKyAyXSA9IGkgKiA0ICsgMjtcbiAgICAgICAgYXJyYXkudWludDE2W2lkeCArIDNdID0gaSAqIDQgKyAyO1xuICAgICAgICBhcnJheS51aW50MTZbaWR4ICsgNF0gPSBpICogNCArIDM7XG4gICAgICAgIGFycmF5LnVpbnQxNltpZHggKyA1XSA9IGkgKiA0ICsgMDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgZHJhd0NvbGxpc2lvbkRlYnVnIGZyb20gJy4vZHJhd19jb2xsaXNpb25fZGVidWcnO1xuXG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cyc7XG5pbXBvcnQgKiBhcyBzeW1ib2xQcm9qZWN0aW9uIGZyb20gJy4uL3N5bWJvbC9wcm9qZWN0aW9uJztcbmltcG9ydCAqIGFzIHN5bWJvbFNpemUgZnJvbSAnLi4vc3ltYm9sL3N5bWJvbF9zaXplJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmNvbnN0IGlkZW50aXR5TWF0NCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0MzJBcnJheSgxNikpO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQge2FkZER5bmFtaWNBdHRyaWJ1dGVzfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcblxuaW1wb3J0IHtnZXRBbmNob3JBbGlnbm1lbnQsIFdyaXRpbmdNb2RlfSBmcm9tICcuLi9zeW1ib2wvc2hhcGluZyc7XG5pbXBvcnQgT05FX0VNIGZyb20gJy4uL3N5bWJvbC9vbmVfZW0nO1xuaW1wb3J0IHtldmFsdWF0ZVZhcmlhYmxlT2Zmc2V0fSBmcm9tICcuLi9zeW1ib2wvc3ltYm9sX2xheW91dCc7XG5cbmltcG9ydCB7XG4gICAgc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMsXG4gICAgc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyxcbiAgICBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL3N5bWJvbF9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQsIHtTeW1ib2xCdWZmZXJzfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0JztcbmltcG9ydCB0eXBlIFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3VuaWZvcm1fYmluZGluZyc7XG5pbXBvcnQgdHlwZSB7U3ltYm9sU0RGVW5pZm9ybXNUeXBlfSBmcm9tICcuLi9yZW5kZXIvcHJvZ3JhbS9zeW1ib2xfcHJvZ3JhbSc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NUaWxlSUQsIFZhcmlhYmxlT2Zmc2V0fSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50JztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd1N5bWJvbHM7XG5cbnR5cGUgU3ltYm9sVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yLFxuICAgIHNvcnRLZXk6IG51bWJlcixcbiAgICBzdGF0ZToge1xuICAgICAgICBwcm9ncmFtOiBhbnksXG4gICAgICAgIGJ1ZmZlcnM6IFN5bWJvbEJ1ZmZlcnMsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXM6IGFueSxcbiAgICAgICAgYXRsYXNUZXh0dXJlOiBUZXh0dXJlLFxuICAgICAgICBhdGxhc1RleHR1cmVJY29uOiBUZXh0dXJlIHwgbnVsbCxcbiAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uOiBhbnksXG4gICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbkljb246IGFueSxcbiAgICAgICAgaXNTREY6IGJvb2xlYW4sXG4gICAgICAgIGhhc0hhbG86IGJvb2xlYW5cbiAgICB9XG59O1xuXG5mdW5jdGlvbiBkcmF3U3ltYm9scyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCB2YXJpYWJsZU9mZnNldHM6IHtbXzogQ3Jvc3NUaWxlSURdOiBWYXJpYWJsZU9mZnNldH0pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBzdGVuY2lsIHRlc3Qgc28gdGhhdCBsYWJlbHMgYXJlbid0IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLlxuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgY29uc3QgdmFyaWFibGVQbGFjZW1lbnQgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXZhcmlhYmxlLWFuY2hvcicpO1xuXG4gICAgLy9Db21wdXRlIHZhcmlhYmxlLW9mZnNldHMgYmVmb3JlIHBhaW50aW5nIHNpbmNlIGljb25zIGFuZCB0ZXh0IGRhdGEgcG9zaXRpb25pbmdcbiAgICAvL2RlcGVuZCBvbiBlYWNoIG90aGVyIGluIHRoaXMgY2FzZS5cbiAgICBpZiAodmFyaWFibGVQbGFjZW1lbnQpIHtcbiAgICAgICAgdXBkYXRlVmFyaWFibGVBbmNob3JzKGNvb3JkcywgcGFpbnRlciwgbGF5ZXIsIHNvdXJjZUNhY2hlLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JyksXG4gICAgICAgICAgICB2YXJpYWJsZU9mZnNldHNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdpY29uLW9wYWNpdHknKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGZhbHNlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXBpdGNoLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1rZWVwLXVwcmlnaHQnKSxcbiAgICAgICAgICAgIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LW9wYWNpdHknKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIHRydWUsXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3RleHQtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3RleHQtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LWtlZXAtdXByaWdodCcpLFxuICAgICAgICAgICAgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VDYWNoZS5tYXAuc2hvd0NvbGxpc2lvbkJveGVzKSB7XG4gICAgICAgIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgbGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LXRyYW5zbGF0ZS1hbmNob3InKSwgdHJ1ZSk7XG4gICAgICAgIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZS1hbmNob3InKSwgZmFsc2UpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlVmFyaWFibGVSZW5kZXJTaGlmdChhbmNob3IsIHdpZHRoLCBoZWlnaHQsIHRleHRPZmZzZXQsIHRleHRCb3hTY2FsZSwgcmVuZGVyVGV4dFNpemUpOiBQb2ludCB7XG4gICAgY29uc3Qge2hvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbn0gPSBnZXRBbmNob3JBbGlnbm1lbnQoYW5jaG9yKTtcbiAgICBjb25zdCBzaGlmdFggPSAtKGhvcml6b250YWxBbGlnbiAtIDAuNSkgKiB3aWR0aDtcbiAgICBjb25zdCBzaGlmdFkgPSAtKHZlcnRpY2FsQWxpZ24gLSAwLjUpICogaGVpZ2h0O1xuICAgIGNvbnN0IHZhcmlhYmxlT2Zmc2V0ID0gZXZhbHVhdGVWYXJpYWJsZU9mZnNldChhbmNob3IsIHRleHRPZmZzZXQpO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIChzaGlmdFggLyB0ZXh0Qm94U2NhbGUgKyB2YXJpYWJsZU9mZnNldFswXSkgKiByZW5kZXJUZXh0U2l6ZSxcbiAgICAgICAgKHNoaWZ0WSAvIHRleHRCb3hTY2FsZSArIHZhcmlhYmxlT2Zmc2V0WzFdKSAqIHJlbmRlclRleHRTaXplXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmFyaWFibGVBbmNob3JzKGNvb3JkcywgcGFpbnRlciwgbGF5ZXIsIHNvdXJjZUNhY2hlLCByb3RhdGlvbkFsaWdubWVudCwgcGl0Y2hBbGlnbm1lbnQsIHZhcmlhYmxlT2Zmc2V0cykge1xuICAgIGNvbnN0IHRyID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3Qgcm90YXRlV2l0aE1hcCA9IHJvdGF0aW9uQWxpZ25tZW50ID09PSAnbWFwJztcbiAgICBjb25zdCBwaXRjaFdpdGhNYXAgPSBwaXRjaEFsaWdubWVudCA9PT0gJ21hcCc7XG5cbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogU3ltYm9sQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQgfHwgIWJ1Y2tldC50ZXh0IHx8ICFidWNrZXQudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHNpemVEYXRhID0gYnVja2V0LnRleHRTaXplRGF0YTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShzaXplRGF0YSwgdHIuem9vbSk7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxUb1RpbGVTY2FsZSA9IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICBjb25zdCBsYWJlbFBsYW5lTWF0cml4ID0gc3ltYm9sUHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCBwYWludGVyLnRyYW5zZm9ybSwgcGl4ZWxUb1RpbGVTY2FsZSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVRleHRGaXRJY29uID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZScgJiYgIGJ1Y2tldC5oYXNJY29uRGF0YSgpO1xuXG4gICAgICAgIGlmIChzaXplKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlU2NhbGUgPSBNYXRoLnBvdygyLCB0ci56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgdXBkYXRlVmFyaWFibGVBbmNob3JzRm9yQnVja2V0KGJ1Y2tldCwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB2YXJpYWJsZU9mZnNldHMsIHN5bWJvbFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIsIGxhYmVsUGxhbmVNYXRyaXgsIGNvb3JkLnBvc01hdHJpeCwgdGlsZVNjYWxlLCBzaXplLCB1cGRhdGVUZXh0Rml0SWNvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZhcmlhYmxlQW5jaG9yc0ZvckJ1Y2tldChidWNrZXQsIHJvdGF0ZVdpdGhNYXAsIHBpdGNoV2l0aE1hcCwgdmFyaWFibGVPZmZzZXRzLCBzeW1ib2xTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwgbGFiZWxQbGFuZU1hdHJpeCwgcG9zTWF0cml4LCB0aWxlU2NhbGUsIHNpemUsIHVwZGF0ZVRleHRGaXRJY29uKSB7XG4gICAgY29uc3QgcGxhY2VkU3ltYm9scyA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5O1xuICAgIGNvbnN0IGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXkgPSBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgY29uc3QgZHluYW1pY0ljb25MYXlvdXRWZXJ0ZXhBcnJheSA9IGJ1Y2tldC5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICBjb25zdCBwbGFjZWRUZXh0U2hpZnRzID0ge307XG5cbiAgICBkeW5hbWljVGV4dExheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwbGFjZWRTeW1ib2xzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gcGxhY2VkU3ltYm9scy5nZXQocyk7XG4gICAgICAgIGNvbnN0IHNraXBPcmllbnRhdGlvbiA9IGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICFzeW1ib2wucGxhY2VkT3JpZW50YXRpb247XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlT2Zmc2V0ID0gKCFzeW1ib2wuaGlkZGVuICYmIHN5bWJvbC5jcm9zc1RpbGVJRCAmJiAhc2tpcE9yaWVudGF0aW9uKSA/IHZhcmlhYmxlT2Zmc2V0c1tzeW1ib2wuY3Jvc3NUaWxlSURdIDogbnVsbDtcblxuICAgICAgICBpZiAoIXZhcmlhYmxlT2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyBUaGVzZSBzeW1ib2xzIGFyZSBmcm9tIGEganVzdGlmaWNhdGlvbiB0aGF0IGlzIG5vdCBiZWluZyB1c2VkLCBvciBhIGxhYmVsIHRoYXQgd2Fzbid0IHBsYWNlZFxuICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgZXh0cmEgbWF0aCB0byBmaWd1cmUgb3V0IHdoYXQgaW5jcmVtZW50YWwgc2hpZnQgdG8gYXBwbHkuXG4gICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY1RleHRMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH0gZWxzZSAge1xuICAgICAgICAgICAgY29uc3QgdGlsZUFuY2hvciA9IG5ldyBQb2ludChzeW1ib2wuYW5jaG9yWCwgc3ltYm9sLmFuY2hvclkpO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkQW5jaG9yID0gc3ltYm9sUHJvamVjdGlvbi5wcm9qZWN0KHRpbGVBbmNob3IsIHBpdGNoV2l0aE1hcCA/IHBvc01hdHJpeCA6IGxhYmVsUGxhbmVNYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgcGVyc3BlY3RpdmVSYXRpbyA9IHN5bWJvbFByb2plY3Rpb24uZ2V0UGVyc3BlY3RpdmVSYXRpbyh0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSwgcHJvamVjdGVkQW5jaG9yLnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSk7XG4gICAgICAgICAgICBsZXQgcmVuZGVyVGV4dFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoYnVja2V0LnRleHRTaXplRGF0YSwgc2l6ZSwgc3ltYm9sKSAqIHBlcnNwZWN0aXZlUmF0aW8gLyBPTkVfRU07XG4gICAgICAgICAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgICAgICAgICAgLy8gR28gZnJvbSBzaXplIGluIHBpeGVscyB0byBlcXVpdmFsZW50IHNpemUgaW4gdGlsZSB1bml0c1xuICAgICAgICAgICAgICAgIHJlbmRlclRleHRTaXplICo9IGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyAvIHRpbGVTY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGFuY2hvciwgdGV4dE9mZnNldCwgdGV4dEJveFNjYWxlfSA9IHZhcmlhYmxlT2Zmc2V0O1xuXG4gICAgICAgICAgICBjb25zdCBzaGlmdCA9IGNhbGN1bGF0ZVZhcmlhYmxlUmVuZGVyU2hpZnQoXG4gICAgICAgICAgICAgICAgYW5jaG9yLCB3aWR0aCwgaGVpZ2h0LCB0ZXh0T2Zmc2V0LCB0ZXh0Qm94U2NhbGUsIHJlbmRlclRleHRTaXplKTtcblxuICAgICAgICAgICAgLy8gVXN1YWwgY2FzZSBpcyB0aGF0IHdlIHRha2UgdGhlIHByb2plY3RlZCBhbmNob3IgYW5kIGFkZCB0aGUgcGl4ZWwtYmFzZWQgc2hpZnRcbiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZWQgYWJvdmUuIEluIHRoZSAoc29tZXdoYXQgd2VpcmQpIGNhc2Ugb2YgcGl0Y2gtYWxpZ25lZCB0ZXh0LCB3ZSBhZGQgYW4gZXF1aXZhbGVudFxuICAgICAgICAgICAgLy8gdGlsZS11bml0IGJhc2VkIHNoaWZ0IHRvIHRoZSBhbmNob3IgYmVmb3JlIHByb2plY3RpbmcgdG8gdGhlIGxhYmVsIHBsYW5lLlxuICAgICAgICAgICAgY29uc3Qgc2hpZnRlZEFuY2hvciA9IHBpdGNoV2l0aE1hcCA/XG4gICAgICAgICAgICAgICAgc3ltYm9sUHJvamVjdGlvbi5wcm9qZWN0KHRpbGVBbmNob3IuYWRkKHNoaWZ0KSwgbGFiZWxQbGFuZU1hdHJpeCkucG9pbnQgOlxuICAgICAgICAgICAgICAgIHByb2plY3RlZEFuY2hvci5wb2ludC5hZGQocm90YXRlV2l0aE1hcCA/XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0LnJvdGF0ZSgtdHJhbnNmb3JtLmFuZ2xlKSA6XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0KTtcblxuICAgICAgICAgICAgY29uc3QgYW5nbGUgPSAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc3ltYm9sLnBsYWNlZE9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkgPyBNYXRoLlBJIC8gMiA6IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBnID0gMDsgZyA8IHN5bWJvbC5udW1HbHlwaHM7IGcrKykge1xuICAgICAgICAgICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXksIHNoaWZ0ZWRBbmNob3IsIGFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vT25seSBvZmZzZXQgaG9yaXpvbnRhbCB0ZXh0IGljb25zXG4gICAgICAgICAgICBpZiAodXBkYXRlVGV4dEZpdEljb24gJiYgc3ltYm9sLmFzc29jaWF0ZWRJY29uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHBsYWNlZFRleHRTaGlmdHNbc3ltYm9sLmFzc29jaWF0ZWRJY29uSW5kZXhdID0ge3NoaWZ0ZWRBbmNob3IsIGFuZ2xlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1cGRhdGVUZXh0Rml0SWNvbikge1xuICAgICAgICBkeW5hbWljSWNvbkxheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG4gICAgICAgIGNvbnN0IHBsYWNlZEljb25zID0gYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VkSWNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZEljb24gPSBwbGFjZWRJY29ucy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAocGxhY2VkSWNvbi5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMocGxhY2VkSWNvbi5udW1HbHlwaHMsIGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGlmdCA9IHBsYWNlZFRleHRTaGlmdHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMocGxhY2VkSWNvbi5udW1HbHlwaHMsIGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgcGxhY2VkSWNvbi5udW1HbHlwaHM7IGcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0ljb25MYXlvdXRWZXJ0ZXhBcnJheSwgc2hpZnQuc2hpZnRlZEFuY2hvciwgc2hpZnQuYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Y2tldC5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShkeW5hbWljSWNvbkxheW91dFZlcnRleEFycmF5KTtcbiAgICB9XG4gICAgYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXkpO1xufVxuXG5mdW5jdGlvbiBnZXRTeW1ib2xQcm9ncmFtTmFtZShpc1NERjogYm9vbGVhbiwgaXNUZXh0OiBib29sZWFuLCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCkge1xuICAgIGlmIChidWNrZXQuaWNvbnNJblRleHQgJiYgaXNUZXh0KSB7XG4gICAgICAgIHJldHVybiAnc3ltYm9sVGV4dEFuZEljb24nO1xuICAgIH0gZWxzZSBpZiAoaXNTREYpIHtcbiAgICAgICAgcmV0dXJuICdzeW1ib2xTREYnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnc3ltYm9sSWNvbic7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3TGF5ZXJTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBpc1RleHQsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFsaWdubWVudCwgcGl0Y2hBbGlnbm1lbnQsIGtlZXBVcHJpZ2h0LCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgY29uc3Qgcm90YXRlV2l0aE1hcCA9IHJvdGF0aW9uQWxpZ25tZW50ID09PSAnbWFwJztcbiAgICBjb25zdCBwaXRjaFdpdGhNYXAgPSBwaXRjaEFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgYWxvbmdMaW5lID0gcm90YXRlV2l0aE1hcCAmJiBsYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCc7XG4gICAgLy8gTGluZSBsYWJlbCByb3RhdGlvbiBoYXBwZW5zIGluIGB1cGRhdGVMaW5lTGFiZWxzYFxuICAgIC8vIFBpdGNoZWQgcG9pbnQgbGFiZWxzIGFyZSBhdXRvbWF0aWNhbGx5IHJvdGF0ZWQgYnkgdGhlIGxhYmVsUGxhbmVNYXRyaXggcHJvamVjdGlvblxuICAgIC8vIFVucGl0Y2hlZCBwb2ludCBsYWJlbHMgbmVlZCB0byBoYXZlIHRoZWlyIHJvdGF0aW9uIGFwcGxpZWQgYWZ0ZXIgcHJvamVjdGlvblxuICAgIGNvbnN0IHJvdGF0ZUluU2hhZGVyID0gcm90YXRlV2l0aE1hcCAmJiAhcGl0Y2hXaXRoTWFwICYmICFhbG9uZ0xpbmU7XG5cbiAgICBjb25zdCBzb3J0RmVhdHVyZXNCeUtleSA9IGxheWVyLmxheW91dC5nZXQoJ3N5bWJvbC1zb3J0LWtleScpLmNvbnN0YW50T3IoMSkgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcblxuICAgIGNvbnN0IHZhcmlhYmxlUGxhY2VtZW50ID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC12YXJpYWJsZS1hbmNob3InKTtcblxuICAgIGNvbnN0IHRpbGVSZW5kZXJTdGF0ZTogQXJyYXk8U3ltYm9sVGlsZVJlbmRlclN0YXRlPiA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0IDogYnVja2V0Lmljb247XG4gICAgICAgIGlmICghYnVmZmVycyB8fCAhYnVmZmVycy5zZWdtZW50cy5nZXQoKS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1ZmZlcnMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG5cbiAgICAgICAgY29uc3QgaXNTREYgPSBpc1RleHQgfHwgYnVja2V0LnNkZkljb25zO1xuXG4gICAgICAgIGNvbnN0IHNpemVEYXRhID0gaXNUZXh0ID8gYnVja2V0LnRleHRTaXplRGF0YSA6IGJ1Y2tldC5pY29uU2l6ZURhdGE7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gcGl0Y2hXaXRoTWFwIHx8IHRyLnBpdGNoICE9PSAwO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oZ2V0U3ltYm9sUHJvZ3JhbU5hbWUoaXNTREYsIGlzVGV4dCwgYnVja2V0KSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBzaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCB0ci56b29tKTtcblxuICAgICAgICBsZXQgdGV4U2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgbGV0IHRleFNpemVJY29uOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgICBsZXQgYXRsYXNUZXh0dXJlO1xuICAgICAgICBsZXQgYXRsYXNJbnRlcnBvbGF0aW9uO1xuICAgICAgICBsZXQgYXRsYXNUZXh0dXJlSWNvbiA9IG51bGw7XG4gICAgICAgIGxldCBhdGxhc0ludGVycG9sYXRpb25JY29uO1xuICAgICAgICBpZiAoaXNUZXh0KSB7XG4gICAgICAgICAgICBhdGxhc1RleHR1cmUgPSB0aWxlLmdseXBoQXRsYXNUZXh0dXJlO1xuICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uID0gZ2wuTElORUFSO1xuICAgICAgICAgICAgdGV4U2l6ZSA9IHRpbGUuZ2x5cGhBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgICAgIGlmIChidWNrZXQuaWNvbnNJblRleHQpIHtcbiAgICAgICAgICAgICAgICB0ZXhTaXplSWNvbiA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgICAgICAgICBhdGxhc1RleHR1cmVJY29uID0gdGlsZS5pbWFnZUF0bGFzVGV4dHVyZTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tRGVwZW5kZW50U2l6ZSA9IHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnIHx8IHNpemVEYXRhLmtpbmQgPT09ICdjYW1lcmEnO1xuICAgICAgICAgICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbkljb24gPSB0cmFuc2Zvcm1lZCB8fCBwYWludGVyLm9wdGlvbnMucm90YXRpbmcgfHwgcGFpbnRlci5vcHRpb25zLnpvb21pbmcgfHwgem9vbURlcGVuZGVudFNpemUgPyBnbC5MSU5FQVIgOiBnbC5ORUFSRVNUO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWNvblNjYWxlZCA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tc2l6ZScpLmNvbnN0YW50T3IoMCkgIT09IDEgfHwgYnVja2V0Lmljb25zTmVlZExpbmVhcjtcbiAgICAgICAgICAgIGF0bGFzVGV4dHVyZSA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmU7XG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb24gPSBpc1NERiB8fCBwYWludGVyLm9wdGlvbnMucm90YXRpbmcgfHwgcGFpbnRlci5vcHRpb25zLnpvb21pbmcgfHwgaWNvblNjYWxlZCB8fCB0cmFuc2Zvcm1lZCA/XG4gICAgICAgICAgICAgICAgZ2wuTElORUFSIDpcbiAgICAgICAgICAgICAgICBnbC5ORUFSRVNUO1xuICAgICAgICAgICAgdGV4U2l6ZSA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHMgPSBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZU1hdHJpeCA9IHN5bWJvbFByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeChjb29yZC5wb3NNYXRyaXgsIHBpdGNoV2l0aE1hcCwgcm90YXRlV2l0aE1hcCwgcGFpbnRlci50cmFuc2Zvcm0sIHMpO1xuICAgICAgICBjb25zdCBnbENvb3JkTWF0cml4ID0gc3ltYm9sUHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCBwYWludGVyLnRyYW5zZm9ybSwgcyk7XG5cbiAgICAgICAgY29uc3QgaGFzVmFyaWFibGVBbmNob3JzID0gdmFyaWFibGVQbGFjZW1lbnQgJiYgYnVja2V0Lmhhc1RleHREYXRhKCk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVRleHRGaXRJY29uID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZScgJiZcbiAgICAgICAgICAgIGhhc1ZhcmlhYmxlQW5jaG9ycyAmJlxuICAgICAgICAgICAgYnVja2V0Lmhhc0ljb25EYXRhKCk7XG5cbiAgICAgICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICAgICAgc3ltYm9sUHJvamVjdGlvbi51cGRhdGVMaW5lTGFiZWxzKGJ1Y2tldCwgY29vcmQucG9zTWF0cml4LCBwYWludGVyLCBpc1RleHQsIGxhYmVsUGxhbmVNYXRyaXgsIGdsQ29vcmRNYXRyaXgsIHBpdGNoV2l0aE1hcCwga2VlcFVwcmlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoY29vcmQucG9zTWF0cml4LCB0aWxlLCB0cmFuc2xhdGUsIHRyYW5zbGF0ZUFuY2hvciksXG4gICAgICAgICAgICB1TGFiZWxQbGFuZU1hdHJpeCA9IChhbG9uZ0xpbmUgfHwgKGlzVGV4dCAmJiB2YXJpYWJsZVBsYWNlbWVudCkgfHwgdXBkYXRlVGV4dEZpdEljb24pID8gaWRlbnRpdHlNYXQ0IDogbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgICAgIHVnbENvb3JkTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoZ2xDb29yZE1hdHJpeCwgdGlsZSwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGhhc0hhbG8gPSBpc1NERiAmJiBsYXllci5wYWludC5nZXQoaXNUZXh0ID8gJ3RleHQtaGFsby13aWR0aCcgOiAnaWNvbi1oYWxvLXdpZHRoJykuY29uc3RhbnRPcigxKSAhPT0gMDtcblxuICAgICAgICBsZXQgdW5pZm9ybVZhbHVlcztcbiAgICAgICAgaWYgKGlzU0RGKSB7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldC5pY29uc0luVGV4dCkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBzeW1ib2xTREZVbmlmb3JtVmFsdWVzKHNpemVEYXRhLmtpbmQsXG4gICAgICAgICAgICAgICAgc2l6ZSwgcm90YXRlSW5TaGFkZXIsIHBpdGNoV2l0aE1hcCwgcGFpbnRlciwgbWF0cml4LFxuICAgICAgICAgICAgICAgIHVMYWJlbFBsYW5lTWF0cml4LCB1Z2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyA9IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybVZhbHVlcyhzaXplRGF0YS5raW5kLFxuICAgICAgICAgICAgICAgIHNpemUsIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCxcbiAgICAgICAgICAgICAgICB1TGFiZWxQbGFuZU1hdHJpeCwgdWdsQ29vcmRNYXRyaXgsIHRleFNpemUsIHRleFNpemVJY29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyhzaXplRGF0YS5raW5kLFxuICAgICAgICAgICAgICAgIHNpemUsIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCxcbiAgICAgICAgICAgICAgICB1TGFiZWxQbGFuZU1hdHJpeCwgdWdsQ29vcmRNYXRyaXgsIGlzVGV4dCwgdGV4U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgICBidWZmZXJzLFxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgICAgIGF0bGFzVGV4dHVyZSxcbiAgICAgICAgICAgIGF0bGFzVGV4dHVyZUljb24sXG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb24sXG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb25JY29uLFxuICAgICAgICAgICAgaXNTREYsXG4gICAgICAgICAgICBoYXNIYWxvXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgICAgICBjb25zdCBvbGRTZWdtZW50cyA9IGJ1ZmZlcnMuc2VnbWVudHMuZ2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygb2xkU2VnbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0aWxlUmVuZGVyU3RhdGUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzOiBuZXcgU2VnbWVudFZlY3Rvcihbc2VnbWVudF0pLFxuICAgICAgICAgICAgICAgICAgICBzb3J0S2V5OiAoKHNlZ21lbnQuc29ydEtleTogYW55KTogbnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGVSZW5kZXJTdGF0ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWdtZW50czogYnVmZmVycy5zZWdtZW50cyxcbiAgICAgICAgICAgICAgICBzb3J0S2V5OiAwLFxuICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzb3J0RmVhdHVyZXNCeUtleSkge1xuICAgICAgICB0aWxlUmVuZGVyU3RhdGUuc29ydCgoYSwgYikgPT4gYS5zb3J0S2V5IC0gYi5zb3J0S2V5KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnRTdGF0ZSBvZiB0aWxlUmVuZGVyU3RhdGUpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzZWdtZW50U3RhdGUuc3RhdGU7XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgIHN0YXRlLmF0bGFzVGV4dHVyZS5iaW5kKHN0YXRlLmF0bGFzSW50ZXJwb2xhdGlvbiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGlmIChzdGF0ZS5hdGxhc1RleHR1cmVJY29uKSB7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hdGxhc1RleHR1cmVJY29uKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuYXRsYXNUZXh0dXJlSWNvbi5iaW5kKHN0YXRlLmF0bGFzSW50ZXJwb2xhdGlvbkljb24sIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmlzU0RGKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gKChzdGF0ZS51bmlmb3JtVmFsdWVzOiBhbnkpOiBVbmlmb3JtVmFsdWVzPFN5bWJvbFNERlVuaWZvcm1zVHlwZT4pO1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhc0hhbG8pIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzWyd1X2lzX2hhbG8nXSA9IDE7XG4gICAgICAgICAgICAgICAgZHJhd1N5bWJvbEVsZW1lbnRzKHN0YXRlLmJ1ZmZlcnMsIHNlZ21lbnRTdGF0ZS5zZWdtZW50cywgbGF5ZXIsIHBhaW50ZXIsIHN0YXRlLnByb2dyYW0sIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgdW5pZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzWyd1X2lzX2hhbG8nXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZHJhd1N5bWJvbEVsZW1lbnRzKHN0YXRlLmJ1ZmZlcnMsIHNlZ21lbnRTdGF0ZS5zZWdtZW50cywgbGF5ZXIsIHBhaW50ZXIsIHN0YXRlLnByb2dyYW0sIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgc3RhdGUudW5pZm9ybVZhbHVlcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3U3ltYm9sRWxlbWVudHMoYnVmZmVycywgc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBwcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHVuaWZvcm1WYWx1ZXMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICBidWZmZXJzLmluZGV4QnVmZmVyLCBzZWdtZW50cywgbGF5ZXIucGFpbnQsXG4gICAgICAgIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIGJ1ZmZlcnMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCksXG4gICAgICAgIGJ1ZmZlcnMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlciwgYnVmZmVycy5vcGFjaXR5VmVydGV4QnVmZmVyKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtJztcbmltcG9ydCB7Y2lyY2xlVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL2NpcmNsZV9wcm9ncmFtJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBDaXJjbGVTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbic7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlcic7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nJztcbmltcG9ydCB0eXBlIHtDaXJjbGVVbmlmb3Jtc1R5cGV9IGZyb20gJy4vcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbSc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdDaXJjbGVzO1xuXG50eXBlIFRpbGVSZW5kZXJTdGF0ZSA9IHtcbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbjogUHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgcHJvZ3JhbTogUHJvZ3JhbTwqPixcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcixcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXIsXG4gICAgdW5pZm9ybVZhbHVlczogVW5pZm9ybVZhbHVlczxDaXJjbGVVbmlmb3Jtc1R5cGU+XG59O1xuXG50eXBlIFNlZ21lbnRzVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yLFxuICAgIHNvcnRLZXk6IG51bWJlcixcbiAgICBzdGF0ZTogVGlsZVJlbmRlclN0YXRlXG59O1xuXG5mdW5jdGlvbiBkcmF3Q2lyY2xlcyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBDaXJjbGVTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnY2lyY2xlLW9wYWNpdHknKTtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXN0cm9rZS13aWR0aCcpO1xuICAgIGNvbnN0IHN0cm9rZU9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utb3BhY2l0eScpO1xuICAgIGNvbnN0IHNvcnRGZWF0dXJlc0J5S2V5ID0gbGF5ZXIubGF5b3V0LmdldCgnY2lyY2xlLXNvcnQta2V5JykuY29uc3RhbnRPcigxKSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKG9wYWNpdHkuY29uc3RhbnRPcigxKSA9PT0gMCAmJiAoc3Ryb2tlV2lkdGguY29uc3RhbnRPcigxKSA9PT0gMCB8fCBzdHJva2VPcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICAvLyBUdXJuIG9mZiBzdGVuY2lsIHRlc3RpbmcgdG8gYWxsb3cgY2lyY2xlcyB0byBiZSBkcmF3biBhY3Jvc3MgYm91bmRhcmllcyxcbiAgICAvLyBzbyB0aGF0IGxhcmdlIGNpcmNsZXMgYXJlIG5vdCBjbGlwcGVkIHRvIHRpbGVzXG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGNvbnN0IHNlZ21lbnRzUmVuZGVyU3RhdGVzOiBBcnJheTxTZWdtZW50c1RpbGVSZW5kZXJTdGF0ZT4gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiA/Q2lyY2xlQnVja2V0PCo+ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjaXJjbGUnLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGxheW91dFZlcnRleEJ1ZmZlciA9IGJ1Y2tldC5sYXlvdXRWZXJ0ZXhCdWZmZXI7XG4gICAgICAgIGNvbnN0IGluZGV4QnVmZmVyID0gYnVja2V0LmluZGV4QnVmZmVyO1xuICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gY2lyY2xlVW5pZm9ybVZhbHVlcyhwYWludGVyLCBjb29yZCwgdGlsZSwgbGF5ZXIpO1xuXG4gICAgICAgIGNvbnN0IHN0YXRlOiBUaWxlUmVuZGVyU3RhdGUgPSB7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICBpbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgICAgICBjb25zdCBvbGRTZWdtZW50cyA9IGJ1Y2tldC5zZWdtZW50cy5nZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBvbGRTZWdtZW50cykge1xuICAgICAgICAgICAgICAgIHNlZ21lbnRzUmVuZGVyU3RhdGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZWdtZW50czogbmV3IFNlZ21lbnRWZWN0b3IoW3NlZ21lbnRdKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydEtleTogKChzZWdtZW50LnNvcnRLZXk6IGFueSk6IG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWdtZW50c1JlbmRlclN0YXRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWdtZW50czogYnVja2V0LnNlZ21lbnRzLFxuICAgICAgICAgICAgICAgIHNvcnRLZXk6IDAsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAoc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgc2VnbWVudHNSZW5kZXJTdGF0ZXMuc29ydCgoYSwgYikgPT4gYS5zb3J0S2V5IC0gYi5zb3J0S2V5KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnRzU3RhdGUgb2Ygc2VnbWVudHNSZW5kZXJTdGF0ZXMpIHtcbiAgICAgICAgY29uc3Qge3Byb2dyYW1Db25maWd1cmF0aW9uLCBwcm9ncmFtLCBsYXlvdXRWZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCB1bmlmb3JtVmFsdWVzfSA9IHNlZ21lbnRzU3RhdGUuc3RhdGU7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gc2VnbWVudHNTdGF0ZS5zZWdtZW50cztcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLFxuICAgICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlciwgc2VnbWVudHMsXG4gICAgICAgICAgICBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7XG4gICAgaGVhdG1hcFVuaWZvcm1WYWx1ZXMsXG4gICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0nO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUgSGVhdG1hcEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldCc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3SGVhdG1hcDtcblxuZnVuY3Rpb24gZHJhd0hlYXRtYXAocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogSGVhdG1hcFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLW9wYWNpdHknKSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIC8vIEFsbG93IGtlcm5lbHMgdG8gYmUgZHJhd24gYWNyb3NzIGJvdW5kYXJpZXMsIHNvIHRoYXRcbiAgICAgICAgLy8gbGFyZ2Uga2VybmVscyBhcmUgbm90IGNsaXBwZWQgdG8gdGlsZXNcbiAgICAgICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICAgICAgLy8gVHVybiBvbiBhZGRpdGl2ZSBibGVuZGluZyBmb3Iga2VybmVscywgd2hpY2ggaXMgYSBrZXkgYXNwZWN0IG9mIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRpb24gZm9ybXVsYVxuICAgICAgICBjb25zdCBjb2xvck1vZGUgPSBuZXcgQ29sb3JNb2RlKFtnbC5PTkUsIGdsLk9ORV0sIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuXG4gICAgICAgIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllcik7XG5cbiAgICAgICAgY29udGV4dC5jbGVhcih7Y29sb3I6IENvbG9yLnRyYW5zcGFyZW50fSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRpbGVzIHRoYXQgaGF2ZSB1bmNvdmVyZWQgcGFyZW50cyB0byBhdm9pZCBmbGlja2VyaW5nOyB3ZSBkb24ndCBuZWVkXG4gICAgICAgICAgICAvLyB0byB1c2UgY29tcGxleCB0aWxlIG1hc2tpbmcgaGVyZSBiZWNhdXNlIHRoZSBjaGFuZ2UgYmV0d2VlbiB6b29tIGxldmVscyBpcyBzdWJ0bGUsXG4gICAgICAgICAgICAvLyBzbyBpdCdzIGZpbmUgdG8gc2ltcGx5IHJlbmRlciB0aGUgcGFyZW50IHVudGlsIGFsbCBpdHMgNCBjaGlsZHJlbiBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUuaGFzUmVuZGVyYWJsZVBhcmVudChjb29yZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQ6ID9IZWF0bWFwQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdoZWF0bWFwJywgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICAgICAgY29uc3Qge3pvb219ID0gcGFpbnRlci50cmFuc2Zvcm07XG5cbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIERlcHRoTW9kZS5kaXNhYmxlZCwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIGhlYXRtYXBVbmlmb3JtVmFsdWVzKGNvb3JkLnBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgdGlsZSwgem9vbSwgbGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLWludGVuc2l0eScpKSxcbiAgICAgICAgICAgICAgICBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5zZWdtZW50cywgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sXG4gICAgICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0XSk7XG5cbiAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuICAgICAgICBwYWludGVyLmNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgcmVuZGVyVGV4dHVyZVRvTWFwKHBhaW50ZXIsIGxheWVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllcikge1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcblxuICAgIC8vIFVzZSBhIDR4IGRvd25zY2FsZWQgc2NyZWVuIHRleHR1cmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0XSk7XG5cbiAgICBsZXQgZmJvID0gbGF5ZXIuaGVhdG1hcEZibztcblxuICAgIGlmICghZmJvKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgICBmYm8gPSBsYXllci5oZWF0bWFwRmJvID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcihwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0LCBmYWxzZSk7XG5cbiAgICAgICAgYmluZFRleHR1cmVUb0ZyYW1lYnVmZmVyKGNvbnRleHQsIHBhaW50ZXIsIHRleHR1cmUsIGZibyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmYm8uY29sb3JBdHRhY2htZW50LmdldCgpKTtcbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KGZiby5mcmFtZWJ1ZmZlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvKSB7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIC8vIFVzZSB0aGUgaGlnaGVyIHByZWNpc2lvbiBoYWxmLWZsb2F0IHRleHR1cmUgd2hlcmUgYXZhaWxhYmxlIChwcm9kdWNpbmcgbXVjaCBzbW9vdGhlciBsb29raW5nIGhlYXRtYXBzKTtcbiAgICAvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBhIGxvdyBwcmVjaXNpb24gdGV4dHVyZVxuICAgIGNvbnN0IGludGVybmFsRm9ybWF0ID0gY29udGV4dC5leHRSZW5kZXJUb1RleHR1cmVIYWxmRmxvYXQgPyBjb250ZXh0LmV4dFRleHR1cmVIYWxmRmxvYXQuSEFMRl9GTE9BVF9PRVMgOiBnbC5VTlNJR05FRF9CWVRFO1xuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgcGFpbnRlci53aWR0aCAvIDQsIHBhaW50ZXIuaGVpZ2h0IC8gNCwgMCwgZ2wuUkdCQSwgaW50ZXJuYWxGb3JtYXQsIG51bGwpO1xuICAgIGZiby5jb2xvckF0dGFjaG1lbnQuc2V0KHRleHR1cmUpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUZXh0dXJlVG9NYXAocGFpbnRlciwgbGF5ZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIC8vIEhlcmUgd2UgYmluZCB0d28gZGlmZmVyZW50IHRleHR1cmVzIGZyb20gd2hpY2ggd2UnbGwgc2FtcGxlIGluIGRyYXdpbmdcbiAgICAvLyBoZWF0bWFwczogdGhlIGtlcm5lbCB0ZXh0dXJlLCBwcmVwYXJlZCBpbiB0aGUgb2Zmc2NyZWVuIHBhc3MsIGFuZCBhXG4gICAgLy8gY29sb3IgcmFtcCB0ZXh0dXJlLlxuICAgIGNvbnN0IGZibyA9IGxheWVyLmhlYXRtYXBGYm87XG4gICAgaWYgKCFmYm8pIHJldHVybjtcbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmYm8uY29sb3JBdHRhY2htZW50LmdldCgpKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuICAgIGxldCBjb2xvclJhbXBUZXh0dXJlID0gbGF5ZXIuY29sb3JSYW1wVGV4dHVyZTtcbiAgICBpZiAoIWNvbG9yUmFtcFRleHR1cmUpIHtcbiAgICAgICAgY29sb3JSYW1wVGV4dHVyZSA9IGxheWVyLmNvbG9yUmFtcFRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBsYXllci5jb2xvclJhbXAsIGdsLlJHQkEpO1xuICAgIH1cbiAgICBjb2xvclJhbXBUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgIHBhaW50ZXIudXNlUHJvZ3JhbSgnaGVhdG1hcFRleHR1cmUnKS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUyxcbiAgICAgICAgRGVwdGhNb2RlLmRpc2FibGVkLCBTdGVuY2lsTW9kZS5kaXNhYmxlZCwgcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIGxheWVyLCAwLCAxKSxcbiAgICAgICAgbGF5ZXIuaWQsIHBhaW50ZXIudmlld3BvcnRCdWZmZXIsIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsXG4gICAgICAgIHBhaW50ZXIudmlld3BvcnRTZWdtZW50cywgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCB7XG4gICAgbGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzLFxuICAgIGxpbmVTREZVbmlmb3JtVmFsdWVzLFxuICAgIGxpbmVHcmFkaWVudFVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2xpbmVfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgTGluZVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllcic7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0JztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQge2NsYW1wLCBuZXh0UG93ZXJPZlR3b30gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7cmVuZGVyQ29sb3JSYW1wfSBmcm9tICcuLi91dGlsL2NvbG9yX3JhbXAnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRyYXdMaW5lKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IExpbmVTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnbGluZS1vcGFjaXR5Jyk7XG4gICAgY29uc3Qgd2lkdGggPSBsYXllci5wYWludC5nZXQoJ2xpbmUtd2lkdGgnKTtcbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwIHx8IHdpZHRoLmNvbnN0YW50T3IoMSkgPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGNvbnN0IGRhc2hhcnJheSA9IGxheWVyLnBhaW50LmdldCgnbGluZS1kYXNoYXJyYXknKTtcbiAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtcGF0dGVybicpO1xuICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuXG4gICAgY29uc3QgZ3JhZGllbnQgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZ3JhZGllbnQnKTtcbiAgICBjb25zdCBjcm9zc2ZhZGUgPSBsYXllci5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtSWQgPVxuICAgICAgICBpbWFnZSA/ICdsaW5lUGF0dGVybicgOlxuICAgICAgICBkYXNoYXJyYXkgPyAnbGluZVNERicgOlxuICAgICAgICBncmFkaWVudCA/ICdsaW5lR3JhZGllbnQnIDogJ2xpbmUnO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBsZXQgZmlyc3RUaWxlID0gdHJ1ZTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcblxuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgYnVja2V0OiA/TGluZUJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgcHJldlByb2dyYW0gPSBwYWludGVyLmNvbnRleHQucHJvZ3JhbS5nZXQoKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtSWQsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNoYW5nZWQgPSBmaXJzdFRpbGUgfHwgcHJvZ3JhbS5wcm9ncmFtICE9PSBwcmV2UHJvZ3JhbTtcblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybiAmJiB0aWxlLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0bGFzID0gdGlsZS5pbWFnZUF0bGFzO1xuICAgICAgICAgICAgY29uc3QgcG9zVG8gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50by50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGNvbnN0IHBvc0Zyb20gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi5mcm9tLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgaWYgKHBvc1RvICYmIHBvc0Zyb20pIHByb2dyYW1Db25maWd1cmF0aW9uLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gaW1hZ2UgPyBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGNyb3NzZmFkZSkgOlxuICAgICAgICAgICAgZGFzaGFycmF5ID8gbGluZVNERlVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRhc2hhcnJheSwgY3Jvc3NmYWRlKSA6XG4gICAgICAgICAgICBncmFkaWVudCA/IGxpbmVHcmFkaWVudFVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGJ1Y2tldC5saW5lQ2xpcHNBcnJheS5sZW5ndGgpIDpcbiAgICAgICAgICAgIGxpbmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyKTtcblxuICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi51cGRhdGVQYWludEJ1ZmZlcnMoY3Jvc3NmYWRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXNoYXJyYXkgJiYgKHByb2dyYW1DaGFuZ2VkIHx8IHBhaW50ZXIubGluZUF0bGFzLmRpcnR5KSkge1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgICAgICBwYWludGVyLmxpbmVBdGxhcy5iaW5kKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKGdyYWRpZW50KSB7XG4gICAgICAgICAgICBjb25zdCBsYXllckdyYWRpZW50ID0gYnVja2V0LmdyYWRpZW50c1tsYXllci5pZF07XG4gICAgICAgICAgICBsZXQgZ3JhZGllbnRUZXh0dXJlID0gbGF5ZXJHcmFkaWVudC50ZXh0dXJlO1xuICAgICAgICAgICAgaWYgKGxheWVyLmdyYWRpZW50VmVyc2lvbiAhPT0gbGF5ZXJHcmFkaWVudC52ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmVSZXNvbHV0aW9uID0gMjU2O1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5zdGVwSW50ZXJwb2xhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlTWF4Wm9vbSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLm1heHpvb207XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvdGVudGlhbE92ZXJ6b29tID0gY29vcmQuY2Fub25pY2FsLnogPT09IHNvdXJjZU1heFpvb20gP1xuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKDEgPDwgKHBhaW50ZXIudHJhbnNmb3JtLm1heFpvb20gLSBjb29yZC5jYW5vbmljYWwueikpIDogMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IGJ1Y2tldC5tYXhMaW5lTGVuZ3RoIC8gRVhURU5UO1xuICAgICAgICAgICAgICAgICAgICAvLyBMb2dpY2FsIHBpeGVsIHRpbGUgc2l6ZSBpcyA1MTJweCwgYW5kIDEwMjRweCByaWdodCBiZWZvcmUgY3VycmVudCB6b29tICsgMVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhUaWxlUGl4ZWxTaXplID0gMTAyNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSBwb3NzaWJsZSB0ZXh0dXJlIGNvdmVyYWdlIGhldXJpc3RpYywgYm91bmQgYnkgaGFyZHdhcmUgbWF4IHRleHR1cmUgc2l6ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhUZXh0dXJlQ292ZXJhZ2UgPSBsaW5lTGVuZ3RoICogbWF4VGlsZVBpeGVsU2l6ZSAqIHBvdGVudGlhbE92ZXJ6b29tO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlUmVzb2x1dGlvbiA9IGNsYW1wKG5leHRQb3dlck9mVHdvKG1heFRleHR1cmVDb3ZlcmFnZSksIDI1NiwgY29udGV4dC5tYXhUZXh0dXJlU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxheWVyR3JhZGllbnQuZ3JhZGllbnQgPSByZW5kZXJDb2xvclJhbXAoe1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBsYXllci5ncmFkaWVudEV4cHJlc3Npb24oKSxcbiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbktleTogJ2xpbmVQcm9ncmVzcycsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb246IHRleHR1cmVSZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogbGF5ZXJHcmFkaWVudC5ncmFkaWVudCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGNsaXBzOiBidWNrZXQubGluZUNsaXBzQXJyYXlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXJHcmFkaWVudC50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyR3JhZGllbnQudGV4dHVyZS51cGRhdGUobGF5ZXJHcmFkaWVudC5ncmFkaWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJHcmFkaWVudC50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgbGF5ZXJHcmFkaWVudC5ncmFkaWVudCwgZ2wuUkdCQSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxheWVyR3JhZGllbnQudmVyc2lvbiA9IGxheWVyLmdyYWRpZW50VmVyc2lvbjtcbiAgICAgICAgICAgICAgICBncmFkaWVudFRleHR1cmUgPSBsYXllckdyYWRpZW50LnRleHR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIGdyYWRpZW50VGV4dHVyZS5iaW5kKGxheWVyLnN0ZXBJbnRlcnBvbGFudCA/IGdsLk5FQVJFU1QgOiBnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLFxuICAgICAgICAgICAgcGFpbnRlci5zdGVuY2lsTW9kZUZvckNsaXBwaW5nKGNvb3JkKSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsIHVuaWZvcm1WYWx1ZXMsXG4gICAgICAgICAgICBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLCBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgICAgICBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sIGJ1Y2tldC5sYXlvdXRWZXJ0ZXhCdWZmZXIyKTtcblxuICAgICAgICBmaXJzdFRpbGUgPSBmYWxzZTtcbiAgICAgICAgLy8gb25jZSByZWZhY3RvcmVkIHNvIHRoYXQgYm91bmQgdGV4dHVyZSBzdGF0ZSBpcyBtYW5hZ2VkLCB3ZSdsbCBhbHNvIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgZmlyc3RUaWxlL3Byb2dyYW1DaGFuZ2VkIGxvZ2ljXG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XG5pbXBvcnQge1xuICAgIGZpbGxVbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vZmlsbF9wcm9ncmFtJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZSc7XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIEZpbGxCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXQnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0ZpbGw7XG5cbmZ1bmN0aW9uIGRyYXdGaWxsKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEZpbGxTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtY29sb3InKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLW9wYWNpdHknKTtcblxuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgY29uc3QgcGF0dGVybiA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgcGFzcyA9IHBhaW50ZXIub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpICYmXG4gICAgICAgICghcGF0dGVybi5jb25zdGFudE9yKCgxOiBhbnkpKSAmJlxuICAgICAgICBjb2xvci5jb25zdGFudE9yKENvbG9yLnRyYW5zcGFyZW50KS5hID09PSAxICYmXG4gICAgICAgIG9wYWNpdHkuY29uc3RhbnRPcigwKSA9PT0gMSkgPyAnb3BhcXVlJyA6ICd0cmFuc2x1Y2VudCc7XG5cbiAgICAvLyBEcmF3IGZpbGxcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSBwYXNzKSB7XG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoXG4gICAgICAgICAgICAxLCBwYWludGVyLnJlbmRlclBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzdHJva2VcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnICYmIGxheWVyLnBhaW50LmdldCgnZmlsbC1hbnRpYWxpYXMnKSkge1xuXG4gICAgICAgIC8vIElmIHdlIGRlZmluZWQgYSBkaWZmZXJlbnQgY29sb3IgZm9yIHRoZSBmaWxsIG91dGxpbmUsIHdlIGFyZVxuICAgICAgICAvLyBnb2luZyB0byBpZ25vcmUgdGhlIGJpdHMgaW4gMHgwNyBhbmQganVzdCBjYXJlIGFib3V0IHRoZSBnbG9iYWxcbiAgICAgICAgLy8gY2xpcHBpbmcgbWFzay5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBvbmx5IHdhbnQgdG8gZHJhd0ZpbGwgdGhlIGFudGlhbGlhc2VkIHBhcnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICpvdXRzaWRlKiB0aGUgY3VycmVudCBzaGFwZS4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gY2FzZSB0aGUgZmlsbFxuICAgICAgICAvLyBvciBzdHJva2UgY29sb3IgaXMgdHJhbnNsdWNlbnQuIElmIHdlIHdvdWxkbid0IGNsaXAgdG8gb3V0c2lkZVxuICAgICAgICAvLyB0aGUgY3VycmVudCBzaGFwZSwgc29tZSBwaXhlbHMgZnJvbSB0aGUgb3V0bGluZSBzdHJva2Ugb3ZlcmxhcHBlZFxuICAgICAgICAvLyB0aGUgKG5vbi1hbnRpYWxpYXNlZCkgZmlsbC5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcihcbiAgICAgICAgICAgIGxheWVyLmdldFBhaW50UHJvcGVydHkoJ2ZpbGwtb3V0bGluZS1jb2xvcicpID8gMiA6IDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCB0cnVlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBpc091dGxpbmUpIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcblxuICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkgJiYgcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICBsZXQgZHJhd01vZGUsIHByb2dyYW1OYW1lLCB1bmlmb3JtVmFsdWVzLCBpbmRleEJ1ZmZlciwgc2VnbWVudHM7XG5cbiAgICBpZiAoIWlzT3V0bGluZSkge1xuICAgICAgICBwcm9ncmFtTmFtZSA9IGltYWdlID8gJ2ZpbGxQYXR0ZXJuJyA6ICdmaWxsJztcbiAgICAgICAgZHJhd01vZGUgPSBnbC5UUklBTkdMRVM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbU5hbWUgPSBpbWFnZSAmJiAhbGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPyAnZmlsbE91dGxpbmVQYXR0ZXJuJyA6ICdmaWxsT3V0bGluZSc7XG4gICAgICAgIGRyYXdNb2RlID0gZ2wuTElORVM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgYnVja2V0OiA/RmlsbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtTmFtZSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGFpbnRlci5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24udXBkYXRlUGFpbnRCdWZmZXJzKGNyb3NzZmFkZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybiAmJiB0aWxlLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0bGFzID0gdGlsZS5pbWFnZUF0bGFzO1xuICAgICAgICAgICAgY29uc3QgcG9zVG8gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50by50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGNvbnN0IHBvc0Zyb20gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi5mcm9tLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgaWYgKHBvc1RvICYmIHBvc0Zyb20pIHByb2dyYW1Db25maWd1cmF0aW9uLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aWxlTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoY29vcmQucG9zTWF0cml4LCB0aWxlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpLCBsYXllci5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlLWFuY2hvcicpKTtcblxuICAgICAgICBpZiAoIWlzT3V0bGluZSkge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIgPSBidWNrZXQuaW5kZXhCdWZmZXI7XG4gICAgICAgICAgICBzZWdtZW50cyA9IGJ1Y2tldC5zZWdtZW50cztcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XG4gICAgICAgICAgICAgICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIHBhaW50ZXIsIGNyb3NzZmFkZSwgdGlsZSkgOlxuICAgICAgICAgICAgICAgIGZpbGxVbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIgPSBidWNrZXQuaW5kZXhCdWZmZXIyO1xuICAgICAgICAgICAgc2VnbWVudHMgPSBidWNrZXQuc2VnbWVudHMyO1xuICAgICAgICAgICAgY29uc3QgZHJhd2luZ0J1ZmZlclNpemUgPSBbZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XTtcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSAocHJvZ3JhbU5hbWUgPT09ICdmaWxsT3V0bGluZVBhdHRlcm4nICYmIGltYWdlKSA/XG4gICAgICAgICAgICAgICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyh0aWxlTWF0cml4LCBwYWludGVyLCBjcm9zc2ZhZGUsIHRpbGUsIGRyYXdpbmdCdWZmZXJTaXplKSA6XG4gICAgICAgICAgICAgICAgZmlsbE91dGxpbmVVbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIGRyYXdpbmdCdWZmZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0uZHJhdyhwYWludGVyLmNvbnRleHQsIGRyYXdNb2RlLCBkZXB0aE1vZGUsXG4gICAgICAgICAgICBwYWludGVyLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoY29vcmQpLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCwgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgICAgIGxheWVyLmlkLCBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlciwgc2VnbWVudHMsXG4gICAgICAgICAgICBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xyXG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcclxuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlJztcclxuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XHJcbmltcG9ydCB7XHJcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyxcclxuICAgIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyxcclxufSBmcm9tICcuL3Byb2dyYW0vZmlsbF9leHRydXNpb25fcHJvZ3JhbSc7XHJcblxyXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XHJcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xyXG5pbXBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcic7XHJcbmltcG9ydCB0eXBlIEZpbGxFeHRydXNpb25CdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYnVja2V0JztcclxuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRyYXc7XHJcblxyXG5mdW5jdGlvbiBkcmF3KHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZTogU291cmNlQ2FjaGUsIGxheWVyOiBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xyXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tb3BhY2l0eScpO1xyXG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xyXG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IG5ldyBEZXB0aE1vZGUocGFpbnRlci5jb250ZXh0LmdsLkxFUVVBTCwgRGVwdGhNb2RlLlJlYWRXcml0ZSwgcGFpbnRlci5kZXB0aFJhbmdlRm9yM0QpO1xyXG5cclxuICAgICAgICBpZiAob3BhY2l0eSA9PT0gMSAmJiAhbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJykuY29uc3RhbnRPcigoMTogYW55KSkpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XHJcbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIERyYXcgdHJhbnNwYXJlbnQgYnVpbGRpbmdzIGluIHR3byBwYXNzZXMgc28gdGhhdCBvbmx5IHRoZSBjbG9zZXN0IHN1cmZhY2UgaXMgZHJhd24uXHJcbiAgICAgICAgICAgIC8vIEZpcnN0IGRyYXcgYWxsIHRoZSBleHRydXNpb25zIGludG8gb25seSB0aGUgZGVwdGggYnVmZmVyLiBObyBjb2xvcnMgYXJlIGRyYXduLlxyXG4gICAgICAgICAgICBkcmF3RXh0cnVzaW9uVGlsZXMocGFpbnRlciwgc291cmNlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsXHJcbiAgICAgICAgICAgICAgICBTdGVuY2lsTW9kZS5kaXNhYmxlZCxcclxuICAgICAgICAgICAgICAgIENvbG9yTW9kZS5kaXNhYmxlZCk7XHJcblxyXG4gICAgICAgICAgICAvLyBUaGVuIGRyYXcgYWxsIHRoZSBleHRydXNpb25zIGEgc2Vjb25kIHR5cGUsIG9ubHkgY29sb3JpbmcgZnJhZ21lbnRzIGlmIHRoZXkgaGF2ZSB0aGVcclxuICAgICAgICAgICAgLy8gc2FtZSBkZXB0aCB2YWx1ZSBhcyB0aGUgY2xvc2VzdCBmcmFnbWVudCBpbiB0aGUgcHJldmlvdXMgcGFzcy4gVXNlIHRoZSBzdGVuY2lsIGJ1ZmZlclxyXG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IHRoZSBzZWNvbmQgZHJhdyBpbiBjYXNlcyB3aGVyZSB3ZSBoYXZlIGNvaW5jaWRlbnQgcG9seWdvbnMuXHJcbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSxcclxuICAgICAgICAgICAgICAgIHBhaW50ZXIuc3RlbmNpbE1vZGVGb3IzRCgpLFxyXG4gICAgICAgICAgICAgICAgcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZHJhd0V4dHJ1c2lvblRpbGVzKHBhaW50ZXIsIHNvdXJjZSwgbGF5ZXIsIGNvb3JkcywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xyXG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xyXG4gICAgY29uc3QgcGF0dGVyblByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJyk7XHJcbiAgICBjb25zdCBpbWFnZSA9IHBhdHRlcm5Qcm9wZXJ0eS5jb25zdGFudE9yKCgxOiBhbnkpKTtcclxuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcclxuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLW9wYWNpdHknKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xyXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2UuZ2V0VGlsZShjb29yZCk7XHJcbiAgICAgICAgY29uc3QgYnVja2V0OiA/RmlsbEV4dHJ1c2lvbkJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XHJcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcclxuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKGltYWdlID8gJ2ZpbGxFeHRydXNpb25QYXR0ZXJuJyA6ICdmaWxsRXh0cnVzaW9uJywgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgICAgICBpZiAoaW1hZ2UpIHtcclxuICAgICAgICAgICAgcGFpbnRlci5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcclxuICAgICAgICAgICAgdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XHJcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLnVwZGF0ZVBhaW50QnVmZmVycyhjcm9zc2ZhZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcclxuICAgICAgICBpZiAoY29uc3RhbnRQYXR0ZXJuICYmIHRpbGUuaW1hZ2VBdGxhcykge1xyXG4gICAgICAgICAgICBjb25zdCBhdGxhcyA9IHRpbGUuaW1hZ2VBdGxhcztcclxuICAgICAgICAgICAgY29uc3QgcG9zVG8gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50by50b1N0cmluZygpXTtcclxuICAgICAgICAgICAgY29uc3QgcG9zRnJvbSA9IGF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLmZyb20udG9TdHJpbmcoKV07XHJcbiAgICAgICAgICAgIGlmIChwb3NUbyAmJiBwb3NGcm9tKSBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG8sIHBvc0Zyb20pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXHJcbiAgICAgICAgICAgIGNvb3JkLnBvc01hdHJpeCxcclxuICAgICAgICAgICAgdGlsZSxcclxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUnKSxcclxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yJykpO1xyXG5cclxuICAgICAgICBjb25zdCBzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudCcpO1xyXG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XHJcbiAgICAgICAgICAgIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHksIGNvb3JkLCBjcm9zc2ZhZGUsIHRpbGUpIDpcclxuICAgICAgICAgICAgZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMobWF0cml4LCBwYWludGVyLCBzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50LCBvcGFjaXR5KTtcclxuXHJcbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGNvbnRleHQuZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5iYWNrQ0NXLFxyXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLFxyXG4gICAgICAgICAgICBidWNrZXQuc2VnbWVudHMsIGxheWVyLnBhaW50LCBwYWludGVyLnRyYW5zZm9ybS56b29tLFxyXG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHtcbiAgICBoaWxsc2hhZGVVbmlmb3JtVmFsdWVzLFxuICAgIGhpbGxzaGFkZVVuaWZvcm1QcmVwYXJlVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9oaWxsc2hhZGVfcHJvZ3JhbSc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IHR5cGUgSGlsbHNoYWRlU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9oaWxsc2hhZGVfc3R5bGVfbGF5ZXInO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0hpbGxzaGFkZTtcblxuZnVuY3Rpb24gZHJhd0hpbGxzaGFkZShwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBIaWxsc2hhZGVTdHlsZUxheWVyLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09ICdvZmZzY3JlZW4nICYmIHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGNvbnN0IFtzdGVuY2lsTW9kZXMsIGNvb3Jkc10gPSBwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcgP1xuICAgICAgICBwYWludGVyLnN0ZW5jaWxDb25maWdGb3JPdmVybGFwKHRpbGVJRHMpIDogW3t9LCB0aWxlSURzXTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgaWYgKHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlICYmIHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgICAgIHByZXBhcmVIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnKSB7XG4gICAgICAgICAgICByZW5kZXJIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGVzW2Nvb3JkLm92ZXJzY2FsZWRaXSwgY29sb3JNb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodF0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IGZibyA9IHRpbGUuZmJvO1xuICAgIGlmICghZmJvKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdoaWxsc2hhZGUnKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuXG4gICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIpO1xuXG4gICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBwYWludGVyLnJhc3RlckJvdW5kc0J1ZmZlcixcbiAgICAgICAgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgcGFpbnRlci5yYXN0ZXJCb3VuZHNTZWdtZW50cyk7XG59XG5cbi8vIGhpbGxzaGFkZSByZW5kZXJpbmcgaXMgZG9uZSBpbiB0d28gc3RlcHMuIHRoZSBwcmVwYXJlIHN0ZXAgZmlyc3QgY2FsY3VsYXRlcyB0aGUgc2xvcGUgb2YgdGhlIHRlcnJhaW4gaW4gdGhlIHggYW5kIHlcbi8vIGRpcmVjdGlvbnMgZm9yIGVhY2ggcGl4ZWwsIGFuZCBzYXZlcyB0aG9zZSB2YWx1ZXMgdG8gYSBmcmFtZWJ1ZmZlciB0ZXh0dXJlIGluIHRoZSByIGFuZCBnIGNoYW5uZWxzLlxuZnVuY3Rpb24gcHJlcGFyZUhpbGxzaGFkZShwYWludGVyLCB0aWxlLCBsYXllciwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgZGVtID0gdGlsZS5kZW07XG4gICAgaWYgKGRlbSAmJiBkZW0uZGF0YSkge1xuICAgICAgICBjb25zdCB0aWxlU2l6ZSA9IGRlbS5kaW07XG4gICAgICAgIGNvbnN0IHRleHR1cmVTdHJpZGUgPSBkZW0uc3RyaWRlO1xuXG4gICAgICAgIGNvbnN0IHBpeGVsRGF0YSA9IGRlbS5nZXRQaXhlbHMoKTtcbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG5cbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQoZmFsc2UpO1xuICAgICAgICB0aWxlLmRlbVRleHR1cmUgPSB0aWxlLmRlbVRleHR1cmUgfHwgcGFpbnRlci5nZXRUaWxlVGV4dHVyZSh0ZXh0dXJlU3RyaWRlKTtcbiAgICAgICAgaWYgKHRpbGUuZGVtVGV4dHVyZSkge1xuICAgICAgICAgICAgY29uc3QgZGVtVGV4dHVyZSA9IHRpbGUuZGVtVGV4dHVyZTtcbiAgICAgICAgICAgIGRlbVRleHR1cmUudXBkYXRlKHBpeGVsRGF0YSwge3ByZW11bHRpcGx5OiBmYWxzZX0pO1xuICAgICAgICAgICAgZGVtVGV4dHVyZS5iaW5kKGdsLk5FQVJFU1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5kZW1UZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgcGl4ZWxEYXRhLCBnbC5SR0JBLCB7cHJlbXVsdGlwbHk6IGZhbHNlfSk7XG4gICAgICAgICAgICB0aWxlLmRlbVRleHR1cmUuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuXG4gICAgICAgIGxldCBmYm8gPSB0aWxlLmZibztcblxuICAgICAgICBpZiAoIWZibykge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHt3aWR0aDogdGlsZVNpemUsIGhlaWdodDogdGlsZVNpemUsIGRhdGE6IG51bGx9LCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHJlbmRlclRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgICAgICBmYm8gPSB0aWxlLmZibyA9IGNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIodGlsZVNpemUsIHRpbGVTaXplLCB0cnVlKTtcbiAgICAgICAgICAgIGZiby5jb2xvckF0dGFjaG1lbnQuc2V0KHJlbmRlclRleHR1cmUudGV4dHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQoZmJvLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHRpbGVTaXplLCB0aWxlU2l6ZV0pO1xuXG4gICAgICAgIHBhaW50ZXIudXNlUHJvZ3JhbSgnaGlsbHNoYWRlUHJlcGFyZScpLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLFxuICAgICAgICAgICAgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlcyh0aWxlLnRpbGVJRCwgZGVtKSxcbiAgICAgICAgICAgIGxheWVyLmlkLCBwYWludGVyLnJhc3RlckJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHBhaW50ZXIucmFzdGVyQm91bmRzU2VnbWVudHMpO1xuXG4gICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gZmFsc2U7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtjbGFtcH0gZnJvbSAnLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IEltYWdlU291cmNlIGZyb20gJy4uL3NvdXJjZS9pbWFnZV9zb3VyY2UnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUnO1xuaW1wb3J0IHtyYXN0ZXJVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3Byb2dyYW0vcmFzdGVyX3Byb2dyYW0nO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIFJhc3RlclN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdSYXN0ZXI7XG5cbmZ1bmN0aW9uIGRyYXdSYXN0ZXIocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogUmFzdGVyU3R5bGVMYXllciwgdGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgncmFzdGVyLW9wYWNpdHknKSA9PT0gMCkgcmV0dXJuO1xuICAgIGlmICghdGlsZUlEcy5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ3Jhc3RlcicpO1xuXG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBjb25zdCBbc3RlbmNpbE1vZGVzLCBjb29yZHNdID0gc291cmNlIGluc3RhbmNlb2YgSW1hZ2VTb3VyY2UgPyBbe30sIHRpbGVJRHNdIDpcbiAgICAgICAgcGFpbnRlci5zdGVuY2lsQ29uZmlnRm9yT3ZlcmxhcCh0aWxlSURzKTtcblxuICAgIGNvbnN0IG1pblRpbGVaID0gY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXS5vdmVyc2NhbGVkWjtcblxuICAgIGNvbnN0IGFsaWduID0gIXBhaW50ZXIub3B0aW9ucy5tb3Zpbmc7XG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBsb3dlciB6b29tIGxldmVsIHRvIHN1YmxheWVyIDAsIGFuZCBoaWdoZXIgem9vbSBsZXZlbHMgdG8gaGlnaGVyIHN1YmxheWVyc1xuICAgICAgICAvLyBVc2UgZ2wuTEVTUyB0byBwcmV2ZW50IGRvdWJsZSBkcmF3aW5nIGluIGFyZWFzIHdoZXJlIHRpbGVzIG92ZXJsYXAuXG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoY29vcmQub3ZlcnNjYWxlZFogLSBtaW5UaWxlWixcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgncmFzdGVyLW9wYWNpdHknKSA9PT0gMSA/IERlcHRoTW9kZS5SZWFkV3JpdGUgOiBEZXB0aE1vZGUuUmVhZE9ubHksIGdsLkxFU1MpO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgcG9zTWF0cml4ID0gcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUG9zTWF0cml4KGNvb3JkLnRvVW53cmFwcGVkKCksIGFsaWduKTtcblxuICAgICAgICB0aWxlLnJlZ2lzdGVyRmFkZUR1cmF0aW9uKGxheWVyLnBhaW50LmdldCgncmFzdGVyLWZhZGUtZHVyYXRpb24nKSk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50VGlsZSA9IHNvdXJjZUNhY2hlLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIDApLFxuICAgICAgICAgICAgZmFkZSA9IGdldEZhZGVWYWx1ZXModGlsZSwgcGFyZW50VGlsZSwgc291cmNlQ2FjaGUsIGxheWVyLCBwYWludGVyLnRyYW5zZm9ybSk7XG5cbiAgICAgICAgbGV0IHBhcmVudFNjYWxlQnksIHBhcmVudFRMO1xuXG4gICAgICAgIGNvbnN0IHRleHR1cmVGaWx0ZXIgPSBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1yZXNhbXBsaW5nJykgPT09ICduZWFyZXN0JyA/ICBnbC5ORUFSRVNUIDogZ2wuTElORUFSO1xuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICB0aWxlLnRleHR1cmUuYmluZCh0ZXh0dXJlRmlsdGVyLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuXG4gICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICBwYXJlbnRUaWxlLnRleHR1cmUuYmluZCh0ZXh0dXJlRmlsdGVyLCBnbC5DTEFNUF9UT19FREdFLCBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1QpO1xuICAgICAgICAgICAgcGFyZW50U2NhbGVCeSA9IE1hdGgucG93KDIsIHBhcmVudFRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgcGFyZW50VEwgPSBbdGlsZS50aWxlSUQuY2Fub25pY2FsLnggKiBwYXJlbnRTY2FsZUJ5ICUgMSwgdGlsZS50aWxlSUQuY2Fub25pY2FsLnkgKiBwYXJlbnRTY2FsZUJ5ICUgMV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUudGV4dHVyZS5iaW5kKHRleHR1cmVGaWx0ZXIsIGdsLkNMQU1QX1RPX0VER0UsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gcmFzdGVyVW5pZm9ybVZhbHVlcyhwb3NNYXRyaXgsIHBhcmVudFRMIHx8IFswLCAwXSwgcGFyZW50U2NhbGVCeSB8fCAxLCBmYWRlLCBsYXllcik7XG5cbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEltYWdlU291cmNlKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgc291cmNlLmJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgICAgICBwYWludGVyLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCBzb3VyY2UuYm91bmRzU2VnbWVudHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZXNbY29vcmQub3ZlcnNjYWxlZFpdLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgcGFpbnRlci5yYXN0ZXJCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgcGFpbnRlci5yYXN0ZXJCb3VuZHNTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEZhZGVWYWx1ZXModGlsZSwgcGFyZW50VGlsZSwgc291cmNlQ2FjaGUsIGxheWVyLCB0cmFuc2Zvcm0pIHtcbiAgICBjb25zdCBmYWRlRHVyYXRpb24gPSBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJyk7XG5cbiAgICBpZiAoZmFkZUR1cmF0aW9uID4gMCkge1xuICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpO1xuICAgICAgICBjb25zdCBzaW5jZVRpbGUgPSAobm93IC0gdGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uO1xuICAgICAgICBjb25zdCBzaW5jZVBhcmVudCA9IHBhcmVudFRpbGUgPyAobm93IC0gcGFyZW50VGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uIDogLTE7XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgIGNvbnN0IGlkZWFsWiA9IHRyYW5zZm9ybS5jb3ZlcmluZ1pvb21MZXZlbCh7XG4gICAgICAgICAgICB0aWxlU2l6ZTogc291cmNlLnRpbGVTaXplLFxuICAgICAgICAgICAgcm91bmRab29tOiBzb3VyY2Uucm91bmRab29tXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXIsIGZhZGUgaW47IGlmIHBhcmVudCBpcyB5b3VuZ2VyLCBmYWRlIG91dFxuICAgICAgICBjb25zdCBmYWRlSW4gPSAhcGFyZW50VGlsZSB8fCBNYXRoLmFicyhwYXJlbnRUaWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWikgPiBNYXRoLmFicyh0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWik7XG5cbiAgICAgICAgY29uc3QgY2hpbGRPcGFjaXR5ID0gKGZhZGVJbiAmJiB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uKSA/IDEgOiBjbGFtcChmYWRlSW4gPyBzaW5jZVRpbGUgOiAxIC0gc2luY2VQYXJlbnQsIDAsIDEpO1xuXG4gICAgICAgIC8vIHdlIGRvbid0IGNyb3NzZmFkZSB0aWxlcyB0aGF0IHdlcmUganVzdCByZWZyZXNoZWQgdXBvbiBleHBpcmluZzpcbiAgICAgICAgLy8gb25jZSB0aGV5J3JlIG9sZCBlbm91Z2ggdG8gcGFzcyB0aGUgY3Jvc3NmYWRpbmcgdGhyZXNob2xkXG4gICAgICAgIC8vIChmYWRlRHVyYXRpb24pLCB1bnNldCB0aGUgYHJlZnJlc2hlZFVwb25FeHBpcmF0aW9uYCBmbGFnIHNvIHdlIGRvbid0XG4gICAgICAgIC8vIGluY29ycmVjdGx5IGZhaWwgdG8gY3Jvc3NmYWRlIHRoZW0gd2hlbiB6b29taW5nXG4gICAgICAgIGlmICh0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uICYmIHNpbmNlVGlsZSA+PSAxKSB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICBtaXg6IDEgLSBjaGlsZE9wYWNpdHlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IGNoaWxkT3BhY2l0eSxcbiAgICAgICAgICAgICAgICBtaXg6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIG1peDogMFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcclxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcclxuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZSc7XHJcbmltcG9ydCB7XHJcbiAgICBiYWNrZ3JvdW5kVW5pZm9ybVZhbHVlcyxcclxuICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlc1xyXG59IGZyb20gJy4vcHJvZ3JhbS9iYWNrZ3JvdW5kX3Byb2dyYW0nO1xyXG5cclxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXInO1xyXG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcclxuaW1wb3J0IHR5cGUgQmFja2dyb3VuZFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBkcmF3QmFja2dyb3VuZDtcclxuXHJcbmZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEJhY2tncm91bmRTdHlsZUxheWVyKSB7XHJcbiAgICBjb25zdCBjb2xvciA9IGxheWVyLnBhaW50LmdldCgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnYmFja2dyb3VuZC1vcGFjaXR5Jyk7XHJcblxyXG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xyXG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xyXG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XHJcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHRyYW5zZm9ybS50aWxlU2l6ZTtcclxuICAgIGNvbnN0IGltYWdlID0gbGF5ZXIucGFpbnQuZ2V0KCdiYWNrZ3JvdW5kLXBhdHRlcm4nKTtcclxuICAgIGlmIChwYWludGVyLmlzUGF0dGVybk1pc3NpbmcoaW1hZ2UpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcGFzcyA9ICghaW1hZ2UgJiYgY29sb3IuYSA9PT0gMSAmJiBvcGFjaXR5ID09PSAxICYmIHBhaW50ZXIub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpKSA/ICdvcGFxdWUnIDogJ3RyYW5zbHVjZW50JztcclxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09IHBhc3MpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xyXG4gICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBwYXNzID09PSAnb3BhcXVlJyA/IERlcHRoTW9kZS5SZWFkV3JpdGUgOiBEZXB0aE1vZGUuUmVhZE9ubHkpO1xyXG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XHJcblxyXG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpbWFnZSA/ICdiYWNrZ3JvdW5kUGF0dGVybicgOiAnYmFja2dyb3VuZCcpO1xyXG5cclxuICAgIGNvbnN0IHRpbGVJRHMgPSB0cmFuc2Zvcm0uY292ZXJpbmdUaWxlcyh7dGlsZVNpemV9KTtcclxuXHJcbiAgICBpZiAoaW1hZ2UpIHtcclxuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcclxuICAgICAgICBwYWludGVyLmltYWdlTWFuYWdlckZhY3RvcnkuYmluZChwYWludGVyLmNvbnRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcclxuICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcclxuICAgICAgICBjb25zdCBtYXRyaXggPSBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgodGlsZUlELnRvVW53cmFwcGVkKCkpO1xyXG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XHJcbiAgICAgICAgICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlcyhtYXRyaXgsIG9wYWNpdHksIHBhaW50ZXIsIGltYWdlLCB7dGlsZUlELCB0aWxlU2l6ZX0sIGNyb3NzZmFkZSkgOlxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kVW5pZm9ybVZhbHVlcyhtYXRyaXgsIG9wYWNpdHksIGNvbG9yKTtcclxuXHJcbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIsXHJcbiAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHBhaW50ZXIudGlsZUV4dGVudFNlZ21lbnRzKTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCB7ZGVidWdVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3Byb2dyYW0vZGVidWdfcHJvZ3JhbSc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZSc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXInO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdEZWJ1ZztcblxuY29uc3QgdG9wQ29sb3IgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XG5jb25zdCBidG1Db2xvciA9IG5ldyBDb2xvcigwLCAxLCAwLCAxKTtcbmNvbnN0IGxlZnRDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAxLCAxKTtcbmNvbnN0IHJpZ2h0Q29sb3IgPSBuZXcgQ29sb3IoMSwgMCwgMSwgMSk7XG5jb25zdCBjZW50ZXJDb2xvciA9IG5ldyBDb2xvcigwLCAxLCAxLCAxKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdEZWJ1Z1BhZGRpbmcocGFpbnRlcjogUGFpbnRlcikge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBwYWludGVyLnRyYW5zZm9ybS5wYWRkaW5nO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IDM7XG4gICAgLy8gVG9wXG4gICAgZHJhd0hvcml6b250YWxMaW5lKHBhaW50ZXIsIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodCAtIChwYWRkaW5nLnRvcCB8fCAwKSwgbGluZVdpZHRoLCB0b3BDb2xvcik7XG4gICAgLy8gQm90dG9tXG4gICAgZHJhd0hvcml6b250YWxMaW5lKHBhaW50ZXIsIHBhZGRpbmcuYm90dG9tIHx8IDAsIGxpbmVXaWR0aCwgYnRtQ29sb3IpO1xuICAgIC8vIExlZnRcbiAgICBkcmF3VmVydGljYWxMaW5lKHBhaW50ZXIsIHBhZGRpbmcubGVmdCB8fCAwLCBsaW5lV2lkdGgsIGxlZnRDb2xvcik7XG4gICAgLy8gUmlnaHRcbiAgICBkcmF3VmVydGljYWxMaW5lKHBhaW50ZXIsIHBhaW50ZXIudHJhbnNmb3JtLndpZHRoIC0gKHBhZGRpbmcucmlnaHQgfHwgMCksIGxpbmVXaWR0aCwgcmlnaHRDb2xvcik7XG4gICAgLy8gQ2VudGVyXG4gICAgY29uc3QgY2VudGVyID0gcGFpbnRlci50cmFuc2Zvcm0uY2VudGVyUG9pbnQ7XG4gICAgZHJhd0Nyb3NzaGFpcihwYWludGVyLCBjZW50ZXIueCwgcGFpbnRlci50cmFuc2Zvcm0uaGVpZ2h0IC0gY2VudGVyLnksIGNlbnRlckNvbG9yKTtcbn1cblxuZnVuY3Rpb24gZHJhd0Nyb3NzaGFpcihwYWludGVyOiBQYWludGVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgY29sb3I6IENvbG9yKSB7XG4gICAgY29uc3Qgc2l6ZSA9IDIwO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IDI7XG4gICAgLy9WZXJ0aWNhbCBsaW5lXG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIHggLSBsaW5lV2lkdGggLyAyLCB5IC0gc2l6ZSAvIDIsIGxpbmVXaWR0aCwgc2l6ZSwgY29sb3IpO1xuICAgIC8vSG9yaXpvbnRhbCBsaW5lXG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIHggLSBzaXplIC8gMiwgeSAtIGxpbmVXaWR0aCAvIDIsIHNpemUsIGxpbmVXaWR0aCwgY29sb3IpO1xufVxuXG5mdW5jdGlvbiBkcmF3SG9yaXpvbnRhbExpbmUocGFpbnRlcjogUGFpbnRlciwgeTogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY29sb3I6IENvbG9yKSB7XG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIDAsIHkgICsgbGluZVdpZHRoIC8gMiwgcGFpbnRlci50cmFuc2Zvcm0ud2lkdGgsICBsaW5lV2lkdGgsIGNvbG9yKTtcbn1cblxuZnVuY3Rpb24gZHJhd1ZlcnRpY2FsTGluZShwYWludGVyOiBQYWludGVyLCB4OiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyLCBjb2xvcjogQ29sb3IpIHtcbiAgICBkcmF3RGVidWdTU1JlY3QocGFpbnRlciwgeCAtIGxpbmVXaWR0aCAvIDIsIDAsIGxpbmVXaWR0aCwgIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodCwgY29sb3IpO1xufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdTU1JlY3QocGFpbnRlcjogUGFpbnRlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBjb2xvcjogQ29sb3IpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgIGdsLnNjaXNzb3IoeCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgeSAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sIGhlaWdodCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5jbGVhcih7Y29sb3J9KTtcbiAgICBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdEZWJ1ZyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBkcmF3RGVidWdUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZHNbaV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0RlYnVnVGlsZShwYWludGVyLCBzb3VyY2VDYWNoZSwgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGNvbnN0IHBvc01hdHJpeCA9IGNvb3JkLnBvc01hdHJpeDtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdkZWJ1ZycpO1xuXG4gICAgY29uc3QgZGVwdGhNb2RlID0gRGVwdGhNb2RlLmRpc2FibGVkO1xuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgY29uc3QgaWQgPSAnJGRlYnVnJztcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIC8vIEJpbmQgdGhlIGVtcHR5IHRleHR1cmUgZm9yIGRyYXdpbmcgb3V0bGluZXNcbiAgICBwYWludGVyLmVtcHR5VGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORV9TVFJJUCwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIGRlYnVnVW5pZm9ybVZhbHVlcyhwb3NNYXRyaXgsIENvbG9yLnJlZCksIGlkLFxuICAgICAgICBwYWludGVyLmRlYnVnQnVmZmVyLCBwYWludGVyLnRpbGVCb3JkZXJJbmRleEJ1ZmZlciwgcGFpbnRlci5kZWJ1Z1NlZ21lbnRzKTtcblxuICAgIGNvbnN0IHRpbGVSYXdEYXRhID0gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoY29vcmQua2V5KS5sYXRlc3RSYXdUaWxlRGF0YTtcbiAgICBjb25zdCB0aWxlQnl0ZUxlbmd0aCA9ICh0aWxlUmF3RGF0YSAmJiB0aWxlUmF3RGF0YS5ieXRlTGVuZ3RoKSB8fCAwO1xuICAgIGNvbnN0IHRpbGVTaXplS2IgPSBNYXRoLmZsb29yKHRpbGVCeXRlTGVuZ3RoIC8gMTAyNCk7XG4gICAgY29uc3QgdGlsZVNpemUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKS50aWxlU2l6ZTtcbiAgICBjb25zdCBzY2FsZVJhdGlvID0gKDUxMiAvIE1hdGgubWluKHRpbGVTaXplLCA1MTIpICogKGNvb3JkLm92ZXJzY2FsZWRaIC8gcGFpbnRlci50cmFuc2Zvcm0uem9vbSkpICogMC41O1xuICAgIGxldCB0aWxlSWRUZXh0ID0gY29vcmQuY2Fub25pY2FsLnRvU3RyaW5nKCk7XG4gICAgaWYgKGNvb3JkLm92ZXJzY2FsZWRaICE9PSBjb29yZC5jYW5vbmljYWwueikge1xuICAgICAgICB0aWxlSWRUZXh0ICs9IGAgPT4gJHtjb29yZC5vdmVyc2NhbGVkWn1gO1xuICAgIH1cbiAgICBjb25zdCB0aWxlTGFiZWwgPSBgJHt0aWxlSWRUZXh0fSAke3RpbGVTaXplS2J9a2JgO1xuICAgIGRyYXdUZXh0VG9PdmVybGF5KHBhaW50ZXIsIHRpbGVMYWJlbCk7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBDb2xvck1vZGUuYWxwaGFCbGVuZGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIGRlYnVnVW5pZm9ybVZhbHVlcyhwb3NNYXRyaXgsIENvbG9yLnRyYW5zcGFyZW50LCBzY2FsZVJhdGlvKSwgaWQsXG4gICAgICAgIHBhaW50ZXIuZGVidWdCdWZmZXIsIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHBhaW50ZXIuZGVidWdTZWdtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGRyYXdUZXh0VG9PdmVybGF5KHBhaW50ZXI6IFBhaW50ZXIsIHRleHQ6IHN0cmluZykge1xuICAgIHBhaW50ZXIuaW5pdERlYnVnT3ZlcmxheUNhbnZhcygpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHBhaW50ZXIuZGVidWdPdmVybGF5Q2FudmFzO1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5jb250ZXh0LmdsO1xuICAgIGNvbnN0IGN0eDJkID0gcGFpbnRlci5kZWJ1Z092ZXJsYXlDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjdHgyZC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIGN0eDJkLnNoYWRvd0NvbG9yID0gJ3doaXRlJztcbiAgICBjdHgyZC5zaGFkb3dCbHVyID0gMjtcbiAgICBjdHgyZC5saW5lV2lkdGggPSAxLjU7XG4gICAgY3R4MmQuc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xuICAgIGN0eDJkLnRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgIGN0eDJkLmZvbnQgPSBgYm9sZCAkezM2fXB4IE9wZW4gU2Fucywgc2Fucy1zZXJpZmA7XG4gICAgY3R4MmQuZmlsbFRleHQodGV4dCwgNSwgNSk7XG4gICAgY3R4MmQuc3Ryb2tlVGV4dCh0ZXh0LCA1LCA1KTtcblxuICAgIHBhaW50ZXIuZGVidWdPdmVybGF5VGV4dHVyZS51cGRhdGUoY2FudmFzKTtcbiAgICBwYWludGVyLmRlYnVnT3ZlcmxheVRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0N1c3RvbTtcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlcic7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJztcbmltcG9ydCB0eXBlIEN1c3RvbVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyJztcblxuZnVuY3Rpb24gZHJhd0N1c3RvbShwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBDdXN0b21TdHlsZUxheWVyKSB7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGltcGxlbWVudGF0aW9uID0gbGF5ZXIuaW1wbGVtZW50YXRpb247XG5cbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAnb2Zmc2NyZWVuJykge1xuXG4gICAgICAgIGNvbnN0IHByZXJlbmRlciA9IGltcGxlbWVudGF0aW9uLnByZXJlbmRlcjtcbiAgICAgICAgaWYgKHByZXJlbmRlcikge1xuICAgICAgICAgICAgcGFpbnRlci5zZXRDdXN0b21MYXllckRlZmF1bHRzKCk7XG4gICAgICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG5cbiAgICAgICAgICAgIHByZXJlbmRlci5jYWxsKGltcGxlbWVudGF0aW9uLCBjb250ZXh0LmdsLCBwYWludGVyLnRyYW5zZm9ybS5jdXN0b21MYXllck1hdHJpeCgpKTtcblxuICAgICAgICAgICAgY29udGV4dC5zZXREaXJ0eSgpO1xuICAgICAgICAgICAgcGFpbnRlci5zZXRCYXNlU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcpIHtcblxuICAgICAgICBwYWludGVyLnNldEN1c3RvbUxheWVyRGVmYXVsdHMoKTtcblxuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG4gICAgICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoU3RlbmNpbE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IGltcGxlbWVudGF0aW9uLnJlbmRlcmluZ01vZGUgPT09ICczZCcgP1xuICAgICAgICAgICAgbmV3IERlcHRoTW9kZShwYWludGVyLmNvbnRleHQuZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBwYWludGVyLmRlcHRoUmFuZ2VGb3IzRCkgOlxuICAgICAgICAgICAgcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKGRlcHRoTW9kZSk7XG5cbiAgICAgICAgaW1wbGVtZW50YXRpb24ucmVuZGVyKGNvbnRleHQuZ2wsIHBhaW50ZXIudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0RGlydHkoKTtcbiAgICAgICAgcGFpbnRlci5zZXRCYXNlU3RhdGUoKTtcbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93JztcblxuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudCc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudCc7XG5pbXBvcnQge1Jhc3RlckJvdW5kc0FycmF5LCBQb3NBcnJheSwgVHJpYW5nbGVJbmRleEFycmF5LCBMaW5lU3RyaXBJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzJztcbmltcG9ydCB7dmFsdWVzfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHJhc3RlckJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2F0dHJpYnV0ZXMnO1xuaW1wb3J0IHBvc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9wb3NfYXR0cmlidXRlcyc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IENyb3NzVGlsZVN5bWJvbEluZGV4IGZyb20gJy4uL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJzIGZyb20gJy4uL3NoYWRlcnMnO1xuaW1wb3J0IFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtJztcbmltcG9ydCB7cHJvZ3JhbVVuaWZvcm1zfSBmcm9tICcuL3Byb2dyYW0vcHJvZ3JhbV91bmlmb3Jtcyc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0JztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZSc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZSc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQge2NsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4vcHJvZ3JhbS9jbGlwcGluZ19tYXNrX3Byb2dyYW0nO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvcic7XG5pbXBvcnQgc3ltYm9sIGZyb20gJy4vZHJhd19zeW1ib2wnO1xuaW1wb3J0IGNpcmNsZSBmcm9tICcuL2RyYXdfY2lyY2xlJztcbmltcG9ydCBoZWF0bWFwIGZyb20gJy4vZHJhd19oZWF0bWFwJztcbmltcG9ydCBsaW5lIGZyb20gJy4vZHJhd19saW5lJztcbmltcG9ydCBmaWxsIGZyb20gJy4vZHJhd19maWxsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uIGZyb20gJy4vZHJhd19maWxsX2V4dHJ1c2lvbic7XG5pbXBvcnQgaGlsbHNoYWRlIGZyb20gJy4vZHJhd19oaWxsc2hhZGUnO1xuaW1wb3J0IHJhc3RlciBmcm9tICcuL2RyYXdfcmFzdGVyJztcbmltcG9ydCBiYWNrZ3JvdW5kIGZyb20gJy4vZHJhd19iYWNrZ3JvdW5kJztcbmltcG9ydCBkZWJ1Zywge2RyYXdEZWJ1Z1BhZGRpbmd9IGZyb20gJy4vZHJhd19kZWJ1Zyc7XG5pbXBvcnQgY3VzdG9tIGZyb20gJy4vZHJhd19jdXN0b20nO1xuXG5jb25zdCBkcmF3ID0ge1xuICAgIHN5bWJvbCxcbiAgICBjaXJjbGUsXG4gICAgaGVhdG1hcCxcbiAgICBsaW5lLFxuICAgIGZpbGwsXG4gICAgJ2ZpbGwtZXh0cnVzaW9uJzogZmlsbEV4dHJ1c2lvbixcbiAgICBoaWxsc2hhZGUsXG4gICAgcmFzdGVyLFxuICAgIGJhY2tncm91bmQsXG4gICAgZGVidWcsXG4gICAgY3VzdG9tXG59O1xuXG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XG5pbXBvcnQgdHlwZSBTdHlsZSBmcm9tICcuLi9zdHlsZS9zdHlsZSc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyJztcbmltcG9ydCB0eXBlIHtDcm9zc0ZhZGVkfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzJztcbmltcG9ydCB0eXBlIExpbmVBdGxhcyBmcm9tICcuL2xpbmVfYXRsYXMnO1xuLy8gaW1wb3J0IHR5cGUgSW1hZ2VNYW5hZ2VyIGZyb20gJy4vaW1hZ2VfbWFuYWdlcic7XG5pbXBvcnQgdHlwZSBpbWFnZU1hbmFnZXJGYWN0b3J5IGZyb20gJy4vaW1hZ2VfbWFuYWdlcl9mYWN0b3J5JztcbmltcG9ydCB0eXBlIEdseXBoTWFuYWdlciBmcm9tICcuL2dseXBoX21hbmFnZXInO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXInO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyJztcbmltcG9ydCB0eXBlIHtEZXB0aFJhbmdlVHlwZSwgRGVwdGhNYXNrVHlwZSwgRGVwdGhGdW5jVHlwZX0gZnJvbSAnLi4vZ2wvdHlwZXMnO1xuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UnO1xuXG5leHBvcnQgdHlwZSBSZW5kZXJQYXNzID0gJ29mZnNjcmVlbicgfCAnb3BhcXVlJyB8ICd0cmFuc2x1Y2VudCc7XG5cbnR5cGUgUGFpbnRlck9wdGlvbnMgPSB7XG4gICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiBib29sZWFuLFxuICAgIHNob3dUaWxlQm91bmRhcmllczogYm9vbGVhbixcbiAgICBzaG93UGFkZGluZzogYm9vbGVhbixcbiAgICByb3RhdGluZzogYm9vbGVhbixcbiAgICB6b29taW5nOiBib29sZWFuLFxuICAgIG1vdmluZzogYm9vbGVhbixcbiAgICBncHVUaW1pbmc6IGJvb2xlYW4sXG4gICAgZmFkZUR1cmF0aW9uOiBudW1iZXJcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IHBhaW50ZXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7Q2FudmFzfSBnbCBhbiBleHBlcmltZW50YWwtd2ViZ2wgZHJhd2luZyBjb250ZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQYWludGVyIHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xuICAgIF90aWxlVGV4dHVyZXM6IHtbXzogbnVtYmVyXTogQXJyYXk8VGV4dHVyZT4gfTtcbiAgICBudW1TdWJsYXllcnM6IG51bWJlcjtcbiAgICBkZXB0aEVwc2lsb246IG51bWJlcjtcbiAgICBlbXB0eVByb2dyYW1Db25maWd1cmF0aW9uOiBQcm9ncmFtQ29uZmlndXJhdGlvbjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHRpbGVFeHRlbnRCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICB0aWxlRXh0ZW50U2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgZGVidWdCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICBkZWJ1Z1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHJhc3RlckJvdW5kc0J1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIHJhc3RlckJvdW5kc1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHZpZXdwb3J0QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgdmlld3BvcnRTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBxdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgdGlsZUJvcmRlckluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcbiAgICBfdGlsZUNsaXBwaW5nTWFza0lEczoge1tfOiBzdHJpbmddOiBudW1iZXIgfTtcbiAgICBzdGVuY2lsQ2xlYXJNb2RlOiBTdGVuY2lsTW9kZTtcbiAgICBzdHlsZTogU3R5bGU7XG4gICAgb3B0aW9uczogUGFpbnRlck9wdGlvbnM7XG4gICAgbGluZUF0bGFzOiBMaW5lQXRsYXM7XG4gICAgaW1hZ2VNYW5hZ2VyRmFjdG9yeTogaW1hZ2VNYW5hZ2VyRmFjdG9yeTtcbiAgICBnbHlwaE1hbmFnZXI6IEdseXBoTWFuYWdlcjtcbiAgICBkZXB0aFJhbmdlRm9yM0Q6IERlcHRoUmFuZ2VUeXBlO1xuICAgIG9wYXF1ZVBhc3NDdXRvZmY6IG51bWJlcjtcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzO1xuICAgIGN1cnJlbnRMYXllcjogbnVtYmVyO1xuICAgIGN1cnJlbnRTdGVuY2lsU291cmNlOiA/c3RyaW5nO1xuICAgIG5leHRTdGVuY2lsSUQ6IG51bWJlcjtcbiAgICBpZDogc3RyaW5nO1xuICAgIF9zaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW47XG4gICAgY2FjaGU6IHtbXzogc3RyaW5nXTogUHJvZ3JhbTwqPiB9O1xuICAgIGNyb3NzVGlsZVN5bWJvbEluZGV4OiBDcm9zc1RpbGVTeW1ib2xJbmRleDtcbiAgICBzeW1ib2xGYWRlQ2hhbmdlOiBudW1iZXI7XG4gICAgZ3B1VGltZXJzOiB7W186IHN0cmluZ106IGFueSB9O1xuICAgIGVtcHR5VGV4dHVyZTogVGV4dHVyZTtcbiAgICBkZWJ1Z092ZXJsYXlUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGRlYnVnT3ZlcmxheUNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgQ29udGV4dChnbCk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICB0aGlzLl90aWxlVGV4dHVyZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnNldHVwKCk7XG5cbiAgICAgICAgLy8gV2l0aGluIGVhY2ggbGF5ZXIgdGhlcmUgYXJlIG11bHRpcGxlIGRpc3RpbmN0IHotcGxhbmVzIHRoYXQgY2FuIGJlIGRyYXduIHRvLlxuICAgICAgICAvLyBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBXZWJHTCBkZXB0aCBidWZmZXIuXG4gICAgICAgIHRoaXMubnVtU3VibGF5ZXJzID0gU291cmNlQ2FjaGUubWF4VW5kZXJ6b29taW5nICsgU291cmNlQ2FjaGUubWF4T3Zlcnpvb21pbmcgKyAxO1xuICAgICAgICB0aGlzLmRlcHRoRXBzaWxvbiA9IDEgLyBNYXRoLnBvdygyLCAxNik7XG5cbiAgICAgICAgdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleCA9IG5ldyBDcm9zc1RpbGVTeW1ib2xJbmRleCgpO1xuXG4gICAgICAgIHRoaXMuZ3B1VGltZXJzID0ge307XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBVcGRhdGUgdGhlIEdMIHZpZXdwb3J0LCBwcm9qZWN0aW9uIG1hdHJpeCwgYW5kIHRyYW5zZm9ybXMgdG8gY29tcGVuc2F0ZVxuICAgICAqIGZvciBhIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlLlxuICAgICAqL1xuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgdGhpcy5zdHlsZS5fb3JkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZF0ucmVzaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXR1cCgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBjb25zdCB0aWxlRXh0ZW50QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKDAsIEVYVEVOVCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMudGlsZUV4dGVudEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRpbGVFeHRlbnRBcnJheSwgcG9zQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy50aWxlRXh0ZW50U2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG5cbiAgICAgICAgY29uc3QgZGVidWdBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5UKTtcbiAgICAgICAgZGVidWdBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCk7XG4gICAgICAgIHRoaXMuZGVidWdCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihkZWJ1Z0FycmF5LCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLmRlYnVnU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgNSk7XG5cbiAgICAgICAgY29uc3QgcmFzdGVyQm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgMCwgMCwgMCk7XG4gICAgICAgIHJhc3RlckJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCwgRVhURU5ULCAwKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5ULCAwLCBFWFRFTlQpO1xuICAgICAgICByYXN0ZXJCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCwgRVhURU5ULCBFWFRFTlQpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHJhc3RlckJvdW5kc0FycmF5LCByYXN0ZXJCb3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAwKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygwLCAxKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAxKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHZpZXdwb3J0QXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMudmlld3BvcnRTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcblxuICAgICAgICBjb25zdCB0aWxlTGluZVN0cmlwSW5kaWNlcyA9IG5ldyBMaW5lU3RyaXBJbmRleEFycmF5KCk7XG4gICAgICAgIHRpbGVMaW5lU3RyaXBJbmRpY2VzLmVtcGxhY2VCYWNrKDApO1xuICAgICAgICB0aWxlTGluZVN0cmlwSW5kaWNlcy5lbXBsYWNlQmFjaygxKTtcbiAgICAgICAgdGlsZUxpbmVTdHJpcEluZGljZXMuZW1wbGFjZUJhY2soMyk7XG4gICAgICAgIHRpbGVMaW5lU3RyaXBJbmRpY2VzLmVtcGxhY2VCYWNrKDIpO1xuICAgICAgICB0aWxlTGluZVN0cmlwSW5kaWNlcy5lbXBsYWNlQmFjaygwKTtcbiAgICAgICAgdGhpcy50aWxlQm9yZGVySW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRpbGVMaW5lU3RyaXBJbmRpY2VzKTtcblxuICAgICAgICBjb25zdCBxdWFkVHJpYW5nbGVJbmRpY2VzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICBxdWFkVHJpYW5nbGVJbmRpY2VzLmVtcGxhY2VCYWNrKDAsIDEsIDIpO1xuICAgICAgICBxdWFkVHJpYW5nbGVJbmRpY2VzLmVtcGxhY2VCYWNrKDIsIDEsIDMpO1xuICAgICAgICB0aGlzLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihxdWFkVHJpYW5nbGVJbmRpY2VzKTtcblxuICAgICAgICB0aGlzLmVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHtcbiAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDBdKVxuICAgICAgICB9LCBjb250ZXh0LmdsLlJHQkEpO1xuXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLnN0ZW5jaWxDbGVhck1vZGUgPSBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IGdsLkFMV0FZUywgbWFzazogMH0sIDB4MCwgMHhGRiwgZ2wuWkVSTywgZ2wuWkVSTywgZ2wuWkVSTyk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNldCB0aGUgZHJhd2luZyBjYW52YXMgYnkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyIHNvIHRoYXQgd2UgY2FuIGRyYXdcbiAgICAgKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAgICAgKi9cbiAgICBjbGVhclN0ZW5jaWwoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICB0aGlzLm5leHRTdGVuY2lsSUQgPSAxO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy81NDkwLFxuICAgICAgICAvLyBwZW5kaW5nIGFuIHVwc3RyZWFtIGZpeCwgd2UgZHJhdyBhIGZ1bGxzY3JlZW4gc3RlbmNpbD0wIGNsaXBwaW5nIG1hc2sgaGVyZSxcbiAgICAgICAgLy8gZWZmZWN0aXZlbHkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyOiBvbmNlIGFuIHVwc3RyZWFtIHBhdGNoIGxhbmRzLCByZW1vdmVcbiAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBpbiBmYXZvciBvZiBjb250ZXh0LmNsZWFyKHsgc3RlbmNpbDogMHgwIH0pXG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCAwLCAxKTtcbiAgICAgICAgbWF0NC5zY2FsZShtYXRyaXgsIG1hdHJpeCwgW2dsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCwgMF0pO1xuXG4gICAgICAgIHRoaXMudXNlUHJvZ3JhbSgnY2xpcHBpbmdNYXNrJykuZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsXG4gICAgICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsIHRoaXMuc3RlbmNpbENsZWFyTW9kZSwgQ29sb3JNb2RlLmRpc2FibGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzKG1hdHJpeCksXG4gICAgICAgICAgICAnJGNsaXBwaW5nJywgdGhpcy52aWV3cG9ydEJ1ZmZlcixcbiAgICAgICAgICAgIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHRoaXMudmlld3BvcnRTZWdtZW50cyk7XG4gICAgfVxuXG4gICAgX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGxheWVyOiBTdHlsZUxheWVyLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9PT0gbGF5ZXIuc291cmNlIHx8ICFsYXllci5pc1RpbGVDbGlwcGVkKCkgfHwgIXRpbGVJRHMgfHwgIXRpbGVJRHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IGxheWVyLnNvdXJjZTtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFN0ZW5jaWxJRCArIHRpbGVJRHMubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgICAgICAvLyB3ZSdsbCBydW4gb3V0IG9mIGZyZXNoIElEcyBzbyB3ZSBuZWVkIHRvIGNsZWFyIGFuZCBzdGFydCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShDb2xvck1vZGUuZGlzYWJsZWQpO1xuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShEZXB0aE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnVzZVByb2dyYW0oJ2NsaXBwaW5nTWFzaycpO1xuXG4gICAgICAgIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdGlsZUlELmtleV0gPSB0aGlzLm5leHRTdGVuY2lsSUQrKztcblxuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgRGVwdGhNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIC8vIFRlc3RzIHdpbGwgYWx3YXlzIHBhc3MsIGFuZCByZWYgdmFsdWUgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZW5jaWwgYnVmZmVyLlxuICAgICAgICAgICAgICAgIG5ldyBTdGVuY2lsTW9kZSh7ZnVuYzogZ2wuQUxXQVlTLCBtYXNrOiAwfSwgaWQsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpLFxuICAgICAgICAgICAgICAgIENvbG9yTW9kZS5kaXNhYmxlZCwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLCBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzKHRpbGVJRC5wb3NNYXRyaXgpLFxuICAgICAgICAgICAgICAgICckY2xpcHBpbmcnLCB0aGlzLnRpbGVFeHRlbnRCdWZmZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgdGhpcy50aWxlRXh0ZW50U2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RlbmNpbE1vZGVGb3IzRCgpOiBTdGVuY2lsTW9kZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFN0ZW5jaWxJRCArIDEgPiAyNTYpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IHRoaXMubmV4dFN0ZW5jaWxJRCsrO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVuY2lsTW9kZSh7ZnVuYzogZ2wuTk9URVFVQUwsIG1hc2s6IDB4RkZ9LCBpZCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuUkVQTEFDRSk7XG4gICAgfVxuXG4gICAgc3RlbmNpbE1vZGVGb3JDbGlwcGluZyh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiBTdGVuY2lsTW9kZSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICByZXR1cm4gbmV3IFN0ZW5jaWxNb2RlKHtmdW5jOiBnbC5FUVVBTCwgbWFzazogMHhGRn0sIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbdGlsZUlELmtleV0sIDB4MDAsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogU29ydCBjb29yZGluYXRlcyBieSBaIGFzIGRyYXdpbmcgdGlsZXMgaXMgZG9uZSBpbiBaLWRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogQWxsIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUgWiB3cml0ZSB0aGUgc2FtZSBzdGVuY2lsIHZhbHVlLiAgQ2hpbGRyZW5cbiAgICAgKiBzdGVuY2lsIHZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIHBhcmVudCdzLiAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIHJhc3RlclxuICAgICAqIGFuZCByYXN0ZXItZGVtIHRpbGVzLCB3aGljaCBhcmUgYWxyZWFkeSBjbGlwcGVkIHRvIHRpbGUgYm91bmRhcmllcywgdG9cbiAgICAgKiBtYXNrIGFyZWEgb2YgdGlsZSBvdmVybGFwcGVkIGJ5IGNoaWxkcmVuIHRpbGVzLlxuICAgICAqIFN0ZW5jaWwgcmVmIHZhbHVlcyBjb250aW51ZSByYW5nZSB1c2VkIGluIF90aWxlQ2xpcHBpbmdNYXNrSURzLlxuICAgICAqXG4gICAgICogUmV0dXJucyBbU3RlbmNpbE1vZGUgZm9yIHRpbGUgb3ZlcnNjYWxlWiBtYXAsIHNvcnRlZENvb3Jkc10uXG4gICAgICovXG4gICAgc3RlbmNpbENvbmZpZ0Zvck92ZXJsYXAodGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pOiBbe1tfOiBudW1iZXJdOiAkUmVhZE9ubHk8U3RlbmNpbE1vZGU+fSwgQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD5dIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRpbGVJRHMuc29ydCgoYSwgYikgPT4gYi5vdmVyc2NhbGVkWiAtIGEub3ZlcnNjYWxlZFopO1xuICAgICAgICBjb25zdCBtaW5UaWxlWiA9IGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMV0ub3ZlcnNjYWxlZFo7XG4gICAgICAgIGNvbnN0IHN0ZW5jaWxWYWx1ZXMgPSBjb29yZHNbMF0ub3ZlcnNjYWxlZFogLSBtaW5UaWxlWiArIDE7XG4gICAgICAgIGlmIChzdGVuY2lsVmFsdWVzID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHRTdGVuY2lsSUQgKyBzdGVuY2lsVmFsdWVzID4gMjU2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHpUb1N0ZW5jaWxNb2RlID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZW5jaWxWYWx1ZXM7IGkrKykge1xuICAgICAgICAgICAgICAgIHpUb1N0ZW5jaWxNb2RlW2kgKyBtaW5UaWxlWl0gPSBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IGdsLkdFUVVBTCwgbWFzazogMHhGRn0sIGkgKyB0aGlzLm5leHRTdGVuY2lsSUQsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXh0U3RlbmNpbElEICs9IHN0ZW5jaWxWYWx1ZXM7XG4gICAgICAgICAgICByZXR1cm4gW3pUb1N0ZW5jaWxNb2RlLCBjb29yZHNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbe1ttaW5UaWxlWl06IFN0ZW5jaWxNb2RlLmRpc2FibGVkfSwgY29vcmRzXTtcbiAgICB9XG5cbiAgICBjb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk6ICRSZWFkT25seTxDb2xvck1vZGU+IHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG51bU92ZXJkcmF3U3RlcHMgPSA4O1xuICAgICAgICAgICAgY29uc3QgYSA9IDEgLyBudW1PdmVyZHJhd1N0ZXBzO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yTW9kZShbZ2wuQ09OU1RBTlRfQ09MT1IsIGdsLk9ORV0sIG5ldyBDb2xvcihhLCBhLCBhLCAwKSwgW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlbmRlclBhc3MgPT09ICdvcGFxdWUnKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29sb3JNb2RlLnVuYmxlbmRlZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBDb2xvck1vZGUuYWxwaGFCbGVuZGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVwdGhNb2RlRm9yU3VibGF5ZXIobjogbnVtYmVyLCBtYXNrOiBEZXB0aE1hc2tUeXBlLCBmdW5jOiA/RGVwdGhGdW5jVHlwZSk6ICRSZWFkT25seTxEZXB0aE1vZGU+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSkgcmV0dXJuIERlcHRoTW9kZS5kaXNhYmxlZDtcbiAgICAgICAgY29uc3QgZGVwdGggPSAxIC0gKCgxICsgdGhpcy5jdXJyZW50TGF5ZXIpICogdGhpcy5udW1TdWJsYXllcnMgKyBuKSAqIHRoaXMuZGVwdGhFcHNpbG9uO1xuICAgICAgICByZXR1cm4gbmV3IERlcHRoTW9kZShmdW5jIHx8IHRoaXMuY29udGV4dC5nbC5MRVFVQUwsIG1hc2ssIFtkZXB0aCwgZGVwdGhdKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRoZSBvcGFxdWUgcGFzcyBhbmQgM0QgbGF5ZXJzIGJvdGggdXNlIHRoZSBkZXB0aCBidWZmZXIuXG4gICAgICogTGF5ZXJzIGRyYXduIGFib3ZlIDNEIGxheWVycyBuZWVkIHRvIGJlIGRyYXduIHVzaW5nIHRoZVxuICAgICAqIHBhaW50ZXIncyBhbGdvcml0aG0gc28gdGhhdCB0aGV5IGFwcGVhciBhYm92ZSAzRCBmZWF0dXJlcy5cbiAgICAgKiBUaGlzIHJldHVybnMgdHJ1ZSBmb3IgbGF5ZXJzIHRoYXQgY2FuIGJlIGRyYXduIHVzaW5nIHRoZVxuICAgICAqIG9wYXF1ZSBwYXNzLlxuICAgICAqL1xuICAgIG9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRMYXllciA8IHRoaXMub3BhcXVlUGFzc0N1dG9mZjtcbiAgICB9XG5cbiAgICByZW5kZXIoc3R5bGU6IFN0eWxlLCBvcHRpb25zOiBQYWludGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5saW5lQXRsYXMgPSBzdHlsZS5saW5lQXRsYXM7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeSA9IHN0eWxlLmltYWdlTWFuYWdlckZhY3Rvcnk7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyID0gc3R5bGUuZ2x5cGhNYW5hZ2VyO1xuXG4gICAgICAgIHRoaXMuc3ltYm9sRmFkZUNoYW5nZSA9IHN0eWxlLnBsYWNlbWVudC5zeW1ib2xGYWRlQ2hhbmdlKGJyb3dzZXIubm93KCkpO1xuXG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyRmFjdG9yeS5iZWdpbkZyYW1lKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJJZHMgPSB0aGlzLnN0eWxlLl9vcmRlcjtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXM7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZS51c2VkKSB7XG4gICAgICAgICAgICAgICAgc291cmNlQ2FjaGUucHJlcGFyZSh0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29vcmRzQXNjZW5kaW5nOiB7W186IHN0cmluZ106IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSA9IHt9O1xuICAgICAgICBjb25zdCBjb29yZHNEZXNjZW5kaW5nOiB7W186IHN0cmluZ106IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSA9IHt9O1xuICAgICAgICBjb25zdCBjb29yZHNEZXNjZW5kaW5nU3ltYm9sOiB7W186IHN0cmluZ106IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgICAgICBjb29yZHNBc2NlbmRpbmdbaWRdID0gc291cmNlQ2FjaGUuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCk7XG4gICAgICAgICAgICBjb29yZHNEZXNjZW5kaW5nW2lkXSA9IGNvb3Jkc0FzY2VuZGluZ1tpZF0uc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgICAgICAgICBjb29yZHNEZXNjZW5kaW5nU3ltYm9sW2lkXSA9IHNvdXJjZUNhY2hlLmdldFZpc2libGVDb29yZGluYXRlcyh0cnVlKS5yZXZlcnNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wYXF1ZVBhc3NDdXRvZmYgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IGxheWVySWRzW2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkXS5pczNEKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wYXF1ZVBhc3NDdXRvZmYgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2Zmc2NyZWVuIHBhc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gV2UgZmlyc3QgZG8gYWxsIHJlbmRlcmluZyB0aGF0IHJlcXVpcmVzIHJlbmRlcmluZyB0byBhIHNlcGFyYXRlXG4gICAgICAgIC8vIGZyYW1lYnVmZmVyLCBhbmQgdGhlbiBzYXZlIHRob3NlIGZvciByZW5kZXJpbmcgYmFjayB0byB0aGUgbWFwXG4gICAgICAgIC8vIGxhdGVyOiBpbiBkb2luZyB0aGlzIHdlIGF2b2lkIGRvaW5nIGV4cGVuc2l2ZSBmcmFtZWJ1ZmZlciByZXN0b3Jlcy5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ29mZnNjcmVlbic7XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIGxheWVySWRzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGlmICghbGF5ZXIuaGFzT2Zmc2NyZWVuUGFzcygpIHx8IGxheWVyLmlzSGlkZGVuKHRoaXMudHJhbnNmb3JtLnpvb20pKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gY29vcmRzRGVzY2VuZGluZ1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdjdXN0b20nICYmICFjb29yZHMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBzb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXSwgbGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWJpbmQgdGhlIG1haW4gZnJhbWVidWZmZXIgbm93IHRoYXQgYWxsIG9mZnNjcmVlbiBsYXllcnMgaGF2ZSBiZWVuIHJlbmRlcmVkOlxuICAgICAgICB0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChudWxsKTtcblxuICAgICAgICAvLyBDbGVhciBidWZmZXJzIGluIHByZXBhcmF0aW9uIGZvciBkcmF3aW5nIHRvIHRoZSBtYWluIGZyYW1lYnVmZmVyXG4gICAgICAgIHRoaXMuY29udGV4dC5jbGVhcih7Y29sb3I6IG9wdGlvbnMuc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gQ29sb3IuYmxhY2sgOiBDb2xvci50cmFuc3BhcmVudCwgZGVwdGg6IDF9KTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwoKTtcblxuICAgICAgICB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPSBvcHRpb25zLnNob3dPdmVyZHJhd0luc3BlY3RvcjtcbiAgICAgICAgdGhpcy5kZXB0aFJhbmdlRm9yM0QgPSBbMCwgMSAtICgoc3R5bGUuX29yZGVyLmxlbmd0aCArIDIpICogdGhpcy5udW1TdWJsYXllcnMgKiB0aGlzLmRlcHRoRXBzaWxvbildO1xuXG4gICAgICAgIC8vIE9wYXF1ZSBwYXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERyYXcgb3BhcXVlIGxheWVycyB0b3AtdG8tYm90dG9tIGZpcnN0LlxuICAgICAgICB0aGlzLnJlbmRlclBhc3MgPSAnb3BhcXVlJztcblxuICAgICAgICBmb3IgKHRoaXMuY3VycmVudExheWVyID0gbGF5ZXJJZHMubGVuZ3RoIC0gMTsgdGhpcy5jdXJyZW50TGF5ZXIgPj0gMDsgdGhpcy5jdXJyZW50TGF5ZXItLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbdGhpcy5jdXJyZW50TGF5ZXJdXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV07XG4gICAgICAgICAgICBjb25zdCBjb29yZHMgPSBjb29yZHNBc2NlbmRpbmdbbGF5ZXIuc291cmNlXTtcblxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MobGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYW5zbHVjZW50IHBhc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRHJhdyBhbGwgb3RoZXIgbGF5ZXJzIGJvdHRvbS10by10b3AuXG4gICAgICAgIHRoaXMucmVuZGVyUGFzcyA9ICd0cmFuc2x1Y2VudCc7XG5cbiAgICAgICAgZm9yICh0aGlzLmN1cnJlbnRMYXllciA9IDA7IHRoaXMuY3VycmVudExheWVyIDwgbGF5ZXJJZHMubGVuZ3RoOyB0aGlzLmN1cnJlbnRMYXllcisrKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkc1t0aGlzLmN1cnJlbnRMYXllcl1dO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXTtcblxuICAgICAgICAgICAgLy8gRm9yIHN5bWJvbCBsYXllcnMgaW4gdGhlIHRyYW5zbHVjZW50IHBhc3MsIHdlIGFkZCBleHRyYSB0aWxlcyB0byB0aGUgcmVuZGVyYWJsZSBzZXRcbiAgICAgICAgICAgIC8vIGZvciBjcm9zcy10aWxlIHN5bWJvbCBmYWRpbmcuIFN5bWJvbCBsYXllcnMgZG9uJ3QgdXNlIHRpbGUgY2xpcHBpbmcsIHNvIG5vIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgICAgICAvLyBzZXBhcmF0ZSBjbGlwcGluZyBtYXNrc1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnID8gY29vcmRzRGVzY2VuZGluZ1N5bWJvbCA6IGNvb3Jkc0Rlc2NlbmRpbmcpW2xheWVyLnNvdXJjZV07XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGxheWVyLCBjb29yZHNBc2NlbmRpbmdbbGF5ZXIuc291cmNlXSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1RpbGVCb3VuZGFyaWVzKSB7XG4gICAgICAgICAgICAvL1VzZSBzb3VyY2Ugd2l0aCBoaWdoZXN0IG1heHpvb21cbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFNvdXJjZTtcbiAgICAgICAgICAgIGxldCBzb3VyY2VDYWNoZTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVycyA9IHZhbHVlcyh0aGlzLnN0eWxlLl9sYXllcnMpO1xuICAgICAgICAgICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAmJiAhbGF5ZXIuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAhPT0gKHNvdXJjZUNhY2hlICYmIHNvdXJjZUNhY2hlLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2FjaGUgPSB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTb3VyY2UgfHwgKHNlbGVjdGVkU291cmNlLmdldFNvdXJjZSgpLm1heHpvb20gPCBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5tYXh6b29tKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTb3VyY2UgPSBzb3VyY2VDYWNoZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkU291cmNlKSB7XG4gICAgICAgICAgICAgICAgZHJhdy5kZWJ1Zyh0aGlzLCBzZWxlY3RlZFNvdXJjZSwgc2VsZWN0ZWRTb3VyY2UuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93UGFkZGluZykge1xuICAgICAgICAgICAgZHJhd0RlYnVnUGFkZGluZyh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkZWZhdWx0cyBmb3IgbW9zdCBHTCB2YWx1ZXMgc28gdGhhdCBhbnlvbmUgdXNpbmcgdGhlIHN0YXRlIGFmdGVyIHRoZSByZW5kZXJcbiAgICAgICAgLy8gZW5jb3VudGVycyBtb3JlIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgICAgdGhpcy5jb250ZXh0LnNldERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICByZW5kZXJMYXllcihwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgICAgIGlmIChsYXllci5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSkgcmV0dXJuO1xuICAgICAgICBpZiAobGF5ZXIudHlwZSAhPT0gJ2JhY2tncm91bmQnICYmIGxheWVyLnR5cGUgIT09ICdjdXN0b20nICYmICFjb29yZHMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMuaWQgPSBsYXllci5pZDtcblxuICAgICAgICB0aGlzLmdwdVRpbWluZ1N0YXJ0KGxheWVyKTtcbiAgICAgICAgZHJhd1tsYXllci50eXBlXShwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgdGhpcy5zdHlsZS5wbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzKTtcbiAgICAgICAgdGhpcy5ncHVUaW1pbmdFbmQoKTtcbiAgICB9XG5cbiAgICBncHVUaW1pbmdTdGFydChsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncHVUaW1pbmcpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgIC8vIFRoaXMgdHJpZXMgdG8gdGltZSB0aGUgZHJhdyBjYWxsIGl0c2VsZiwgYnV0IG5vdGUgdGhhdCB0aGUgY29zdCBmb3IgZHJhd2luZyBhIGxheWVyXG4gICAgICAgIC8vIG1heSBiZSBkb21pbmF0ZWQgYnkgdGhlIGNvc3Qgb2YgdXBsb2FkaW5nIHZlcnRpY2VzIHRvIHRoZSBHUFUuXG4gICAgICAgIC8vIFRvIGluc3RydW1lbnQgdGhhdCwgd2UnZCBuZWVkIHRvIHBhc3MgdGhlIGxheWVyVGltZXJzIG9iamVjdCBkb3duIGludG8gdGhlIGJ1Y2tldFxuICAgICAgICAvLyB1cGxvYWRpbmcgbG9naWMuXG4gICAgICAgIGxldCBsYXllclRpbWVyID0gdGhpcy5ncHVUaW1lcnNbbGF5ZXIuaWRdO1xuICAgICAgICBpZiAoIWxheWVyVGltZXIpIHtcbiAgICAgICAgICAgIGxheWVyVGltZXIgPSB0aGlzLmdwdVRpbWVyc1tsYXllci5pZF0gPSB7XG4gICAgICAgICAgICAgICAgY2FsbHM6IDAsXG4gICAgICAgICAgICAgICAgY3B1VGltZTogMCxcbiAgICAgICAgICAgICAgICBxdWVyeTogZXh0LmNyZWF0ZVF1ZXJ5RVhUKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbGF5ZXJUaW1lci5jYWxscysrO1xuICAgICAgICBleHQuYmVnaW5RdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCwgbGF5ZXJUaW1lci5xdWVyeSk7XG4gICAgfVxuXG4gICAgZ3B1VGltaW5nRW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncHVUaW1pbmcpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgIGV4dC5lbmRRdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCk7XG4gICAgfVxuXG4gICAgY29sbGVjdEdwdVRpbWVycygpIHtcbiAgICAgICAgY29uc3QgY3VycmVudExheWVyVGltZXJzID0gdGhpcy5ncHVUaW1lcnM7XG4gICAgICAgIHRoaXMuZ3B1VGltZXJzID0ge307XG4gICAgICAgIHJldHVybiBjdXJyZW50TGF5ZXJUaW1lcnM7XG4gICAgfVxuXG4gICAgcXVlcnlHcHVUaW1lcnMoZ3B1VGltZXJzOiB7W186IHN0cmluZ106IGFueX0pIHtcbiAgICAgICAgY29uc3QgbGF5ZXJzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiBncHVUaW1lcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdwdVRpbWVyID0gZ3B1VGltZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgICAgICBjb25zdCBncHVUaW1lID0gZXh0LmdldFF1ZXJ5T2JqZWN0RVhUKGdwdVRpbWVyLnF1ZXJ5LCBleHQuUVVFUllfUkVTVUxUX0VYVCkgLyAoMTAwMCAqIDEwMDApO1xuICAgICAgICAgICAgZXh0LmRlbGV0ZVF1ZXJ5RVhUKGdwdVRpbWVyLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxheWVyc1tsYXllcklkXSA9IGdwdVRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYSBtYXRyaXggdG8gaW5jb3Jwb3JhdGUgdGhlICotdHJhbnNsYXRlIGFuZCAqLXRyYW5zbGF0ZS1hbmNob3IgcHJvcGVydGllcyBpbnRvIGl0LlxuICAgICAqIEBwYXJhbSBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzIFRydWUgd2hlbiB0aGUgdW5pdHMgYWNjZXB0ZWQgYnkgdGhlIG1hdHJpeCBhcmUgaW4gdmlld3BvcnQgcGl4ZWxzIGluc3RlYWQgb2YgdGlsZSB1bml0cy5cbiAgICAgKiBAcmV0dXJucyB7RmxvYXQzMkFycmF5fSBtYXRyaXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZVBvc01hdHJpeChtYXRyaXg6IEZsb2F0MzJBcnJheSwgdGlsZTogVGlsZSwgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLCB0cmFuc2xhdGVBbmNob3I6ICdtYXAnIHwgJ3ZpZXdwb3J0JywgaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cz86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkgcmV0dXJuIG1hdHJpeDtcblxuICAgICAgICBjb25zdCBhbmdsZSA9IGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgP1xuICAgICAgICAgICAgKHRyYW5zbGF0ZUFuY2hvciA9PT0gJ21hcCcgPyB0aGlzLnRyYW5zZm9ybS5hbmdsZSA6IDApIDpcbiAgICAgICAgICAgICh0cmFuc2xhdGVBbmNob3IgPT09ICd2aWV3cG9ydCcgPyAtdGhpcy50cmFuc2Zvcm0uYW5nbGUgOiAwKTtcblxuICAgICAgICBpZiAoYW5nbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbkEgPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgICAgICAgICBjb25zdCBjb3NBID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICAgICAgdHJhbnNsYXRlID0gW1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVswXSAqIGNvc0EgLSB0cmFuc2xhdGVbMV0gKiBzaW5BLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVswXSAqIHNpbkEgKyB0cmFuc2xhdGVbMV0gKiBjb3NBXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBbXG4gICAgICAgICAgICBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzID8gdHJhbnNsYXRlWzBdIDogcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgdHJhbnNsYXRlWzBdLCB0aGlzLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgIGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgPyB0cmFuc2xhdGVbMV0gOiBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCB0cmFuc2xhdGVbMV0sIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgMFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodHJhbnNsYXRlZE1hdHJpeCwgbWF0cml4LCB0cmFuc2xhdGlvbik7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkTWF0cml4O1xuICAgIH1cblxuICAgIHNhdmVUaWxlVGV4dHVyZSh0ZXh0dXJlOiBUZXh0dXJlKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmVzID0gdGhpcy5fdGlsZVRleHR1cmVzW3RleHR1cmUuc2l6ZVswXV07XG4gICAgICAgIGlmICghdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVUZXh0dXJlc1t0ZXh0dXJlLnNpemVbMF1dID0gW3RleHR1cmVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGV4dHVyZXMucHVzaCh0ZXh0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFRpbGVUZXh0dXJlKHNpemU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0ZXh0dXJlcyA9IHRoaXMuX3RpbGVUZXh0dXJlc1tzaXplXTtcbiAgICAgICAgcmV0dXJuIHRleHR1cmVzICYmIHRleHR1cmVzLmxlbmd0aCA+IDAgPyB0ZXh0dXJlcy5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBwYXR0ZXJuIGltYWdlIGlzIG5lZWRlZCwgYW5kIGlmIGl0IGlzLCB3aGV0aGVyIGl0IGlzIG5vdCBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbmVlZGVkIGltYWdlIGlzIG1pc3NpbmcgYW5kIHJlbmRlcmluZyBuZWVkcyB0byBiZSBza2lwcGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaXNQYXR0ZXJuTWlzc2luZyhpbWFnZTogP0Nyb3NzRmFkZWQ8UmVzb2x2ZWRJbWFnZT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFpbWFnZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWltYWdlLmZyb20gfHwgIWltYWdlLnRvKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaW1hZ2VQb3NBID0gdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LmdldFBhdHRlcm4oaW1hZ2UuZnJvbS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgaW1hZ2VQb3NCID0gdGhpcy5pbWFnZU1hbmFnZXJGYWN0b3J5LmdldFBhdHRlcm4oaW1hZ2UudG8udG9TdHJpbmcoKSk7XG4gICAgICAgIHJldHVybiAhaW1hZ2VQb3NBIHx8ICFpbWFnZVBvc0I7XG4gICAgfVxuXG4gICAgdXNlUHJvZ3JhbShuYW1lOiBzdHJpbmcsIHByb2dyYW1Db25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24pOiBQcm9ncmFtPGFueT4ge1xuICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZSB8fCB7fTtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7bmFtZX0ke3Byb2dyYW1Db25maWd1cmF0aW9uID8gcHJvZ3JhbUNvbmZpZ3VyYXRpb24uY2FjaGVLZXkgOiAnJ30ke3RoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciA/ICcvb3ZlcmRyYXcnIDogJyd9YDtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVba2V5XSA9IG5ldyBQcm9ncmFtKHRoaXMuY29udGV4dCwgbmFtZSwgc2hhZGVyc1tuYW1lXSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sIHByb2dyYW1Vbmlmb3Jtc1tuYW1lXSwgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUmVzZXQgc29tZSBHTCBzdGF0ZSB0byBkZWZhdWx0IHZhbHVlcyB0byBhdm9pZCBoYXJkLXRvLWRlYnVnIGJ1Z3NcbiAgICAgKiBpbiBjdXN0b20gbGF5ZXJzLlxuICAgICAqL1xuICAgIHNldEN1c3RvbUxheWVyRGVmYXVsdHMoKSB7XG4gICAgICAgIC8vIFByZXZlbnQgY3VzdG9tIGxheWVycyBmcm9tIHVuaW50ZW50aW9uYWxseSBtb2RpZnkgdGhlIGxhc3QgVkFPIHVzZWQuXG4gICAgICAgIC8vIEFsbCBvdGhlciBzdGF0ZSBpcyBzdGF0ZSBpcyByZXN0b3JlZCBvbiBpdCdzIG93biwgYnV0IGZvciBWQU9zIGl0J3NcbiAgICAgICAgLy8gc2ltcGxlciB0byB1bmJpbmQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiBWQU9zLlxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG5cbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGlzIHN0YXRlIGlzIG1lYW5pbmdmdWwgYW5kIG9mdGVuIGV4cGVjdGVkLlxuICAgICAgICAvLyBMZWF2aW5nIHRoaXMgc3RhdGUgZGlydHkgY291bGQgY2F1c2UgYSBsb3Qgb2YgY29uZnVzaW9uIGZvciB1c2Vycy5cbiAgICAgICAgdGhpcy5jb250ZXh0LmN1bGxGYWNlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNvbnRleHQucGl4ZWxTdG9yZVVucGFjay5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogU2V0IEdMIHN0YXRlIHRoYXQgaXMgc2hhcmVkIGJ5IGFsbCBsYXllcnMuXG4gICAgICovXG4gICAgc2V0QmFzZVN0YXRlKCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5jb250ZXh0LmN1bGxGYWNlLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5ibGVuZEVxdWF0aW9uLnNldChnbC5GVU5DX0FERCk7XG4gICAgfVxuXG4gICAgaW5pdERlYnVnT3ZlcmxheUNhbnZhcygpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWdPdmVybGF5Q2FudmFzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdPdmVybGF5Q2FudmFzID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMud2lkdGggPSA1MTI7XG4gICAgICAgICAgICB0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcy5oZWlnaHQgPSA1MTI7XG4gICAgICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgICAgIHRoaXMuZGVidWdPdmVybGF5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKHRoaXMuY29udGV4dCwgdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMsIGdsLlJHQkEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5lbXB0eVRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnT3ZlcmxheVRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWludGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt2ZWMzLCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jbGFzcyBGcnVzdHVtIHtcbiAgICBwb2ludHM6IEFycmF5PEFycmF5PG51bWJlcj4+O1xuICAgIHBsYW5lczogQXJyYXk8QXJyYXk8bnVtYmVyPj47XG5cbiAgICBjb25zdHJ1Y3Rvcihwb2ludHNfOiBBcnJheTxBcnJheTxudW1iZXI+PiwgcGxhbmVzXzogQXJyYXk8QXJyYXk8bnVtYmVyPj4pIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHNfO1xuICAgICAgICB0aGlzLnBsYW5lcyA9IHBsYW5lc187XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21JbnZQcm9qZWN0aW9uTWF0cml4KGludlByb2o6IEZsb2F0NjRBcnJheSwgd29ybGRTaXplOiBudW1iZXIsIHpvb206IG51bWJlcik6IEZydXN0dW0ge1xuICAgICAgICBjb25zdCBjbGlwU3BhY2VDb3JuZXJzID0gW1xuICAgICAgICAgICAgWy0xLCAxLCAtMSwgMV0sXG4gICAgICAgICAgICBbIDEsIDEsIC0xLCAxXSxcbiAgICAgICAgICAgIFsgMSwgLTEsIC0xLCAxXSxcbiAgICAgICAgICAgIFstMSwgLTEsIC0xLCAxXSxcbiAgICAgICAgICAgIFstMSwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbIDEsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWyAxLCAtMSwgMSwgMV0sXG4gICAgICAgICAgICBbLTEsIC0xLCAxLCAxXVxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5wb3coMiwgem9vbSk7XG5cbiAgICAgICAgLy8gVHJhbnNmb3JtIGZydXN0dW0gY29ybmVyIHBvaW50cyBmcm9tIGNsaXAgc3BhY2UgdG8gdGlsZSBzcGFjZVxuICAgICAgICBjb25zdCBmcnVzdHVtQ29vcmRzID0gY2xpcFNwYWNlQ29ybmVyc1xuICAgICAgICAgICAgLm1hcCh2ID0+IHZlYzQudHJhbnNmb3JtTWF0NChbXSwgdiwgaW52UHJvaikpXG4gICAgICAgICAgICAubWFwKHYgPT4gdmVjNC5zY2FsZShbXSwgdiwgMS4wIC8gdlszXSAvIHdvcmxkU2l6ZSAqIHNjYWxlKSk7XG5cbiAgICAgICAgY29uc3QgZnJ1c3R1bVBsYW5lUG9pbnRJbmRpY2VzID0gW1xuICAgICAgICAgICAgWzAsIDEsIDJdLCAgLy8gbmVhclxuICAgICAgICAgICAgWzYsIDUsIDRdLCAgLy8gZmFyXG4gICAgICAgICAgICBbMCwgMywgN10sICAvLyBsZWZ0XG4gICAgICAgICAgICBbMiwgMSwgNV0sICAvLyByaWdodFxuICAgICAgICAgICAgWzMsIDIsIDZdLCAgLy8gYm90dG9tXG4gICAgICAgICAgICBbMCwgNCwgNV0gICAvLyB0b3BcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBmcnVzdHVtUGxhbmVzID0gZnJ1c3R1bVBsYW5lUG9pbnRJbmRpY2VzLm1hcCgocDogQXJyYXk8bnVtYmVyPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IHZlYzMuc3ViKFtdLCBmcnVzdHVtQ29vcmRzW3BbMF1dLCBmcnVzdHVtQ29vcmRzW3BbMV1dKTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSB2ZWMzLnN1YihbXSwgZnJ1c3R1bUNvb3Jkc1twWzJdXSwgZnJ1c3R1bUNvb3Jkc1twWzFdXSk7XG4gICAgICAgICAgICBjb25zdCBuID0gdmVjMy5ub3JtYWxpemUoW10sIHZlYzMuY3Jvc3MoW10sIGEsIGIpKTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSAtdmVjMy5kb3QobiwgZnJ1c3R1bUNvb3Jkc1twWzFdXSk7XG4gICAgICAgICAgICByZXR1cm4gbi5jb25jYXQoZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgRnJ1c3R1bShmcnVzdHVtQ29vcmRzLCBmcnVzdHVtUGxhbmVzKTtcbiAgICB9XG59XG5cbmNsYXNzIEFhYmIge1xuICAgIG1pbjogdmVjMztcbiAgICBtYXg6IHZlYzM7XG4gICAgY2VudGVyOiB2ZWMzO1xuXG4gICAgY29uc3RydWN0b3IobWluXzogdmVjMywgbWF4XzogdmVjMykge1xuICAgICAgICB0aGlzLm1pbiA9IG1pbl87XG4gICAgICAgIHRoaXMubWF4ID0gbWF4XztcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB2ZWMzLnNjYWxlKFtdLCB2ZWMzLmFkZChbXSwgdGhpcy5taW4sIHRoaXMubWF4KSwgMC41KTtcbiAgICB9XG5cbiAgICBxdWFkcmFudChpbmRleDogbnVtYmVyKTogQWFiYiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gWyhpbmRleCAlIDIpID09PSAwLCBpbmRleCA8IDJdO1xuICAgICAgICBjb25zdCBxTWluID0gdmVjMy5jbG9uZSh0aGlzLm1pbik7XG4gICAgICAgIGNvbnN0IHFNYXggPSB2ZWMzLmNsb25lKHRoaXMubWF4KTtcbiAgICAgICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBzcGxpdC5sZW5ndGg7IGF4aXMrKykge1xuICAgICAgICAgICAgcU1pbltheGlzXSA9IHNwbGl0W2F4aXNdID8gdGhpcy5taW5bYXhpc10gOiB0aGlzLmNlbnRlcltheGlzXTtcbiAgICAgICAgICAgIHFNYXhbYXhpc10gPSBzcGxpdFtheGlzXSA/IHRoaXMuY2VudGVyW2F4aXNdIDogdGhpcy5tYXhbYXhpc107XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxldmF0aW9uIGlzIGFsd2F5cyBjb25zdGFudCwgaGVuY2UgcXVhZHJhbnQubWF4LnogPSB0aGlzLm1heC56XG4gICAgICAgIHFNYXhbMl0gPSB0aGlzLm1heFsyXTtcbiAgICAgICAgcmV0dXJuIG5ldyBBYWJiKHFNaW4sIHFNYXgpO1xuICAgIH1cblxuICAgIGRpc3RhbmNlWChwb2ludDogQXJyYXk8bnVtYmVyPik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBvaW50T25BYWJiID0gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5tYXhbMF0sIHBvaW50WzBdKSwgdGhpcy5taW5bMF0pO1xuICAgICAgICByZXR1cm4gcG9pbnRPbkFhYmIgLSBwb2ludFswXTtcbiAgICB9XG5cbiAgICBkaXN0YW5jZVkocG9pbnQ6IEFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBwb2ludE9uQWFiYiA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4WzFdLCBwb2ludFsxXSksIHRoaXMubWluWzFdKTtcbiAgICAgICAgcmV0dXJuIHBvaW50T25BYWJiIC0gcG9pbnRbMV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgYSBmcnVzdHVtLWFhYmIgaW50ZXJzZWN0aW9uIHRlc3QuIFJldHVybnMgMCBpZiB0aGVyZSdzIG5vIGludGVyc2VjdGlvbixcbiAgICAvLyAxIGlmIHNoYXBlcyBhcmUgaW50ZXJzZWN0aW5nIGFuZCAyIGlmIHRoZSBhYWJiIGlmIGZ1bGx5IGluc2lkZSB0aGUgZnJ1c3R1bS5cbiAgICBpbnRlcnNlY3RzKGZydXN0dW06IEZydXN0dW0pOiBudW1iZXIge1xuICAgICAgICAvLyBFeGVjdXRlIHNlcGFyYXRpbmcgYXhpcyB0ZXN0IGJldHdlZW4gdHdvIGNvbnZleCBvYmplY3RzIHRvIGZpbmQgaW50ZXJzZWN0aW9uc1xuICAgICAgICAvLyBFYWNoIGZydXN0dW0gcGxhbmUgdG9nZXRoZXIgd2l0aCAzIG1ham9yIGF4ZXMgZGVmaW5lIHRoZSBzZXBhcmF0aW5nIGF4ZXNcbiAgICAgICAgLy8gTm90ZTogdGVzdCBvbmx5IDQgcG9pbnRzIGFzIGJvdGggbWluIGFuZCBtYXggcG9pbnRzIGhhdmUgZXF1YWwgZWxldmF0aW9uXG4gICAgICAgIGFzc2VydCh0aGlzLm1pblsyXSA9PT0gMCAmJiB0aGlzLm1heFsyXSA9PT0gMCk7XG5cbiAgICAgICAgY29uc3QgYWFiYlBvaW50cyA9IFtcbiAgICAgICAgICAgIFt0aGlzLm1pblswXSwgdGhpcy5taW5bMV0sIDAuMCwgMV0sXG4gICAgICAgICAgICBbdGhpcy5tYXhbMF0sIHRoaXMubWluWzFdLCAwLjAsIDFdLFxuICAgICAgICAgICAgW3RoaXMubWF4WzBdLCB0aGlzLm1heFsxXSwgMC4wLCAxXSxcbiAgICAgICAgICAgIFt0aGlzLm1pblswXSwgdGhpcy5tYXhbMV0sIDAuMCwgMV1cbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgZnVsbHlJbnNpZGUgPSB0cnVlO1xuXG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgZnJ1c3R1bS5wbGFuZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYW5lID0gZnJ1c3R1bS5wbGFuZXNbcF07XG4gICAgICAgICAgICBsZXQgcG9pbnRzSW5zaWRlID0gMDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhYWJiUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzSW5zaWRlICs9IHZlYzQuZG90KHBsYW5lLCBhYWJiUG9pbnRzW2ldKSA+PSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocG9pbnRzSW5zaWRlID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXG4gICAgICAgICAgICBpZiAocG9pbnRzSW5zaWRlICE9PSBhYWJiUG9pbnRzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmdWxseUluc2lkZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bGx5SW5zaWRlKVxuICAgICAgICAgICAgcmV0dXJuIDI7XG5cbiAgICAgICAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCAzOyBheGlzKyspIHtcbiAgICAgICAgICAgIGxldCBwcm9qTWluID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICAgIGxldCBwcm9qTWF4ID0gLU51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgZnJ1c3R1bS5wb2ludHMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRQb2ludCA9IGZydXN0dW0ucG9pbnRzW3BdW2F4aXNdIC0gdGhpcy5taW5bYXhpc107XG5cbiAgICAgICAgICAgICAgICBwcm9qTWluID0gTWF0aC5taW4ocHJvak1pbiwgcHJvamVjdGVkUG9pbnQpO1xuICAgICAgICAgICAgICAgIHByb2pNYXggPSBNYXRoLm1heChwcm9qTWF4LCBwcm9qZWN0ZWRQb2ludCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9qTWF4IDwgMCB8fCBwcm9qTWluID4gdGhpcy5tYXhbYXhpc10gLSB0aGlzLm1pbltheGlzXSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbn1cbmV4cG9ydCB7XG4gICAgQWFiYixcbiAgICBGcnVzdHVtXG59O1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7bnVtYmVyfSBmcm9tIFwiLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlXCI7XG5pbXBvcnQgUG9pbnQgIGZyb20gXCJAbWFwYm94L3BvaW50LWdlb21ldHJ5XCI7XG5pbXBvcnQge2NsYW1wfSBmcm9tIFwiLi4vdXRpbC91dGlsXCI7XG5cbi8qKlxuICogQW4gYEVkZ2VJbnNldGAgb2JqZWN0IHJlcHJlc2VudHMgc2NyZWVuIHNwYWNlIHBhZGRpbmcgYXBwbGllZCB0byB0aGUgZWRnZXMgb2YgdGhlIHZpZXdwb3J0LlxuICogVGhpcyBzaGlmdHMgdGhlIGFwcHJlbnQgY2VudGVyIG9yIHRoZSB2YW5pc2hpbmcgcG9pbnQgb2YgdGhlIG1hcC4gVGhpcyBpcyB1c2VmdWwgZm9yIGFkZGluZyBmbG9hdGluZyBVSSBlbGVtZW50c1xuICogb24gdG9wIG9mIHRoZSBtYXAgYW5kIGhhdmluZyB0aGUgdmFuaXNoaW5nIHBvaW50IHNoaWZ0IGFzIFVJIGVsZW1lbnRzIHJlc2l6ZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3RvcD0wXVxuICogQHBhcmFtIHtudW1iZXJ9IFtib3R0b209MF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVmdD0wXVxuICogQHBhcmFtIHtudW1iZXJ9IFtyaWdodD0wXVxuICovXG5jbGFzcyBFZGdlSW5zZXRzIHtcbiAgICB0b3A6IG51bWJlcjtcbiAgICBib3R0b206IG51bWJlcjtcbiAgICBsZWZ0OiBudW1iZXI7XG4gICAgcmlnaHQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHRvcDogbnVtYmVyID0gMCwgYm90dG9tOiBudW1iZXIgPSAwLCBsZWZ0OiBudW1iZXIgPSAwLCByaWdodDogbnVtYmVyID0gMCkge1xuICAgICAgICBpZiAoaXNOYU4odG9wKSB8fCB0b3AgPCAwIHx8XG4gICAgICAgICAgICBpc05hTihib3R0b20pIHx8IGJvdHRvbSA8IDAgfHxcbiAgICAgICAgICAgIGlzTmFOKGxlZnQpIHx8IGxlZnQgPCAwIHx8XG4gICAgICAgICAgICBpc05hTihyaWdodCkgfHwgcmlnaHQgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBlZGdlLWluc2V0cywgdG9wLCBib3R0b20sIGxlZnQgYW5kIHJpZ2h0IG11c3QgYWxsIGJlIG51bWJlcnMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9wID0gdG9wO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IGJvdHRvbTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludGVycG9sYXRlcyB0aGUgaW5zZXQgaW4tcGxhY2UuXG4gICAgICogVGhpcyBtYWludGFpbnMgdGhlIGN1cnJlbnQgaW5zZXQgdmFsdWUgZm9yIGFueSBpbnNldCBub3QgcHJlc2VudCBpbiBgdGFyZ2V0YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGFkZGluZ09wdGlvbnN9IHRhcmdldFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0XG4gICAgICogQHJldHVybnMge0VkZ2VJbnNldHN9XG4gICAgICogQG1lbWJlcm9mIEVkZ2VJbnNldHNcbiAgICAgKi9cbiAgICBpbnRlcnBvbGF0ZShzdGFydDogUGFkZGluZ09wdGlvbnMgfCBFZGdlSW5zZXRzLCB0YXJnZXQ6IFBhZGRpbmdPcHRpb25zLCB0OiBudW1iZXIpOiBFZGdlSW5zZXRzIHtcbiAgICAgICAgaWYgKHRhcmdldC50b3AgIT0gbnVsbCAmJiBzdGFydC50b3AgIT0gbnVsbCkgdGhpcy50b3AgPSBudW1iZXIoc3RhcnQudG9wLCB0YXJnZXQudG9wLCB0KTtcbiAgICAgICAgaWYgKHRhcmdldC5ib3R0b20gIT0gbnVsbCAmJiBzdGFydC5ib3R0b20gIT0gbnVsbCkgdGhpcy5ib3R0b20gPSBudW1iZXIoc3RhcnQuYm90dG9tLCB0YXJnZXQuYm90dG9tLCB0KTtcbiAgICAgICAgaWYgKHRhcmdldC5sZWZ0ICE9IG51bGwgJiYgc3RhcnQubGVmdCAhPSBudWxsKSB0aGlzLmxlZnQgPSBudW1iZXIoc3RhcnQubGVmdCwgdGFyZ2V0LmxlZnQsIHQpO1xuICAgICAgICBpZiAodGFyZ2V0LnJpZ2h0ICE9IG51bGwgJiYgc3RhcnQucmlnaHQgIT0gbnVsbCkgdGhpcy5yaWdodCA9IG51bWJlcihzdGFydC5yaWdodCwgdGFyZ2V0LnJpZ2h0LCB0KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNvbXB1dGVzIHRoZSBuZXcgYXBwcmVudCBjZW50ZXIgb3IgdmFuaXNoaW5nIHBvaW50IGFmdGVyIGFwcGx5aW5nIGluc2V0cy5cbiAgICAgKiBUaGlzIGlzIGluIHBpeGVscyBhbmQgd2l0aCB0aGUgdG9wIGxlZnQgYmVpbmcgKDAuMCkgYW5kICt5IGJlaW5nIGRvd253YXJkcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9XG4gICAgICogQG1lbWJlcm9mIEVkZ2VJbnNldHNcbiAgICAgKi9cbiAgICBnZXRDZW50ZXIod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQb2ludCB7XG4gICAgICAgIC8vIENsYW1wIGluc2V0cyBzbyB0aGV5IG5ldmVyIG92ZXJmbG93IHdpZHRoL2hlaWdodCBhbmQgYWx3YXlzIGNhbGN1bGF0ZSBhIHZhbGlkIGNlbnRlclxuICAgICAgICBjb25zdCB4ID0gY2xhbXAoKHRoaXMubGVmdCArIHdpZHRoIC0gdGhpcy5yaWdodCkgLyAyLCAwLCB3aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBjbGFtcCgodGhpcy50b3AgKyBoZWlnaHQgLSB0aGlzLmJvdHRvbSkgLyAyLCAwLCBoZWlnaHQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7XG4gICAgfVxuXG4gICAgZXF1YWxzKG90aGVyOiBQYWRkaW5nT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b3AgPT09IG90aGVyLnRvcCAmJlxuICAgICAgICAgICAgdGhpcy5ib3R0b20gPT09IG90aGVyLmJvdHRvbSAmJlxuICAgICAgICAgICAgdGhpcy5sZWZ0ID09PSBvdGhlci5sZWZ0ICYmXG4gICAgICAgICAgICB0aGlzLnJpZ2h0ID09PSBvdGhlci5yaWdodDtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBFZGdlSW5zZXRzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFZGdlSW5zZXRzKHRoaXMudG9wLCB0aGlzLmJvdHRvbSwgdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNkdGF0ZSBhcyBqc29uLCB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBoYXZlIGFcbiAgICAgKiByZWFkLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BhZGRpbmdPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBFZGdlSW5zZXRzXG4gICAgICovXG4gICAgdG9KU09OKCk6IFBhZGRpbmdPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogdGhpcy50b3AsXG4gICAgICAgICAgICBib3R0b206IHRoaXMuYm90dG9tLFxuICAgICAgICAgICAgbGVmdDogdGhpcy5sZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IHRoaXMucmlnaHRcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFBhZGRpbmdPcHRpb25zID0ge3RvcDogP251bWJlciwgYm90dG9tOiA/bnVtYmVyLCByaWdodDogP251bWJlciwgbGVmdDogP251bWJlcn07XG5cbmV4cG9ydCBkZWZhdWx0IEVkZ2VJbnNldHM7XG4iLCIvLyBAZmxvd1xyXG5cclxuaW1wb3J0IExuZ0xhdCBmcm9tICcuL2xuZ19sYXQnO1xyXG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vbG5nX2xhdF9ib3VuZHMnO1xyXG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlLCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdCwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlfSBmcm9tICcuL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xyXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XHJcbmltcG9ydCB7d3JhcCwgY2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XHJcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUnO1xyXG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50JztcclxuaW1wb3J0IHt2ZWM0LCBtYXQ0LCBtYXQyLCB2ZWMyfSBmcm9tICdnbC1tYXRyaXgnO1xyXG5pbXBvcnQge0FhYmIsIEZydXN0dW19IGZyb20gJy4uL3V0aWwvcHJpbWl0aXZlcy5qcyc7XHJcbmltcG9ydCBFZGdlSW5zZXRzIGZyb20gJy4vZWRnZV9pbnNldHMnO1xyXG5cclxuaW1wb3J0IHtVbndyYXBwZWRUaWxlSUQsIE92ZXJzY2FsZWRUaWxlSUQsIENhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQnO1xyXG5pbXBvcnQgdHlwZSB7UGFkZGluZ09wdGlvbnN9IGZyb20gJy4vZWRnZV9pbnNldHMnO1xyXG5cclxuLyoqXHJcbiAqIEEgc2luZ2xlIHRyYW5zZm9ybSwgZ2VuZXJhbGx5IHVzZWQgZm9yIGEgc2luZ2xlIHRpbGUgdG8gYmVcclxuICogc2NhbGVkLCByb3RhdGVkLCBhbmQgem9vbWVkLlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY2xhc3MgVHJhbnNmb3JtIHtcclxuICAgIHRpbGVTaXplOiBudW1iZXI7XHJcbiAgICB0aWxlWm9vbTogbnVtYmVyO1xyXG4gICAgbG5nUmFuZ2U6ID9bbnVtYmVyLCBudW1iZXJdO1xyXG4gICAgbGF0UmFuZ2U6ID9bbnVtYmVyLCBudW1iZXJdO1xyXG4gICAgbWF4VmFsaWRMYXRpdHVkZTogbnVtYmVyO1xyXG4gICAgc2NhbGU6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIGFuZ2xlOiBudW1iZXI7XHJcbiAgICByb3RhdGlvbk1hdHJpeDogRmxvYXQ2NEFycmF5O1xyXG4gICAgem9vbUZyYWN0aW9uOiBudW1iZXI7XHJcbiAgICBwaXhlbHNUb0dMVW5pdHM6IFtudW1iZXIsIG51bWJlcl07XHJcbiAgICBjYW1lcmFUb0NlbnRlckRpc3RhbmNlOiBudW1iZXI7XHJcbiAgICBtZXJjYXRvck1hdHJpeDogQXJyYXk8bnVtYmVyPjtcclxuICAgIHByb2pNYXRyaXg6IEZsb2F0NjRBcnJheTtcclxuICAgIGludlByb2pNYXRyaXg6IEZsb2F0NjRBcnJheTtcclxuICAgIGFsaWduZWRQcm9qTWF0cml4OiBGbG9hdDY0QXJyYXk7XHJcbiAgICBwaXhlbE1hdHJpeDogRmxvYXQ2NEFycmF5O1xyXG4gICAgcGl4ZWxNYXRyaXhJbnZlcnNlOiBGbG9hdDY0QXJyYXk7XHJcbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBsYWJlbFBsYW5lTWF0cml4OiBGbG9hdDMyQXJyYXk7XHJcbiAgICBfZm92OiBudW1iZXI7XHJcbiAgICBfcGl0Y2g6IG51bWJlcjtcclxuICAgIF96b29tOiBudW1iZXI7XHJcbiAgICBfdW5tb2RpZmllZDogYm9vbGVhbjtcclxuICAgIF9yZW5kZXJXb3JsZENvcGllczogYm9vbGVhbjtcclxuICAgIF9taW5ab29tOiBudW1iZXI7XHJcbiAgICBfbWF4Wm9vbTogbnVtYmVyO1xyXG4gICAgX21pblBpdGNoOiBudW1iZXI7XHJcbiAgICBfbWF4UGl0Y2g6IG51bWJlcjtcclxuICAgIF9jZW50ZXI6IExuZ0xhdDtcclxuICAgIF9lZGdlSW5zZXRzOiBFZGdlSW5zZXRzO1xyXG4gICAgX2NvbnN0cmFpbmluZzogYm9vbGVhbjtcclxuICAgIF9wb3NNYXRyaXhDYWNoZToge1tfOiBzdHJpbmddOiBGbG9hdDMyQXJyYXl9O1xyXG4gICAgX2FsaWduZWRQb3NNYXRyaXhDYWNoZToge1tfOiBzdHJpbmddOiBGbG9hdDMyQXJyYXl9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG1pblpvb206ID9udW1iZXIsIG1heFpvb206ID9udW1iZXIsIG1pblBpdGNoOiA/bnVtYmVyLCBtYXhQaXRjaDogP251bWJlciwgcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW4gfCB2b2lkLCBtYXhCb3VuZHMsIGNycykge1xyXG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7IC8vIGNvbnN0YW50XHJcbiAgICAgICAgdGhpcy5tYXhWYWxpZExhdGl0dWRlID0gODUuMDUxMTI5OyAvLyBjb25zdGFudFxyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyA9IHJlbmRlcldvcmxkQ29waWVzID09PSB1bmRlZmluZWQgPyB0cnVlIDogcmVuZGVyV29ybGRDb3BpZXM7XHJcbiAgICAgICAgdGhpcy5fbWluWm9vbSA9IG1pblpvb20gfHwgMDtcclxuICAgICAgICB0aGlzLl9tYXhab29tID0gbWF4Wm9vbSB8fCAyMjtcclxuXHJcbiAgICAgICAgdGhpcy5fbWluUGl0Y2ggPSAobWluUGl0Y2ggPT09IHVuZGVmaW5lZCB8fCBtaW5QaXRjaCA9PT0gbnVsbCkgPyAwIDogbWluUGl0Y2g7XHJcbiAgICAgICAgdGhpcy5fbWF4UGl0Y2ggPSAobWF4UGl0Y2ggPT09IHVuZGVmaW5lZCB8fCBtYXhQaXRjaCA9PT0gbnVsbCkgPyA2MCA6IG1heFBpdGNoO1xyXG5cclxuICAgICAgICB0aGlzLnNldE1heEJvdW5kcygpO1xyXG4gICAgICAgIGlmIChjcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDUlMoY3JzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMuX2NlbnRlciA9IG5ldyBMbmdMYXQoMCwgMCk7XHJcbiAgICAgICAgdGhpcy56b29tID0gMDtcclxuICAgICAgICB0aGlzLmFuZ2xlID0gMDtcclxuICAgICAgICB0aGlzLl9mb3YgPSAwLjY0MzUwMTEwODc5MzI4NDQ7XHJcbiAgICAgICAgdGhpcy5fcGl0Y2ggPSAwO1xyXG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VkZ2VJbnNldHMgPSBuZXcgRWRnZUluc2V0cygpO1xyXG4gICAgICAgIHRoaXMuX3Bvc01hdHJpeENhY2hlID0ge307XHJcbiAgICAgICAgdGhpcy5fYWxpZ25lZFBvc01hdHJpeENhY2hlID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgY2xvbmUoKTogVHJhbnNmb3JtIHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IG5ldyBUcmFuc2Zvcm0odGhpcy5fbWluWm9vbSwgdGhpcy5fbWF4Wm9vbSwgdGhpcy5fbWluUGl0Y2gsIHRoaXMubWF4UGl0Y2gsIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzLCBudWxsLCB0aGlzLmNycyk7XHJcbiAgICAgICAgY2xvbmUudGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xyXG4gICAgICAgIGNsb25lLmxhdFJhbmdlID0gdGhpcy5sYXRSYW5nZTtcclxuICAgICAgICBjbG9uZS53aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgY2xvbmUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcbiAgICAgICAgY2xvbmUuX2NlbnRlciA9IHRoaXMuX2NlbnRlcjtcclxuICAgICAgICBjbG9uZS56b29tID0gdGhpcy56b29tO1xyXG4gICAgICAgIGNsb25lLmFuZ2xlID0gdGhpcy5hbmdsZTtcclxuICAgICAgICBjbG9uZS5fZm92ID0gdGhpcy5fZm92O1xyXG4gICAgICAgIGNsb25lLl9waXRjaCA9IHRoaXMuX3BpdGNoO1xyXG4gICAgICAgIGNsb25lLl91bm1vZGlmaWVkID0gdGhpcy5fdW5tb2RpZmllZDtcclxuICAgICAgICBjbG9uZS5fZWRnZUluc2V0cyA9IHRoaXMuX2VkZ2VJbnNldHMuY2xvbmUoKTtcclxuICAgICAgICBjbG9uZS5fY2FsY01hdHJpY2VzKCk7XHJcbiAgICAgICAgcmV0dXJuIGNsb25lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENSUygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jcnM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q1JTKGNycykge1xyXG4gICAgICAgIHRoaXMuY3JzID0gY3JzO1xyXG4gICAgICAgIHRoaXMuaW5kZXhFeHRlbnQgPSBjcnMuZ2V0RXh0ZW50KCk7XHJcbiAgICAgICAgdGhpcy53b3JsZFdpZHRoID0gdGhpcy5pbmRleEV4dGVudFsyXSAtIHRoaXMuaW5kZXhFeHRlbnRbMF07XHJcbiAgICAgICAgdGhpcy53b3JsZEhlaWdodCA9IHRoaXMuaW5kZXhFeHRlbnRbM10gLSB0aGlzLmluZGV4RXh0ZW50WzFdO1xyXG4gICAgICAgIHRoaXMuY2VudGVyWCA9ICh0aGlzLmluZGV4RXh0ZW50WzJdICsgdGhpcy5pbmRleEV4dGVudFswXSkgLyAyO1xyXG4gICAgICAgIHRoaXMuY2VudGVyWSA9ICh0aGlzLmluZGV4RXh0ZW50WzNdICsgdGhpcy5pbmRleEV4dGVudFsxXSkgLyAyO1xyXG4gICAgICAgIHRoaXMub3JpZ2luWCA9IHRoaXMuaW5kZXhFeHRlbnRbMF07XHJcbiAgICAgICAgdGhpcy5vcmlnaW5ZID0gdGhpcy5pbmRleEV4dGVudFszXTtcclxuICAgICAgICB0aGlzLmNycy5yZW5kZXJXb3JsZENvcGllcyA9IHRoaXMucmVuZGVyV29ybGRDb3BpZXM7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldCBtaW5ab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9taW5ab29tOyB9XHJcbiAgICBzZXQgbWluWm9vbSh6b29tOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fbWluWm9vbSA9PT0gem9vbSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX21pblpvb20gPSB6b29tO1xyXG4gICAgICAgIHRoaXMuem9vbSA9IE1hdGgubWF4KHRoaXMuem9vbSwgem9vbSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1heFpvb20oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX21heFpvb207IH1cclxuICAgIHNldCBtYXhab29tKHpvb206IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhab29tID09PSB6b29tKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fbWF4Wm9vbSA9IHpvb207XHJcbiAgICAgICAgdGhpcy56b29tID0gTWF0aC5taW4odGhpcy56b29tLCB6b29tKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWluUGl0Y2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX21pblBpdGNoOyB9XHJcbiAgICBzZXQgbWluUGl0Y2gocGl0Y2g6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9taW5QaXRjaCA9PT0gcGl0Y2gpIHJldHVybjtcclxuICAgICAgICB0aGlzLl9taW5QaXRjaCA9IHBpdGNoO1xyXG4gICAgICAgIHRoaXMucGl0Y2ggPSBNYXRoLm1heCh0aGlzLnBpdGNoLCBwaXRjaCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1heFBpdGNoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9tYXhQaXRjaDsgfVxyXG4gICAgc2V0IG1heFBpdGNoKHBpdGNoOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4UGl0Y2ggPT09IHBpdGNoKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fbWF4UGl0Y2ggPSBwaXRjaDtcclxuICAgICAgICB0aGlzLnBpdGNoID0gTWF0aC5taW4odGhpcy5waXRjaCwgcGl0Y2gpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByZW5kZXJXb3JsZENvcGllcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzOyB9XHJcbiAgICBzZXQgcmVuZGVyV29ybGRDb3BpZXMocmVuZGVyV29ybGRDb3BpZXM/OiA/Ym9vbGVhbikge1xyXG4gICAgICAgIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlbmRlcldvcmxkQ29waWVzID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyA9IHJlbmRlcldvcmxkQ29waWVzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB3b3JsZFNpemUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50aWxlU2l6ZSAqIHRoaXMuc2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNlbnRlck9mZnNldCgpOiBQb2ludCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VudGVyUG9pbnQuX3N1Yih0aGlzLnNpemUuX2RpdigyKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpemUoKTogUG9pbnQge1xyXG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBiZWFyaW5nKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIC10aGlzLmFuZ2xlIC8gTWF0aC5QSSAqIDE4MDtcclxuICAgIH1cclxuICAgIHNldCBiZWFyaW5nKGJlYXJpbmc6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGIgPSAtd3JhcChiZWFyaW5nLCAtMTgwLCAxODApICogTWF0aC5QSSAvIDE4MDtcclxuICAgICAgICBpZiAodGhpcy5hbmdsZSA9PT0gYikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFuZ2xlID0gYjtcclxuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcclxuXHJcbiAgICAgICAgLy8gMngyIG1hdHJpeCBmb3Igcm90YXRpbmcgcG9pbnRzXHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IG1hdDIuY3JlYXRlKCk7XHJcbiAgICAgICAgbWF0Mi5yb3RhdGUodGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5hbmdsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBpdGNoKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpdGNoIC8gTWF0aC5QSSAqIDE4MDtcclxuICAgIH1cclxuICAgIHNldCBwaXRjaChwaXRjaDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgcCA9IGNsYW1wKHBpdGNoLCB0aGlzLm1pblBpdGNoLCB0aGlzLm1heFBpdGNoKSAvIDE4MCAqIE1hdGguUEk7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoID09PSBwKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3BpdGNoID0gcDtcclxuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm92KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvdiAvIE1hdGguUEkgKiAxODA7XHJcbiAgICB9XHJcbiAgICBzZXQgZm92KGZvdjogbnVtYmVyKSB7XHJcbiAgICAgICAgZm92ID0gTWF0aC5tYXgoMC4wMSwgTWF0aC5taW4oNjAsIGZvdikpO1xyXG4gICAgICAgIGlmICh0aGlzLl9mb3YgPT09IGZvdikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9mb3YgPSBmb3YgLyAxODAgKiBNYXRoLlBJO1xyXG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB6b29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl96b29tOyB9XHJcbiAgICBzZXQgem9vbSh6b29tOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB6ID0gTWF0aC5taW4oTWF0aC5tYXgoem9vbSwgdGhpcy5taW5ab29tKSwgdGhpcy5tYXhab29tKTtcclxuICAgICAgICBpZiAodGhpcy5fem9vbSA9PT0geikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl96b29tID0gejtcclxuICAgICAgICB0aGlzLnNjYWxlID0gdGhpcy56b29tU2NhbGUoeik7XHJcbiAgICAgICAgdGhpcy50aWxlWm9vbSA9IE1hdGguZmxvb3Ioeik7XHJcbiAgICAgICAgdGhpcy56b29tRnJhY3Rpb24gPSB6IC0gdGhpcy50aWxlWm9vbTtcclxuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcclxuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2VudGVyKCk6IExuZ0xhdCB7IHJldHVybiB0aGlzLl9jZW50ZXI7IH1cclxuICAgIHNldCBjZW50ZXIoY2VudGVyOiBMbmdMYXQpIHtcclxuICAgICAgICBpZiAoY2VudGVyLmxhdCA9PT0gdGhpcy5fY2VudGVyLmxhdCAmJiBjZW50ZXIubG5nID09PSB0aGlzLl9jZW50ZXIubG5nKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NlbnRlciA9IGNlbnRlcjtcclxuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcclxuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGFkZGluZygpOiBQYWRkaW5nT3B0aW9ucyB7IHJldHVybiB0aGlzLl9lZGdlSW5zZXRzLnRvSlNPTigpOyB9XHJcbiAgICBzZXQgcGFkZGluZyhwYWRkaW5nOiBQYWRkaW5nT3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0aGlzLl9lZGdlSW5zZXRzLmVxdWFscyhwYWRkaW5nKSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcclxuICAgICAgICAvL1VwZGF0ZSBlZGdlLWluc2V0cyBpbnBsYWNlXHJcbiAgICAgICAgdGhpcy5fZWRnZUluc2V0cy5pbnRlcnBvbGF0ZSh0aGlzLl9lZGdlSW5zZXRzLCBwYWRkaW5nLCAxKTtcclxuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbiBpbiBwaXhlbHMgd2l0aCB0aGUgdG9wLWxlZnQgY29ybmVyIGJlaW5nICgwLDApXHJcbiAgICAgKiBhbmQgK3kgYXhpcyBwb2ludGluZyBkb3dud2FyZHMuIFRoaXMgYWNjb3VudHMgZm9yIHBhZGRpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7UG9pbnR9XHJcbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmb3JtXHJcbiAgICAgKi9cclxuICAgIGdldCBjZW50ZXJQb2ludCgpOiBQb2ludCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMuZ2V0Q2VudGVyKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgaWYgdGhlIHBhZGRpbmcgcGFyYW1zIG1hdGNoXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQYWRkaW5nT3B0aW9uc30gcGFkZGluZ1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmb3JtXHJcbiAgICAgKi9cclxuICAgIGlzUGFkZGluZ0VxdWFsKHBhZGRpbmc6IFBhZGRpbmdPcHRpb25zKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMuZXF1YWxzKHBhZGRpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIG1ldGhvZCB0byB1cGFkdGUgZWRnZS1pbnNldHMgaW5wbGFjZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGFkZGluZ09wdGlvbnN9IHRhcmdldFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRcclxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zvcm1cclxuICAgICAqL1xyXG4gICAgaW50ZXJwb2xhdGVQYWRkaW5nKHN0YXJ0OiBQYWRkaW5nT3B0aW9ucywgdGFyZ2V0OiBQYWRkaW5nT3B0aW9ucywgdDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2VkZ2VJbnNldHMuaW50ZXJwb2xhdGUoc3RhcnQsIHRhcmdldCwgdCk7XHJcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XHJcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSB6b29tIGxldmVsIHRoYXQgd2lsbCBjb3ZlciBhbGwgdGlsZXMgdGhlIHRyYW5zZm9ybVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb3B0aW9uc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemUgVGlsZSBzaXplLCBleHByZXNzZWQgaW4gc2NyZWVuIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5yb3VuZFpvb20gVGFyZ2V0IHpvb20gbGV2ZWwuIElmIHRydWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHJvdW5kZWQgdG8gdGhlIGNsb3Nlc3QgaW50ZWdlci4gT3RoZXJ3aXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGZsb29yZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSB6b29tIGxldmVsIEFuIGludGVnZXIgem9vbSBsZXZlbCBhdCB3aGljaCBhbGwgdGlsZXMgd2lsbCBiZSB2aXNpYmxlLlxyXG4gICAgICovXHJcbiAgICBjb3ZlcmluZ1pvb21MZXZlbChvcHRpb25zOiB7cm91bmRab29tPzogYm9vbGVhbiwgdGlsZVNpemU6IG51bWJlcn0pIHtcclxuICAgICAgICBjb25zdCB6ID0gKG9wdGlvbnMucm91bmRab29tID8gTWF0aC5yb3VuZCA6IE1hdGguZmxvb3IpKFxyXG4gICAgICAgICAgICB0aGlzLnpvb20gKyB0aGlzLnNjYWxlWm9vbSh0aGlzLnRpbGVTaXplIC8gb3B0aW9ucy50aWxlU2l6ZSlcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIEF0IG5lZ2F0aXZlIHpvb20gbGV2ZWxzIGxvYWQgdGlsZXMgZnJvbSB6MCBiZWNhdXNlIG5lZ2F0aXZlIHRpbGUgem9vbSBsZXZlbHMgZG9uJ3QgZXhpc3QuXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHopO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGFueSBcIndyYXBwZWRcIiBjb3BpZXMgb2YgYSBnaXZlbiB0aWxlIGNvb3JkaW5hdGUgdGhhdCBhcmUgdmlzaWJsZVxyXG4gICAgICogaW4gdGhlIGN1cnJlbnQgdmlldy5cclxuICAgICAqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBnZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXModGlsZUlEOiBDYW5vbmljYWxUaWxlSUQpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbbmV3IFVud3JhcHBlZFRpbGVJRCgwLCB0aWxlSUQpXTtcclxuICAgICAgICBpZiAodGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdXRsID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIDApKTtcclxuICAgICAgICAgICAgY29uc3QgdXRyID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIDApKTtcclxuICAgICAgICAgICAgY29uc3QgdWJsID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHViciA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCgwLCB0aGlzLmhlaWdodCkpO1xyXG4gICAgICAgICAgICBjb25zdCB3MCA9IE1hdGguZmxvb3IoTWF0aC5taW4odXRsLngsIHV0ci54LCB1YmwueCwgdWJyLngpKTtcclxuICAgICAgICAgICAgY29uc3QgdzEgPSBNYXRoLmZsb29yKE1hdGgubWF4KHV0bC54LCB1dHIueCwgdWJsLngsIHVici54KSk7XHJcblxyXG4gICAgICAgICAgICAvLyBBZGQgYW4gZXh0cmEgY29weSBvZiB0aGUgd29ybGQgb24gZWFjaCBzaWRlIHRvIHByb3Blcmx5IHJlbmRlciBJbWFnZVNvdXJjZXMgYW5kIENhbnZhc1NvdXJjZXMuXHJcbiAgICAgICAgICAgIC8vIEJvdGggc291cmNlcyBkcmF3IG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcmllcyBvZiB0aGUgdGlsZSB0aGF0IFwiY29udGFpbnMgdGhlbVwiIHNvIHdlIG5lZWRcclxuICAgICAgICAgICAgLy8gdG8gYWRkIGV4dHJhIGNvcGllcyBvbiBib3RoIHNpZGVzIGluIGNhc2Ugb2Zmc2NyZWVuIHRpbGVzIG5lZWQgdG8gZHJhdyBpbnRvIG9uLXNjcmVlbiBvbmVzLlxyXG4gICAgICAgICAgICBjb25zdCBleHRyYVdvcmxkQ29weSA9IDE7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCB3ID0gdzAgLSBleHRyYVdvcmxkQ29weTsgdyA8PSB3MSArIGV4dHJhV29ybGRDb3B5OyB3KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh3ID09PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBVbndyYXBwZWRUaWxlSUQodywgdGlsZUlEKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhbGwgY29vcmRpbmF0ZXMgdGhhdCBjb3VsZCBjb3ZlciB0aGlzIHRyYW5zZm9ybSBmb3IgYSBjb3ZlcmluZ1xyXG4gICAgICogem9vbSBsZXZlbC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aWxlU2l6ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMubWluem9vbVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMubWF4em9vbVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJvdW5kWm9vbVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJlcGFyc2VPdmVyc2NhbGVkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucmVuZGVyV29ybGRDb3BpZXNcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPdmVyc2NhbGVkVGlsZUlEPn0gT3ZlcnNjYWxlZFRpbGVJRHNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvdmVyaW5nVGlsZXMoXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICB0aWxlU2l6ZTogbnVtYmVyLFxyXG4gICAgICAgICAgICBtaW56b29tPzogbnVtYmVyLFxyXG4gICAgICAgICAgICBtYXh6b29tPzogbnVtYmVyLFxyXG4gICAgICAgICAgICByb3VuZFpvb20/OiBib29sZWFuLFxyXG4gICAgICAgICAgICByZXBhcnNlT3ZlcnNjYWxlZD86IGJvb2xlYW4sXHJcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzPzogYm9vbGVhblxyXG4gICAgICAgIH1cclxuICAgICk6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+IHtcclxuICAgICAgICBsZXQgeiA9IHRoaXMuY292ZXJpbmdab29tTGV2ZWwob3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsWiA9IHo7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLm1pbnpvb20gIT09IHVuZGVmaW5lZCAmJiB6IDwgb3B0aW9ucy5taW56b29tKSByZXR1cm4gW107XHJcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4em9vbSAhPT0gdW5kZWZpbmVkICYmIHogPiBvcHRpb25zLm1heHpvb20pIHogPSBvcHRpb25zLm1heHpvb207XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbnRlckNvb3JkID0gdGhpcy5jcnMuZnJvbUxuZ0xhdCh0aGlzLmNlbnRlcik7XHJcbiAgICAgICAgY29uc3QgbnVtVGlsZXMgPSBNYXRoLnBvdygyLCB6KTtcclxuICAgICAgICBjb25zdCBjZW50ZXJQb2ludCA9IFtudW1UaWxlcyAqIGNlbnRlckNvb3JkLngsIG51bVRpbGVzICogY2VudGVyQ29vcmQueSwgMF07XHJcbiAgICAgICAgY29uc3QgY2FtZXJhRnJ1c3R1bSA9IEZydXN0dW0uZnJvbUludlByb2plY3Rpb25NYXRyaXgodGhpcy5pbnZQcm9qTWF0cml4LCB0aGlzLndvcmxkU2l6ZSwgeik7XHJcblxyXG4gICAgICAgIC8vIE5vIGNoYW5nZSBvZiBMT0QgYmVoYXZpb3IgZm9yIHBpdGNoIGxvd2VyIHRoYW4gNjAgYW5kIHdoZW4gdGhlcmUgaXMgbm8gdG9wIHBhZGRpbmc6IHJldHVybiBvbmx5IHRpbGUgaWRzIGZyb20gdGhlIHJlcXVlc3RlZCB6b29tIGxldmVsXHJcbiAgICAgICAgbGV0IG1pblpvb20gPSBvcHRpb25zLm1pbnpvb20gfHwgMDtcclxuICAgICAgICAvLyBVc2UgMC4xIGFzIGFuIGVwc2lsb24gdG8gYXZvaWQgZm9yIGV4cGxpY2l0ID09IDAuMCBmbG9hdGluZyBwb2ludCBjaGVja3NcclxuICAgICAgICBpZiAodGhpcy5waXRjaCA8PSA2MC4wICYmIHRoaXMuX2VkZ2VJbnNldHMudG9wIDwgMC4xKVxyXG4gICAgICAgICAgICBtaW5ab29tID0gejtcclxuXHJcbiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIGNlcnRhaW4gbnVtYmVyIG9mIG1heGltdW0gem9vbSBsZXZlbCB0aWxlcyBzdXJyb3VuZGluZyB0aGUgY2VudGVyIGxvY2F0aW9uXHJcbiAgICAgICAgY29uc3QgcmFkaXVzT2ZNYXhMdmxMb2RJblRpbGVzID0gMztcclxuXHJcbiAgICAgICAgY29uc3QgbmV3Um9vdFRpbGUgPSAod3JhcDogbnVtYmVyKTogYW55ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC8vIEFsbCB0aWxlcyBhcmUgb24gemVybyBlbGV2YXRpb24gcGxhbmUgPT4geiBkaWZmZXJlbmNlIGlzIHplcm9cclxuICAgICAgICAgICAgICAgIGFhYmI6IG5ldyBBYWJiKFt3cmFwICogbnVtVGlsZXMsIDAsIDBdLCBbKHdyYXAgKyAxKSAqIG51bVRpbGVzLCBudW1UaWxlcywgMF0pLFxyXG4gICAgICAgICAgICAgICAgem9vbTogMCxcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgd3JhcCxcclxuICAgICAgICAgICAgICAgIGZ1bGx5VmlzaWJsZTogZmFsc2VcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBEbyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCB0byBmaW5kIHZpc2libGUgdGlsZXMgYW5kIHByb3BlciBsZXZlbHMgb2YgZGV0YWlsXHJcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBbXTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgICAgICBjb25zdCBtYXhab29tID0gejtcclxuICAgICAgICBjb25zdCBvdmVyc2NhbGVkWiA9IG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWQgPyBhY3R1YWxaIDogejtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlcldvcmxkQ29waWVzKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbmRlciBjb3B5IG9mIHRoZSBnbG9iZSB0aHJpY2Ugb24gYm90aCBzaWRlc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobmV3Um9vdFRpbGUoLWkpKTtcclxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobmV3Um9vdFRpbGUoaSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFjay5wdXNoKG5ld1Jvb3RUaWxlKDApKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgaXQgPSBzdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgY29uc3QgeCA9IGl0Lng7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSBpdC55O1xyXG4gICAgICAgICAgICBsZXQgZnVsbHlWaXNpYmxlID0gaXQuZnVsbHlWaXNpYmxlO1xyXG5cclxuICAgICAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiBhIHRpbGUgaXMgbm90IHJlcXVpcmVkIGlmIGFueSBvZiBpdHMgYW5jZXN0b3IgaWYgZnVsbHkgaW5zaWRlIHRoZSBmcnVzdHVtXHJcbiAgICAgICAgICAgIGlmICghZnVsbHlWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3RSZXN1bHQgPSBpdC5hYWJiLmludGVyc2VjdHMoY2FtZXJhRnJ1c3R1bSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdFJlc3VsdCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBmdWxseVZpc2libGUgPSBpbnRlcnNlY3RSZXN1bHQgPT09IDI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlWCA9IGl0LmFhYmIuZGlzdGFuY2VYKGNlbnRlclBvaW50KTtcclxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VZID0gaXQuYWFiYi5kaXN0YW5jZVkoY2VudGVyUG9pbnQpO1xyXG4gICAgICAgICAgICBjb25zdCBsb25nZXN0RGltID0gTWF0aC5tYXgoTWF0aC5hYnMoZGlzdGFuY2VYKSwgTWF0aC5hYnMoZGlzdGFuY2VZKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBXZSdyZSB1c2luZyBkaXN0YW5jZSBiYXNlZCBoZXVyaXN0aWNzIHRvIGRldGVybWluZSBpZiBhIHRpbGUgc2hvdWxkIGJlIHNwbGl0IGludG8gcXVhZHJhbnRzIG9yIG5vdC5cclxuICAgICAgICAgICAgLy8gcmFkaXVzT2ZNYXhMdmxMb2RJblRpbGVzIGRlZmluZXMgdGhhdCB0aGVyZSdzIGFsd2F5cyBhIGNlcnRhaW4gbnVtYmVyIG9mIG1heExldmVsIHRpbGVzIG5leHQgdG8gdGhlIG1hcCBjZW50ZXIuXHJcbiAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBmYWN0IHRoYXQgYSBwYXJlbnQgbm9kZSBpbiBxdWFkdHJlZSBpcyB0d2ljZSB0aGUgc2l6ZSBvZiBpdHMgY2hpbGRyZW4gKHBlciBkaW1lbnNpb24pXHJcbiAgICAgICAgICAgIC8vIHdlIGNhbiBkZWZpbmUgZGlzdGFuY2UgdGhyZXNob2xkcyBmb3IgZWFjaCByZWxhdGl2ZSBsZXZlbDpcclxuICAgICAgICAgICAgLy8gZihrKSA9IG9mZnNldCArIDIgKyA0ICsgOCArIDE2ICsgLi4uICsgMl5rLiBUaGlzIGlzIHRoZSBzYW1lIGFzIFwib2Zmc2V0KzJeKGsrMSktMlwiXHJcbiAgICAgICAgICAgIGNvbnN0IGRpc3RUb1NwbGl0ID0gcmFkaXVzT2ZNYXhMdmxMb2RJblRpbGVzICsgKDEgPDwgKG1heFpvb20gLSBpdC56b29tKSkgLSAyO1xyXG5cclxuICAgICAgICAgICAgLy8gSGF2ZSB3ZSByZWFjaGVkIHRoZSB0YXJnZXQgZGVwdGggb3IgaXMgdGhlIHRpbGUgdG9vIGZhciBhd2F5IHRvIGJlIGFueSBzcGxpdCBmdXJ0aGVyP1xyXG4gICAgICAgICAgICBpZiAoaXQuem9vbSA9PT0gbWF4Wm9vbSB8fCAobG9uZ2VzdERpbSA+IGRpc3RUb1NwbGl0ICYmIGl0Lnpvb20gPj0gbWluWm9vbSkpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICB0aWxlSUQ6IG5ldyBPdmVyc2NhbGVkVGlsZUlEKGl0Lnpvb20gPT09IG1heFpvb20gPyBvdmVyc2NhbGVkWiA6IGl0Lnpvb20sIGl0LndyYXAsIGl0Lnpvb20sIHgsIHksIHRoaXMuaW5kZXhFeHRlbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3E6IHZlYzIuc3FyTGVuKFtjZW50ZXJQb2ludFswXSAtIDAuNSAtIHgsIGNlbnRlclBvaW50WzFdIC0gMC41IC0geV0pXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRYID0gKHggPDwgMSkgKyAoaSAlIDIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRZID0gKHkgPDwgMSkgKyAoaSA+PiAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHthYWJiOiBpdC5hYWJiLnF1YWRyYW50KGkpLCB6b29tOiBpdC56b29tICsgMSwgeDogY2hpbGRYLCB5OiBjaGlsZFksIHdyYXA6IGl0LndyYXAsIGZ1bGx5VmlzaWJsZX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEuZGlzdGFuY2VTcSAtIGIuZGlzdGFuY2VTcSkubWFwKGEgPT4gYS50aWxlSUQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgdGhpcy5waXhlbHNUb0dMVW5pdHMgPSBbMiAvIHdpZHRoLCAtMiAvIGhlaWdodF07XHJcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XHJcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHVubW9kaWZpZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl91bm1vZGlmaWVkOyB9XHJcblxyXG4gICAgem9vbVNjYWxlKHpvb206IG51bWJlcikgeyByZXR1cm4gTWF0aC5wb3coMiwgem9vbSk7IH1cclxuICAgIHNjYWxlWm9vbShzY2FsZTogbnVtYmVyKSB7IHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjsgfVxyXG5cclxuICAgIHByb2plY3QobG5nbGF0OiBMbmdMYXQpIHtcclxuICAgICAgICBjb25zdCBsYXQgPSB0aGlzLmxhdFJhbmdlP2NsYW1wKGxuZ2xhdC5sYXQsIC10aGlzLm1heFZhbGlkTGF0aXR1ZGUsIHRoaXMubWF4VmFsaWRMYXRpdHVkZSk6bG5nbGF0LmxhdDtcclxuICAgICAgICBjb25zdCB4eSA9IHRoaXMubG5nTGF0WFkobG5nbGF0LmxuZywgbGF0KTtcclxuICAgICAgICByZXR1cm4gbmV3IFBvaW50KFxyXG4gICAgICAgICAgIHh5WzBdLCB4eVsxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5wcm9qZWN0KHBvaW50OiBQb2ludCk6IExuZ0xhdCB7XHJcbiAgICAgICAgY29uc3QgdW5wcm9qZWN0ID0gdGhpcy54WUxuZ0xhdChwb2ludC54LCBwb2ludC55KTtcclxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdCh1bnByb2plY3RbMF0sIHVucHJvamVjdFsxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBvaW50KCk6IFBvaW50IHsgcmV0dXJuIHRoaXMucHJvamVjdCh0aGlzLmNlbnRlcik7IH1cclxuXHJcbiAgICBsbmdMYXRYWShsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBmb3J3YXJkID0gdGhpcy5jcnMuZnJvbVdHUzg0KFtsbmcsIGxhdF0pO1xyXG4gICAgICAgIHJldHVybiBbKChmb3J3YXJkWzBdIC0gdGhpcy5vcmlnaW5YKSAqIHRoaXMud29ybGRTaXplKSAvIHRoaXMud29ybGRXaWR0aCwgKCh0aGlzLm9yaWdpblkgLSBmb3J3YXJkWzFdKSAqIHRoaXMud29ybGRTaXplKSAvIHRoaXMud29ybGRIZWlnaHRdO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBsYXRpdHVkZSB0byBhYnNvbHV0ZSB4IGNvb3JkXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG9uXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBwaXhlbCBjb29yZGluYXRlXHJcbiAgICAgKi9cclxuICAgIGxuZ1gobG5nOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sbmdMYXRYWShsbmcsIHRoaXMuY2VudGVyLmxhdClbMF07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIGxhdGl0dWRlIHRvIGFic29sdXRlIHkgY29vcmRcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsYXRcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHBpeGVsIGNvb3JkaW5hdGVcclxuICAgICAqL1xyXG4gICAgbGF0WShsYXQ6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxuZ0xhdFhZKHRoaXMuY2VudGVyLmxuZywgbGF0KVsxXTtcclxuICAgIH1cclxuXHJcbiAgICB4WUxuZ0xhdCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNycy50b1dHUzg0KFsoeCAqIHRoaXMud29ybGRXaWR0aCkgLyB0aGlzLndvcmxkU2l6ZSArIHRoaXMub3JpZ2luWCwgdGhpcy5vcmlnaW5ZIC0gKHkgKiB0aGlzLndvcmxkSGVpZ2h0KSAvIHRoaXMud29ybGRTaXplXSk7XHJcbiAgICB9XHJcblxyXG4gICAgeExuZyh4KSB7XHJcbiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5jZW50ZXI7XHJcbiAgICAgICAgY29uc3QgY2VudGVyWFkgPSB0aGlzLmxuZ0xhdFhZKGNlbnRlci5sbmcsIGNlbnRlci5sYXQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnhZTG5nTGF0KHgsIGNlbnRlclhZWzFdKVswXTtcclxuICAgIH1cclxuICAgIHlMYXQoeSkge1xyXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xyXG4gICAgICAgIGNvbnN0IGNlbnRlclhZID0gdGhpcy5sbmdMYXRYWShjZW50ZXIubG5nLCBjZW50ZXIubGF0KTtcclxuICAgICAgICByZXR1cm4gdGhpcy54WUxuZ0xhdChjZW50ZXJYWVswXSwgeSlbMV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TG9jYXRpb25BdFBvaW50KGxuZ2xhdDogTG5nTGF0LCBwb2ludDogUG9pbnQpIHtcclxuICAgICAgICBjb25zdCBhID0gdGhpcy5wb2ludENvb3JkaW5hdGUocG9pbnQpO1xyXG4gICAgICAgIGNvbnN0IGIgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50KTtcclxuICAgICAgICBjb25zdCBsb2MgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpO1xyXG4gICAgICAgIGNvbnN0IG5ld0NlbnRlciA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoXHJcbiAgICAgICAgICAgICAgICBsb2MueCAtIChhLnggLSBiLngpLFxyXG4gICAgICAgICAgICAgICAgbG9jLnkgLSAoYS55IC0gYi55KSk7XHJcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihuZXdDZW50ZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJXb3JsZENvcGllcykge1xyXG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyLndyYXAoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIGxvY2F0aW9uLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XHJcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgbG9jYXRpb25Qb2ludChsbmdsYXQ6IExuZ0xhdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVQb2ludCh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGEgcG9pbnQgb24gc2NyZWVuLCByZXR1cm4gaXRzIGxuZ2xhdFxyXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCBzY3JlZW4gcG9pbnRcclxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IGxuZ2xhdCBsb2NhdGlvblxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcG9pbnRMb2NhdGlvbihwOiBQb2ludCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbih0aGlzLnBvaW50Q29vcmRpbmF0ZShwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHaXZlbiBhIGdlb2dyYXBoaWNhbCBsbmdsYXQsIHJldHVybiBhbiB1bnJvdW5kZWRcclxuICAgICAqIGNvb3JkaW5hdGUgdGhhdCByZXByZXNlbnRzIGl0IGF0IHRoaXMgdHJhbnNmb3JtJ3Mgem9vbSBsZXZlbC5cclxuICAgICAqIEBwYXJhbSB7TG5nTGF0fSBsbmdsYXRcclxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgbG9jYXRpb25Db29yZGluYXRlKGxuZ2xhdDogTG5nTGF0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JzLmZyb21MbmdMYXQobG5nbGF0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGEgQ29vcmRpbmF0ZSwgcmV0dXJuIGl0cyBnZW9ncmFwaGljYWwgcG9zaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXHJcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBsbmdsYXRcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNvb3JkaW5hdGVMb2NhdGlvbihjb29yZDogTWVyY2F0b3JDb29yZGluYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JzLnRvTG5nTGF0KGNvb3JkLngsIGNvb3JkLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvaW50Q29vcmRpbmF0ZShwOiBQb2ludCkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldFogPSAwO1xyXG4gICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3QgcHJvamVjdGVkIHogdmFsdWUgZm9yIHRoZSBwb2ludCxcclxuICAgICAgICAvLyB1bnByb2plY3QgdHdvIHBvaW50cyB0byBnZXQgYSBsaW5lIGFuZCB0aGVuIGZpbmQgdGhlIHBvaW50IG9uIHRoYXRcclxuICAgICAgICAvLyBsaW5lIHdpdGggej0wXHJcblxyXG4gICAgICAgIGNvbnN0IGNvb3JkMCA9IFtwLngsIHAueSwgMCwgMV07XHJcbiAgICAgICAgY29uc3QgY29vcmQxID0gW3AueCwgcC55LCAxLCAxXTtcclxuXHJcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGNvb3JkMCwgY29vcmQwLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XHJcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGNvb3JkMSwgY29vcmQxLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHcwID0gY29vcmQwWzNdO1xyXG4gICAgICAgIGNvbnN0IHcxID0gY29vcmQxWzNdO1xyXG4gICAgICAgIGNvbnN0IHgwID0gY29vcmQwWzBdIC8gdzA7XHJcbiAgICAgICAgY29uc3QgeDEgPSBjb29yZDFbMF0gLyB3MTtcclxuICAgICAgICBjb25zdCB5MCA9IGNvb3JkMFsxXSAvIHcwO1xyXG4gICAgICAgIGNvbnN0IHkxID0gY29vcmQxWzFdIC8gdzE7XHJcbiAgICAgICAgY29uc3QgejAgPSBjb29yZDBbMl0gLyB3MDtcclxuICAgICAgICBjb25zdCB6MSA9IGNvb3JkMVsyXSAvIHcxO1xyXG5cclxuICAgICAgICBjb25zdCB0ID0gejAgPT09IHoxID8gMCA6ICh0YXJnZXRaIC0gejApIC8gKHoxIC0gejApO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcclxuICAgICAgICAgICAgaW50ZXJwb2xhdGUoeDAsIHgxLCB0KSAvIHRoaXMud29ybGRTaXplLFxyXG4gICAgICAgICAgICBpbnRlcnBvbGF0ZSh5MCwgeTEsIHQpIC8gdGhpcy53b3JsZFNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2l2ZW4gYSBjb29yZGluYXRlLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XHJcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXHJcbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgY29vcmRpbmF0ZVBvaW50KGNvb3JkOiBNZXJjYXRvckNvb3JkaW5hdGUpIHtcclxuICAgICAgICBjb25zdCBwID0gW2Nvb3JkLnggKiB0aGlzLndvcmxkU2l6ZSwgY29vcmQueSAqIHRoaXMud29ybGRTaXplLCAwLCAxXTtcclxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocCwgcCwgdGhpcy5waXhlbE1hdHJpeCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChwWzBdIC8gcFszXSwgcFsxXSAvIHBbM10pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy4gV2hlbiB0aGUgYmVhcmluZyBvciBwaXRjaCBpcyBub24temVybywgdGhlIHZpc2libGUgcmVnaW9uIGlzIG5vdFxyXG4gICAgICogYW4gYXhpcy1hbGlnbmVkIHJlY3RhbmdsZSwgYW5kIHRoZSByZXN1bHQgaXMgdGhlIHNtYWxsZXN0IGJvdW5kcyB0aGF0IGVuY29tcGFzc2VzIHRoZSB2aXNpYmxlIHJlZ2lvbi5cclxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFJldHVybnMgYSB7QGxpbmsgTG5nTGF0Qm91bmRzfSBvYmplY3QgZGVzY3JpYmluZyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy5cclxuICAgICAqL1xyXG4gICAgZ2V0Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXRCb3VuZHMoKVxyXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpKVxyXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQodGhpcy53aWR0aCwgMCkpKVxyXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpKSlcclxuICAgICAgICAgICAgLmV4dGVuZCh0aGlzLnBvaW50TG9jYXRpb24obmV3IFBvaW50KDAsIHRoaXMuaGVpZ2h0KSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBnZW9ncmFwaGljYWwgYm91bmRzIHRoZSBtYXAgaXMgY29uc3RyYWluZWQgdG8sIG9yIGBudWxsYCBpZiBub25lIHNldC5cclxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IHtAbGluayBMbmdMYXRCb3VuZHN9XHJcbiAgICAgKi9cclxuICAgIGdldE1heEJvdW5kcygpOiBMbmdMYXRCb3VuZHMgfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMubGF0UmFuZ2UgfHwgdGhpcy5sYXRSYW5nZS5sZW5ndGggIT09IDIgfHxcclxuICAgICAgICAgICAgIXRoaXMubG5nUmFuZ2UgfHwgdGhpcy5sbmdSYW5nZS5sZW5ndGggIT09IDIpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyhbdGhpcy5sbmdSYW5nZVswXSwgdGhpcy5sYXRSYW5nZVswXV0sIFt0aGlzLmxuZ1JhbmdlWzFdLCB0aGlzLmxhdFJhbmdlWzFdXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNvbnN0cmFpbnRzLlxyXG4gICAgICogQHBhcmFtIHtMbmdMYXRCb3VuZHN9IGJvdW5kcyBBIHtAbGluayBMbmdMYXRCb3VuZHN9IG9iamVjdCBkZXNjcmliaW5nIHRoZSBuZXcgZ2VvZ3JhcGhpYyBib3VuZGFyaWVzIG9mIHRoZSBtYXAuXHJcbiAgICAgKi9cclxuICAgIHNldE1heEJvdW5kcyhib3VuZHM/OiBMbmdMYXRCb3VuZHMpIHtcclxuICAgICAgICBpZiAoYm91bmRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG5nUmFuZ2UgPSBbYm91bmRzLmdldFdlc3QoKSwgYm91bmRzLmdldEVhc3QoKV07XHJcbiAgICAgICAgICAgIHRoaXMubGF0UmFuZ2UgPSBbYm91bmRzLmdldFNvdXRoKCksIGJvdW5kcy5nZXROb3J0aCgpXTtcclxuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sbmdSYW5nZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMubGF0UmFuZ2UgPSBbLXRoaXMubWF4VmFsaWRMYXRpdHVkZSwgdGhpcy5tYXhWYWxpZExhdGl0dWRlXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHBvc01hdHJpeCB0aGF0LCBnaXZlbiBhIHRpbGUgY29vcmRpbmF0ZSwgd291bGQgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSB0aWxlIG9uIGEgbWFwLlxyXG4gICAgICogQHBhcmFtIHtVbndyYXBwZWRUaWxlSUR9IHVud3JhcHBlZFRpbGVJRDtcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZVBvc01hdHJpeCh1bndyYXBwZWRUaWxlSUQ6IFVud3JhcHBlZFRpbGVJRCwgYWxpZ25lZDogYm9vbGVhbiA9IGZhbHNlKTogRmxvYXQzMkFycmF5IHtcclxuICAgICAgICBjb25zdCBwb3NNYXRyaXhLZXkgPSB1bndyYXBwZWRUaWxlSUQua2V5O1xyXG4gICAgICAgIGNvbnN0IGNhY2hlID0gYWxpZ25lZCA/IHRoaXMuX2FsaWduZWRQb3NNYXRyaXhDYWNoZSA6IHRoaXMuX3Bvc01hdHJpeENhY2hlO1xyXG4gICAgICAgIGlmIChjYWNoZVtwb3NNYXRyaXhLZXldKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtwb3NNYXRyaXhLZXldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gdW53cmFwcGVkVGlsZUlELmNhbm9uaWNhbDtcclxuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMud29ybGRTaXplIC8gdGhpcy56b29tU2NhbGUoY2Fub25pY2FsLnopO1xyXG4gICAgICAgIGNvbnN0IHVud3JhcHBlZFggPSBjYW5vbmljYWwueCArIE1hdGgucG93KDIsIGNhbm9uaWNhbC56KSAqIHVud3JhcHBlZFRpbGVJRC53cmFwO1xyXG5cclxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcclxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShwb3NNYXRyaXgsIHBvc01hdHJpeCwgW3Vud3JhcHBlZFggKiBzY2FsZSwgY2Fub25pY2FsLnkgKiBzY2FsZSwgMF0pO1xyXG4gICAgICAgIG1hdDQuc2NhbGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtzY2FsZSAvIEVYVEVOVCwgc2NhbGUgLyBFWFRFTlQsIDFdKTtcclxuICAgICAgICBtYXQ0Lm11bHRpcGx5KHBvc01hdHJpeCwgYWxpZ25lZCA/IHRoaXMuYWxpZ25lZFByb2pNYXRyaXggOiB0aGlzLnByb2pNYXRyaXgsIHBvc01hdHJpeCk7XHJcblxyXG4gICAgICAgIGNhY2hlW3Bvc01hdHJpeEtleV0gPSBuZXcgRmxvYXQzMkFycmF5KHBvc01hdHJpeCk7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlW3Bvc01hdHJpeEtleV07XHJcbiAgICB9XHJcblxyXG4gICAgY3VzdG9tTGF5ZXJNYXRyaXgoKTogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWVyY2F0b3JNYXRyaXguc2xpY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBfY29uc3RyYWluKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jZW50ZXIgfHwgIXRoaXMud2lkdGggfHwgIXRoaXMuaGVpZ2h0IHx8IHRoaXMuX2NvbnN0cmFpbmluZykgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgbWluWSA9IC05MDtcclxuICAgICAgICBsZXQgbWF4WSA9IDkwO1xyXG4gICAgICAgIGxldCBtaW5YID0gLTE4MDtcclxuICAgICAgICBsZXQgbWF4WCA9IDE4MDtcclxuICAgICAgICBsZXQgc3ksIHN4LCB4MiwgeTI7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgdW5tb2RpZmllZCA9IHRoaXMuX3VubW9kaWZpZWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxhdFJhbmdlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhdFJhbmdlID0gdGhpcy5sYXRSYW5nZTtcclxuICAgICAgICAgICAgbWluWSA9IHRoaXMubGF0WShsYXRSYW5nZVsxXSk7XHJcbiAgICAgICAgICAgIG1heFkgPSB0aGlzLmxhdFkobGF0UmFuZ2VbMF0pO1xyXG4gICAgICAgICAgICBzeSA9IG1heFkgLSBtaW5ZIDwgc2l6ZS55ID8gc2l6ZS55IC8gKG1heFkgLSBtaW5ZKSA6IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xyXG4gICAgICAgICAgICBjb25zdCBsbmdSYW5nZSA9IHRoaXMubG5nUmFuZ2U7XHJcbiAgICAgICAgICAgIG1pblggPSB0aGlzLmxuZ1gobG5nUmFuZ2VbMF0pO1xyXG4gICAgICAgICAgICBtYXhYID0gdGhpcy5sbmdYKGxuZ1JhbmdlWzFdKTtcclxuICAgICAgICAgICAgc3ggPSBtYXhYIC0gbWluWCA8IHNpemUueCA/IHNpemUueCAvIChtYXhYIC0gbWluWCkgOiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLnBvaW50O1xyXG5cclxuICAgICAgICAvLyBob3cgbXVjaCB0aGUgbWFwIHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIHNjcmVlbiBpbnRvIGdpdmVuIGxhdGl0dWRlL2xvbmdpdHVkZSByYW5nZXNcclxuICAgICAgICBjb25zdCBzID0gTWF0aC5tYXgoc3ggfHwgMCwgc3kgfHwgMCk7XHJcblxyXG4gICAgICAgIGlmIChzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy51bnByb2plY3QobmV3IFBvaW50KFxyXG4gICAgICAgICAgICAgICAgc3ggPyAobWF4WCArIG1pblgpIC8gMiA6IHBvaW50LngsXHJcbiAgICAgICAgICAgICAgICBzeSA/IChtYXhZICsgbWluWSkgLyAyIDogcG9pbnQueSkpO1xyXG4gICAgICAgICAgICB0aGlzLnpvb20gKz0gdGhpcy5zY2FsZVpvb20ocyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB1bm1vZGlmaWVkO1xyXG4gICAgICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF0UmFuZ2UpIHtcclxuICAgICAgICAgICAgY29uc3QgeSA9IHBvaW50LnksXHJcbiAgICAgICAgICAgICAgICBoMiA9IHNpemUueSAvIDI7XHJcblxyXG4gICAgICAgICAgICBpZiAoeSAtIGgyIDwgbWluWSkgeTIgPSBtaW5ZICsgaDI7XHJcbiAgICAgICAgICAgIGlmICh5ICsgaDIgPiBtYXhZKSB5MiA9IG1heFkgLSBoMjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxuZ1JhbmdlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBwb2ludC54LFxyXG4gICAgICAgICAgICAgICAgdzIgPSBzaXplLnggLyAyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHggLSB3MiA8IG1pblgpIHgyID0gbWluWCArIHcyO1xyXG4gICAgICAgICAgICBpZiAoeCArIHcyID4gbWF4WCkgeDIgPSBtYXhYIC0gdzI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwYW4gdGhlIG1hcCBpZiB0aGUgc2NyZWVuIGdvZXMgb2ZmIHRoZSByYW5nZVxyXG4gICAgICAgIGlmICh4MiAhPT0gdW5kZWZpbmVkIHx8IHkyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoXHJcbiAgICAgICAgICAgICAgICB4MiAhPT0gdW5kZWZpbmVkID8geDIgOiBwb2ludC54LFxyXG4gICAgICAgICAgICAgICAgeTIgIT09IHVuZGVmaW5lZCA/IHkyIDogcG9pbnQueSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IHVubW9kaWZpZWQ7XHJcbiAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2NhbGNNYXRyaWNlcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVpZ2h0KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGhhbGZGb3YgPSB0aGlzLl9mb3YgLyAyO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY2VudGVyT2Zmc2V0O1xyXG4gICAgICAgIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSA9IDAuNSAvIE1hdGgudGFuKGhhbGZGb3YpICogdGhpcy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIC8vIEZpbmQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBwb2ludCBbd2lkdGgvMiArIG9mZnNldC54LCBoZWlnaHQvMiArIG9mZnNldC55XSB0byB0aGVcclxuICAgICAgICAvLyBjZW50ZXIgdG9wIHBvaW50IFt3aWR0aC8yICsgb2Zmc2V0LngsIDBdIGluIFogdW5pdHMsIHVzaW5nIHRoZSBsYXcgb2Ygc2luZXMuXHJcbiAgICAgICAgLy8gMSBaIHVuaXQgaXMgZXF1aXZhbGVudCB0byAxIGhvcml6b250YWwgcHggYXQgdGhlIGNlbnRlciBvZiB0aGUgbWFwXHJcbiAgICAgICAgLy8gKHRoZSBkaXN0YW5jZSBiZXR3ZWVuW3dpZHRoLzIsIGhlaWdodC8yXSBhbmQgW3dpZHRoLzIgKyAxLCBoZWlnaHQvMl0pXHJcbiAgICAgICAgY29uc3QgZ3JvdW5kQW5nbGUgPSBNYXRoLlBJIC8gMiArIHRoaXMuX3BpdGNoO1xyXG4gICAgICAgIGNvbnN0IGZvdkFib3ZlQ2VudGVyID0gdGhpcy5fZm92ICogKDAuNSArIG9mZnNldC55IC8gdGhpcy5oZWlnaHQpO1xyXG4gICAgICAgIGNvbnN0IHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgPSBNYXRoLnNpbihmb3ZBYm92ZUNlbnRlcikgKiB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBNYXRoLnNpbihjbGFtcChNYXRoLlBJIC0gZ3JvdW5kQW5nbGUgLSBmb3ZBYm92ZUNlbnRlciwgMC4wMSwgTWF0aC5QSSAtIDAuMDEpKTtcclxuICAgICAgICBjb25zdCBwb2ludCA9IHRoaXMucG9pbnQ7XHJcbiAgICAgICAgY29uc3QgeCA9IHBvaW50LngsIHkgPSBwb2ludC55O1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgeiBkaXN0YW5jZSBvZiB0aGUgZmFydGhlc3QgZnJhZ21lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXHJcbiAgICAgICAgY29uc3QgZnVydGhlc3REaXN0YW5jZSA9IE1hdGguY29zKE1hdGguUEkgLyAyIC0gdGhpcy5fcGl0Y2gpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcclxuICAgICAgICAvLyBBZGQgYSBiaXQgZXh0cmEgdG8gYXZvaWQgcHJlY2lzaW9uIHByb2JsZW1zIHdoZW4gYSBmcmFnbWVudCdzIGRpc3RhbmNlIGlzIGV4YWN0bHkgYGZ1cnRoZXN0RGlzdGFuY2VgXHJcbiAgICAgICAgY29uc3QgZmFyWiA9IGZ1cnRoZXN0RGlzdGFuY2UgKiAxLjAxO1xyXG5cclxuICAgICAgICAvLyBUaGUgbGFyZ2VyIHRoZSB2YWx1ZSBvZiBuZWFyWiBpc1xyXG4gICAgICAgIC8vIC0gdGhlIG1vcmUgZGVwdGggcHJlY2lzaW9uIGlzIGF2YWlsYWJsZSBmb3IgZmVhdHVyZXMgKGdvb2QpXHJcbiAgICAgICAgLy8gLSBjbGlwcGluZyBzdGFydHMgYXBwZWFyaW5nIHNvb25lciB3aGVuIHRoZSBjYW1lcmEgaXMgY2xvc2UgdG8gM2QgZmVhdHVyZXMgKGJhZClcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFNtYWxsZXIgdmFsdWVzIHdvcmtlZCB3ZWxsIGZvciBtYXBib3gtZ2wtanMgYnV0IGRlY2tnbCB3YXMgZW5jb3VudGVyaW5nIHByZWNpc2lvbiBpc3N1ZXNcclxuICAgICAgICAvLyB3aGVuIHJlbmRlcmluZyBpdCdzIGxheWVycyB1c2luZyBjdXN0b20gbGF5ZXJzLiBUaGlzIHZhbHVlIHdhcyBleHBlcmltZW50YWxseSBjaG9zZW4gYW5kXHJcbiAgICAgICAgLy8gc2VlbXMgdG8gc29sdmUgei1maWdodGluZyBpc3N1ZXMgaW4gZGVja2dsIHdoaWxlIG5vdCBjbGlwcGluZyBidWlsZGluZ3MgdG9vIGNsb3NlIHRvIHRoZSBjYW1lcmEuXHJcbiAgICAgICAgY29uc3QgbmVhclogPSB0aGlzLmhlaWdodCAvIDUwO1xyXG5cclxuICAgICAgICAvLyBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBsb2NhdGlvbiB0byBHTCBjb29yZGluYXRlcyAoLTEgLi4gMSlcclxuICAgICAgICBsZXQgbSA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xyXG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUobSwgdGhpcy5fZm92LCB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQsIG5lYXJaLCBmYXJaKTtcclxuXHJcbiAgICAgICAgLy9BcHBseSBjZW50ZXIgb2YgcGVyc3BlY3RpdmUgb2Zmc2V0XHJcbiAgICAgICAgbVs4XSA9IC1vZmZzZXQueCAqIDIgLyB0aGlzLndpZHRoO1xyXG4gICAgICAgIG1bOV0gPSBvZmZzZXQueSAqIDIgLyB0aGlzLmhlaWdodDtcclxuXHJcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMSwgLTEsIDFdKTtcclxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMCwgMCwgLXRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZV0pO1xyXG4gICAgICAgIG1hdDQucm90YXRlWChtLCBtLCB0aGlzLl9waXRjaCk7XHJcbiAgICAgICAgbWF0NC5yb3RhdGVaKG0sIG0sIHRoaXMuYW5nbGUpO1xyXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFsteCwgLXksIDBdKTtcclxuXHJcbiAgICAgICAgLy8gVGhlIG1lcmNhdG9yTWF0cml4IGNhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSBwb2ludHMgZnJvbSBtZXJjYXRvciBjb29yZGluYXRlc1xyXG4gICAgICAgIC8vIChbMCwgMF0gbncsIFsxLCAxXSBzZSkgdG8gR0wgY29vcmRpbmF0ZXMuXHJcbiAgICAgICAgdGhpcy5tZXJjYXRvck1hdHJpeCA9IG1hdDQuc2NhbGUoW10sIG0sIFt0aGlzLndvcmxkU2l6ZSwgdGhpcy53b3JsZFNpemUsIHRoaXMud29ybGRTaXplXSk7XHJcblxyXG4gICAgICAgIC8vIHNjYWxlIHZlcnRpY2FsbHkgdG8gbWV0ZXJzIHBlciBwaXhlbCAoaW52ZXJzZSBvZiBncm91bmQgcmVzb2x1dGlvbik6XHJcbiAgICAgICAgLy8gbWF0NC5zY2FsZShtLCBtLCBbMSwgMSwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIHRoaXMuY2VudGVyLmxhdCkgKiB0aGlzLndvcmxkU2l6ZSwgMV0pO1xyXG4gICAgICAgIGxldCB2ZXJ0aWNhbFNjYWxlID0gdGhpcy53b3JsZFNpemUgLyAoMiAqIE1hdGguUEkgKiA2Mzc4MTM3ICogTWF0aC5hYnMoTWF0aC5jb3ModGhpcy5jZW50ZXIubGF0ICogKE1hdGguUEkgLyAxODApKSkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVuaXRzID09PSAnbScgfHwgdGhpcy51bml0cyA9PT0gJ21ldGVyJykge1xyXG4gICAgICAgICAgICBpZih0aGlzLmNycyl7XHJcbiAgICAgICAgICAgICAgdmVydGljYWxTY2FsZSA9IHRoaXMud29ybGRTaXplIC8gKHRoaXMuY3JzLmV4dGVudFszXSAtIHRoaXMuY3JzLmV4dGVudFsxXSk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHZlcnRpY2FsU2NhbGUgPSB0aGlzLndvcmxkU2l6ZSAvICh0aGlzLmxhdFJhbmdlWzFdIC0gdGhpcy5sYXRSYW5nZVswXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEsIDEsIHZlcnRpY2FsU2NhbGUsIDFdKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9qTWF0cml4ID0gbTtcclxuICAgICAgICB0aGlzLmludlByb2pNYXRyaXggPSBtYXQ0LmludmVydChbXSwgdGhpcy5wcm9qTWF0cml4KTtcclxuXHJcbiAgICAgICAgLy8gTWFrZSBhIHNlY29uZCBwcm9qZWN0aW9uIG1hdHJpeCB0aGF0IGlzIGFsaWduZWQgdG8gYSBwaXhlbCBncmlkIGZvciByZW5kZXJpbmcgcmFzdGVyIHRpbGVzLlxyXG4gICAgICAgIC8vIFdlJ3JlIHJvdW5kaW5nIHRoZSAoZmxvYXRpbmcgcG9pbnQpIHgveSB2YWx1ZXMgdG8gYWNoaWV2ZSB0byBhdm9pZCByZW5kZXJpbmcgcmFzdGVyIGltYWdlcyB0byBmcmFjdGlvbmFsXHJcbiAgICAgICAgLy8gY29vcmRpbmF0ZXMuIEFkZGl0aW9uYWxseSwgd2UgYWRqdXN0IGJ5IGhhbGYgYSBwaXhlbCBpbiBlaXRoZXIgZGlyZWN0aW9uIGluIGNhc2UgdGhhdCB2aWV3cG9ydCBkaW1lbnNpb25cclxuICAgICAgICAvLyBpcyBhbiBvZGQgaW50ZWdlciB0byBwcmVzZXJ2ZSByZW5kZXJpbmcgdG8gdGhlIHBpeGVsIGdyaWQuIFdlJ3JlIHJvdGF0aW5nIHRoaXMgc2hpZnQgYmFzZWQgb24gdGhlIGFuZ2xlXHJcbiAgICAgICAgLy8gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHNvIHRoYXQgMMKwLCA5MMKwLCAxODDCsCwgYW5kIDI3MMKwIHJhc3RlcnMgYXJlIGNyaXNwLCBhbmQgYWRqdXN0IHRoZSBzaGlmdCBzbyB0aGF0XHJcbiAgICAgICAgLy8gaXQgaXMgYWx3YXlzIDw9IDAuNSBwaXhlbHMuXHJcbiAgICAgICAgY29uc3QgeFNoaWZ0ID0gKHRoaXMud2lkdGggJSAyKSAvIDIsIHlTaGlmdCA9ICh0aGlzLmhlaWdodCAlIDIpIC8gMixcclxuICAgICAgICAgICAgYW5nbGVDb3MgPSBNYXRoLmNvcyh0aGlzLmFuZ2xlKSwgYW5nbGVTaW4gPSBNYXRoLnNpbih0aGlzLmFuZ2xlKSxcclxuICAgICAgICAgICAgZHggPSB4IC0gTWF0aC5yb3VuZCh4KSArIGFuZ2xlQ29zICogeFNoaWZ0ICsgYW5nbGVTaW4gKiB5U2hpZnQsXHJcbiAgICAgICAgICAgIGR5ID0geSAtIE1hdGgucm91bmQoeSkgKyBhbmdsZUNvcyAqIHlTaGlmdCArIGFuZ2xlU2luICogeFNoaWZ0O1xyXG4gICAgICAgIGNvbnN0IGFsaWduZWRNID0gbmV3IEZsb2F0NjRBcnJheShtKTtcclxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhbGlnbmVkTSwgYWxpZ25lZE0sIFsgZHggPiAwLjUgPyBkeCAtIDEgOiBkeCwgZHkgPiAwLjUgPyBkeSAtIDEgOiBkeSwgMCBdKTtcclxuICAgICAgICB0aGlzLmFsaWduZWRQcm9qTWF0cml4ID0gYWxpZ25lZE07XHJcblxyXG4gICAgICAgIG0gPSBtYXQ0LmNyZWF0ZSgpO1xyXG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3RoaXMud2lkdGggLyAyLCAtdGhpcy5oZWlnaHQgLyAyLCAxXSk7XHJcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWzEsIC0xLCAwXSk7XHJcbiAgICAgICAgdGhpcy5sYWJlbFBsYW5lTWF0cml4ID0gbTtcclxuXHJcbiAgICAgICAgbSA9IG1hdDQuY3JlYXRlKCk7XHJcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMSwgLTEsIDFdKTtcclxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbLTEsIC0xLCAwXSk7XHJcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMiAvIHRoaXMud2lkdGgsIDIgLyB0aGlzLmhlaWdodCwgMV0pO1xyXG4gICAgICAgIHRoaXMuZ2xDb29yZE1hdHJpeCA9IG07XHJcblxyXG4gICAgICAgIC8vIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIGxvY2F0aW9uIHRvIHNjcmVlbiBjb29yZGluYXRlc1xyXG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXggPSBtYXQ0Lm11bHRpcGx5KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLmxhYmVsUGxhbmVNYXRyaXgsIHRoaXMucHJvak1hdHJpeCk7XHJcblxyXG4gICAgICAgIC8vIGludmVyc2UgbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gc2NyZWVuIGNvb3JkaW5hZXMgdG8gbG9jYXRpb25cclxuICAgICAgICBtID0gbWF0NC5pbnZlcnQobmV3IEZsb2F0NjRBcnJheSgxNiksIHRoaXMucGl4ZWxNYXRyaXgpO1xyXG4gICAgICAgIGlmICghbSkgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIGludmVydCBtYXRyaXhcIik7XHJcbiAgICAgICAgdGhpcy5waXhlbE1hdHJpeEludmVyc2UgPSBtO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3NNYXRyaXhDYWNoZSA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2FsaWduZWRQb3NNYXRyaXhDYWNoZSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIG1heFBpdGNoU2NhbGVGYWN0b3IoKSB7XHJcbiAgICAgICAgLy8gY2FsY01hdHJpY2VzIGhhc24ndCBydW4geWV0XHJcbiAgICAgICAgaWYgKCF0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIDApKTtcclxuICAgICAgICBjb25zdCBwID0gW2Nvb3JkLnggKiB0aGlzLndvcmxkU2l6ZSwgY29vcmQueSAqIHRoaXMud29ybGRTaXplLCAwLCAxXTtcclxuICAgICAgICBjb25zdCB0b3BQb2ludCA9IHZlYzQudHJhbnNmb3JtTWF0NChwLCBwLCB0aGlzLnBpeGVsTWF0cml4KTtcclxuICAgICAgICByZXR1cm4gdG9wUG9pbnRbM10gLyB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFRoZSBjYW1lcmEgbG9va3MgYXQgdGhlIG1hcCBmcm9tIGEgM0QgKGxuZywgbGF0LCBhbHRpdHVkZSkgbG9jYXRpb24uIExldCdzIHVzZSBgY2FtZXJhTG9jYXRpb25gXHJcbiAgICAgKiBhcyB0aGUgbmFtZSBmb3IgdGhlIGxvY2F0aW9uIHVuZGVyIHRoZSBjYW1lcmEgYW5kIG9uIHRoZSBzdXJmYWNlIG9mIHRoZSBlYXJ0aCAobG5nLCBsYXQsIDApLlxyXG4gICAgICogYGNhbWVyYVBvaW50YCBpcyB0aGUgcHJvamVjdGVkIHBvc2l0aW9uIG9mIHRoZSBgY2FtZXJhTG9jYXRpb25gLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgcG9pbnQgaXMgdXNlZnVsIHRvIHVzIGJlY2F1c2Ugb25seSBmaWxsLWV4dHJ1c2lvbnMgdGhhdCBhcmUgYmV0d2VlbiBgY2FtZXJhUG9pbnRgIGFuZFxyXG4gICAgICogdGhlIHF1ZXJ5IHBvaW50IG9uIHRoZSBzdXJmYWNlIG9mIHRoZSBlYXJ0aCBjYW4gZXh0ZW5kIGFuZCBpbnRlcnNlY3QgdGhlIHF1ZXJ5LlxyXG4gICAgICpcclxuICAgICAqIFdoZW4gdGhlIG1hcCBpcyBub3QgcGl0Y2hlZCB0aGUgYGNhbWVyYVBvaW50YCBpcyBlcXVpdmFsZW50IHRvIHRoZSBjZW50ZXIgb2YgdGhlIG1hcCBiZWNhdXNlXHJcbiAgICAgKiB0aGUgY2FtZXJhIGlzIHJpZ2h0IGFib3ZlIHRoZSBjZW50ZXIgb2YgdGhlIG1hcC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FtZXJhUG9pbnQoKSB7XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSB0aGlzLl9waXRjaDtcclxuICAgICAgICBjb25zdCB5T2Zmc2V0ID0gTWF0aC50YW4ocGl0Y2gpICogKHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSB8fCAxKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXJQb2ludC5hZGQobmV3IFBvaW50KDAsIHlPZmZzZXQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogV2hlbiB0aGUgbWFwIGlzIHBpdGNoZWQsIHNvbWUgb2YgdGhlIDNEIGZlYXR1cmVzIHRoYXQgaW50ZXJzZWN0IGEgcXVlcnkgd2lsbCBub3QgaW50ZXJzZWN0XHJcbiAgICAgKiB0aGUgcXVlcnkgYXQgdGhlIHN1cmZhY2Ugb2YgdGhlIGVhcnRoLiBJbnN0ZWFkIHRoZSBmZWF0dXJlIG1heSBiZSBjbG9zZXIgYW5kIG9ubHkgaW50ZXJzZWN0XHJcbiAgICAgKiB0aGUgcXVlcnkgYmVjYXVzZSBpdCBleHRydWRlcyBpbnRvIHRoZSBhaXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyByZXR1cm5zIGEgZ2VvbWV0cnkgdGhhdCBpbmNsdWRlcyBhbGwgb2YgdGhlIG9yaWdpbmFsIHF1ZXJ5IGFzIHdlbGwgYXMgYWxsIHBvc3NpYmxlIGFyZXMgb2YgdGhlXHJcbiAgICAgKiBzY3JlZW4gd2hlcmUgdGhlICpiYXNlKiBvZiBhIHZpc2libGUgZXh0cnVzaW9uIGNvdWxkIGJlLlxyXG4gICAgICogIC0gRm9yIHBvaW50IHF1ZXJpZXMsIHRoZSBsaW5lIGZyb20gdGhlIHF1ZXJ5IHBvaW50IHRvIHRoZSBcImNhbWVyYSBwb2ludFwiXHJcbiAgICAgKiAgLSBGb3Igb3RoZXIgZ2VvbWV0cmllcywgdGhlIGVudmVsb3BlIG9mIHRoZSBxdWVyeSBnZW9tZXRyeSBhbmQgdGhlIFwiY2FtZXJhIHBvaW50XCJcclxuICAgICAqL1xyXG4gICAgZ2V0Q2FtZXJhUXVlcnlHZW9tZXRyeShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4pOiBBcnJheTxQb2ludD4ge1xyXG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmdldENhbWVyYVBvaW50KCk7XHJcblxyXG4gICAgICAgIGlmIChxdWVyeUdlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW3F1ZXJ5R2VvbWV0cnlbMF0sIGNdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBtaW5YID0gYy54O1xyXG4gICAgICAgICAgICBsZXQgbWluWSA9IGMueTtcclxuICAgICAgICAgICAgbGV0IG1heFggPSBjLng7XHJcbiAgICAgICAgICAgIGxldCBtYXhZID0gYy55O1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcXVlcnlHZW9tZXRyeSkge1xyXG4gICAgICAgICAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHAueCk7XHJcbiAgICAgICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcC55KTtcclxuICAgICAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLngpO1xyXG4gICAgICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHAueSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtaW5YLCBtaW5ZKSxcclxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtYXhYLCBtaW5ZKSxcclxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtYXhYLCBtYXhZKSxcclxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtaW5YLCBtYXhZKSxcclxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChtaW5YLCBtaW5ZKVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVHJhbnNmb3JtO1xyXG4iLCIvLyBAZmxvdyBzdHJpY3RcblxuLyoqXG4gKiBUaHJvdHRsZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gcnVuIGF0IG1vc3QgZXZlcnkgYHBlcmlvZGAgbWlsbGlzZWNvbmRzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGhyb3R0bGUoZm46ICgpID0+IHZvaWQsIHRpbWU6IG51bWJlcik6ICgpID0+ID9UaW1lb3V0SUQge1xuICAgIGxldCBwZW5kaW5nID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQ6ID9UaW1lb3V0SUQgPSBudWxsO1xuXG4gICAgY29uc3QgbGF0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBwZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aW1lcklkKSB7XG4gICAgICAgICAgICBsYXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aW1lcklkO1xuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2JpbmRBbGx9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93JztcbmltcG9ydCB0aHJvdHRsZSBmcm9tICcuLi91dGlsL3Rocm90dGxlJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwJztcblxuLypcbiAqIEFkZHMgdGhlIG1hcCdzIHBvc2l0aW9uIHRvIGl0cyBwYWdlJ3MgbG9jYXRpb24gaGFzaC5cbiAqIFBhc3NlZCBhcyBhbiBvcHRpb24gdG8gdGhlIG1hcCBvYmplY3QuXG4gKlxuICogQHJldHVybnMge0hhc2h9IGB0aGlzYFxuICovXG5jbGFzcyBIYXNoIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX3VwZGF0ZUhhc2g6ICgpID0+ID9UaW1lb3V0SUQ7XG4gICAgX2hhc2hOYW1lOiA/c3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoaGFzaE5hbWU6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faGFzaE5hbWUgPSBoYXNoTmFtZSAmJiBlbmNvZGVVUklDb21wb25lbnQoaGFzaE5hbWUpO1xuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfZ2V0Q3VycmVudEhhc2gnLFxuICAgICAgICAgICAgJ19vbkhhc2hDaGFuZ2UnLFxuICAgICAgICAgICAgJ191cGRhdGVIYXNoJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXNuJ3QgYWxsb3cgdXBkYXRpbmcgdGhlIGhhc2ggbW9yZSB0aGFuIDEwMCB0aW1lcyBwZXIgMzAgc2Vjb25kcy5cbiAgICAgICAgdGhpcy5fdXBkYXRlSGFzaCA9IHRocm90dGxlKHRoaXMuX3VwZGF0ZUhhc2hVbnRocm90dGxlZC5iaW5kKHRoaXMpLCAzMCAqIDEwMDAgLyAxMDApO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogTWFwIGVsZW1lbnQgdG8gbGlzdGVuIGZvciBjb29yZGluYXRlIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXBcbiAgICAgKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVIYXNoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZW1vdmVzIGhhc2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVIYXNoKCkpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tYXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldEhhc2hTdHJpbmcobWFwRmVlZGJhY2s/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgIHpvb20gPSBNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkgKiAxMDApIC8gMTAwLFxuICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIGVxdWF0aW9uOiA1MTJweCAqIDJeeiAvIDM2MCAvIDEwXmQgPCAwLjVweFxuICAgICAgICAgICAgcHJlY2lzaW9uID0gTWF0aC5jZWlsKCh6b29tICogTWF0aC5MTjIgKyBNYXRoLmxvZyg1MTIgLyAzNjAgLyAwLjUpKSAvIE1hdGguTE4xMCksXG4gICAgICAgICAgICBtID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbiksXG4gICAgICAgICAgICBsbmcgPSBNYXRoLnJvdW5kKGNlbnRlci5sbmcgKiBtKSAvIG0sXG4gICAgICAgICAgICBsYXQgPSBNYXRoLnJvdW5kKGNlbnRlci5sYXQgKiBtKSAvIG0sXG4gICAgICAgICAgICBiZWFyaW5nID0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHBpdGNoID0gdGhpcy5fbWFwLmdldFBpdGNoKCk7XG4gICAgICAgIGxldCBoYXNoID0gJyc7XG4gICAgICAgIGlmIChtYXBGZWVkYmFjaykge1xuICAgICAgICAgICAgLy8gbmV3IG1hcCBmZWVkYmFjayBzaXRlIGhhcyBzb21lIGNvbnN0cmFpbnRzIHRoYXQgZG9uJ3QgYWxsb3dcbiAgICAgICAgICAgIC8vIHVzIHRvIHVzZSB0aGUgc2FtZSBoYXNoIGZvcm1hdCBhcyB3ZSBkbyBmb3IgdGhlIE1hcCBoYXNoIG9wdGlvbi5cbiAgICAgICAgICAgIGhhc2ggKz0gYC8ke2xuZ30vJHtsYXR9LyR7em9vbX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFzaCArPSBgJHt6b29tfS8ke2xhdH0vJHtsbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWFyaW5nIHx8IHBpdGNoKSBoYXNoICs9IChgLyR7TWF0aC5yb3VuZChiZWFyaW5nICogMTApIC8gMTB9YCk7XG4gICAgICAgIGlmIChwaXRjaCkgaGFzaCArPSAoYC8ke01hdGgucm91bmQocGl0Y2gpfWApO1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNoTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaGFzaE5hbWUgPSB0aGlzLl9oYXNoTmFtZTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKS5zcGxpdCgnJicpLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYXJ0LnNwbGl0KCc9JylbMF07XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gaGFzaE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2hhc2h9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgICAgICAgICB9KS5maWx0ZXIoYSA9PiBhKTtcbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGAke2hhc2hOYW1lfT0ke2hhc2h9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYCMke3BhcnRzLmpvaW4oJyYnKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAjJHtoYXNofWA7XG4gICAgfVxuXG4gICAgX2dldEN1cnJlbnRIYXNoKCkge1xuICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgaGFzaCBmcm9tIGxvY2F0aW9uLCBzdHJpcHBlZCBmcm9tIGl0cyBudW1iZXIgc2lnblxuICAgICAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnIycsICcnKTtcbiAgICAgICAgaWYgKHRoaXMuX2hhc2hOYW1lKSB7XG4gICAgICAgICAgICAvLyBTcGxpdCB0aGUgcGFyYW1ldGVyLXN0eWxlZCBoYXNoIGludG8gcGFydHMgYW5kIGZpbmQgdGhlIHZhbHVlIHdlIG5lZWRcbiAgICAgICAgICAgIGxldCBrZXl2YWw7XG4gICAgICAgICAgICBoYXNoLnNwbGl0KCcmJykubWFwKFxuICAgICAgICAgICAgICAgIHBhcnQgPT4gcGFydC5zcGxpdCgnPScpXG4gICAgICAgICAgICApLmZvckVhY2gocGFydCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRbMF0gPT09IHRoaXMuX2hhc2hOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXZhbCA9IHBhcnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gKGtleXZhbCA/IGtleXZhbFsxXSB8fCAnJyA6ICcnKS5zcGxpdCgnLycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoLnNwbGl0KCcvJyk7XG4gICAgfVxuXG4gICAgX29uSGFzaENoYW5nZSgpIHtcbiAgICAgICAgY29uc3QgbG9jID0gdGhpcy5fZ2V0Q3VycmVudEhhc2goKTtcbiAgICAgICAgaWYgKGxvYy5sZW5ndGggPj0gMyAmJiAhbG9jLnNvbWUodiA9PiBpc05hTih2KSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlYXJpbmcgPSB0aGlzLl9tYXAuZHJhZ1JvdGF0ZS5pc0VuYWJsZWQoKSAmJiB0aGlzLl9tYXAudG91Y2hab29tUm90YXRlLmlzRW5hYmxlZCgpID8gKyhsb2NbM10gfHwgMCkgOiB0aGlzLl9tYXAuZ2V0QmVhcmluZygpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBbK2xvY1syXSwgK2xvY1sxXV0sXG4gICAgICAgICAgICAgICAgem9vbTogK2xvY1swXSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nLFxuICAgICAgICAgICAgICAgIHBpdGNoOiArKGxvY1s0XSB8fCAwKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUhhc2hVbnRocm90dGxlZCgpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0SGFzaFN0cmluZygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdy5oaXN0b3J5LnN0YXRlLCAnJywgaGFzaCk7XG4gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgICAgICAgIC8vIElFMTEgZG9lcyBub3QgYWxsb3cgdGhpcyBpZiB0aGUgcGFnZSBpcyB3aXRoaW4gYW4gaWZyYW1lIGNyZWF0ZWRcbiAgICAgICAgICAgIC8vIHdpdGggaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoLi4uKS5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy83NDEwXG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGFzaDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHtiZXppZXIsIGNsYW1wLCBleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7RHJhZ1Bhbk9wdGlvbnN9IGZyb20gJy4vaGFuZGxlci9zaGltL2RyYWdfcGFuJztcblxuY29uc3QgZGVmYXVsdEluZXJ0aWFPcHRpb25zID0ge1xuICAgIGxpbmVhcml0eTogMC4zLFxuICAgIGVhc2luZzogYmV6aWVyKDAsIDAsIDAuMywgMSksXG59O1xuXG5jb25zdCBkZWZhdWx0UGFuSW5lcnRpYU9wdGlvbnMgPSBleHRlbmQoe1xuICAgIGRlY2VsZXJhdGlvbjogMjUwMCxcbiAgICBtYXhTcGVlZDogMTQwMFxufSwgZGVmYXVsdEluZXJ0aWFPcHRpb25zKTtcblxuY29uc3QgZGVmYXVsdFpvb21JbmVydGlhT3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgZGVjZWxlcmF0aW9uOiAyMCxcbiAgICBtYXhTcGVlZDogMTQwMFxufSwgZGVmYXVsdEluZXJ0aWFPcHRpb25zKTtcblxuY29uc3QgZGVmYXVsdEJlYXJpbmdJbmVydGlhT3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgZGVjZWxlcmF0aW9uOiAxMDAwLFxuICAgIG1heFNwZWVkOiAzNjBcbn0sIGRlZmF1bHRJbmVydGlhT3B0aW9ucyk7XG5cbmNvbnN0IGRlZmF1bHRQaXRjaEluZXJ0aWFPcHRpb25zID0gZXh0ZW5kKHtcbiAgICBkZWNlbGVyYXRpb246IDEwMDAsXG4gICAgbWF4U3BlZWQ6IDkwXG59LCBkZWZhdWx0SW5lcnRpYU9wdGlvbnMpO1xuXG5leHBvcnQgdHlwZSBJbmVydGlhT3B0aW9ucyA9IHtcbiAgICBsaW5lYXJpdHk6IG51bWJlcjtcbiAgICBlYXNpbmc6ICh0OiBudW1iZXIpID0+IG51bWJlcjtcbiAgICBkZWNlbGVyYXRpb246IG51bWJlcjtcbiAgICBtYXhTcGVlZDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFdmVudCA9IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgS2V5Ym9hcmRFdmVudCB8IFdoZWVsRXZlbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhhbmRsZXJJbmVydGlhIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2luZXJ0aWFCdWZmZXI6IEFycmF5PHsgdGltZTogbnVtYmVyLCBzZXR0aW5nczogT2JqZWN0IH0+O1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX2luZXJ0aWFCdWZmZXIgPSBbXTtcbiAgICB9XG5cbiAgICByZWNvcmQoc2V0dGluZ3M6IGFueSkge1xuICAgICAgICB0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5faW5lcnRpYUJ1ZmZlci5wdXNoKHt0aW1lOiBicm93c2VyLm5vdygpLCBzZXR0aW5nc30pO1xuICAgIH1cblxuICAgIF9kcmFpbkluZXJ0aWFCdWZmZXIoKSB7XG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhQnVmZmVyLFxuICAgICAgICAgICAgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIGN1dG9mZiA9IDE2MDsgICAvL21zZWNcblxuICAgICAgICB3aGlsZSAoaW5lcnRpYS5sZW5ndGggPiAwICYmIG5vdyAtIGluZXJ0aWFbMF0udGltZSA+IGN1dG9mZilcbiAgICAgICAgICAgIGluZXJ0aWEuc2hpZnQoKTtcbiAgICB9XG5cbiAgICBfb25Nb3ZlRW5kKHBhbkluZXJ0aWFPcHRpb25zPzogRHJhZ1Bhbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIGlmICh0aGlzLl9pbmVydGlhQnVmZmVyLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbHRhcyA9IHtcbiAgICAgICAgICAgIHpvb206IDAsXG4gICAgICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgICBwYW46IG5ldyBQb2ludCgwLCAwKSxcbiAgICAgICAgICAgIHBpbmNoQXJvdW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcm91bmQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3Qge3NldHRpbmdzfSBvZiB0aGlzLl9pbmVydGlhQnVmZmVyKSB7XG4gICAgICAgICAgICBkZWx0YXMuem9vbSArPSBzZXR0aW5ncy56b29tRGVsdGEgfHwgMDtcbiAgICAgICAgICAgIGRlbHRhcy5iZWFyaW5nICs9IHNldHRpbmdzLmJlYXJpbmdEZWx0YSB8fCAwO1xuICAgICAgICAgICAgZGVsdGFzLnBpdGNoICs9IHNldHRpbmdzLnBpdGNoRGVsdGEgfHwgMDtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5wYW5EZWx0YSkgZGVsdGFzLnBhbi5fYWRkKHNldHRpbmdzLnBhbkRlbHRhKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5hcm91bmQpIGRlbHRhcy5hcm91bmQgPSBzZXR0aW5ncy5hcm91bmQ7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MucGluY2hBcm91bmQpIGRlbHRhcy5waW5jaEFyb3VuZCA9IHNldHRpbmdzLnBpbmNoQXJvdW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdEVudHJ5ID0gdGhpcy5faW5lcnRpYUJ1ZmZlclt0aGlzLl9pbmVydGlhQnVmZmVyLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChsYXN0RW50cnkudGltZSAtIHRoaXMuX2luZXJ0aWFCdWZmZXJbMF0udGltZSk7XG5cbiAgICAgICAgY29uc3QgZWFzZU9wdGlvbnMgPSB7fTtcblxuICAgICAgICBpZiAoZGVsdGFzLnBhbi5tYWcoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlRWFzaW5nKGRlbHRhcy5wYW4ubWFnKCksIGR1cmF0aW9uLCBleHRlbmQoe30sIGRlZmF1bHRQYW5JbmVydGlhT3B0aW9ucywgcGFuSW5lcnRpYU9wdGlvbnMgfHwge30pKTtcbiAgICAgICAgICAgIGVhc2VPcHRpb25zLm9mZnNldCA9IGRlbHRhcy5wYW4ubXVsdChyZXN1bHQuYW1vdW50IC8gZGVsdGFzLnBhbi5tYWcoKSk7XG4gICAgICAgICAgICBlYXNlT3B0aW9ucy5jZW50ZXIgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmNlbnRlcjtcbiAgICAgICAgICAgIGV4dGVuZER1cmF0aW9uKGVhc2VPcHRpb25zLCByZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlbHRhcy56b29tKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVFYXNpbmcoZGVsdGFzLnpvb20sIGR1cmF0aW9uLCBkZWZhdWx0Wm9vbUluZXJ0aWFPcHRpb25zKTtcbiAgICAgICAgICAgIGVhc2VPcHRpb25zLnpvb20gPSB0aGlzLl9tYXAudHJhbnNmb3JtLnpvb20gKyByZXN1bHQuYW1vdW50O1xuICAgICAgICAgICAgZXh0ZW5kRHVyYXRpb24oZWFzZU9wdGlvbnMsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGFzLmJlYXJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZUVhc2luZyhkZWx0YXMuYmVhcmluZywgZHVyYXRpb24sIGRlZmF1bHRCZWFyaW5nSW5lcnRpYU9wdGlvbnMpO1xuICAgICAgICAgICAgZWFzZU9wdGlvbnMuYmVhcmluZyA9IHRoaXMuX21hcC50cmFuc2Zvcm0uYmVhcmluZyArIGNsYW1wKHJlc3VsdC5hbW91bnQsIC0xNzksIDE3OSk7XG4gICAgICAgICAgICBleHRlbmREdXJhdGlvbihlYXNlT3B0aW9ucywgcmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWx0YXMucGl0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZUVhc2luZyhkZWx0YXMucGl0Y2gsIGR1cmF0aW9uLCBkZWZhdWx0UGl0Y2hJbmVydGlhT3B0aW9ucyk7XG4gICAgICAgICAgICBlYXNlT3B0aW9ucy5waXRjaCA9IHRoaXMuX21hcC50cmFuc2Zvcm0ucGl0Y2ggKyByZXN1bHQuYW1vdW50O1xuICAgICAgICAgICAgZXh0ZW5kRHVyYXRpb24oZWFzZU9wdGlvbnMsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWFzZU9wdGlvbnMuem9vbSB8fCBlYXNlT3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0ID0gZGVsdGFzLnBpbmNoQXJvdW5kID09PSB1bmRlZmluZWQgPyBkZWx0YXMuYXJvdW5kIDogZGVsdGFzLnBpbmNoQXJvdW5kO1xuICAgICAgICAgICAgZWFzZU9wdGlvbnMuYXJvdW5kID0gbGFzdCA/IHRoaXMuX21hcC51bnByb2plY3QobGFzdCkgOiB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBleHRlbmQoZWFzZU9wdGlvbnMsIHtcbiAgICAgICAgICAgIG5vTW92ZVN0YXJ0OiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgfVxufVxuXG4vLyBVbmZvcnR1bmF0ZWx5IHpvb20sIGJlYXJpbmcsIGV0YyBjYW4ndCBoYXZlIGRpZmZlcmVudCBkdXJhdGlvbnMgYW5kIGVhc2luZ3Mgc29cbi8vIHdlIG5lZWQgdG8gY2hvb3NlIG9uZS4gV2UgdXNlIHRoZSBsb25nZXN0IGR1cmF0aW9uIGFuZCBpdCdzIGNvcnJlc3BvbmRpbmcgZWFzaW5nLlxuZnVuY3Rpb24gZXh0ZW5kRHVyYXRpb24oZWFzZU9wdGlvbnMsIHJlc3VsdCkge1xuICAgIGlmICghZWFzZU9wdGlvbnMuZHVyYXRpb24gfHwgZWFzZU9wdGlvbnMuZHVyYXRpb24gPCByZXN1bHQuZHVyYXRpb24pIHtcbiAgICAgICAgZWFzZU9wdGlvbnMuZHVyYXRpb24gPSByZXN1bHQuZHVyYXRpb247XG4gICAgICAgIGVhc2VPcHRpb25zLmVhc2luZyA9IHJlc3VsdC5lYXNpbmc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVFYXNpbmcoYW1vdW50LCBpbmVydGlhRHVyYXRpb246IG51bWJlciwgaW5lcnRpYU9wdGlvbnMpIHtcbiAgICBjb25zdCB7bWF4U3BlZWQsIGxpbmVhcml0eSwgZGVjZWxlcmF0aW9ufSA9IGluZXJ0aWFPcHRpb25zO1xuICAgIGNvbnN0IHNwZWVkID0gY2xhbXAoXG4gICAgICAgIGFtb3VudCAqIGxpbmVhcml0eSAvIChpbmVydGlhRHVyYXRpb24gLyAxMDAwKSxcbiAgICAgICAgLW1heFNwZWVkLFxuICAgICAgICBtYXhTcGVlZCk7XG4gICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLmFicyhzcGVlZCkgLyAoZGVjZWxlcmF0aW9uICogbGluZWFyaXR5KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBlYXNpbmc6IGluZXJ0aWFPcHRpb25zLmVhc2luZyxcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uICogMTAwMCxcbiAgICAgICAgYW1vdW50OiBzcGVlZCAqIChkdXJhdGlvbiAvIDIpXG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7RXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5cbmltcG9ydCBET00gZnJvbSAnLi4vdXRpbC9kb20nO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuL21hcCc7XG5pbXBvcnQgdHlwZSBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuXG4vKipcbiAqIGBNYXBNb3VzZUV2ZW50YCBpcyB0aGUgZXZlbnQgdHlwZSBmb3IgbW91c2UtcmVsYXRlZCBtYXAgZXZlbnRzLlxuICogQGV4dGVuZHMge09iamVjdH1cbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgYGNsaWNrYCBldmVudCBpcyBhbiBleGFtcGxlIG9mIGEgYE1hcE1vdXNlRXZlbnRgLlxuICogLy8gU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIG9uIHRoZSBtYXAuXG4gKiBtYXAub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICogICAvLyBUaGUgZXZlbnQgb2JqZWN0IChlKSBjb250YWlucyBpbmZvcm1hdGlvbiBsaWtlIHRoZVxuICogICAvLyBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQgb24gdGhlIG1hcCB0aGF0IHdhcyBjbGlja2VkLlxuICogICBjb25zb2xlLmxvZygnQSBjbGljayBldmVudCBoYXMgb2NjdXJyZWQgYXQgJyArIGUubG5nTGF0KTtcbiAqIH0pO1xuICovXG5leHBvcnQgY2xhc3MgTWFwTW91c2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgdHlwZSAob25lIG9mIHtAbGluayBNYXAuZXZlbnQ6bW91c2Vkb3dufSxcbiAgICAgKiB7QGxpbmsgTWFwLmV2ZW50Om1vdXNldXB9LFxuICAgICAqIHtAbGluayBNYXAuZXZlbnQ6Y2xpY2t9LFxuICAgICAqIHtAbGluayBNYXAuZXZlbnQ6ZGJsY2xpY2t9LFxuICAgICAqIHtAbGluayBNYXAuZXZlbnQ6bW91c2Vtb3ZlfSxcbiAgICAgKiB7QGxpbmsgTWFwLmV2ZW50Om1vdXNlb3Zlcn0sXG4gICAgICoge0BsaW5rIE1hcC5ldmVudDptb3VzZWVudGVyfSxcbiAgICAgKiB7QGxpbmsgTWFwLmV2ZW50Om1vdXNlbGVhdmV9LFxuICAgICAqIHtAbGluayBNYXAuZXZlbnQ6bW91c2VvdXR9LFxuICAgICAqIHtAbGluayBNYXAuZXZlbnQ6Y29udGV4dG1lbnV9KS5cbiAgICAgKi9cbiAgICB0eXBlOiAnbW91c2Vkb3duJ1xuICAgICAgICB8ICdtb3VzZXVwJ1xuICAgICAgICB8ICdjbGljaydcbiAgICAgICAgfCAnZGJsY2xpY2snXG4gICAgICAgIHwgJ21vdXNlbW92ZSdcbiAgICAgICAgfCAnbW91c2VvdmVyJ1xuICAgICAgICB8ICdtb3VzZWVudGVyJ1xuICAgICAgICB8ICdtb3VzZWxlYXZlJ1xuICAgICAgICB8ICdtb3VzZW91dCdcbiAgICAgICAgfCAnY29udGV4dG1lbnUnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBNYXBgIG9iamVjdCB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICB0YXJnZXQ6IE1hcDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBET00gZXZlbnQgd2hpY2ggY2F1c2VkIHRoZSBtYXAgZXZlbnQuXG4gICAgICovXG4gICAgb3JpZ2luYWxFdmVudDogTW91c2VFdmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgY3Vyc29yLCByZWxhdGl2ZSB0byB0aGUgbWFwIGFuZCBtZWFzdXJlZCBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIuXG4gICAgICovXG4gICAgcG9pbnQ6IFBvaW50O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gb24gdGhlIG1hcCBvZiB0aGUgbW91c2UgY3Vyc29yLlxuICAgICAqL1xuICAgIGxuZ0xhdDogTG5nTGF0O1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgc3Vic2VxdWVudCBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIGV2ZW50IGJ5IHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcHJldmVudCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwIGJlaGF2aW9yczpcbiAgICAgKlxuICAgICAqICAgKiBPbiBgbW91c2Vkb3duYCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9XG4gICAgICogICAqIE9uIGBtb3VzZWRvd25gIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn1cbiAgICAgKiAgICogT24gYG1vdXNlZG93bmAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIEJveFpvb21IYW5kbGVyfVxuICAgICAqICAgKiBPbiBgZGJsY2xpY2tgIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBEb3VibGVDbGlja1pvb21IYW5kbGVyfVxuICAgICAqXG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiBgcHJldmVudERlZmF1bHRgIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICB9XG5cbiAgICBfZGVmYXVsdFByZXZlbnRlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBtYXA6IE1hcCwgb3JpZ2luYWxFdmVudDogTW91c2VFdmVudCwgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBET00ubW91c2VQb3MobWFwLmdldENhbnZhc0NvbnRhaW5lcigpLCBvcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgY29uc3QgbG5nTGF0ID0gbWFwLnVucHJvamVjdChwb2ludCk7XG4gICAgICAgIHN1cGVyKHR5cGUsIGV4dGVuZCh7cG9pbnQsIGxuZ0xhdCwgb3JpZ2luYWxFdmVudH0sIGRhdGEpKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhcmdldCA9IG1hcDtcbiAgICB9XG59XG5cbi8qKlxuICogYE1hcFRvdWNoRXZlbnRgIGlzIHRoZSBldmVudCB0eXBlIGZvciB0b3VjaC1yZWxhdGVkIG1hcCBldmVudHMuXG4gKiBAZXh0ZW5kcyB7T2JqZWN0fVxuICovXG5leHBvcnQgY2xhc3MgTWFwVG91Y2hFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgdHlwZS5cbiAgICAgKi9cbiAgICB0eXBlOiAndG91Y2hzdGFydCdcbiAgICAgICAgfCAndG91Y2hlbmQnXG4gICAgICAgIHwgJ3RvdWNoY2FuY2VsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgdGFyZ2V0OiBNYXA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgRE9NIGV2ZW50IHdoaWNoIGNhdXNlZCB0aGUgbWFwIGV2ZW50LlxuICAgICAqL1xuICAgIG9yaWdpbmFsRXZlbnQ6IFRvdWNoRXZlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvbiB0aGUgbWFwIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHRvdWNoIGV2ZW50IHBvaW50cy5cbiAgICAgKi9cbiAgICBsbmdMYXQ6IExuZ0xhdDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSB0b3VjaCBldmVudCBwb2ludHMsIHJlbGF0aXZlIHRvIHRoZSBtYXAgYW5kIG1lYXN1cmVkIGZyb20gdGhlIHRvcCBsZWZ0XG4gICAgICogY29ybmVyLlxuICAgICAqL1xuICAgIHBvaW50OiBQb2ludDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhcnJheSBvZiBwaXhlbCBjb29yZGluYXRlcyBjb3JyZXNwb25kaW5nIHRvIGFcbiAgICAgKiBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHBvaW50czogQXJyYXk8UG9pbnQ+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbnMgb24gdGhlIG1hcCBjb3JyZXNwb25kaW5nIHRvIGFcbiAgICAgKiBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGxuZ0xhdHM6IEFycmF5PExuZ0xhdD47XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyBzdWJzZXF1ZW50IGRlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgZXZlbnQgYnkgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBwcmV2ZW50IHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBtYXAgYmVoYXZpb3JzOlxuICAgICAqXG4gICAgICogICAqIE9uIGB0b3VjaHN0YXJ0YCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9XG4gICAgICogICAqIE9uIGB0b3VjaHN0YXJ0YCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgVG91Y2hab29tUm90YXRlSGFuZGxlcn1cbiAgICAgKlxuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYHByZXZlbnREZWZhdWx0YCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxuXG4gICAgX2RlZmF1bHRQcmV2ZW50ZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgbWFwOiBNYXAsIG9yaWdpbmFsRXZlbnQ6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdG91Y2hlcyA9IHR5cGUgPT09IFwidG91Y2hlbmRcIiA/IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMgOiBvcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IERPTS50b3VjaFBvcyhtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCksIHRvdWNoZXMpO1xuICAgICAgICBjb25zdCBsbmdMYXRzID0gcG9pbnRzLm1hcCgodCkgPT4gbWFwLnVucHJvamVjdCh0KSk7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLnJlZHVjZSgocHJldiwgY3VyciwgaSwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldi5hZGQoY3Vyci5kaXYoYXJyLmxlbmd0aCkpO1xuICAgICAgICB9LCBuZXcgUG9pbnQoMCwgMCkpO1xuICAgICAgICBjb25zdCBsbmdMYXQgPSBtYXAudW5wcm9qZWN0KHBvaW50KTtcbiAgICAgICAgc3VwZXIodHlwZSwge3BvaW50cywgcG9pbnQsIGxuZ0xhdHMsIGxuZ0xhdCwgb3JpZ2luYWxFdmVudH0pO1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIGBNYXBXaGVlbEV2ZW50YCBpcyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhlIGB3aGVlbGAgbWFwIGV2ZW50LlxuICogQGV4dGVuZHMge09iamVjdH1cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcFdoZWVsRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IHR5cGUuXG4gICAgICovXG4gICAgdHlwZTogJ3doZWVsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgdGFyZ2V0OiBNYXA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgRE9NIGV2ZW50IHdoaWNoIGNhdXNlZCB0aGUgbWFwIGV2ZW50LlxuICAgICAqL1xuICAgIG9yaWdpbmFsRXZlbnQ6IFdoZWVsRXZlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyBzdWJzZXF1ZW50IGRlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgZXZlbnQgYnkgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBwcmV2ZW50IHRoZSB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIFNjcm9sbFpvb21IYW5kbGVyfS5cbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIGBwcmV2ZW50RGVmYXVsdGAgaGFzIGJlZW4gY2FsbGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRQcmV2ZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cblxuICAgIF9kZWZhdWx0UHJldmVudGVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcsIG1hcDogTWFwLCBvcmlnaW5hbEV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIHtvcmlnaW5hbEV2ZW50fSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBgTWFwQm94Wm9vbUV2ZW50YCBpcyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhlIGJveHpvb20tcmVsYXRlZCBtYXAgZXZlbnRzIGVtaXR0ZWQgYnkgdGhlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwQm94Wm9vbUV2ZW50XG4gKiBAcHJvcGVydHkge01vdXNlRXZlbnR9IG9yaWdpbmFsRXZlbnQgVGhlIERPTSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgYm94em9vbSBldmVudC4gQ2FuIGJlIGEgYE1vdXNlRXZlbnRgIG9yIGBLZXlib2FyZEV2ZW50YFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgYm94em9vbSBldmVudC4gT25lIG9mIGBib3h6b29tc3RhcnRgLCBgYm94em9vbWVuZGAgb3IgYGJveHpvb21jYW5jZWxgXG4gKiBAcHJvcGVydHkge01hcH0gdGFyZ2V0IFRoZSBgTWFwYCBpbnN0YW5jZSB0aGF0IHRyaWdnZXJyZWQgdGhlIGV2ZW50XG4gKi9cbmV4cG9ydCB0eXBlIE1hcEJveFpvb21FdmVudCA9IHtcbiAgICB0eXBlOiAnYm94em9vbXN0YXJ0J1xuICAgICAgICB8ICdib3h6b29tZW5kJ1xuICAgICAgICB8ICdib3h6b29tY2FuY2VsJyxcbiAgICB0YXJnZXQ6IE1hcCxcbiAgICBvcmlnaW5hbEV2ZW50OiBNb3VzZUV2ZW50XG59O1xuXG4vKipcbiAqIEEgYE1hcERhdGFFdmVudGAgb2JqZWN0IGlzIGVtaXR0ZWQgd2l0aCB0aGUge0BsaW5rIE1hcC5ldmVudDpkYXRhfVxuICogYW5kIHtAbGluayBNYXAuZXZlbnQ6ZGF0YWxvYWRpbmd9IGV2ZW50cy4gUG9zc2libGUgdmFsdWVzIGZvclxuICogYGRhdGFUeXBlYHMgYXJlOlxuICpcbiAqIC0gYCdzb3VyY2UnYDogVGhlIG5vbi10aWxlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFueSBzb3VyY2VcbiAqIC0gYCdzdHlsZSdgOiBUaGUgW3N0eWxlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykgdXNlZCBieSB0aGUgbWFwXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwRGF0YUV2ZW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhVHlwZSBUaGUgdHlwZSBvZiBkYXRhIHRoYXQgaGFzIGNoYW5nZWQuIE9uZSBvZiBgJ3NvdXJjZSdgLCBgJ3N0eWxlJ2AuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpc1NvdXJjZUxvYWRlZF0gVHJ1ZSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmQgdGhlIHNvdXJjZSBoYXMgbm8gb3V0c3RhbmRpbmcgbmV0d29yayByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbc291cmNlXSBUaGUgW3N0eWxlIHNwZWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNvdXJjZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcykgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZURhdGFUeXBlXSBJbmNsdWRlZCBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmQgdGhlIGV2ZW50IHNpZ25hbHNcbiAqIHRoYXQgaW50ZXJuYWwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBvciBjaGFuZ2VkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBtZXRhZGF0YWAgYW5kIGBjb250ZW50YC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbdGlsZV0gVGhlIHRpbGUgYmVpbmcgbG9hZGVkIG9yIGNoYW5nZWQsIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgIGFuZFxuICogdGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gbG9hZGluZyBvZiBhIHRpbGUuXG4gKiBAcHJvcGVydHkge0Nvb3JkaW5hdGV9IFtjb29yZF0gVGhlIGNvb3JkaW5hdGUgb2YgdGhlIHRpbGUgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kXG4gKiB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0byBsb2FkaW5nIG9mIGEgdGlsZS5cbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc291cmNlZGF0YSBldmVudCBpcyBhbiBleGFtcGxlIG9mIE1hcERhdGFFdmVudC5cbiAqIC8vIFNldCB1cCBhbiBldmVudCBsaXN0ZW5lciBvbiB0aGUgbWFwLlxuICogbWFwLm9uKCdzb3VyY2VkYXRhJywgZnVuY3Rpb24oZSkge1xuICogICAgaWYgKGUuaXNTb3VyY2VMb2FkZWQpIHtcbiAqICAgICAgICAvLyBEbyBzb21ldGhpbmcgd2hlbiB0aGUgc291cmNlIGhhcyBmaW5pc2hlZCBsb2FkaW5nXG4gKiAgICB9XG4gKiB9KTtcbiAqL1xuZXhwb3J0IHR5cGUgTWFwRGF0YUV2ZW50ID0ge1xuICAgIHR5cGU6IHN0cmluZyxcbiAgICBkYXRhVHlwZTogc3RyaW5nXG59O1xuXG5leHBvcnQgdHlwZSBNYXBDb250ZXh0RXZlbnQgPSB7XG4gICAgdHlwZTogJ3dlYmdsY29udGV4dGxvc3QnIHwgJ3dlYmdsY29udGV4dHJlc3RvcmVkJyxcbiAgICBvcmlnaW5hbEV2ZW50OiBXZWJHTENvbnRleHRFdmVudFxufVxuXG5leHBvcnQgdHlwZSBNYXBFdmVudCA9XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBwcmVzc2VkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZXZlbnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcHRpb25hbCBgbGF5ZXJJZGAgcGFyYW1ldGVyLlxuICAgICAqIElmIGBsYXllcklkYCBpcyBpbmNsdWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGluIHtAbGluayBNYXAjb259LCB0aGUgZXZlbnQgbGlzdGVuZXIgd2lsbCBmaXJlIG9ubHkgd2hlbiB0aGVcbiAgICAgKiB0aGUgY3Vyc29yIGlzIHByZXNzZWQgd2hpbGUgaW5zaWRlIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZWRvd25cbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignbW91c2Vkb3duJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBtb3VzZWRvd24gZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgbGF5ZXJcbiAgICAgKiBtYXAub24oJ21vdXNlZG93bicsICdwb2ktbGFiZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIG1vdXNlZG93biBldmVudCBoYXMgb2NjdXJyZWQgb24gYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHBvaS1sYWJlbCBsYXllci4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAnbW91c2Vkb3duJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyByZWxlYXNlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGV2ZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cbiAgICAgKiBJZiBgbGF5ZXJJZGAgaXMgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpbiB7QGxpbmsgTWFwI29ufSwgdGhlIGV2ZW50IGxpc3RlbmVyIHdpbGwgZmlyZSBvbmx5IHdoZW4gdGhlXG4gICAgICogdGhlIGN1cnNvciBpcyByZWxlYXNlZCB3aGlsZSBpbnNpZGUgYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHNwZWNpZmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNldXBcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignbW91c2V1cCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgbW91c2V1cCBldmVudCBoYXMgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBsYXllclxuICAgICAqIG1hcC5vbignbW91c2V1cCcsICdwb2ktbGFiZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIG1vdXNldXAgZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHwgJ21vdXNldXAnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIG1vdmVkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIEFzIHlvdSBtb3ZlIHRoZSBjdXJzb3IgYWNyb3NzIGEgd2ViIHBhZ2UgY29udGFpbmluZyBhIG1hcCxcbiAgICAgKiB0aGUgZXZlbnQgd2lsbCBmaXJlIGVhY2ggdGltZSBpdCBlbnRlcnMgdGhlIG1hcCBvciBhbnkgY2hpbGQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBldmVudCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIuXG4gICAgICogSWYgYGxheWVySWRgIGlzIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4ge0BsaW5rIE1hcCNvbn0sIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGZpcmUgb25seSB3aGVuIHRoZVxuICAgICAqIHRoZSBjdXJzb3IgaXMgbW92ZWQgaW5zaWRlIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZW92ZXJcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBtb3VzZW92ZXIgZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgbGF5ZXJcbiAgICAgKiBtYXAub24oJ21vdXNlb3ZlcicsICdwb2ktbGFiZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIG1vdXNlb3ZlciBldmVudCBoYXMgb2NjdXJyZWQgb24gYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHBvaS1sYWJlbCBsYXllci4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtHZXQgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbW91c2UtcG9zaXRpb24vKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICovXG4gICAgfCAnbW91c2VvdmVyJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBtb3ZlZCB3aGlsZSB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUgbWFwLlxuICAgICAqIEFzIHlvdSBtb3ZlIHRoZSBjdXJzb3IgYWNyb3NzIHRoZSBtYXAsIHRoZSBldmVudCB3aWxsIGZpcmUgZXZlcnkgdGltZSB0aGUgY3Vyc29yIGNoYW5nZXMgcG9zaXRpb24gd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBldmVudCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIuXG4gICAgICogSWYgYGxheWVySWRgIGlzIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4ge0BsaW5rIE1hcCNvbn0sIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGZpcmUgb25seSB3aGVuIHRoZVxuICAgICAqIHRoZSBjdXJzb3IgaXMgaW5zaWRlIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2Vtb3ZlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBtYXAub24oJ21vdXNlbW92ZScsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgbW91c2Vtb3ZlIGV2ZW50IGhhcyBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGxheWVyXG4gICAgICogbWFwLm9uKCdtb3VzZW1vdmUnLCAncG9pLWxhYmVsJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBtb3VzZW1vdmUgZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gb3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICovXG4gICAgfCAnbW91c2Vtb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBwcmVzc2VkIGFuZCByZWxlYXNlZCBhdCB0aGUgc2FtZSBwb2ludCBvbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZXZlbnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcHRpb25hbCBgbGF5ZXJJZGAgcGFyYW1ldGVyLlxuICAgICAqIElmIGBsYXllcklkYCBpcyBpbmNsdWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGluIHtAbGluayBNYXAjb259LCB0aGUgZXZlbnQgbGlzdGVuZXIgd2lsbCBmaXJlIG9ubHkgd2hlbiB0aGVcbiAgICAgKiBwb2ludCB0aGF0IGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkIGNvbnRhaW5zIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBjbGlja1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICogbWFwLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIGNsaWNrIGV2ZW50IGhhcyBvY2N1cnJlZCBhdCAnICsgZS5sbmdMYXQpO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgbGF5ZXJcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgJ3BvaS1sYWJlbCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIGNsaWNrIGV2ZW50IGhhcyBvY2N1cnJlZCBvbiBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgcG9pLWxhYmVsIGxheWVyIGF0ICcgKyBlLmxuZ0xhdCk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbTWVhc3VyZSBkaXN0YW5jZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbWVhc3VyZS8pXG4gICAgICogQHNlZSBbQ2VudGVyIHRoZSBtYXAgb24gYSBjbGlja2VkIHN5bWJvbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKi9cbiAgICB8ICdjbGljaydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQgdHdpY2UgYXQgdGhlIHNhbWUgcG9pbnQgb25cbiAgICAgKiB0aGUgbWFwIGluIHJhcGlkIHN1Y2Nlc3Npb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBldmVudCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIuXG4gICAgICogSWYgYGxheWVySWRgIGlzIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4ge0BsaW5rIE1hcCNvbn0sIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGZpcmUgb25seVxuICAgICAqIHdoZW4gdGhlIHBvaW50IHRoYXQgaXMgY2xpY2tlZCB0d2ljZSBjb250YWlucyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZGJsY2xpY2tcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignZGJsY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBkYmxjbGljayBldmVudCBoYXMgb2NjdXJyZWQgYXQgJyArIGUubG5nTGF0KTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGxheWVyXG4gICAgICogbWFwLm9uKCdkYmxjbGljaycsICdwb2ktbGFiZWwnLCBmdW5jdGlvbihlKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBkYmxjbGljayBldmVudCBoYXMgb2NjdXJyZWQgb24gYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHBvaS1sYWJlbCBsYXllciBhdCAnICsgZS5sbmdMYXQpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2RibGNsaWNrJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBlbnRlcnMgYSB2aXNpYmxlIHBvcnRpb24gb2YgYSBzcGVjaWZpZWQgbGF5ZXIgZnJvbVxuICAgICAqIG91dHNpZGUgdGhhdCBsYXllciBvciBvdXRzaWRlIHRoZSBtYXAgY2FudmFzLlxuICAgICAqXG4gICAgICogKipJbXBvcnRhbnQ6KiogVGhpcyBldmVudCBjYW4gb25seSBiZSBsaXN0ZW5lZCBmb3Igd2hlbiB7QGxpbmsgTWFwI29ufSBpbmNsdWRlcyB0aHJlZSBhcmd1bWVudHMsXG4gICAgICogd2hlcmUgdGhlIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2VlbnRlclxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICogbWFwLm9uKCdtb3VzZWVudGVyJywgJ3dhdGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBtb3VzZWVudGVyIGV2ZW50IG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB3YXRlciBsYXllci4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtDZW50ZXIgdGhlIG1hcCBvbiBhIGNsaWNrZWQgc3ltYm9sXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICB8ICdtb3VzZWVudGVyJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBsZWF2ZXMgYSB2aXNpYmxlIHBvcnRpb24gb2YgYSBzcGVjaWZpZWQgbGF5ZXIsIG9yIGxlYXZlc1xuICAgICAqIHRoZSBtYXAgY2FudmFzLlxuICAgICAqXG4gICAgICogKipJbXBvcnRhbnQ6KiogVGhpcyBldmVudCBjYW4gb25seSBiZSBsaXN0ZW5lZCBmb3Igd2hlbiB7QGxpbmsgTWFwI29ufSBpbmNsdWRlcyB0aHJlZSBhcmd1ZW1lbnRzLFxuICAgICAqIHdoZXJlIHRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlbGVhdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgcG9pbnRpbmcgZGV2aWNlIGxlYXZlc1xuICAgICAqIC8vIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIuXG4gICAgICogbWFwLm9uKCdtb3VzZWxlYXZlJywgJ3dhdGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBtb3VzZWxlYXZlIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBjbGlja10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24tY2xpY2svKVxuICAgICAqL1xuICAgIHwgJ21vdXNlbGVhdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnQgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGxlYXZlcyB0aGUgbWFwJ3MgY2FudmFzLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlb3V0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIHBvaW50aW5nIGRldmljZSBsZWF2ZSdzXG4gICAgICogLy8gdGhlIG1hcCdzIGNhbnZhcy5cbiAgICAgKiBtYXAub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBtb3VzZW91dCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdtb3VzZW91dCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHJpZ2h0IGJ1dHRvbiBvZiB0aGUgbW91c2UgaXMgY2xpY2tlZCBvciB0aGUgY29udGV4dCBtZW51IGtleSBpcyBwcmVzc2VkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IGNvbnRleHRtZW51XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpc1xuICAgICAqIC8vIHByZXNzZWQgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgY29udGV4dG1lbnUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnY29udGV4dG1lbnUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B3aGVlbGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy93aGVlbCkgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IHdoZWVsXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwV2hlZWxFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gYSB3aGVlbCBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd3aGVlbCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egd2hlZWwgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnd2hlZWwnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaHN0YXJ0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNoc3RhcnQpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaHN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGEgdG91Y2hzdGFydCBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSB0b3VjaHN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKi9cbiAgICB8ICd0b3VjaHN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFtgdG91Y2hlbmRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvdG91Y2hlbmQpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaGVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGEgdG91Y2hzdGFydCBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSB0b3VjaHN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKi9cbiAgICB8ICd0b3VjaGVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNobW92ZWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy90b3VjaG1vdmUpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaG1vdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhIHRvdWNobW92ZSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd0b3VjaG1vdmUnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIHRvdWNobW92ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAndG91Y2htb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFtgdG91Y2hjYW5jZWxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvdG91Y2hjYW5jZWwpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaGNhbmNlbFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGEgdG91Y2hjYW5jZWwgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIG1hcC5vbigndG91Y2hjYW5jZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIHRvdWNoY2FuY2VsIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3RvdWNoY2FuY2VsJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBiZWZvcmUgdGhlIG1hcCBiZWdpbnMgYSB0cmFuc2l0aW9uIGZyb20gb25lXG4gICAgICogdmlldyB0byBhbm90aGVyLCBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2p1bXBUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW92ZXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7e29yaWdpbmFsRXZlbnQ6IERyYWdFdmVudH19IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGJlZm9yZSB0aGUgbWFwIGJlZ2lucyBhIHRyYW5zaXRpb25cbiAgICAgKiAvLyBmcm9tIG9uZSB2aWV3IHRvIGFub3RoZXIuXG4gICAgICogbWFwLm9uKCdtb3Zlc3RhcnQnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIG1vdmVzdGFydGAgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnbW92ZXN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgcmVwZWF0ZWRseSBkdXJpbmcgYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbiBmcm9tIG9uZSB2aWV3IHRvXG4gICAgICogYW5vdGhlciwgYXMgdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW92ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gcmVwZWF0ZWRseSBkdXJpbmcgYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKiBtYXAub24oJ21vdmUnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIG1vdmUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRGlzcGxheSBIVE1MIGNsdXN0ZXJzIHdpdGggY3VzdG9tIHByb3BlcnRpZXNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NsdXN0ZXItaHRtbC8pXG4gICAgICogQHNlZSBbRmlsdGVyIGZlYXR1cmVzIHdpdGhpbiBtYXAgdmlld10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICovXG4gICAgfCAnbW92ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1hcCBjb21wbGV0ZXMgYSB0cmFuc2l0aW9uIGZyb20gb25lXG4gICAgICogdmlldyB0byBhbm90aGVyLCBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2p1bXBUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW92ZWVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge3tvcmlnaW5hbEV2ZW50OiBEcmFnRXZlbnR9fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBhZnRlciB0aGUgbWFwIGNvbXBsZXRlcyBhIHRyYW5zaXRpb24uXG4gICAgICogbWFwLm9uKCdtb3ZlZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBtb3ZlZW5kIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW1BsYXkgbWFwIGxvY2F0aW9ucyBhcyBhIHNsaWRlc2hvd10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wbGF5YmFjay1sb2NhdGlvbnMvKVxuICAgICAqIEBzZWUgW0ZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICogQHNlZSBbRGlzcGxheSBIVE1MIGNsdXN0ZXJzIHdpdGggY3VzdG9tIHByb3BlcnRpZXNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NsdXN0ZXItaHRtbC8pXG4gICAgICovXG4gICAgfCAnbW92ZWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gc3RhcnRzLiBTZWUge0BsaW5rIERyYWdQYW5IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBkcmFnc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHt7b3JpZ2luYWxFdmVudDogRHJhZ0V2ZW50fX0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gc3RhcnRzLlxuICAgICAqIG1hcC5vbignZHJhZ3N0YXJ0JywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBkcmFnc3RhcnQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZHJhZ3N0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgcmVwZWF0ZWRseSBkdXJpbmcgYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uIFNlZSB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGRyYWdcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHJlcGVhdGVkbHkgIGR1cmluZyBhIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbi5cbiAgICAgKiBtYXAub24oJ2RyYWcnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIGRyYWcgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZHJhZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gZW5kcy4gU2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZHJhZ2VuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge3tvcmlnaW5hbEV2ZW50OiBEcmFnRXZlbnR9fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBlbmRzLlxuICAgICAqIG1hcC5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgZHJhZ2VuZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgbWFya2VyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtbWFya2VyLylcbiAgICAgKi9cbiAgICB8ICdkcmFnZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBiZWZvcmUgdGhlIG1hcCBiZWdpbnMgYSB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIGEgem9vbSB0cmFuc2l0aW9uIHN0YXJ0cy5cbiAgICAgKiBtYXAub24oJ3pvb21zdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egem9vbXN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3pvb21zdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24gZnJvbSBvbmUgem9vbSBsZXZlbCB0byBhbm90aGVyLFxuICAgICAqIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHpvb21cbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHJlcGVhdGVkbHkgZHVyaW5nIGEgem9vbSB0cmFuc2l0aW9uLlxuICAgICAqIG1hcC5vbignem9vbScsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egem9vbSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtVcGRhdGUgYSBjaG9yb3BsZXRoIGxheWVyIGJ5IHpvb20gbGV2ZWxdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXBkYXRpbmctY2hvcm9wbGV0aC8pXG4gICAgICovXG4gICAgfCAnem9vbSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1hcCBjb21wbGV0ZXMgYSB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGFmdGVyIGEgem9vbSB0cmFuc2l0aW9uIGZpbmlzaGVzLlxuICAgICAqIG1hcC5vbignem9vbWVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egem9vbWVuZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICd6b29tZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBzdGFydHMuIFNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IHJvdGF0ZXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGJlZm9yZSBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBzdGFydHMuXG4gICAgICogbWFwLm9uKCdyb3RhdGVzdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egcm90YXRlc3RhcnQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncm90YXRlc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi4gU2VlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcm90YXRlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyByZXBlYXRlZGx5IGR1cmluZyBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICogbWFwLm9uKCdyb3RhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIHJvdGF0ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdyb3RhdGUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGVuZHMuIFNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IHJvdGF0ZWVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBhZnRlciBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBlbmRzLlxuICAgICAqIG1hcC5vbigncm90YXRlZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSByb3RhdGVlbmQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncm90YXRlZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbmV2ZXIgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBiZWdpbnMgYSBjaGFuZ2UgYXNcbiAgICAgKiB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfSAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcGl0Y2hzdGFydFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcEV2ZW50RGF0YX0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIGEgcGl0Y2ggKHRpbHQpIHRyYW5zaXRpb24gc3RhcnRzLlxuICAgICAqIG1hcC5vbigncGl0Y2hzdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgcGl0Y2hzdGFydCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdwaXRjaHN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgcmVwZWF0ZWRseSBkdXJpbmcgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBhbmltYXRpb24gYmV0d2VlblxuICAgICAqIG9uZSBzdGF0ZSBhbmQgYW5vdGhlciBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uXG4gICAgICogb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHBpdGNoXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRXZlbnREYXRhfSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gcmVwZWF0ZWRseSBkdXJpbmcgYSBwaXRjaCAodGlsdCkgdHJhbnNpdGlvbi5cbiAgICAgKiBtYXAub24oJ3BpdGNoJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBwaXRjaCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdwaXRjaCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAncyBwaXRjaCAodGlsdCkgZmluaXNoZXMgY2hhbmdpbmcgYXNcbiAgICAgKiB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBwaXRjaGVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcEV2ZW50RGF0YX0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYWZ0ZXIgYSBwaXRjaCAodGlsdCkgdHJhbnNpdGlvbiBlbmRzLlxuICAgICAqIG1hcC5vbigncGl0Y2hlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIHBpdGNoZW5kIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3BpdGNoZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBzdGFydHMuIFNlZSB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGJveHpvb21zdGFydFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcEJveFpvb21FdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIHN0YXJ0cy5cbiAgICAgKiBtYXAub24oJ2JveHpvb21zdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgYm94em9vbXN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2JveHpvb21zdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gZW5kcy4gIFNlZSB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGJveHpvb21lbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge01hcEJveFpvb21FdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYWZ0ZXIgYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gZW5kcy5cbiAgICAgKiBtYXAub24oJ2JveHpvb21lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIGJveHpvb21lbmQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnYm94em9vbWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiwgb3Igd2hlbiB0aGUgYm91bmRpbmcgYm94IGRvZXMgbm90IG1lZXQgdGhlIG1pbmltdW0gc2l6ZSB0aHJlc2hvbGQuXG4gICAgICogU2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgYm94em9vbWNhbmNlbFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcEJveFpvb21FdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHRoZSB1c2VyIGNhbmNlbHMgYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICogbWFwLm9uKCdib3h6b29tY2FuY2VsJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBib3h6b29tY2FuY2VsIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2JveHpvb21jYW5jZWwnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFwIGhhcyBiZWVuIHJlc2l6ZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcmVzaXplXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAgaGFzIGJlZW4gcmVzaXplZC5cbiAgICAgKiBtYXAub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgcmVzaXplIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3Jlc2l6ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgbG9zdC5cbiAgICAgKlxuICAgICAqIEBldmVudCB3ZWJnbGNvbnRleHRsb3N0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgbG9zdC5cbiAgICAgKiBtYXAub24oJ3dlYmdsY29udGV4dGxvc3QnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIHdlYmdsY29udGV4dGxvc3QgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnd2ViZ2xjb250ZXh0bG9zdCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgcmVzdG9yZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgd2ViZ2xjb250ZXh0cmVzdG9yZWRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyByZXN0b3JlZC5cbiAgICAgKiBtYXAub24oJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSB3ZWJnbGNvbnRleHRyZXN0b3JlZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICd3ZWJnbGNvbnRleHRyZXN0b3JlZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIGFsbCBuZWNlc3NhcnkgcmVzb3VyY2VzIGhhdmUgYmVlbiBkb3dubG9hZGVkXG4gICAgICogYW5kIHRoZSBmaXJzdCB2aXN1YWxseSBjb21wbGV0ZSByZW5kZXJpbmcgb2YgdGhlIG1hcCBoYXMgb2NjdXJyZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbG9hZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIG1hcCBoYXMgZmluaXNoZWQgbG9hZGluZy5cbiAgICAgKiBtYXAub24oJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIGxvYWQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICAgICAqIEBzZWUgW0FkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS1nZW9qc29uLylcbiAgICAgKiBAc2VlIFtBbmltYXRlIGEgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYW5pbWF0ZS1wb2ludC1hbG9uZy1saW5lLylcbiAgICAgKi9cbiAgICB8ICdsb2FkJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbmV2ZXIgdGhlIG1hcCBpcyBkcmF3biB0byB0aGUgc2NyZWVuLCBhcyB0aGUgcmVzdWx0IG9mXG4gICAgICpcbiAgICAgKiAtIGEgY2hhbmdlIHRvIHRoZSBtYXAncyBwb3NpdGlvbiwgem9vbSwgcGl0Y2gsIG9yIGJlYXJpbmdcbiAgICAgKiAtIGEgY2hhbmdlIHRvIHRoZSBtYXAncyBzdHlsZVxuICAgICAqIC0gYSBjaGFuZ2UgdG8gYSBHZW9KU09OIHNvdXJjZVxuICAgICAqIC0gdGhlIGxvYWRpbmcgb2YgYSB2ZWN0b3IgdGlsZSwgR2VvSlNPTiBmaWxlLCBnbHlwaCwgb3Igc3ByaXRlXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcmVuZGVyXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW5ldmVyIHRoZSBtYXAgaXMgZHJhd24gdG8gdGhlIHNjcmVlbi5cbiAgICAgKiBtYXAub24oJ3JlbmRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgcmVuZGVyIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3JlbmRlcidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHJlbmRlcmVkIGJlZm9yZSB0aGUgbWFwIGVudGVycyBhblxuICAgICAqIFwiaWRsZVwiIHN0YXRlOlxuICAgICAqXG4gICAgICogLSBObyBjYW1lcmEgdHJhbnNpdGlvbnMgYXJlIGluIHByb2dyZXNzXG4gICAgICogLSBBbGwgY3VycmVudGx5IHJlcXVlc3RlZCB0aWxlcyBoYXZlIGxvYWRlZFxuICAgICAqIC0gQWxsIGZhZGUvdHJhbnNpdGlvbiBhbmltYXRpb25zIGhhdmUgY29tcGxldGVkXG4gICAgICpcbiAgICAgKiBAZXZlbnQgaWRsZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGJlZm9yZSB0aGUgbWFwIGVudGVycyBhbiBcImlkbGVcIiBzdGF0ZS5cbiAgICAgKiBtYXAub24oJ2lkbGUnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIGlkbGUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnaWRsZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAgaGFzIGJlZW4gcmVtb3ZlZCB3aXRoIHtAbGluayBNYXAuZXZlbnQ6cmVtb3ZlfS5cbiAgICAgKlxuICAgICAqIEBldmVudCByZW1vdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBhZnRlciB0aGUgbWFwIGlzIHJlbW92ZWQuXG4gICAgICogbWFwLm9uKCdyZW1vdmUnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIHJlbW92ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdyZW1vdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVGhpcyBpcyBHTCBKUydzIHByaW1hcnkgZXJyb3IgcmVwb3J0aW5nXG4gICAgICogbWVjaGFuaXNtLiBXZSB1c2UgYW4gZXZlbnQgaW5zdGVhZCBvZiBgdGhyb3dgIHRvIGJldHRlciBhY2NvbW1vZGF0ZVxuICAgICAqIGFzeW5jcm9ub3VzIG9wZXJhdGlvbnMuIElmIG5vIGxpc3RlbmVycyBhcmUgYm91bmQgdG8gdGhlIGBlcnJvcmAgZXZlbnQsIHRoZVxuICAgICAqIGVycm9yIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKlxuICAgICAqIEBldmVudCBlcnJvclxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge3tlcnJvcjoge21lc3NhZ2U6IHN0cmluZ319fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gICAgICogbWFwLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgZXJyb3IgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZXJyb3InXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFueSBtYXAgZGF0YSBsb2FkcyBvciBjaGFuZ2VzLiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH1cbiAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBkYXRhXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBtYXAgZGF0YSBsb2FkcyBvciBjaGFuZ2VzLlxuICAgICAqIG1hcC5vbignZGF0YScsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0EgZGF0YSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtEaXNwbGF5IEhUTUwgY2x1c3RlcnMgd2l0aCBjdXN0b20gcHJvcGVydGllc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci1odG1sLylcbiAgICAgKi9cbiAgICB8ICdkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbWFwJ3Mgc3R5bGUgbG9hZHMgb3IgY2hhbmdlcy4gU2VlXG4gICAgICoge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVkYXRhXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgbWFwJ3Mgc3R5bGUgbG9hZHMgb3IgY2hhbmdlcy5cbiAgICAgKiBtYXAub24oJ3N0eWxlZGF0YScsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egc3R5bGVkYXRhIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3N0eWxlZGF0YSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIHRoZSBtYXAncyBzb3VyY2VzIGxvYWRzIG9yIGNoYW5nZXMsIGluY2x1ZGluZyBpZiBhIHRpbGUgYmVsb25naW5nXG4gICAgICogdG8gYSBzb3VyY2UgbG9hZHMgb3IgY2hhbmdlcy4gU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IHNvdXJjZWRhdGFcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHsgLy8gbWFwIG9wdGlvbnMgfSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIG9uZSBvZiB0aGUgbWFwJ3Mgc291cmNlcyBsb2FkcyBvciBjaGFuZ2VzLlxuICAgICAqIG1hcC5vbignc291cmNlZGF0YScsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egc291cmNlZGF0YSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdzb3VyY2VkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhbnkgbWFwIGRhdGEgKHN0eWxlLCBzb3VyY2UsIHRpbGUsIGV0YykgYmVnaW5zIGxvYWRpbmcgb3JcbiAgICAgKiBjaGFuZ2luZyBhc3luY3Jvbm91c2x5LiBBbGwgYGRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYGRhdGFgXG4gICAgICogb3IgYGVycm9yYCBldmVudC4gU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IGRhdGFsb2FkaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhbnkgbWFwIGRhdGEgYmVnaW5zIGxvYWRpbmdcbiAgICAgKiAvLyBvciBjaGFuZ2luZyBhc3luY2hyb25vdXNseS5cbiAgICAgKiBtYXAub24oJ2RhdGFsb2FkaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnQSBkYXRhbG9hZGluZyBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdkYXRhbG9hZGluZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIG1hcCdzIHN0eWxlIGJlZ2lucyBsb2FkaW5nIG9yIGNoYW5naW5nIGFzeW5jcm9ub3VzbHkuXG4gICAgICogQWxsIGBzdHlsZWRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYHN0eWxlZGF0YWBcbiAgICAgKiBvciBgZXJyb3JgIGV2ZW50LiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVkYXRhbG9hZGluZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcERhdGFFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIG1hcCdzIHN0eWxlIGJlZ2lucyBsb2FkaW5nIG9yXG4gICAgICogLy8gY2hhbmdpbmcgYXN5bmNyb25vdXNseS5cbiAgICAgKiBtYXAub24oJ3N0eWxlZGF0YWxvYWRpbmcnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBIHN0eWxlZGF0YWxvYWRpbmcgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnc3R5bGVkYXRhbG9hZGluZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gb25lIG9mIHRoZSBtYXAncyBzb3VyY2VzIGJlZ2lucyBsb2FkaW5nIG9yIGNoYW5naW5nIGFzeW5jcm9ub3VzbHkuXG4gICAgICogQWxsIGBzb3VyY2VkYXRhbG9hZGluZ2AgZXZlbnRzIGFyZSBmb2xsb3dlZCBieSBhIGBzb3VyY2VkYXRhYCBvciBgZXJyb3JgIGV2ZW50LlxuICAgICAqIFNlZSB7QGxpbmsgTWFwRGF0YUV2ZW50fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBzb3VyY2VkYXRhbG9hZGluZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge01hcERhdGFFdmVudH0gZGF0YVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoeyAvLyBtYXAgb3B0aW9ucyB9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIG1hcCdzIHNvdXJjZXMgYmVnaW4gbG9hZGluZyBvclxuICAgICAqIC8vIGNoYW5naW5nIGFzeW5jcm9ub3VzbHkuXG4gICAgICogbWFwLm9uKCdzb3VyY2VkYXRhbG9hZGluZycsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egc291cmNlZGF0YWxvYWRpbmcgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnc291cmNlZGF0YWxvYWRpbmcnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFuIGljb24gb3IgcGF0dGVybiBuZWVkZWQgYnkgdGhlIHN0eWxlIGlzIG1pc3NpbmcuIFRoZSBtaXNzaW5nIGltYWdlIGNhblxuICAgICAqIGJlIGFkZGVkIHdpdGgge0BsaW5rIE1hcCNhZGRJbWFnZX0gd2l0aGluIHRoaXMgZXZlbnQgbGlzdGVuZXIgY2FsbGJhY2sgdG8gcHJldmVudCB0aGUgaW1hZ2UgZnJvbVxuICAgICAqIGJlaW5nIHNraXBwZWQuIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgaWNvbnMgYW5kIHBhdHRlcm5zLlxuICAgICAqXG4gICAgICogQGV2ZW50IHN0eWxlaW1hZ2VtaXNzaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBUaGUgaWQgb2YgdGhlIG1pc3NpbmcgaW1hZ2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7IC8vIG1hcCBvcHRpb25zIH0pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gYW4gaWNvbiBvciBwYXR0ZXJuIGlzIG1pc3NpbmcuXG4gICAgICogbWFwLm9uKCdzdHlsZWltYWdlbWlzc2luZycsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ0Egc3R5bGVpbWFnZW1pc3NpbmcgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbR2VuZXJhdGUgYW5kIGFkZCBhIG1pc3NpbmcgaWNvbiB0byB0aGUgbWFwXShodHRwczovL21hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLW1pc3NpbmctZ2VuZXJhdGVkLylcbiAgICAgKi9cbiAgICB8ICdzdHlsZWltYWdlbWlzc2luZydcblxuICAgIC8qKlxuICAgICAqIEBldmVudCBzdHlsZS5sb2FkXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgfCAnc3R5bGUubG9hZCc7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge01hcE1vdXNlRXZlbnQsIE1hcFRvdWNoRXZlbnQsIE1hcFdoZWVsRXZlbnR9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxuZXhwb3J0IGNsYXNzIE1hcEV2ZW50SGFuZGxlciB7XG5cbiAgICBfbW91c2Vkb3duUG9zOiBQb2ludDtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcbiAgICBfbWFwOiBNYXA7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgb3B0aW9uczogeyBjbGlja1RvbGVyYW5jZTogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IG9wdGlvbnMuY2xpY2tUb2xlcmFuY2U7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tb3VzZWRvd25Qb3M7XG4gICAgfVxuXG4gICAgd2hlZWwoZTogV2hlZWxFdmVudCkge1xuICAgICAgICAvLyBJZiBtYXBFdmVudC5wcmV2ZW50RGVmYXVsdCgpIGlzIGNhbGxlZCBieSB0aGUgdXNlciwgcHJldmVudCBoYW5kbGVycyBzdWNoIGFzOlxuICAgICAgICAvLyAtIFNjcm9sbFpvb21cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgTWFwV2hlZWxFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIG1vdXNlZG93bihlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgdGhpcy5fbW91c2Vkb3duUG9zID0gcG9pbnQ7XG4gICAgICAgIC8vIElmIG1hcEV2ZW50LnByZXZlbnREZWZhdWx0KCkgaXMgY2FsbGVkIGJ5IHRoZSB1c2VyLCBwcmV2ZW50IGhhbmRsZXJzIHN1Y2ggYXM6XG4gICAgICAgIC8vIC0gTW91c2VQYW5cbiAgICAgICAgLy8gLSBNb3VzZVJvdGF0ZVxuICAgICAgICAvLyAtIE1vdXNlUGl0Y2hcbiAgICAgICAgLy8gLSBEYmxjbGlja0hhbmRsZXJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIG1vdXNldXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIGNsaWNrKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBpZiAodGhpcy5fbW91c2Vkb3duUG9zICYmIHRoaXMuX21vdXNlZG93blBvcy5kaXN0KHBvaW50KSA+PSB0aGlzLl9jbGlja1RvbGVyYW5jZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIGRibGNsaWNrKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgbWFwRXZlbnQucHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgYnkgdGhlIHVzZXIsIHByZXZlbnQgaGFuZGxlcnMgc3VjaCBhczpcbiAgICAgICAgLy8gLSBEYmxDbGlja1pvb21cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIG1vdXNlb3ZlcihlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgbW91c2VvdXQoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICAvLyBJZiBtYXBFdmVudC5wcmV2ZW50RGVmYXVsdCgpIGlzIGNhbGxlZCBieSB0aGUgdXNlciwgcHJldmVudCBoYW5kbGVycyBzdWNoIGFzOlxuICAgICAgICAvLyAtIFRvdWNoUGFuXG4gICAgICAgIC8vIC0gVG91Y2hab29tXG4gICAgICAgIC8vIC0gVG91Y2hSb3RhdGVcbiAgICAgICAgLy8gLSBUb3VjaFBpdGNoXG4gICAgICAgIC8vIC0gVGFwWm9vbVxuICAgICAgICAvLyAtIFN3aXBlWm9vbVxuICAgICAgICByZXR1cm4gdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBNYXBUb3VjaEV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcFRvdWNoRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBUb3VjaEV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgdG91Y2hjYW5jZWwoZTogVG91Y2hFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwVG91Y2hFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIF9maXJlUHJldmVudGFibGUobWFwRXZlbnQ6IE1hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50IHwgTWFwV2hlZWxFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShtYXBFdmVudCk7XG4gICAgICAgIGlmIChtYXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAvLyByZXR1cm5pbmcgYW4gb2JqZWN0IG1hcmtzIHRoZSBoYW5kbGVyIGFzIGFjdGl2ZSBhbmQgcmVzZXRzIG90aGVyIGhhbmRsZXJzXG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVuYWJsZSgpIHt9XG4gICAgZGlzYWJsZSgpIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBCbG9ja2FibGVNYXBFdmVudEhhbmRsZXIge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfZGVsYXlDb250ZXh0TWVudTogYm9vbGVhbjtcbiAgICBfY29udGV4dE1lbnVFdmVudDogTW91c2VFdmVudDtcblxuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fZGVsYXlDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5fY29udGV4dE1lbnVFdmVudDtcbiAgICB9XG5cbiAgICBtb3VzZW1vdmUoZTogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBtb3VzZW1vdmUgbWFwIGV2ZW50cyBzaG91bGQgbm90IGJlIGZpcmVkIHdoZW4gaW50ZXJhY3Rpb24gaGFuZGxlcnMgKHBhbiwgcm90YXRlLCBldGMpIGFyZSBhY3RpdmVcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBtb3VzZWRvd24oKSB7XG4gICAgICAgIHRoaXMuX2RlbGF5Q29udGV4dE1lbnUgPSB0cnVlO1xuICAgIH1cblxuICAgIG1vdXNldXAoKSB7XG4gICAgICAgIHRoaXMuX2RlbGF5Q29udGV4dE1lbnUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRNZW51RXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KCdjb250ZXh0bWVudScsIHRoaXMuX21hcCwgdGhpcy5fY29udGV4dE1lbnVFdmVudCkpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NvbnRleHRNZW51RXZlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29udGV4dG1lbnUoZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fZGVsYXlDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgLy8gTWFjOiBjb250ZXh0bWVudSBmaXJlZCBvbiBtb3VzZWRvd247IHdlIHNhdmUgaXQgdW50aWwgbW91c2V1cCBmb3IgY29uc2lzdGVuY3kncyBzYWtlXG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0TWVudUV2ZW50ID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdpbmRvd3M6IGNvbnRleHRtZW51IGZpcmVkIG9uIG1vdXNldXAsIHNvIGZpcmUgZXZlbnQgbm93XG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJldmVudCBicm93c2VyIGNvbnRleHQgbWVudSB3aGVuIG5lY2Vzc2FyeVxuICAgICAgICBpZiAodGhpcy5fbWFwLmxpc3RlbnMoJ2NvbnRleHRtZW51JykpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZW5hYmxlKCkge31cbiAgICBkaXNhYmxlKCkge31cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxuLyoqXG4gKiBUaGUgYEJveFpvb21IYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSB0aGUgbWFwIHRvIGZpdCB3aXRoaW4gYSBib3VuZGluZyBib3guXG4gKiBUaGUgYm91bmRpbmcgYm94IGlzIGRlZmluZWQgYnkgY2xpY2tpbmcgYW5kIGhvbGRpbmcgYHNoaWZ0YCB3aGlsZSBkcmFnZ2luZyB0aGUgY3Vyc29yLlxuICovXG5jbGFzcyBCb3hab29tSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfc3RhcnRQb3M6IFBvaW50O1xuICAgIF9sYXN0UG9zOiBQb2ludDtcbiAgICBfYm94OiBIVE1MRWxlbWVudDtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHtcbiAgICAgICAgY2xpY2tUb2xlcmFuY2U6IG51bWJlclxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gbWFwLmdldENvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IG9wdGlvbnMuY2xpY2tUb2xlcmFuY2UgfHwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLmJveFpvb20uZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5ib3hab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG1vdXNlZG93bihlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIGlmICghKGUuc2hpZnRLZXkgJiYgZS5idXR0b24gPT09IDApKSByZXR1cm47XG5cbiAgICAgICAgRE9NLmRpc2FibGVEcmFnKCk7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fbGFzdFBvcyA9IHBvaW50O1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIG1vdXNlbW92ZVdpbmRvdyhlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwb3MgPSBwb2ludDtcblxuICAgICAgICBpZiAodGhpcy5fbGFzdFBvcy5lcXVhbHMocG9zKSB8fCAoIXRoaXMuX2JveCAmJiBwb3MuZGlzdCh0aGlzLl9zdGFydFBvcykgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHAwID0gdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgIHRoaXMuX2xhc3RQb3MgPSBwb3M7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9ib3gpIHtcbiAgICAgICAgICAgIHRoaXMuX2JveCA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1ib3h6b29tJywgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnYm94em9vbXN0YXJ0JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5YID0gTWF0aC5taW4ocDAueCwgcG9zLngpLFxuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHAwLngsIHBvcy54KSxcbiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihwMC55LCBwb3MueSksXG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgocDAueSwgcG9zLnkpO1xuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fYm94LCBgdHJhbnNsYXRlKCR7bWluWH1weCwke21pbll9cHgpYCk7XG5cbiAgICAgICAgdGhpcy5fYm94LnN0eWxlLndpZHRoID0gYCR7bWF4WCAtIG1pblh9cHhgO1xuICAgICAgICB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gYCR7bWF4WSAtIG1pbll9cHhgO1xuICAgIH1cblxuICAgIG1vdXNldXBXaW5kb3coZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcDAgPSB0aGlzLl9zdGFydFBvcyxcbiAgICAgICAgICAgIHAxID0gcG9pbnQ7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIERPTS5zdXBwcmVzc0NsaWNrKCk7XG5cbiAgICAgICAgaWYgKHAwLnggPT09IHAxLnggJiYgcDAueSA9PT0gcDEueSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tY2FuY2VsJywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ2JveHpvb21lbmQnLCB7b3JpZ2luYWxFdmVudDogZX0pKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY2FtZXJhQW5pbWF0aW9uOiBtYXAgPT4gbWFwLmZpdFNjcmVlbkNvb3JkaW5hdGVzKHAwLCBwMSwgdGhpcy5fbWFwLmdldEJlYXJpbmcoKSwge2xpbmVhcjogdHJ1ZX0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAga2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnYm94em9vbWNhbmNlbCcsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcblxuICAgICAgICBpZiAodGhpcy5fYm94KSB7XG4gICAgICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2JveCk7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSAobnVsbDogYW55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0UG9zO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGFzdFBvcztcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGU6IHN0cmluZywgZTogKikge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KHR5cGUsIHtvcmlnaW5hbEV2ZW50OiBlfSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQm94Wm9vbUhhbmRsZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmRleFRvdWNoZXModG91Y2hlczogQXJyYXk8VG91Y2g+LCBwb2ludHM6IEFycmF5PFBvaW50Pikge1xuICAgIGFzc2VydCh0b3VjaGVzLmxlbmd0aCA9PT0gcG9pbnRzLmxlbmd0aCk7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9ialt0b3VjaGVzW2ldLmlkZW50aWZpZXJdID0gcG9pbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtpbmRleFRvdWNoZXN9IGZyb20gJy4vaGFuZGxlcl91dGlsJztcblxuZnVuY3Rpb24gZ2V0Q2VudHJvaWQocG9pbnRzOiBBcnJheTxQb2ludD4pIHtcbiAgICBjb25zdCBzdW0gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgc3VtLl9hZGQocG9pbnQpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtLmRpdihwb2ludHMubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGNvbnN0IE1BWF9UQVBfSU5URVJWQUwgPSA1MDA7XG5jb25zdCBNQVhfVE9VQ0hfVElNRSA9IDUwMDtcbmNvbnN0IE1BWF9ESVNUID0gMzA7XG5cbmV4cG9ydCBjbGFzcyBTaW5nbGVUYXBSZWNvZ25pemVyIHtcblxuICAgIG51bVRvdWNoZXM6IG51bWJlcjtcbiAgICBjZW50cm9pZDogUG9pbnQ7XG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XG4gICAgYWJvcnRlZDogYm9vbGVhbjtcbiAgICB0b3VjaGVzOiB7IFtudW1iZXIgfCBzdHJpbmddOiBQb2ludCB9O1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogeyBudW1Ub3VjaGVzOiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHRoaXMubnVtVG91Y2hlcyA9IG9wdGlvbnMubnVtVG91Y2hlcztcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2VudHJvaWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0YXJ0VGltZTtcbiAgICAgICAgZGVsZXRlIHRoaXMudG91Y2hlcztcbiAgICAgICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdG91Y2hzdGFydChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG5cbiAgICAgICAgaWYgKHRoaXMuY2VudHJvaWQgfHwgbWFwVG91Y2hlcy5sZW5ndGggPiB0aGlzLm51bVRvdWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWJvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IHRoaXMubnVtVG91Y2hlcykge1xuICAgICAgICAgICAgdGhpcy5jZW50cm9pZCA9IGdldENlbnRyb2lkKHBvaW50cyk7XG4gICAgICAgICAgICB0aGlzLnRvdWNoZXMgPSBpbmRleFRvdWNoZXMobWFwVG91Y2hlcywgcG9pbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWQgfHwgIXRoaXMuY2VudHJvaWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBuZXdUb3VjaGVzID0gaW5kZXhUb3VjaGVzKG1hcFRvdWNoZXMsIHBvaW50cyk7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy50b3VjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2UG9zID0gdGhpcy50b3VjaGVzW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IG5ld1RvdWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKCFwb3MgfHwgcG9zLmRpc3QocHJldlBvcykgPiBNQVhfRElTVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICghdGhpcy5jZW50cm9pZCB8fCBlLnRpbWVTdGFtcCAtIHRoaXMuc3RhcnRUaW1lID4gTUFYX1RPVUNIX1RJTUUpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRyb2lkID0gIXRoaXMuYWJvcnRlZCAmJiB0aGlzLmNlbnRyb2lkO1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgaWYgKGNlbnRyb2lkKSByZXR1cm4gY2VudHJvaWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIFRhcFJlY29nbml6ZXIge1xuXG4gICAgc2luZ2xlVGFwOiBTaW5nbGVUYXBSZWNvZ25pemVyO1xuICAgIG51bVRhcHM6IG51bWJlcjtcbiAgICBsYXN0VGltZTogbnVtYmVyO1xuICAgIGxhc3RUYXA6IFBvaW50O1xuICAgIGNvdW50OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IG51bVRhcHM6IG51bWJlciwgbnVtVG91Y2hlczogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy5zaW5nbGVUYXAgPSBuZXcgU2luZ2xlVGFwUmVjb2duaXplcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5udW1UYXBzID0gb3B0aW9ucy5udW1UYXBzO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMubGFzdFRpbWUgPSBJbmZpbml0eTtcbiAgICAgICAgZGVsZXRlIHRoaXMubGFzdFRhcDtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc2luZ2xlVGFwLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgdG91Y2hzdGFydChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIHRoaXMuc2luZ2xlVGFwLnRvdWNoc3RhcnQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLnNpbmdsZVRhcC50b3VjaG1vdmUoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGNvbnN0IHRhcCA9IHRoaXMuc2luZ2xlVGFwLnRvdWNoZW5kKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIGlmICh0YXApIHtcbiAgICAgICAgICAgIGNvbnN0IHNvb25Fbm91Z2ggPSBlLnRpbWVTdGFtcCAtIHRoaXMubGFzdFRpbWUgPCBNQVhfVEFQX0lOVEVSVkFMO1xuICAgICAgICAgICAgY29uc3QgY2xvc2VFbm91Z2ggPSAhdGhpcy5sYXN0VGFwIHx8IHRoaXMubGFzdFRhcC5kaXN0KHRhcCkgPCBNQVhfRElTVDtcblxuICAgICAgICAgICAgaWYgKCFzb29uRW5vdWdoIHx8ICFjbG9zZUVub3VnaCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5sYXN0VGltZSA9IGUudGltZVN0YW1wO1xuICAgICAgICAgICAgdGhpcy5sYXN0VGFwID0gdGFwO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gdGhpcy5udW1UYXBzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1RhcFJlY29nbml6ZXJ9IGZyb20gJy4vdGFwX3JlY29nbml6ZXInO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFwWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfem9vbUluOiBUYXBSZWNvZ25pemVyO1xuICAgIF96b29tT3V0OiBUYXBSZWNvZ25pemVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3pvb21JbiA9IG5ldyBUYXBSZWNvZ25pemVyKHtcbiAgICAgICAgICAgIG51bVRvdWNoZXM6IDEsXG4gICAgICAgICAgICBudW1UYXBzOiAyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3pvb21PdXQgPSBuZXcgVGFwUmVjb2duaXplcih7XG4gICAgICAgICAgICBudW1Ub3VjaGVzOiAyLFxuICAgICAgICAgICAgbnVtVGFwczogMVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl96b29tSW4ucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fem9vbU91dC5yZXNldCgpO1xuICAgIH1cblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLl96b29tSW4udG91Y2hzdGFydChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgICAgICB0aGlzLl96b29tT3V0LnRvdWNoc3RhcnQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLl96b29tSW4udG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIHRoaXMuX3pvb21PdXQudG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgfVxuXG4gICAgdG91Y2hlbmQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICBjb25zdCB6b29tSW5Qb2ludCA9IHRoaXMuX3pvb21Jbi50b3VjaGVuZChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgICAgICBjb25zdCB6b29tT3V0UG9pbnQgPSB0aGlzLl96b29tT3V0LnRvdWNoZW5kKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG5cbiAgICAgICAgaWYgKHpvb21JblBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2V0KCksIDApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjYW1lcmFBbmltYXRpb246IChtYXA6IE1hcCkgPT4gbWFwLmVhc2VUbyh7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICAgICAgICAgIHpvb206IG1hcC5nZXRab29tKCkgKyAxLFxuICAgICAgICAgICAgICAgICAgICBhcm91bmQ6IG1hcC51bnByb2plY3Qoem9vbUluUG9pbnQpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh6b29tT3V0UG9pbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVzZXQoKSwgMCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNhbWVyYUFuaW1hdGlvbjogKG1hcDogTWFwKSA9PiBtYXAuZWFzZVRvKHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICAgICAgem9vbTogbWFwLmdldFpvb20oKSAtIDEsXG4gICAgICAgICAgICAgICAgICAgIGFyb3VuZDogbWFwLnVucHJvamVjdCh6b29tT3V0UG9pbnQpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNoY2FuY2VsKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmNvbnN0IExFRlRfQlVUVE9OID0gMDtcbmNvbnN0IFJJR0hUX0JVVFRPTiA9IDI7XG5cbi8vIHRoZSB2YWx1ZXMgZm9yIGVhY2ggYnV0dG9uIGluIE1vdXNlRXZlbnQuYnV0dG9uc1xuY29uc3QgQlVUVE9OU19GTEFHUyA9IHtcbiAgICBbTEVGVF9CVVRUT05dOiAxLFxuICAgIFtSSUdIVF9CVVRUT05dOiAyXG59O1xuXG5mdW5jdGlvbiBidXR0b25TdGlsbFByZXNzZWQoZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpIHtcbiAgICBjb25zdCBmbGFnID0gQlVUVE9OU19GTEFHU1tidXR0b25dO1xuICAgIHJldHVybiBlLmJ1dHRvbnMgPT09IHVuZGVmaW5lZCB8fCAoZS5idXR0b25zICYgZmxhZykgIT09IGZsYWc7XG59XG5cbmNsYXNzIE1vdXNlSGFuZGxlciB7XG5cbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF9sYXN0UG9pbnQ6IFBvaW50O1xuICAgIF9ldmVudEJ1dHRvbjogbnVtYmVyO1xuICAgIF9tb3ZlZDogYm9vbGVhbjtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgY2xpY2tUb2xlcmFuY2U6IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlIHx8IDE7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tb3ZlZCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGFzdFBvaW50O1xuICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRCdXR0b247XG4gICAgfVxuXG4gICAgX2NvcnJlY3RCdXR0b24oZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpIHsgIC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGltcGxlbWVudGVkIGJ5IGNoaWxkXG4gICAgfVxuXG4gICAgX21vdmUobGFzdFBvaW50OiBQb2ludCwgcG9pbnQ6IFBvaW50KSB7ICAvL2VzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgcmV0dXJuIHt9OyAvLyBpbXBsZW1lbnRlZCBieSBjaGlsZFxuICAgIH1cblxuICAgIG1vdXNlZG93bihlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RQb2ludCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50QnV0dG9uID0gRE9NLm1vdXNlQnV0dG9uKGUpO1xuICAgICAgICBpZiAoIXRoaXMuX2NvcnJlY3RCdXR0b24oZSwgZXZlbnRCdXR0b24pKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fbGFzdFBvaW50ID0gcG9pbnQ7XG4gICAgICAgIHRoaXMuX2V2ZW50QnV0dG9uID0gZXZlbnRCdXR0b247XG4gICAgfVxuXG4gICAgbW91c2Vtb3ZlV2luZG93KGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBjb25zdCBsYXN0UG9pbnQgPSB0aGlzLl9sYXN0UG9pbnQ7XG4gICAgICAgIGlmICghbGFzdFBvaW50KSByZXR1cm47XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAoYnV0dG9uU3RpbGxQcmVzc2VkKGUsIHRoaXMuX2V2ZW50QnV0dG9uKSkge1xuICAgICAgICAgICAgLy8gU29tZSBicm93c2VycyBkb24ndCBmaXJlIGEgYG1vdXNldXBgIHdoZW4gdGhlIG1vdXNldXAgb2NjdXJzIG91dHNpZGVcbiAgICAgICAgICAgIC8vIHRoZSB3aW5kb3cgb3IgaWZyYW1lOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzQ2MjJcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJZiB0aGUgYnV0dG9uIGlzIG5vIGxvbmdlciBwcmVzc2VkIGR1cmluZyB0aGlzIGBtb3VzZW1vdmVgIGl0IG1heSBoYXZlXG4gICAgICAgICAgICAvLyBiZWVuIHJlbGVhc2VkIG91dHNpZGUgb2YgdGhlIHdpbmRvdyBvciBpZnJhbWUuXG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vdmVkICYmIHBvaW50LmRpc3QobGFzdFBvaW50KSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21vdmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbGFzdFBvaW50ID0gcG9pbnQ7XG5cbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3NcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdmUobGFzdFBvaW50LCBwb2ludCk7XG4gICAgfVxuXG4gICAgbW91c2V1cFdpbmRvdyhlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5fbGFzdFBvaW50KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGV2ZW50QnV0dG9uID0gRE9NLm1vdXNlQnV0dG9uKGUpO1xuICAgICAgICBpZiAoZXZlbnRCdXR0b24gIT09IHRoaXMuX2V2ZW50QnV0dG9uKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLl9tb3ZlZCkgRE9NLnN1cHByZXNzQ2xpY2soKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb3VzZVBhbkhhbmRsZXIgZXh0ZW5kcyBNb3VzZUhhbmRsZXIge1xuXG4gICAgbW91c2Vkb3duKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBzdXBlci5tb3VzZWRvd24oZSwgcG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5fbGFzdFBvaW50KSB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBfY29ycmVjdEJ1dHRvbihlOiBNb3VzZUV2ZW50LCBidXR0b246IG51bWJlcikge1xuICAgICAgICByZXR1cm4gYnV0dG9uID09PSBMRUZUX0JVVFRPTiAmJiAhZS5jdHJsS2V5O1xuICAgIH1cblxuICAgIF9tb3ZlKGxhc3RQb2ludDogUG9pbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJvdW5kOiBwb2ludCxcbiAgICAgICAgICAgIHBhbkRlbHRhOiBwb2ludC5zdWIobGFzdFBvaW50KVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vdXNlUm90YXRlSGFuZGxlciBleHRlbmRzIE1vdXNlSGFuZGxlciB7XG4gICAgX2NvcnJlY3RCdXR0b24oZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIChidXR0b24gPT09IExFRlRfQlVUVE9OICYmIGUuY3RybEtleSkgfHwgKGJ1dHRvbiA9PT0gUklHSFRfQlVUVE9OKTtcbiAgICB9XG5cbiAgICBfbW92ZShsYXN0UG9pbnQ6IFBvaW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVncmVlc1BlclBpeGVsTW92ZWQgPSAwLjg7XG4gICAgICAgIGNvbnN0IGJlYXJpbmdEZWx0YSA9IChwb2ludC54IC0gbGFzdFBvaW50LngpICogZGVncmVlc1BlclBpeGVsTW92ZWQ7XG4gICAgICAgIGlmIChiZWFyaW5nRGVsdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4ge2JlYXJpbmdEZWx0YX07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0bWVudShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIHByZXZlbnQgYnJvd3NlciBjb250ZXh0IG1lbnUgd2hlbiBuZWNlc3Nhcnk7IHdlIGRvbid0IGFsbG93IGl0IHdpdGggcm90YXRpb25cbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCBkaXNjZXJuIHJvdGF0aW9uIGdlc3R1cmUgc3RhcnQgZnJvbSBjb250ZXh0bWVudSBvbiBNYWNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vdXNlUGl0Y2hIYW5kbGVyIGV4dGVuZHMgTW91c2VIYW5kbGVyIHtcbiAgICBfY29ycmVjdEJ1dHRvbihlOiBNb3VzZUV2ZW50LCBidXR0b246IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKGJ1dHRvbiA9PT0gTEVGVF9CVVRUT04gJiYgZS5jdHJsS2V5KSB8fCAoYnV0dG9uID09PSBSSUdIVF9CVVRUT04pO1xuICAgIH1cblxuICAgIF9tb3ZlKGxhc3RQb2ludDogUG9pbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBjb25zdCBkZWdyZWVzUGVyUGl4ZWxNb3ZlZCA9IC0wLjU7XG4gICAgICAgIGNvbnN0IHBpdGNoRGVsdGEgPSAocG9pbnQueSAtIGxhc3RQb2ludC55KSAqIGRlZ3JlZXNQZXJQaXhlbE1vdmVkO1xuICAgICAgICBpZiAocGl0Y2hEZWx0YSkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB7cGl0Y2hEZWx0YX07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0bWVudShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIHByZXZlbnQgYnJvd3NlciBjb250ZXh0IG1lbnUgd2hlbiBuZWNlc3Nhcnk7IHdlIGRvbid0IGFsbG93IGl0IHdpdGggcm90YXRpb25cbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCBkaXNjZXJuIHJvdGF0aW9uIGdlc3R1cmUgc3RhcnQgZnJvbSBjb250ZXh0bWVudSBvbiBNYWNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7aW5kZXhUb3VjaGVzfSBmcm9tICcuL2hhbmRsZXJfdXRpbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvdWNoUGFuSGFuZGxlciB7XG5cbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF90b3VjaGVzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBQb2ludCB9O1xuICAgIF9taW5Ub3VjaGVzOiBudW1iZXI7XG4gICAgX2NsaWNrVG9sZXJhbmNlOiBudW1iZXI7XG4gICAgX3N1bTogUG9pbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGNsaWNrVG9sZXJhbmNlOiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLl9taW5Ub3VjaGVzID0gMTtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlIHx8IDE7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3RvdWNoZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fc3VtID0gbmV3IFBvaW50KDAsIDApO1xuICAgIH1cblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUgfHwgbWFwVG91Y2hlcy5sZW5ndGggPCB0aGlzLl9taW5Ub3VjaGVzKSByZXR1cm47XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZVRyYW5zZm9ybShlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgIH1cblxuICAgIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSAmJiBtYXBUb3VjaGVzLmxlbmd0aCA8IHRoaXMuX21pblRvdWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNoY2FuY2VsKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgX2NhbGN1bGF0ZVRyYW5zZm9ybShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmIChtYXBUb3VjaGVzLmxlbmd0aCA+IDApIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgdG91Y2hlcyA9IGluZGV4VG91Y2hlcyhtYXBUb3VjaGVzLCBwb2ludHMpO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoUG9pbnRTdW0gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgIGNvbnN0IHRvdWNoRGVsdGFTdW0gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgIGxldCB0b3VjaERlbHRhQ291bnQgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBpbiB0b3VjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHRvdWNoZXNbaWRlbnRpZmllcl07XG4gICAgICAgICAgICBjb25zdCBwcmV2UG9pbnQgPSB0aGlzLl90b3VjaGVzW2lkZW50aWZpZXJdO1xuICAgICAgICAgICAgaWYgKHByZXZQb2ludCkge1xuICAgICAgICAgICAgICAgIHRvdWNoUG9pbnRTdW0uX2FkZChwb2ludCk7XG4gICAgICAgICAgICAgICAgdG91Y2hEZWx0YVN1bS5fYWRkKHBvaW50LnN1YihwcmV2UG9pbnQpKTtcbiAgICAgICAgICAgICAgICB0b3VjaERlbHRhQ291bnQrKztcbiAgICAgICAgICAgICAgICB0b3VjaGVzW2lkZW50aWZpZXJdID0gcG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90b3VjaGVzID0gdG91Y2hlcztcblxuICAgICAgICBpZiAodG91Y2hEZWx0YUNvdW50IDwgdGhpcy5fbWluVG91Y2hlcyB8fCAhdG91Y2hEZWx0YVN1bS5tYWcoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhbkRlbHRhID0gdG91Y2hEZWx0YVN1bS5kaXYodG91Y2hEZWx0YUNvdW50KTtcbiAgICAgICAgdGhpcy5fc3VtLl9hZGQocGFuRGVsdGEpO1xuICAgICAgICBpZiAodGhpcy5fc3VtLm1hZygpIDwgdGhpcy5fY2xpY2tUb2xlcmFuY2UpIHJldHVybjtcblxuICAgICAgICBjb25zdCBhcm91bmQgPSB0b3VjaFBvaW50U3VtLmRpdih0b3VjaERlbHRhQ291bnQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcm91bmQsXG4gICAgICAgICAgICBwYW5EZWx0YVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tJztcblxuY2xhc3MgVHdvVG91Y2hIYW5kbGVyIHtcblxuICAgIF9lbmFibGVkOiBib29sZWFuO1xuICAgIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgX2ZpcnN0VHdvVG91Y2hlczogW251bWJlciwgbnVtYmVyXTtcbiAgICBfdmVjdG9yOiBQb2ludDtcbiAgICBfc3RhcnRWZWN0b3I6IFBvaW50O1xuICAgIF9hcm91bmRDZW50ZXI6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2ZpcnN0VHdvVG91Y2hlcztcbiAgICB9XG5cbiAgICBfc3RhcnQocG9pbnRzOiBbUG9pbnQsIFBvaW50XSkge30gLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgX21vdmUocG9pbnRzOiBbUG9pbnQsIFBvaW50XSwgcGluY2hBcm91bmQ6IFBvaW50LCBlOiBUb3VjaEV2ZW50KSB7IHJldHVybiB7fTsgfSAvL2VzbGludC1kaXNhYmxlLWxpbmVcblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGUudGFyZ2V0LCBlLnRhcmdldFRvdWNoZXMubGVuZ3RoID8gZS50YXJnZXRUb3VjaGVzWzBdLnRhcmdldCA6IG51bGwpO1xuICAgICAgICAvL2xvZygndG91Y2hzdGFydCcsIHBvaW50cywgZS50YXJnZXQuaW5uZXJIVE1MLCBlLnRhcmdldFRvdWNoZXMubGVuZ3RoID8gZS50YXJnZXRUb3VjaGVzWzBdLnRhcmdldC5pbm5lckhUTUw6IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLl9maXJzdFR3b1RvdWNoZXMgfHwgbWFwVG91Y2hlcy5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fZmlyc3RUd29Ub3VjaGVzID0gW1xuICAgICAgICAgICAgbWFwVG91Y2hlc1swXS5pZGVudGlmaWVyLFxuICAgICAgICAgICAgbWFwVG91Y2hlc1sxXS5pZGVudGlmaWVyXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3Nlc1xuICAgICAgICB0aGlzLl9zdGFydChbcG9pbnRzWzBdLCBwb2ludHNbMV1dKTtcbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICBpZiAoIXRoaXMuX2ZpcnN0VHdvVG91Y2hlcykgcmV0dXJuO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBbaWRBLCBpZEJdID0gdGhpcy5fZmlyc3RUd29Ub3VjaGVzO1xuICAgICAgICBjb25zdCBhID0gZ2V0VG91Y2hCeUlkKG1hcFRvdWNoZXMsIHBvaW50cywgaWRBKTtcbiAgICAgICAgY29uc3QgYiA9IGdldFRvdWNoQnlJZChtYXBUb3VjaGVzLCBwb2ludHMsIGlkQik7XG4gICAgICAgIGlmICghYSB8fCAhYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBwaW5jaEFyb3VuZCA9IHRoaXMuX2Fyb3VuZENlbnRlciA/IG51bGwgOiBhLmFkZChiKS5kaXYoMik7XG5cbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3Nlc1xuICAgICAgICByZXR1cm4gdGhpcy5fbW92ZShbYSwgYl0sIHBpbmNoQXJvdW5kLCBlKTtcblxuICAgIH1cblxuICAgIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9maXJzdFR3b1RvdWNoZXMpIHJldHVybjtcblxuICAgICAgICBjb25zdCBbaWRBLCBpZEJdID0gdGhpcy5fZmlyc3RUd29Ub3VjaGVzO1xuICAgICAgICBjb25zdCBhID0gZ2V0VG91Y2hCeUlkKG1hcFRvdWNoZXMsIHBvaW50cywgaWRBKTtcbiAgICAgICAgY29uc3QgYiA9IGdldFRvdWNoQnlJZChtYXBUb3VjaGVzLCBwb2ludHMsIGlkQik7XG4gICAgICAgIGlmIChhICYmIGIpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSBET00uc3VwcHJlc3NDbGljaygpO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0b3VjaGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGVuYWJsZShvcHRpb25zOiA/e2Fyb3VuZD86ICdjZW50ZXInfSkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYXJvdW5kQ2VudGVyID0gISFvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0VG91Y2hCeUlkKG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPiwgcG9pbnRzOiBBcnJheTxQb2ludD4sIGlkZW50aWZpZXI6IG51bWJlcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWFwVG91Y2hlc1tpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSByZXR1cm4gcG9pbnRzW2ldO1xuICAgIH1cbn1cblxuLyogWk9PTSAqL1xuXG5jb25zdCBaT09NX1RIUkVTSE9MRCA9IDAuMTtcblxuZnVuY3Rpb24gZ2V0Wm9vbURlbHRhKGRpc3RhbmNlLCBsYXN0RGlzdGFuY2UpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coZGlzdGFuY2UgLyBsYXN0RGlzdGFuY2UpIC8gTWF0aC5MTjI7XG59XG5cbmV4cG9ydCBjbGFzcyBUb3VjaFpvb21IYW5kbGVyIGV4dGVuZHMgVHdvVG91Y2hIYW5kbGVyIHtcblxuICAgIF9kaXN0YW5jZTogbnVtYmVyO1xuICAgIF9zdGFydERpc3RhbmNlOiBudW1iZXI7XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgc3VwZXIucmVzZXQoKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2Rpc3RhbmNlO1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RhcnREaXN0YW5jZTtcbiAgICB9XG5cbiAgICBfc3RhcnQocG9pbnRzOiBbUG9pbnQsIFBvaW50XSkge1xuICAgICAgICB0aGlzLl9zdGFydERpc3RhbmNlID0gdGhpcy5fZGlzdGFuY2UgPSBwb2ludHNbMF0uZGlzdChwb2ludHNbMV0pO1xuICAgIH1cblxuICAgIF9tb3ZlKHBvaW50czogW1BvaW50LCBQb2ludF0sIHBpbmNoQXJvdW5kOiBQb2ludCkge1xuICAgICAgICBjb25zdCBsYXN0RGlzdGFuY2UgPSB0aGlzLl9kaXN0YW5jZTtcbiAgICAgICAgdGhpcy5fZGlzdGFuY2UgPSBwb2ludHNbMF0uZGlzdChwb2ludHNbMV0pO1xuICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZSAmJiBNYXRoLmFicyhnZXRab29tRGVsdGEodGhpcy5fZGlzdGFuY2UsIHRoaXMuX3N0YXJ0RGlzdGFuY2UpKSA8IFpPT01fVEhSRVNIT0xEKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB6b29tRGVsdGE6IGdldFpvb21EZWx0YSh0aGlzLl9kaXN0YW5jZSwgbGFzdERpc3RhbmNlKSxcbiAgICAgICAgICAgIHBpbmNoQXJvdW5kXG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKiBST1RBVEUgKi9cblxuY29uc3QgUk9UQVRJT05fVEhSRVNIT0xEID0gMjU7IC8vIHBpeGVscyBhbG9uZyBjaXJjdW1mZXJlbmNlIG9mIHRvdWNoIGNpcmNsZVxuXG5mdW5jdGlvbiBnZXRCZWFyaW5nRGVsdGEoYSwgYikge1xuICAgIHJldHVybiBhLmFuZ2xlV2l0aChiKSAqIDE4MCAvIE1hdGguUEk7XG59XG5cbmV4cG9ydCBjbGFzcyBUb3VjaFJvdGF0ZUhhbmRsZXIgZXh0ZW5kcyBUd29Ub3VjaEhhbmRsZXIge1xuICAgIF9taW5EaWFtZXRlcjogbnVtYmVyO1xuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHN1cGVyLnJlc2V0KCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9taW5EaWFtZXRlcjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0VmVjdG9yO1xuICAgICAgICBkZWxldGUgdGhpcy5fdmVjdG9yO1xuICAgIH1cblxuICAgIF9zdGFydChwb2ludHM6IFtQb2ludCwgUG9pbnRdKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjdG9yID0gdGhpcy5fdmVjdG9yID0gcG9pbnRzWzBdLnN1Yihwb2ludHNbMV0pO1xuICAgICAgICB0aGlzLl9taW5EaWFtZXRlciA9IHBvaW50c1swXS5kaXN0KHBvaW50c1sxXSk7XG4gICAgfVxuXG4gICAgX21vdmUocG9pbnRzOiBbUG9pbnQsIFBvaW50XSwgcGluY2hBcm91bmQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3RWZWN0b3IgPSB0aGlzLl92ZWN0b3I7XG4gICAgICAgIHRoaXMuX3ZlY3RvciA9IHBvaW50c1swXS5zdWIocG9pbnRzWzFdKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZSAmJiB0aGlzLl9pc0JlbG93VGhyZXNob2xkKHRoaXMuX3ZlY3RvcikpIHJldHVybjtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVhcmluZ0RlbHRhOiBnZXRCZWFyaW5nRGVsdGEodGhpcy5fdmVjdG9yLCBsYXN0VmVjdG9yKSxcbiAgICAgICAgICAgIHBpbmNoQXJvdW5kXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX2lzQmVsb3dUaHJlc2hvbGQodmVjdG9yOiBQb2ludCkge1xuICAgICAgICAvKlxuICAgICAgICAgKiBUaGUgdGhyZXNob2xkIGJlZm9yZSBhIHJvdGF0aW9uIGFjdHVhbGx5IGhhcHBlbnMgaXMgY29uZmlndXJlZCBpblxuICAgICAgICAgKiBwaXhlbHMgYWxvbmd0aCBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjaXJjbGUgZm9ybWVkIGJ5IHRoZSB0d28gZmluZ2Vycy5cbiAgICAgICAgICogVGhpcyBtYWtlcyB0aGUgdGhyZXNob2xkIGluIGRlZ3JlZXMgbGFyZ2VyIHdoZW4gdGhlIGZpbmdlcnMgYXJlIGNsb3NlXG4gICAgICAgICAqIHRvZ2V0aGVyIGFuZCBzbWFsbGVyIHdoZW4gdGhlIGZpbmdlcnMgYXJlIGZhciBhcGFydC5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlIHRoZSBzbWFsbGVzdCBkaWFtZXRlciBmcm9tIHRoZSB3aG9sZSBnZXN0dXJlIHRvIHJlZHVjZSBzZW5zaXRpdml0eVxuICAgICAgICAgKiB3aGVuIHBpbmNoaW5nIGluIGFuZCBvdXQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIHRoaXMuX21pbkRpYW1ldGVyID0gTWF0aC5taW4odGhpcy5fbWluRGlhbWV0ZXIsIHZlY3Rvci5tYWcoKSk7XG4gICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSBNYXRoLlBJICogdGhpcy5fbWluRGlhbWV0ZXI7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IFJPVEFUSU9OX1RIUkVTSE9MRCAvIGNpcmN1bWZlcmVuY2UgKiAzNjA7XG5cbiAgICAgICAgY29uc3QgYmVhcmluZ0RlbHRhU2luY2VTdGFydCA9IGdldEJlYXJpbmdEZWx0YSh2ZWN0b3IsIHRoaXMuX3N0YXJ0VmVjdG9yKTtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGJlYXJpbmdEZWx0YVNpbmNlU3RhcnQpIDwgdGhyZXNob2xkO1xuICAgIH1cbn1cblxuLyogUElUQ0ggKi9cblxuZnVuY3Rpb24gaXNWZXJ0aWNhbCh2ZWN0b3IpIHtcbiAgICByZXR1cm4gTWF0aC5hYnModmVjdG9yLnkpID4gTWF0aC5hYnModmVjdG9yLngpO1xufVxuXG5jb25zdCBBTExPV0VEX1NJTkdMRV9UT1VDSF9USU1FID0gMTAwO1xuXG4vKipcbiAqIFRoZSBgVG91Y2hQaXRjaEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byBwaXRjaCB0aGUgbWFwIGJ5IGRyYWdnaW5nIHVwIGFuZCBkb3duIHdpdGggdHdvIGZpbmdlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3VjaFBpdGNoSGFuZGxlciBleHRlbmRzIFR3b1RvdWNoSGFuZGxlciB7XG5cbiAgICBfdmFsaWQ6IGJvb2xlYW4gfCB2b2lkO1xuICAgIF9maXJzdE1vdmU6IG51bWJlcjtcbiAgICBfbGFzdFBvaW50czogW1BvaW50LCBQb2ludF07XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgc3VwZXIucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9maXJzdE1vdmU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0UG9pbnRzO1xuICAgIH1cblxuICAgIF9zdGFydChwb2ludHM6IFtQb2ludCwgUG9pbnRdKSB7XG4gICAgICAgIHRoaXMuX2xhc3RQb2ludHMgPSBwb2ludHM7XG4gICAgICAgIGlmIChpc1ZlcnRpY2FsKHBvaW50c1swXS5zdWIocG9pbnRzWzFdKSkpIHtcbiAgICAgICAgICAgIC8vIGZpbmdlcnMgYXJlIG1vcmUgaG9yaXpvbnRhbCB0aGFuIHZlcnRpY2FsXG4gICAgICAgICAgICB0aGlzLl92YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbW92ZShwb2ludHM6IFtQb2ludCwgUG9pbnRdLCBjZW50ZXI6IFBvaW50LCBlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHZlY3RvckEgPSBwb2ludHNbMF0uc3ViKHRoaXMuX2xhc3RQb2ludHNbMF0pO1xuICAgICAgICBjb25zdCB2ZWN0b3JCID0gcG9pbnRzWzFdLnN1Yih0aGlzLl9sYXN0UG9pbnRzWzFdKTtcblxuICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMuZ2VzdHVyZUJlZ2luc1ZlcnRpY2FsbHkodmVjdG9yQSwgdmVjdG9yQiwgZS50aW1lU3RhbXApO1xuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fbGFzdFBvaW50cyA9IHBvaW50cztcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeURlbHRhQXZlcmFnZSA9ICh2ZWN0b3JBLnkgKyB2ZWN0b3JCLnkpIC8gMjtcbiAgICAgICAgY29uc3QgZGVncmVlc1BlclBpeGVsTW92ZWQgPSAtMC41O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGl0Y2hEZWx0YTogeURlbHRhQXZlcmFnZSAqIGRlZ3JlZXNQZXJQaXhlbE1vdmVkXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2VzdHVyZUJlZ2luc1ZlcnRpY2FsbHkodmVjdG9yQTogUG9pbnQsIHZlY3RvckI6IFBvaW50LCB0aW1lU3RhbXA6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5fdmFsaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuXG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG4gICAgICAgIGNvbnN0IG1vdmVkQSA9IHZlY3RvckEubWFnKCkgPj0gdGhyZXNob2xkO1xuICAgICAgICBjb25zdCBtb3ZlZEIgPSB2ZWN0b3JCLm1hZygpID49IHRocmVzaG9sZDtcblxuICAgICAgICAvLyBuZWl0aGVyIGZpbmdlciBoYXMgbW92ZWQgYSBtZWFuaW5nZnVsIGFtb3VudCwgd2FpdFxuICAgICAgICBpZiAoIW1vdmVkQSAmJiAhbW92ZWRCKSByZXR1cm47XG5cbiAgICAgICAgLy8gT25lIGZpbmdlciBoYXMgbW92ZWQgYW5kIHRoZSBvdGhlciBoYXMgbm90LlxuICAgICAgICAvLyBJZiBlbm91Z2ggdGltZSBoYXMgcGFzc2VkLCBkZWNpZGUgaXQgaXMgbm90IGEgcGl0Y2guXG4gICAgICAgIGlmICghbW92ZWRBIHx8ICFtb3ZlZEIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9maXJzdE1vdmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcnN0TW92ZSA9IHRpbWVTdGFtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRpbWVTdGFtcCAtIHRoaXMuX2ZpcnN0TW92ZSA8IEFMTE9XRURfU0lOR0xFX1RPVUNIX1RJTUUpIHtcbiAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YWl0aW5nIGZvciBhIG1vdmVtZW50IGZyb20gdGhlIHNlY29uZCBmaW5nZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1NhbWVEaXJlY3Rpb24gPSB2ZWN0b3JBLnkgPiAwID09PSB2ZWN0b3JCLnkgPiAwO1xuICAgICAgICByZXR1cm4gaXNWZXJ0aWNhbCh2ZWN0b3JBKSAmJiBpc1ZlcnRpY2FsKHZlY3RvckIpICYmIGlzU2FtZURpcmVjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byBwaXRjaFwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgVG91Y2hQaXRjaEhhbmRsZXJcbiAgICAgKiBAbmFtZSBpc0VuYWJsZWRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcGl0Y2hcIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcGl0Y2hcIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUsIGkuZS4gY3VycmVudGx5IGJlaW5nIHVzZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgVG91Y2hQaXRjaEhhbmRsZXJcbiAgICAgKiBAbmFtZSBpc0FjdGl2ZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byBwaXRjaFwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZS5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZHJhZyB0byBwaXRjaFwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIFRvdWNoUGl0Y2hIYW5kbGVyXG4gICAgICogQG5hbWUgZW5hYmxlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAudG91Y2hQaXRjaC5lbmFibGUoKTtcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRyYWcgdG8gcGl0Y2hcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBUb3VjaFBpdGNoSGFuZGxlclxuICAgICAqIEBuYW1lIGRpc2FibGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC50b3VjaFBpdGNoLmRpc2FibGUoKTtcbiAgICAgKi9cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBwYW5TdGVwOiAxMDAsXG4gICAgYmVhcmluZ1N0ZXA6IDE1LFxuICAgIHBpdGNoU3RlcDogMTBcbn07XG5cbi8qKlxuICogVGhlIGBLZXlib2FyZEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tLCByb3RhdGUsIGFuZCBwYW4gdGhlIG1hcCB1c2luZ1xuICogdGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHM6XG4gKlxuICogLSBgPWAgLyBgK2A6IEluY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDEuXG4gKiAtIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogSW5jcmVhc2UgdGhlIHpvb20gbGV2ZWwgYnkgMi5cbiAqIC0gYC1gOiBEZWNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAxLlxuICogLSBgU2hpZnQtLWA6IERlY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDIuXG4gKiAtIEFycm93IGtleXM6IFBhbiBieSAxMDAgcGl4ZWxzLlxuICogLSBgU2hpZnQr4oeiYDogSW5jcmVhc2UgdGhlIHJvdGF0aW9uIGJ5IDE1IGRlZ3JlZXMuXG4gKiAtIGBTaGlmdCvih6BgOiBEZWNyZWFzZSB0aGUgcm90YXRpb24gYnkgMTUgZGVncmVlcy5cbiAqIC0gYFNoaWZ0K+KHoWA6IEluY3JlYXNlIHRoZSBwaXRjaCBieSAxMCBkZWdyZWVzLlxuICogLSBgU2hpZnQr4oejYDogRGVjcmVhc2UgdGhlIHBpdGNoIGJ5IDEwIGRlZ3JlZXMuXG4gKi9cbmNsYXNzIEtleWJvYXJkSGFuZGxlciB7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfcGFuU3RlcDogbnVtYmVyO1xuICAgIF9iZWFyaW5nU3RlcDogbnVtYmVyO1xuICAgIF9waXRjaFN0ZXA6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBzdGVwT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgICAgICB0aGlzLl9wYW5TdGVwID0gc3RlcE9wdGlvbnMucGFuU3RlcDtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1N0ZXAgPSBzdGVwT3B0aW9ucy5iZWFyaW5nU3RlcDtcbiAgICAgICAgdGhpcy5fcGl0Y2hTdGVwID0gc3RlcE9wdGlvbnMucGl0Y2hTdGVwO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBrZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLm1ldGFLZXkpIHJldHVybjtcblxuICAgICAgICBsZXQgem9vbURpciA9IDA7XG4gICAgICAgIGxldCBiZWFyaW5nRGlyID0gMDtcbiAgICAgICAgbGV0IHBpdGNoRGlyID0gMDtcbiAgICAgICAgbGV0IHhEaXIgPSAwO1xuICAgICAgICBsZXQgeURpciA9IDA7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSA2MTpcbiAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgIGNhc2UgMTcxOlxuICAgICAgICBjYXNlIDE4NzpcbiAgICAgICAgICAgIHpvb21EaXIgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxODk6XG4gICAgICAgIGNhc2UgMTA5OlxuICAgICAgICBjYXNlIDE3MzpcbiAgICAgICAgICAgIHpvb21EaXIgPSAtMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGJlYXJpbmdEaXIgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHhEaXIgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGJlYXJpbmdEaXIgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeERpciA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBwaXRjaERpciA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB5RGlyID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBwaXRjaERpciA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeURpciA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbWVyYUFuaW1hdGlvbjogKG1hcDogTWFwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbSA9IG1hcC5nZXRab29tKCk7XG4gICAgICAgICAgICAgICAgbWFwLmVhc2VUbyh7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICAgICAgICAgIGVhc2VJZDogJ2tleWJvYXJkSGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIGVhc2luZzogZWFzZU91dCxcblxuICAgICAgICAgICAgICAgICAgICB6b29tOiB6b29tRGlyID8gTWF0aC5yb3VuZCh6b29tKSArIHpvb21EaXIgKiAoZS5zaGlmdEtleSA/IDIgOiAxKSA6IHpvb20sXG4gICAgICAgICAgICAgICAgICAgIGJlYXJpbmc6IG1hcC5nZXRCZWFyaW5nKCkgKyBiZWFyaW5nRGlyICogdGhpcy5fYmVhcmluZ1N0ZXAsXG4gICAgICAgICAgICAgICAgICAgIHBpdGNoOiBtYXAuZ2V0UGl0Y2goKSArIHBpdGNoRGlyICogdGhpcy5fcGl0Y2hTdGVwLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IFsteERpciAqIHRoaXMuX3BhblN0ZXAsIC15RGlyICogdGhpcy5fcGFuU3RlcF0sXG4gICAgICAgICAgICAgICAgICAgIGNlbnRlcjogbWFwLmdldENlbnRlcigpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlYXNlT3V0KHQ6IG51bWJlcikge1xuICAgIHJldHVybiB0ICogKDIgLSB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgS2V5Ym9hcmRIYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5cbmltcG9ydCB7ZWFzZSBhcyBfZWFzZSwgYmluZEFsbCwgYmV6aWVyfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZSc7XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uLy4uL2dlby9sbmdfbGF0JztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5pbXBvcnQgdHlwZSBIYW5kbGVyTWFuYWdlciBmcm9tICcuLi9oYW5kbGVyX21hbmFnZXInO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbi8vIGRlbHRhWSB2YWx1ZSBmb3IgbW91c2Ugc2Nyb2xsIHdoZWVsIGlkZW50aWZpY2F0aW9uXG5jb25zdCB3aGVlbFpvb21EZWx0YSA9IDQuMDAwMjQ0MTQwNjI1O1xuXG4vLyBUaGVzZSBtYWdpYyBudW1iZXJzIGNvbnRyb2wgdGhlIHJhdGUgb2Ygem9vbS4gVHJhY2twYWQgZXZlbnRzIGZpcmUgYXQgYSBncmVhdGVyXG4vLyBmcmVxdWVuY3kgdGhhbiBtb3VzZSBzY3JvbGwgd2hlZWwsIHNvIHJlZHVjZSB0aGUgem9vbSByYXRlIHBlciB3aGVlbCB0aWNrXG5jb25zdCBkZWZhdWx0Wm9vbVJhdGUgPSAxIC8gMTAwO1xuY29uc3Qgd2hlZWxab29tUmF0ZSA9IDEgLyA0NTA7XG5cbi8vIHVwcGVyIGJvdW5kIG9uIGhvdyBtdWNoIHdlIHNjYWxlIHRoZSBtYXAgaW4gYW55IHNpbmdsZSByZW5kZXIgZnJhbWU7IHRoaXNcbi8vIGlzIHVzZWQgdG8gbGltaXQgem9vbSByYXRlIGluIHRoZSBjYXNlIG9mIHZlcnkgZmFzdCBzY3JvbGxpbmdcbmNvbnN0IG1heFNjYWxlUGVyRnJhbWUgPSAyO1xuXG4vKipcbiAqIFRoZSBgU2Nyb2xsWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYnkgc2Nyb2xsaW5nLlxuICovXG5jbGFzcyBTY3JvbGxab29tSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfem9vbWluZzogYm9vbGVhbjtcbiAgICBfYXJvdW5kQ2VudGVyOiBib29sZWFuO1xuICAgIF9hcm91bmQ6IFBvaW50O1xuICAgIF9hcm91bmRQb2ludDogUG9pbnQ7XG4gICAgX3R5cGU6ICd3aGVlbCcgfCAndHJhY2twYWQnIHwgbnVsbDtcbiAgICBfbGFzdFZhbHVlOiBudW1iZXI7XG4gICAgX3RpbWVvdXQ6ID9UaW1lb3V0SUQ7IC8vIHVzZWQgZm9yIGRlbGF5ZWQtaGFuZGxpbmcgb2YgYSBzaW5nbGUgd2hlZWwgbW92ZW1lbnRcbiAgICBfZmluaXNoVGltZW91dDogP1RpbWVvdXRJRDsgLy8gdXNlZCB0byBkZWxheSBmaW5hbCAne21vdmUsem9vbX1lbmQnIGV2ZW50c1xuXG4gICAgX2xhc3RXaGVlbEV2ZW50OiBhbnk7XG4gICAgX2xhc3RXaGVlbEV2ZW50VGltZTogbnVtYmVyO1xuXG4gICAgX3N0YXJ0Wm9vbTogP251bWJlcjtcbiAgICBfdGFyZ2V0Wm9vbTogP251bWJlcjtcbiAgICBfZGVsdGE6IG51bWJlcjtcbiAgICBfZWFzaW5nOiA/KChudW1iZXIpID0+IG51bWJlcik7XG4gICAgX3ByZXZFYXNlOiA/e3N0YXJ0OiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZzogKF86IG51bWJlcikgPT4gbnVtYmVyfTtcblxuICAgIF9mcmFtZUlkOiA/Ym9vbGVhbjtcbiAgICBfaGFuZGxlcjogSGFuZGxlck1hbmFnZXI7XG5cbiAgICBfZGVmYXVsdFpvb21SYXRlOiBudW1iZXI7XG4gICAgX3doZWVsWm9vbVJhdGU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIGhhbmRsZXI6IEhhbmRsZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgICAgIHRoaXMuX2RlbHRhID0gMDtcblxuICAgICAgICB0aGlzLl9kZWZhdWx0Wm9vbVJhdGUgPSBkZWZhdWx0Wm9vbVJhdGU7XG4gICAgICAgIHRoaXMuX3doZWVsWm9vbVJhdGUgPSB3aGVlbFpvb21SYXRlO1xuXG4gICAgICAgIGJpbmRBbGwoWydfb25UaW1lb3V0J10sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgem9vbSByYXRlIG9mIGEgdHJhY2twYWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3pvb21SYXRlPTEvMTAwXSBUaGUgcmF0ZSB1c2VkIHRvIHNjYWxlIHRyYWNrcGFkIG1vdmVtZW50IHRvIGEgem9vbSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFNwZWVkIHVwIHRyYWNrcGFkIHpvb21cbiAgICAgKiBtYXAuc2Nyb2xsWm9vbS5zZXRab29tUmF0ZSgxLzI1KTtcbiAgICAgKi9cbiAgICBzZXRab29tUmF0ZSh6b29tUmF0ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRab29tUmF0ZSA9IHpvb21SYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogU2V0IHRoZSB6b29tIHJhdGUgb2YgYSBtb3VzZSB3aGVlbFxuICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aGVlbFpvb21SYXRlPTEvNDUwXSBUaGUgcmF0ZSB1c2VkIHRvIHNjYWxlIG1vdXNlIHdoZWVsIG1vdmVtZW50IHRvIGEgem9vbSB2YWx1ZS5cbiAgICAqIEBleGFtcGxlXG4gICAgKiAvLyBTbG93IGRvd24gem9vbSBvZiBtb3VzZSB3aGVlbFxuICAgICogbWFwLnNjcm9sbFpvb20uc2V0V2hlZWxab29tUmF0ZSgxLzYwMCk7XG4gICAgKi9cbiAgICBzZXRXaGVlbFpvb21SYXRlKHdoZWVsWm9vbVJhdGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl93aGVlbFpvb21SYXRlID0gd2hlZWxab29tUmF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBBY3RpdmUgc3RhdGUgaXMgdHVybmVkIG9uIGFuZCBvZmYgd2l0aCBldmVyeSBzY3JvbGwgd2hlZWwgZXZlbnQgYW5kIGlzIHNldCBiYWNrIHRvIGZhbHNlIGJlZm9yZSB0aGUgbWFwXG4gICAgKiByZW5kZXIgaXMgY2FsbGVkLCBzbyBfYWN0aXZlIGlzIG5vdCBhIGdvb2QgY2FuZGlkYXRlIGZvciBkZXRlcm1pbmluZyBpZiBhIHNjcm9sbCB6b29tIGFuaW1hdGlvbiBpcyBpblxuICAgICogcHJvZ3Jlc3MuXG4gICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fYWN0aXZlIHx8IHRoaXMuX2ZpbmlzaFRpbWVvdXQgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpc1pvb21pbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3pvb21pbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXJvdW5kXSBJZiBcImNlbnRlclwiIGlzIHBhc3NlZCwgbWFwIHdpbGwgem9vbSBhcm91bmQgY2VudGVyIG9mIG1hcFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5zY3JvbGxab29tLmVuYWJsZSgpO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogIG1hcC5zY3JvbGxab29tLmVuYWJsZSh7IGFyb3VuZDogJ2NlbnRlcicgfSlcbiAgICAgKi9cbiAgICBlbmFibGUob3B0aW9uczogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hcm91bmRDZW50ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHdoZWVsKGU6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgLy8gUmVtb3ZlIGBhbnlgIGNhc3Qgd2hlbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNDg3OSBpcyBmaXhlZC5cbiAgICAgICAgbGV0IHZhbHVlID0gZS5kZWx0YU1vZGUgPT09ICh3aW5kb3cuV2hlZWxFdmVudDogYW55KS5ET01fREVMVEFfTElORSA/IGUuZGVsdGFZICogNDAgOiBlLmRlbHRhWTtcbiAgICAgICAgY29uc3Qgbm93ID0gYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRpbWVEZWx0YSA9IG5vdyAtICh0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUgfHwgMCk7XG5cbiAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnRUaW1lID0gbm93O1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gMCAmJiAodmFsdWUgJSB3aGVlbFpvb21EZWx0YSkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgb25lIGlzIGRlZmluaXRlbHkgYSBtb3VzZSB3aGVlbCBldmVudC5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAnd2hlZWwnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IDAgJiYgTWF0aC5hYnModmFsdWUpIDwgNCkge1xuICAgICAgICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIHRyYWNrcGFkIGV2ZW50IGJlY2F1c2UgaXQgaXMgc28gc21hbGwuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gJ3RyYWNrcGFkJztcblxuICAgICAgICB9IGVsc2UgaWYgKHRpbWVEZWx0YSA+IDQwMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBuZXcgc2Nyb2xsIGFjdGlvbi5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGEgdGltZW91dCBpbiBjYXNlIHRoaXMgd2FzIGEgc2luZ3VsYXIgZXZlbnQsIGFuZCBkZWx5IGl0IGJ5IHVwIHRvIDQwbXMuXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDQwLCBlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVwZWF0aW5nIGV2ZW50LCBidXQgd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBvZiBldmVudCBqdXN0IHlldC5cbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWx0YSBwZXIgdGltZSBpcyBzbWFsbCwgd2UgYXNzdW1lIGl0J3MgYSBmYXN0IHRyYWNrcGFkOyBvdGhlcndpc2Ugd2Ugc3dpdGNoIGludG8gd2hlZWwgbW9kZS5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAoTWF0aC5hYnModGltZURlbHRhICogdmFsdWUpIDwgMjAwKSA/ICd0cmFja3BhZCcgOiAnd2hlZWwnO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3VyIGRlbGF5ZWQgZXZlbnQgaXNuJ3QgZmlyZWQgYWdhaW4sIGJlY2F1c2Ugd2UgYWNjdW11bGF0ZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGV2ZW50ICh3aGljaCB3YXMgbGVzcyB0aGFuIDQwbXMgYWdvKSBpbnRvIHRoaXMgZXZlbnQuXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9sYXN0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTbG93IGRvd24gem9vbSBpZiBzaGlmdCBrZXkgaXMgaGVsZCBmb3IgbW9yZSBwcmVjaXNlIHpvb21pbmdcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgdmFsdWUpIHZhbHVlID0gdmFsdWUgLyA0O1xuXG4gICAgICAgIC8vIE9ubHkgZmlyZSB0aGUgY2FsbGJhY2sgaWYgd2UgYWN0dWFsbHkga25vdyB3aGF0IHR5cGUgb2Ygc2Nyb2xsaW5nIGRldmljZSB0aGUgdXNlciB1c2VzLlxuICAgICAgICBpZiAodGhpcy5fdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnQgPSBlO1xuICAgICAgICAgICAgdGhpcy5fZGVsdGEgLT0gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIF9vblRpbWVvdXQoaW5pdGlhbEV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgIHRoaXMuX2RlbHRhIC09IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGluaXRpYWxFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3RhcnQoZTogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5fZGVsdGEpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuaXNab29taW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5pc2hUaW1lb3V0KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9maW5pc2hUaW1lb3V0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcblxuICAgICAgICB0aGlzLl9hcm91bmQgPSBMbmdMYXQuY29udmVydCh0aGlzLl9hcm91bmRDZW50ZXIgPyB0aGlzLl9tYXAuZ2V0Q2VudGVyKCkgOiB0aGlzLl9tYXAudW5wcm9qZWN0KHBvcykpO1xuICAgICAgICB0aGlzLl9hcm91bmRQb2ludCA9IHRoaXMuX21hcC50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludCh0aGlzLl9hcm91bmQpO1xuICAgICAgICBpZiAoIXRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlci5fdHJpZ2dlclJlbmRlckZyYW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGcmFtZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mcmFtZUlkKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICAvLyBpZiB3ZSd2ZSBoYWQgc2Nyb2xsIGV2ZW50cyBzaW5jZSB0aGUgbGFzdCByZW5kZXIgZnJhbWUsIGNvbnN1bWUgdGhlXG4gICAgICAgIC8vIGFjY3VtdWxhdGVkIGRlbHRhLCBhbmQgdXBkYXRlIHRoZSB0YXJnZXQgem9vbSBsZXZlbCBhY2NvcmRpbmdseVxuICAgICAgICBpZiAodGhpcy5fZGVsdGEgIT09IDApIHtcbiAgICAgICAgICAgIC8vIEZvciB0cmFja3BhZCBldmVudHMgYW5kIHNpbmdsZSBtb3VzZSB3aGVlbCB0aWNrcywgdXNlIHRoZSBkZWZhdWx0IHpvb20gcmF0ZVxuICAgICAgICAgICAgY29uc3Qgem9vbVJhdGUgPSAodGhpcy5fdHlwZSA9PT0gJ3doZWVsJyAmJiBNYXRoLmFicyh0aGlzLl9kZWx0YSkgPiB3aGVlbFpvb21EZWx0YSkgPyB0aGlzLl93aGVlbFpvb21SYXRlIDogdGhpcy5fZGVmYXVsdFpvb21SYXRlO1xuICAgICAgICAgICAgLy8gU2NhbGUgYnkgc2lnbW9pZCBvZiBzY3JvbGwgd2hlZWwgZGVsdGEuXG4gICAgICAgICAgICBsZXQgc2NhbGUgPSBtYXhTY2FsZVBlckZyYW1lIC8gKDEgKyBNYXRoLmV4cCgtTWF0aC5hYnModGhpcy5fZGVsdGEgKiB6b29tUmF0ZSkpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlbHRhIDwgMCAmJiBzY2FsZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHNjYWxlID0gMSAvIHNjYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmcm9tU2NhbGUgPSB0eXBlb2YgdGhpcy5fdGFyZ2V0Wm9vbSA9PT0gJ251bWJlcicgPyB0ci56b29tU2NhbGUodGhpcy5fdGFyZ2V0Wm9vbSkgOiB0ci5zY2FsZTtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFpvb20gPSBNYXRoLm1pbih0ci5tYXhab29tLCBNYXRoLm1heCh0ci5taW5ab29tLCB0ci5zY2FsZVpvb20oZnJvbVNjYWxlICogc2NhbGUpKSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBtb3VzZSB3aGVlbCwgcmVmcmVzaCB0aGUgc3RhcnRpbmcgem9vbSBhbmQgZWFzaW5nXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiB3ZSdyZSB1c2luZyB0byBzbW9vdGggb3V0IHRoZSB6b29taW5nIGJldHdlZW4gd2hlZWxcbiAgICAgICAgICAgIC8vIGV2ZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09ICd3aGVlbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFpvb20gPSB0ci56b29tO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vhc2luZyA9IHRoaXMuX3Ntb290aE91dEVhc2luZygyMDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9kZWx0YSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRab29tID0gdHlwZW9mIHRoaXMuX3RhcmdldFpvb20gPT09ICdudW1iZXInID9cbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFpvb20gOiB0ci56b29tO1xuICAgICAgICBjb25zdCBzdGFydFpvb20gPSB0aGlzLl9zdGFydFpvb207XG4gICAgICAgIGNvbnN0IGVhc2luZyA9IHRoaXMuX2Vhc2luZztcblxuICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHpvb207XG4gICAgICAgIGlmICh0aGlzLl90eXBlID09PSAnd2hlZWwnICYmIHN0YXJ0Wm9vbSAmJiBlYXNpbmcpIHtcbiAgICAgICAgICAgIGFzc2VydChlYXNpbmcgJiYgdHlwZW9mIHN0YXJ0Wm9vbSA9PT0gJ251bWJlcicpO1xuXG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUpIC8gMjAwLCAxKTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBlYXNpbmcodCk7XG4gICAgICAgICAgICB6b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB0YXJnZXRab29tLCBrKTtcbiAgICAgICAgICAgIGlmICh0IDwgMSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHpvb20gPSB0YXJnZXRab29tO1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVyLl90cmlnZ2VyUmVuZGVyRnJhbWUoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGFyZ2V0Wm9vbTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZmluaXNoVGltZW91dDtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9JbmVydGlhOiB0cnVlLFxuICAgICAgICAgICAgbmVlZHNSZW5kZXJGcmFtZTogIWZpbmlzaGVkLFxuICAgICAgICAgICAgem9vbURlbHRhOiB6b29tIC0gdHIuem9vbSxcbiAgICAgICAgICAgIGFyb3VuZDogdGhpcy5fYXJvdW5kUG9pbnQsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0aGlzLl9sYXN0V2hlZWxFdmVudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9zbW9vdGhPdXRFYXNpbmcoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBsZXQgZWFzaW5nID0gX2Vhc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZFYXNlKSB7XG4gICAgICAgICAgICBjb25zdCBlYXNlID0gdGhpcy5fcHJldkVhc2UsXG4gICAgICAgICAgICAgICAgdCA9IChicm93c2VyLm5vdygpIC0gZWFzZS5zdGFydCkgLyBlYXNlLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHNwZWVkID0gZWFzZS5lYXNpbmcodCArIDAuMDEpIC0gZWFzZS5lYXNpbmcodCksXG5cbiAgICAgICAgICAgICAgICAvLyBRdWljayBoYWNrIHRvIG1ha2UgbmV3IGJlemllciB0aGF0IGlzIGNvbnRpbnVvdXMgd2l0aCBsYXN0XG4gICAgICAgICAgICAgICAgeCA9IDAuMjcgLyBNYXRoLnNxcnQoc3BlZWQgKiBzcGVlZCArIDAuMDAwMSkgKiAwLjAxLFxuICAgICAgICAgICAgICAgIHkgPSBNYXRoLnNxcnQoMC4yNyAqIDAuMjcgLSB4ICogeCk7XG5cbiAgICAgICAgICAgIGVhc2luZyA9IGJlemllcih4LCB5LCAwLjI1LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByZXZFYXNlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIGVhc2luZ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBlYXNpbmc7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsWm9vbUhhbmRsZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBDbGlja1pvb21IYW5kbGVyIGZyb20gJy4uL2NsaWNrX3pvb20nO1xuaW1wb3J0IHR5cGUgVGFwWm9vbUhhbmRsZXIgZnJvbSAnLi8uLi90YXBfem9vbSc7XG5cbi8qKlxuICogVGhlIGBEb3VibGVDbGlja1pvb21IYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSB0aGUgbWFwIGF0IGEgcG9pbnQgYnlcbiAqIGRvdWJsZSBjbGlja2luZyBvciBkb3VibGUgdGFwcGluZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG91YmxlQ2xpY2tab29tSGFuZGxlciB7XG5cbiAgICBfY2xpY2tab29tOiBDbGlja1pvb21IYW5kbGVyO1xuICAgIF90YXBab29tOiBUYXBab29tSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGlja1pvb206IENsaWNrWm9vbUhhbmRsZXIsIFRhcFpvb206IFRhcFpvb21IYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrWm9vbSA9IGNsaWNrWm9vbTtcbiAgICAgICAgdGhpcy5fdGFwWm9vbSA9IFRhcFpvb207XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tab29tLmVuYWJsZSgpO1xuICAgICAgICB0aGlzLl90YXBab29tLmVuYWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kb3VibGVDbGlja1pvb20uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrWm9vbS5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuX3RhcFpvb20uZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGlja1pvb20uaXNFbmFibGVkKCkgJiYgdGhpcy5fdGFwWm9vbS5pc0VuYWJsZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUsIGkuZS4gY3VycmVudGx5IGJlaW5nIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpY2tab29tLmlzQWN0aXZlKCkgfHwgdGhpcy5fdGFwWm9vbS5pc0FjdGl2ZSgpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWNrWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRibGNsaWNrKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW1lcmFBbmltYXRpb246IChtYXA6IE1hcCkgPT4ge1xuICAgICAgICAgICAgICAgIG1hcC5lYXNlVG8oe1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICAgICAgICB6b29tOiBtYXAuZ2V0Wm9vbSgpICsgKGUuc2hpZnRLZXkgPyAtMSA6IDEpLFxuICAgICAgICAgICAgICAgICAgICBhcm91bmQ6IG1hcC51bnByb2plY3QocG9pbnQpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtUYXBSZWNvZ25pemVyLCBNQVhfVEFQX0lOVEVSVkFMfSBmcm9tICcuL3RhcF9yZWNvZ25pemVyJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYXBEcmFnWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfc3dpcGVQb2ludDogUG9pbnQ7XG4gICAgX3N3aXBlVG91Y2g6IG51bWJlcjtcbiAgICBfdGFwVGltZTogbnVtYmVyO1xuICAgIF90YXA6IFRhcFJlY29nbml6ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgICAgICB0aGlzLl90YXAgPSBuZXcgVGFwUmVjb2duaXplcih7XG4gICAgICAgICAgICBudW1Ub3VjaGVzOiAxLFxuICAgICAgICAgICAgbnVtVGFwczogMVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5fc3dpcGVQb2ludDtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N3aXBlVG91Y2g7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90YXBUaW1lO1xuICAgICAgICB0aGlzLl90YXAucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3N3aXBlUG9pbnQpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fdGFwVGltZSAmJiBlLnRpbWVTdGFtcCAtIHRoaXMuX3RhcFRpbWUgPiBNQVhfVEFQX0lOVEVSVkFMKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3RhcFRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhcC50b3VjaHN0YXJ0KGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAobWFwVG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zd2lwZVBvaW50ID0gcG9pbnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5fc3dpcGVUb3VjaCA9IG1hcFRvdWNoZXNbMF0uaWRlbnRpZmllcjtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl90YXBUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLl90YXAudG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3dpcGVQb2ludCkge1xuICAgICAgICAgICAgaWYgKG1hcFRvdWNoZXNbMF0uaWRlbnRpZmllciAhPT0gdGhpcy5fc3dpcGVUb3VjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3U3dpcGVQb2ludCA9IHBvaW50c1swXTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3QgPSBuZXdTd2lwZVBvaW50LnkgLSB0aGlzLl9zd2lwZVBvaW50Lnk7XG4gICAgICAgICAgICB0aGlzLl9zd2lwZVBvaW50ID0gbmV3U3dpcGVQb2ludDtcblxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB6b29tRGVsdGE6IGRpc3QgLyAxMjhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICghdGhpcy5fdGFwVGltZSkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLl90YXAudG91Y2hlbmQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhcFRpbWUgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zd2lwZVBvaW50KSB7XG4gICAgICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7TW91c2VQYW5IYW5kbGVyfSBmcm9tICcuLi9tb3VzZSc7XG5pbXBvcnQgdHlwZSBUb3VjaFBhbkhhbmRsZXIgZnJvbSAnLi8uLi90b3VjaF9wYW4nO1xuXG5leHBvcnQgdHlwZSBEcmFnUGFuT3B0aW9ucyA9IHtcbiAgICBsaW5lYXJpdHk/OiBudW1iZXI7XG4gICAgZWFzaW5nPzogKHQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIGRlY2VsZXJhdGlvbj86IG51bWJlcjtcbiAgICBtYXhTcGVlZD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogVGhlIGBEcmFnUGFuSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHBhbiB0aGUgbWFwIGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZ1xuICogdGhlIGN1cnNvci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJhZ1BhbkhhbmRsZXIge1xuXG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfbW91c2VQYW46IE1vdXNlUGFuSGFuZGxlcjtcbiAgICBfdG91Y2hQYW46IFRvdWNoUGFuSGFuZGxlcjtcbiAgICBfaW5lcnRpYU9wdGlvbnM6IERyYWdQYW5PcHRpb25zXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgY29uc3RydWN0b3IoZWw6IEhUTUxFbGVtZW50LCBtb3VzZVBhbjogTW91c2VQYW5IYW5kbGVyLCB0b3VjaFBhbjogVG91Y2hQYW5IYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuX2VsID0gZWw7XG4gICAgICAgIHRoaXMuX21vdXNlUGFuID0gbW91c2VQYW47XG4gICAgICAgIHRoaXMuX3RvdWNoUGFuID0gdG91Y2hQYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5saW5lYXJpdHk9MF0gZmFjdG9yIHVzZWQgdG8gc2NhbGUgdGhlIGRyYWcgdmVsb2NpdHlcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lYXNpbmc9YmV6aWVyKDAsIDAsIDAuMywgMSldIGVhc2luZyBmdW5jdGlvbiBhcHBsbGVkIHRvIGBtYXAucGFuVG9gIHdoZW4gYXBwbHlpbmcgdGhlIGRyYWcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFNwZWVkPTE0MDBdIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBkcmFnIHZlbG9jaXR5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5kZWNlbGVyYXRpb249MjUwMF0gdGhlIHJhdGUgYXQgd2hpY2ggdGhlIHNwZWVkIHJlZHVjZXMgYWZ0ZXIgdGhlIHBhbiBlbmRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5kcmFnUGFuLmVuYWJsZSgpO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAuZHJhZ1Bhbi5lbmFibGUoe1xuICAgICAqICAgICAgbGluZWFyaXR5OiAwLjMsXG4gICAgICogICAgICBlYXNpbmc6IGJlemllcigwLCAwLCAwLjMsIDEpLFxuICAgICAqICAgICAgbWF4U3BlZWQ6IDE0MDAsXG4gICAgICogICAgICBkZWNlbGVyYXRpb246IDI1MDAsXG4gICAgICogICB9KTtcbiAgICAgKi9cbiAgICBlbmFibGUob3B0aW9ucz86IERyYWdQYW5PcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2luZXJ0aWFPcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdGhpcy5fbW91c2VQYW4uZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuX3RvdWNoUGFuLmVuYWJsZSgpO1xuICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC10b3VjaC1kcmFnLXBhbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUGFuLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9tb3VzZVBhbi5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuX3RvdWNoUGFuLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdG91Y2gtZHJhZy1wYW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW91c2VQYW4uaXNFbmFibGVkKCkgJiYgdGhpcy5fdG91Y2hQYW4uaXNFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLCBpLmUuIGN1cnJlbnRseSBiZWluZyB1c2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZS5cbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUGFuLmlzQWN0aXZlKCkgfHwgdGhpcy5fdG91Y2hQYW4uaXNBY3RpdmUoKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7TW91c2VSb3RhdGVIYW5kbGVyLCBNb3VzZVBpdGNoSGFuZGxlcn0gZnJvbSAnLi4vbW91c2UnO1xuXG4vKipcbiAqIFRoZSBgRHJhZ1JvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byByb3RhdGUgdGhlIG1hcCBieSBjbGlja2luZyBhbmRcbiAqIGRyYWdnaW5nIHRoZSBjdXJzb3Igd2hpbGUgaG9sZGluZyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIG9yIGBjdHJsYCBrZXkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYWdSb3RhdGVIYW5kbGVyIHtcblxuICAgIF9tb3VzZVJvdGF0ZTogTW91c2VSb3RhdGVIYW5kbGVyO1xuICAgIF9tb3VzZVBpdGNoOiBNb3VzZVBpdGNoSGFuZGxlcjtcbiAgICBfcGl0Y2hXaXRoUm90YXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iZWFyaW5nU25hcF0gVGhlIHRocmVzaG9sZCwgbWVhc3VyZWQgaW4gZGVncmVlcywgdGhhdCBkZXRlcm1pbmVzIHdoZW4gdGhlIG1hcCdzXG4gICAgICogICBiZWFyaW5nIHdpbGwgc25hcCB0byBub3J0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2x9IFtvcHRpb25zLnBpdGNoV2l0aFJvdGF0ZT10cnVlXSBDb250cm9sIHRoZSBtYXAgcGl0Y2ggaW4gYWRkaXRpb24gdG8gdGhlIGJlYXJpbmdcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtwaXRjaFdpdGhSb3RhdGU6IGJvb2xlYW59LCBtb3VzZVJvdGF0ZTogTW91c2VSb3RhdGVIYW5kbGVyLCBtb3VzZVBpdGNoOiBNb3VzZVBpdGNoSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9waXRjaFdpdGhSb3RhdGUgPSBvcHRpb25zLnBpdGNoV2l0aFJvdGF0ZTtcbiAgICAgICAgdGhpcy5fbW91c2VSb3RhdGUgPSBtb3VzZVJvdGF0ZTtcbiAgICAgICAgdGhpcy5fbW91c2VQaXRjaCA9IG1vdXNlUGl0Y2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZHJhZ1JvdGF0ZS5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX21vdXNlUm90YXRlLmVuYWJsZSgpO1xuICAgICAgICBpZiAodGhpcy5fcGl0Y2hXaXRoUm90YXRlKSB0aGlzLl9tb3VzZVBpdGNoLmVuYWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUm90YXRlLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9tb3VzZVJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuX21vdXNlUGl0Y2guZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb3VzZVJvdGF0ZS5pc0VuYWJsZWQoKSAmJiAoIXRoaXMuX3BpdGNoV2l0aFJvdGF0ZSB8fCB0aGlzLl9tb3VzZVBpdGNoLmlzRW5hYmxlZCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUsIGkuZS4gY3VycmVudGx5IGJlaW5nIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW91c2VSb3RhdGUuaXNBY3RpdmUoKSB8fCB0aGlzLl9tb3VzZVBpdGNoLmlzQWN0aXZlKCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1RvdWNoWm9vbUhhbmRsZXIsIFRvdWNoUm90YXRlSGFuZGxlcn0gZnJvbSAnLi4vdG91Y2hfem9vbV9yb3RhdGUnO1xuaW1wb3J0IHR5cGUgVGFwRHJhZ1pvb21IYW5kbGVyIGZyb20gJy4uL3RhcF9kcmFnX3pvb20nO1xuXG4vKipcbiAqIFRoZSBgVG91Y2hab29tUm90YXRlSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gYW5kIHJvdGF0ZSB0aGUgbWFwIGJ5XG4gKiBwaW5jaGluZyBvbiBhIHRvdWNoc2NyZWVuLlxuICpcbiAqIFRoZXkgY2FuIHpvb20gd2l0aCBvbmUgZmluZ2VyIGJ5IGRvdWJsZSB0YXBwaW5nIGFuZCBkcmFnZ2luZy4gT24gdGhlIHNlY29uZCB0YXAsXG4gKiBob2xkIHRoZSBmaW5nZXIgZG93biBhbmQgZHJhZyB1cCBvciBkb3duIHRvIHpvb20gaW4gb3Igb3V0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyIHtcblxuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX3RvdWNoWm9vbTogVG91Y2hab29tSGFuZGxlcjtcbiAgICBfdG91Y2hSb3RhdGU6IFRvdWNoUm90YXRlSGFuZGxlcjtcbiAgICBfdGFwRHJhZ1pvb206IFRhcERyYWdab29tSGFuZGxlcjtcbiAgICBfcm90YXRpb25EaXNhYmxlZDogYm9vbGVhbjtcbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIHRvdWNoWm9vbTogVG91Y2hab29tSGFuZGxlciwgdG91Y2hSb3RhdGU6IFRvdWNoUm90YXRlSGFuZGxlciwgdGFwRHJhZ1pvb206IFRhcERyYWdab29tSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9lbCA9IGVsO1xuICAgICAgICB0aGlzLl90b3VjaFpvb20gPSB0b3VjaFpvb207XG4gICAgICAgIHRoaXMuX3RvdWNoUm90YXRlID0gdG91Y2hSb3RhdGU7XG4gICAgICAgIHRoaXMuX3RhcERyYWdab29tID0gdGFwRHJhZ1pvb207XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFyb3VuZF0gSWYgXCJjZW50ZXJcIiBpcyBwYXNzZWQsIG1hcCB3aWxsIHpvb20gYXJvdW5kIHRoZSBjZW50ZXJcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZSgpO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZSh7IGFyb3VuZDogJ2NlbnRlcicgfSk7XG4gICAgICovXG4gICAgZW5hYmxlKG9wdGlvbnM6ID97YXJvdW5kPzogJ2NlbnRlcid9KSB7XG4gICAgICAgIHRoaXMuX3RvdWNoWm9vbS5lbmFibGUob3B0aW9ucyk7XG4gICAgICAgIGlmICghdGhpcy5fcm90YXRpb25EaXNhYmxlZCkgdGhpcy5fdG91Y2hSb3RhdGUuZW5hYmxlKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl90YXBEcmFnWm9vbS5lbmFibGUoKTtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl90b3VjaFpvb20uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl90b3VjaFJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuX3RhcERyYWdab29tLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3VjaFpvb20uaXNFbmFibGVkKCkgJiZcbiAgICAgICAgICAgICh0aGlzLl9yb3RhdGlvbkRpc2FibGVkIHx8IHRoaXMuX3RvdWNoUm90YXRlLmlzRW5hYmxlZCgpKSAmJlxuICAgICAgICAgICAgdGhpcy5fdGFwRHJhZ1pvb20uaXNFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWQgYW5kIGhhcyBkZXRlY3RlZCB0aGUgc3RhcnQgb2YgYSB6b29tL3JvdGF0ZSBnZXN0dXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG91Y2hab29tLmlzQWN0aXZlKCkgfHwgdGhpcy5fdG91Y2hSb3RhdGUuaXNBY3RpdmUoKSB8fCB0aGlzLl90YXBEcmFnWm9vbS5pc0FjdGl2ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcInBpbmNoIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLCBsZWF2aW5nIHRoZSBcInBpbmNoIHRvIHpvb21cIlxuICAgICAqIGludGVyYWN0aW9uIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlUm90YXRpb24oKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlUm90YXRpb24oKSB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl90b3VjaFJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZSgpO1xuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5lbmFibGVSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGVuYWJsZVJvdGF0aW9uKCkge1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl90b3VjaFpvb20uaXNFbmFibGVkKCkpIHRoaXMuX3RvdWNoUm90YXRlLmVuYWJsZSgpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7RXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuL21hcCc7XG5pbXBvcnQgSGFuZGxlckluZXJ0aWEgZnJvbSAnLi9oYW5kbGVyX2luZXJ0aWEnO1xuaW1wb3J0IHtNYXBFdmVudEhhbmRsZXIsIEJsb2NrYWJsZU1hcEV2ZW50SGFuZGxlcn0gZnJvbSAnLi9oYW5kbGVyL21hcF9ldmVudCc7XG5pbXBvcnQgQm94Wm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL2JveF96b29tJztcbmltcG9ydCBUYXBab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvdGFwX3pvb20nO1xuaW1wb3J0IHtNb3VzZVBhbkhhbmRsZXIsIE1vdXNlUm90YXRlSGFuZGxlciwgTW91c2VQaXRjaEhhbmRsZXJ9IGZyb20gJy4vaGFuZGxlci9tb3VzZSc7XG5pbXBvcnQgVG91Y2hQYW5IYW5kbGVyIGZyb20gJy4vaGFuZGxlci90b3VjaF9wYW4nO1xuaW1wb3J0IHtUb3VjaFpvb21IYW5kbGVyLCBUb3VjaFJvdGF0ZUhhbmRsZXIsIFRvdWNoUGl0Y2hIYW5kbGVyfSBmcm9tICcuL2hhbmRsZXIvdG91Y2hfem9vbV9yb3RhdGUnO1xuaW1wb3J0IEtleWJvYXJkSGFuZGxlciBmcm9tICcuL2hhbmRsZXIva2V5Ym9hcmQnO1xuaW1wb3J0IFNjcm9sbFpvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zY3JvbGxfem9vbSc7XG5pbXBvcnQgRG91YmxlQ2xpY2tab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2hpbS9kYmxjbGlja196b29tJztcbmltcG9ydCBDbGlja1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9jbGlja196b29tJztcbmltcG9ydCBUYXBEcmFnWm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3RhcF9kcmFnX3pvb20nO1xuaW1wb3J0IERyYWdQYW5IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zaGltL2RyYWdfcGFuJztcbmltcG9ydCBEcmFnUm90YXRlSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2hpbS9kcmFnX3JvdGF0ZSc7XG5pbXBvcnQgVG91Y2hab29tUm90YXRlSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2hpbS90b3VjaF96b29tX3JvdGF0ZSc7XG5pbXBvcnQge2JpbmRBbGwsIGV4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5leHBvcnQgdHlwZSBJbnB1dEV2ZW50ID0gTW91c2VFdmVudCB8IFRvdWNoRXZlbnQgfCBLZXlib2FyZEV2ZW50IHwgV2hlZWxFdmVudDtcblxuY29uc3QgaXNNb3ZpbmcgPSBwID0+IHAuem9vbSB8fCBwLmRyYWcgfHwgcC5waXRjaCB8fCBwLnJvdGF0ZTtcblxuY2xhc3MgUmVuZGVyRnJhbWVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICB0eXBlOiAncmVuZGVyRnJhbWUnO1xuICAgIHRpbWVTdGFtcDogbnVtYmVyO1xufVxuXG4vLyBIYW5kbGVycyBpbnRlcnByZXQgZG9tIGV2ZW50cyBhbmQgcmV0dXJuIGNhbWVyYSBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlXG4vLyBhcHBsaWVkIHRvIHRoZSBtYXAgKGBIYW5kbGVyUmVzdWx0YHMpLiBUaGUgY2FtZXJhIGNoYW5nZXMgYXJlIGFsbCBkZWx0YXMuXG4vLyBUaGUgaGFuZGxlciBpdHNlbGYgc2hvdWxkIGhhdmUgbm8ga25vd2xlZGdlIG9mIHRoZSBtYXAncyBjdXJyZW50IHN0YXRlLlxuLy8gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gbWVyZ2UgbXVsdGlwbGUgcmVzdWx0cyBhbmQga2VlcHMgaGFuZGxlcnMgc2ltcGxlci5cbi8vIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhIG1vdXNlZG93biBhbmQgbW91c2Vtb3ZlLCB0aGUgbW91c2VQYW4gaGFuZGxlclxuLy8gd291bGQgcmV0dXJuIGEgYHBhbkRlbHRhYCBvbiB0aGUgbW91c2Vtb3ZlLlxuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyIHtcbiAgICBlbmFibGUoKTogdm9pZDtcbiAgICBkaXNhYmxlKCk6IHZvaWQ7XG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW47XG4gICAgaXNBY3RpdmUoKTogYm9vbGVhbjtcblxuICAgIC8vIGByZXNldGAgY2FuIGJlIGNhbGxlZCBieSB0aGUgbWFuYWdlciBhdCBhbnkgdGltZSBhbmQgbXVzdCByZXNldCBldmVyeXRoaW5nIHRvIGl0J3Mgb3JpZ2luYWwgc3RhdGVcbiAgICByZXNldCgpOiB2b2lkO1xuXG4gICAgLy8gSGFuZGxlcnMgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IHRoZXNlIG1ldGhvZHMuXG4gICAgLy8gVGhleSBhcmUgY2FsbGVkIHdpdGggZG9tIGV2ZW50cyB3aGVuZXZlciB0aG9zZSBkb20gZXZlbnMgYXJlIHJlY2VpdmVkLlxuICAgICt0b3VjaHN0YXJ0PzogKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICt0b3VjaG1vdmU/OiAoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikgPT4gSGFuZGxlclJlc3VsdCB8IHZvaWQ7XG4gICAgK3RvdWNoZW5kPzogKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICt0b3VjaGNhbmNlbD86IChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSA9PiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcbiAgICArbW91c2Vkb3duPzogKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gSGFuZGxlclJlc3VsdCB8IHZvaWQ7XG4gICAgK21vdXNlbW92ZT86IChlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICttb3VzZXVwPzogKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gSGFuZGxlclJlc3VsdCB8IHZvaWQ7XG4gICAgK2RibGNsaWNrPzogKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gSGFuZGxlclJlc3VsdCB8IHZvaWQ7XG4gICAgK3doZWVsPzogKGU6IFdoZWVsRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gSGFuZGxlclJlc3VsdCB8IHZvaWQ7XG4gICAgK2tleWRvd24/OiAoZTogS2V5Ym9hcmRFdmVudCkgPT4gSGFuZGxlclJlc3VsdCB8IHZvaWQ7XG4gICAgK2tleXVwPzogKGU6IEtleWJvYXJkRXZlbnQpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuXG4gICAgLy8gYHJlbmRlckZyYW1lYCBpcyB0aGUgb25seSBub24tZG9tIGV2ZW50LiBJdCBpcyBjYWxsZWQgZHVyaW5nIHJlbmRlclxuICAgIC8vIGZyYW1lcyBhbmQgY2FuIGJlIHVzZWQgdG8gc21vb3RoIGNhbWVyYSBjaGFuZ2VzIChzZWUgc2Nyb2xsIGhhbmRsZXIpLlxuICAgICtyZW5kZXJGcmFtZT86ICgpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xufVxuXG4vLyBBbGwgaGFuZGxlciBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCB3aXRoIGV2ZW50cyBjYW4gb3B0aW9uYWxseSByZXR1cm4gYSBgSGFuZGxlclJlc3VsdGAuXG5leHBvcnQgdHlwZSBIYW5kbGVyUmVzdWx0ID0ge3xcbiAgICBwYW5EZWx0YT86IFBvaW50LFxuICAgIHpvb21EZWx0YT86IG51bWJlcixcbiAgICBiZWFyaW5nRGVsdGE/OiBudW1iZXIsXG4gICAgcGl0Y2hEZWx0YT86IG51bWJlcixcbiAgICAvLyB0aGUgcG9pbnQgdG8gbm90IG1vdmUgd2hlbiBjaGFuZ2luZyB0aGUgY2FtZXJhXG4gICAgYXJvdW5kPzogUG9pbnQgfCBudWxsLFxuICAgIC8vIHNhbWUgYXMgYWJvdmUsIGV4Y2VwdCBmb3IgcGluY2ggYWN0aW9ucywgd2hpY2ggYXJlIGdpdmVuIGhpZ2hlciBwcmlvcml0eVxuICAgIHBpbmNoQXJvdW5kPzogUG9pbnQgfCBudWxsLFxuICAgIC8vIEEgbWV0aG9kIHRoYXQgY2FuIGZpcmUgYSBvbmUtb2ZmIGVhc2luZyBieSBkaXJlY3RseSBjaGFuZ2luZyB0aGUgbWFwJ3MgY2FtZXJhLlxuICAgIGNhbWVyYUFuaW1hdGlvbj86IChtYXA6IE1hcCkgPT4gYW55O1xuXG4gICAgLy8gVGhlIGxhc3QgdGhyZWUgcHJvcGVydGllcyBhcmUgbmVlZGVkIGJ5IG9ubHkgb25lIGhhbmRsZXI6IHNjcm9sbHpvb20uXG4gICAgLy8gVGhlIERPTSBldmVudCB0byBiZSB1c2VkIGFzIHRoZSBgb3JpZ2luYWxFdmVudGAgb24gYW55IGNhbWVyYSBjaGFuZ2UgZXZlbnRzLlxuICAgIG9yaWdpbmFsRXZlbnQ/OiBhbnksXG4gICAgLy8gTWFrZXMgdGhlIG1hbmFnZXIgdHJpZ2dlciBhIGZyYW1lLCBhbGxvd2luZyB0aGUgaGFuZGxlciB0byByZXR1cm4gbXVsdGlwbGUgcmVzdWx0cyBvdmVyIHRpbWUgKHNlZSBzY3JvbGx6b29tKS5cbiAgICBuZWVkc1JlbmRlckZyYW1lPzogYm9vbGVhbixcbiAgICAvLyBUaGUgY2FtZXJhIGNoYW5nZXMgd29uJ3QgZ2V0IHJlY29yZGVkIGZvciBpbmVydGlhbCB6b29taW5nLlxuICAgIG5vSW5lcnRpYT86IGJvb2xlYW5cbnx9O1xuXG5mdW5jdGlvbiBoYXNDaGFuZ2UocmVzdWx0OiBIYW5kbGVyUmVzdWx0KSB7XG4gICAgcmV0dXJuIChyZXN1bHQucGFuRGVsdGEgJiYgcmVzdWx0LnBhbkRlbHRhLm1hZygpKSB8fCByZXN1bHQuem9vbURlbHRhIHx8IHJlc3VsdC5iZWFyaW5nRGVsdGEgfHwgcmVzdWx0LnBpdGNoRGVsdGE7XG59XG5cbmNsYXNzIEhhbmRsZXJNYW5hZ2VyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfaGFuZGxlcnM6IEFycmF5PHsgaGFuZGxlck5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlciwgYWxsb3dlZDogYW55IH0+O1xuICAgIF9ldmVudHNJblByb2dyZXNzOiBPYmplY3Q7XG4gICAgX2ZyYW1lSWQ6IG51bWJlcjtcbiAgICBfaW5lcnRpYTogSGFuZGxlckluZXJ0aWE7XG4gICAgX2JlYXJpbmdTbmFwOiBudW1iZXI7XG4gICAgX2hhbmRsZXJzQnlJZDogeyBbc3RyaW5nXTogSGFuZGxlciB9O1xuICAgIF91cGRhdGluZ0NhbWVyYTogYm9vbGVhbjtcbiAgICBfY2hhbmdlczogQXJyYXk8W0hhbmRsZXJSZXN1bHQsIE9iamVjdCwgYW55XT47XG4gICAgX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnM6IHsgW3N0cmluZ106IEhhbmRsZXIgfTtcbiAgICBfbGlzdGVuZXJzOiBBcnJheTxbSFRNTEVsZW1lbnQsIHN0cmluZywgdm9pZCB8IHtwYXNzaXZlPzogYm9vbGVhbiwgY2FwdHVyZT86IGJvb2xlYW59XT47XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgb3B0aW9uczogeyBpbnRlcmFjdGl2ZTogYm9vbGVhbiwgcGl0Y2hXaXRoUm90YXRlOiBib29sZWFuLCBjbGlja1RvbGVyYW5jZTogbnVtYmVyLCBiZWFyaW5nU25hcDogbnVtYmVyfSkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gdGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgICAgICB0aGlzLl9oYW5kbGVyc0J5SWQgPSB7fTtcbiAgICAgICAgdGhpcy5fY2hhbmdlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX2luZXJ0aWEgPSBuZXcgSGFuZGxlckluZXJ0aWEobWFwKTtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwO1xuICAgICAgICB0aGlzLl9wcmV2aW91c0FjdGl2ZUhhbmRsZXJzID0ge307XG5cbiAgICAgICAgLy8gVHJhY2sgd2hldGhlciBtYXAgaXMgY3VycmVudGx5IG1vdmluZywgdG8gY29tcHV0ZSBzdGFydC9tb3ZlL2VuZCBldmVudHNcbiAgICAgICAgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2FkZERlZmF1bHRIYW5kbGVycyhvcHRpb25zKTtcblxuICAgICAgICBiaW5kQWxsKFsnaGFuZGxlRXZlbnQnLCAnaGFuZGxlV2luZG93RXZlbnQnXSwgdGhpcyk7XG5cbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLl9lbDtcblxuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXG4gICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGBwYXNzaXZlOiB0cnVlYCBzbyB0aGF0IGEgZG91YmxlIHRhcCBmaXJlcyB0d29cbiAgICAgICAgICAgIC8vIHBhaXJzIG9mIHRvdWNoc3RhcnQvZW5kIGV2ZW50cyBpbiBpT1MgU2FmYXJpIDEzLiBJZiB0aGlzIGlzIHNldCB0b1xuICAgICAgICAgICAgLy8gYHBhc3NpdmU6IGZhbHNlYCB0aGVuIHRoZSBzZWNvbmQgcGFpciBvZiBldmVudHMgaXMgb25seSBmaXJlZCBpZlxuICAgICAgICAgICAgLy8gcHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgb24gdGhlIGZpcnN0IHRvdWNoc3RhcnQuIENhbGxpbmcgcHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgLy8gdW5kZXNpcmFibHkgcHJldmVudHMgY2xpY2sgZXZlbnRzLlxuICAgICAgICAgICAgW2VsLCAndG91Y2hzdGFydCcsIHtwYXNzaXZlOiB0cnVlfV0sXG4gICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGBwYXNzaXZlOiBmYWxzZWAgc28gdGhhdCBzY3JvbGxzIGFuZCBwaW5jaGVzIGNhbiBiZVxuICAgICAgICAgICAgLy8gcHJldmVudGVkIGluIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBgdG91Y2gtYWN0aW9uczogbm9uZWAsIGZvciBleGFtcGxlIGlPUyBTYWZhcmkgMTIuXG4gICAgICAgICAgICBbZWwsICd0b3VjaG1vdmUnLCB7cGFzc2l2ZTogZmFsc2V9XSxcbiAgICAgICAgICAgIFtlbCwgJ3RvdWNoZW5kJywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgIFtlbCwgJ3RvdWNoY2FuY2VsJywgdW5kZWZpbmVkXSxcblxuICAgICAgICAgICAgW2VsLCAnbW91c2Vkb3duJywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgIFtlbCwgJ21vdXNlbW92ZScsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICBbZWwsICdtb3VzZXVwJywgdW5kZWZpbmVkXSxcblxuICAgICAgICAgICAgLy8gQmluZCB3aW5kb3ctbGV2ZWwgZXZlbnQgbGlzdGVuZXJzIGZvciBtb3ZlIGFuZCB1cC9lbmQgZXZlbnRzLiBJbiB0aGUgYWJzZW5jZSBvZlxuICAgICAgICAgICAgLy8gdGhlIHBvaW50ZXIgY2FwdHVyZSBBUEksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIG5lY2Vzc2FyeSBwbGF0Zm9ybXMsXG4gICAgICAgICAgICAvLyB3aW5kb3ctbGV2ZWwgZXZlbnQgbGlzdGVuZXJzIGdpdmUgdXMgdGhlIGJlc3Qgc2hvdCBhdCBjYXB0dXJpbmcgZXZlbnRzIHRoYXRcbiAgICAgICAgICAgIC8vIGZhbGwgb3V0c2lkZSB0aGUgbWFwIGNhbnZhcyBlbGVtZW50LiBVc2UgYHtjYXB0dXJlOiB0cnVlfWAgZm9yIHRoZSBtb3ZlIGV2ZW50XG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IG1hcCBtb3ZlIGV2ZW50cyBmcm9tIGJlaW5nIGZpcmVkIGR1cmluZyBhIGRyYWcuXG4gICAgICAgICAgICBbd2luZG93LmRvY3VtZW50LCAnbW91c2Vtb3ZlJywge2NhcHR1cmU6IHRydWV9XSxcbiAgICAgICAgICAgIFt3aW5kb3cuZG9jdW1lbnQsICdtb3VzZXVwJywgdW5kZWZpbmVkXSxcblxuICAgICAgICAgICAgW2VsLCAnbW91c2VvdmVyJywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgIFtlbCwgJ21vdXNlb3V0JywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgIFtlbCwgJ2RibGNsaWNrJywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgIFtlbCwgJ2NsaWNrJywgdW5kZWZpbmVkXSxcblxuICAgICAgICAgICAgW2VsLCAna2V5ZG93bicsIHtjYXB0dXJlOiBmYWxzZX1dLFxuICAgICAgICAgICAgW2VsLCAna2V5dXAnLCB1bmRlZmluZWRdLFxuXG4gICAgICAgICAgICBbZWwsICd3aGVlbCcsIHtwYXNzaXZlOiBmYWxzZX1dLFxuICAgICAgICAgICAgW2VsLCAnY29udGV4dG1lbnUnLCB1bmRlZmluZWRdLFxuXG4gICAgICAgICAgICBbd2luZG93LCAnYmx1cicsIHVuZGVmaW5lZF1cbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHR5cGUsIGxpc3RlbmVyT3B0aW9uc10gb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIHRhcmdldCA9PT0gd2luZG93LmRvY3VtZW50ID8gdGhpcy5oYW5kbGVXaW5kb3dFdmVudCA6IHRoaXMuaGFuZGxlRXZlbnQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHR5cGUsIGxpc3RlbmVyT3B0aW9uc10gb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIHRhcmdldCA9PT0gd2luZG93LmRvY3VtZW50ID8gdGhpcy5oYW5kbGVXaW5kb3dFdmVudCA6IHRoaXMuaGFuZGxlRXZlbnQsIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRkRGVmYXVsdEhhbmRsZXJzKG9wdGlvbnM6IHsgaW50ZXJhY3RpdmU6IGJvb2xlYW4sIHBpdGNoV2l0aFJvdGF0ZTogYm9vbGVhbiwgY2xpY2tUb2xlcmFuY2U6IG51bWJlciB9KSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgY29uc3QgZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2FkZCgnbWFwRXZlbnQnLCBuZXcgTWFwRXZlbnRIYW5kbGVyKG1hcCwgb3B0aW9ucykpO1xuXG4gICAgICAgIGNvbnN0IGJveFpvb20gPSBtYXAuYm94Wm9vbSA9IG5ldyBCb3hab29tSGFuZGxlcihtYXAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9hZGQoJ2JveFpvb20nLCBib3hab29tKTtcblxuICAgICAgICBjb25zdCB0YXBab29tID0gbmV3IFRhcFpvb21IYW5kbGVyKCk7XG4gICAgICAgIGNvbnN0IGNsaWNrWm9vbSA9IG5ldyBDbGlja1pvb21IYW5kbGVyKCk7XG4gICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20gPSBuZXcgRG91YmxlQ2xpY2tab29tSGFuZGxlcihjbGlja1pvb20sIHRhcFpvb20pO1xuICAgICAgICB0aGlzLl9hZGQoJ3RhcFpvb20nLCB0YXBab29tKTtcbiAgICAgICAgdGhpcy5fYWRkKCdjbGlja1pvb20nLCBjbGlja1pvb20pO1xuXG4gICAgICAgIGNvbnN0IHRhcERyYWdab29tID0gbmV3IFRhcERyYWdab29tSGFuZGxlcigpO1xuICAgICAgICB0aGlzLl9hZGQoJ3RhcERyYWdab29tJywgdGFwRHJhZ1pvb20pO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoUGl0Y2ggPSBtYXAudG91Y2hQaXRjaCA9IG5ldyBUb3VjaFBpdGNoSGFuZGxlcigpO1xuICAgICAgICB0aGlzLl9hZGQoJ3RvdWNoUGl0Y2gnLCB0b3VjaFBpdGNoKTtcblxuICAgICAgICBjb25zdCBtb3VzZVJvdGF0ZSA9IG5ldyBNb3VzZVJvdGF0ZUhhbmRsZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG1vdXNlUGl0Y2ggPSBuZXcgTW91c2VQaXRjaEhhbmRsZXIob3B0aW9ucyk7XG4gICAgICAgIG1hcC5kcmFnUm90YXRlID0gbmV3IERyYWdSb3RhdGVIYW5kbGVyKG9wdGlvbnMsIG1vdXNlUm90YXRlLCBtb3VzZVBpdGNoKTtcbiAgICAgICAgdGhpcy5fYWRkKCdtb3VzZVJvdGF0ZScsIG1vdXNlUm90YXRlLCBbJ21vdXNlUGl0Y2gnXSk7XG4gICAgICAgIHRoaXMuX2FkZCgnbW91c2VQaXRjaCcsIG1vdXNlUGl0Y2gsIFsnbW91c2VSb3RhdGUnXSk7XG5cbiAgICAgICAgY29uc3QgbW91c2VQYW4gPSBuZXcgTW91c2VQYW5IYW5kbGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB0b3VjaFBhbiA9IG5ldyBUb3VjaFBhbkhhbmRsZXIob3B0aW9ucyk7XG4gICAgICAgIG1hcC5kcmFnUGFuID0gbmV3IERyYWdQYW5IYW5kbGVyKGVsLCBtb3VzZVBhbiwgdG91Y2hQYW4pO1xuICAgICAgICB0aGlzLl9hZGQoJ21vdXNlUGFuJywgbW91c2VQYW4pO1xuICAgICAgICB0aGlzLl9hZGQoJ3RvdWNoUGFuJywgdG91Y2hQYW4sIFsndG91Y2hab29tJywgJ3RvdWNoUm90YXRlJ10pO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoUm90YXRlID0gbmV3IFRvdWNoUm90YXRlSGFuZGxlcigpO1xuICAgICAgICBjb25zdCB0b3VjaFpvb20gPSBuZXcgVG91Y2hab29tSGFuZGxlcigpO1xuICAgICAgICBtYXAudG91Y2hab29tUm90YXRlID0gbmV3IFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIoZWwsIHRvdWNoWm9vbSwgdG91Y2hSb3RhdGUsIHRhcERyYWdab29tKTtcbiAgICAgICAgdGhpcy5fYWRkKCd0b3VjaFJvdGF0ZScsIHRvdWNoUm90YXRlLCBbJ3RvdWNoUGFuJywgJ3RvdWNoWm9vbSddKTtcbiAgICAgICAgdGhpcy5fYWRkKCd0b3VjaFpvb20nLCB0b3VjaFpvb20sIFsndG91Y2hQYW4nLCAndG91Y2hSb3RhdGUnXSk7XG5cbiAgICAgICAgY29uc3Qgc2Nyb2xsWm9vbSA9IG1hcC5zY3JvbGxab29tID0gbmV3IFNjcm9sbFpvb21IYW5kbGVyKG1hcCwgdGhpcyk7XG4gICAgICAgIHRoaXMuX2FkZCgnc2Nyb2xsWm9vbScsIHNjcm9sbFpvb20sIFsnbW91c2VQYW4nXSk7XG5cbiAgICAgICAgY29uc3Qga2V5Ym9hcmQgPSBtYXAua2V5Ym9hcmQgPSBuZXcgS2V5Ym9hcmRIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2FkZCgna2V5Ym9hcmQnLCBrZXlib2FyZCk7XG5cbiAgICAgICAgdGhpcy5fYWRkKCdibG9ja2FibGVNYXBFdmVudCcsIG5ldyBCbG9ja2FibGVNYXBFdmVudEhhbmRsZXIobWFwKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIFsnYm94Wm9vbScsICdkb3VibGVDbGlja1pvb20nLCAndGFwRHJhZ1pvb20nLCAndG91Y2hQaXRjaCcsICdkcmFnUm90YXRlJywgJ2RyYWdQYW4nLCAndG91Y2hab29tUm90YXRlJywgJ3Njcm9sbFpvb20nLCAna2V5Ym9hcmQnXSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW50ZXJhY3RpdmUgJiYgKG9wdGlvbnM6IGFueSlbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAobWFwOiBhbnkpW25hbWVdLmVuYWJsZSgob3B0aW9uczogYW55KVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRkKGhhbmRsZXJOYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXIsIGFsbG93ZWQ/OiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJzLnB1c2goe2hhbmRsZXJOYW1lLCBoYW5kbGVyLCBhbGxvd2VkfSk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJzQnlJZFtoYW5kbGVyTmFtZV0gPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHN0b3AoYWxsb3dFbmRBbmltYXRpb246IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyBpZiB0aGlzIG1ldGhvZCB3YXMgdHJpZ2dlcmVkIGJ5IGEgZ2VzdHVyZSB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nQ2FtZXJhKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCB7aGFuZGxlcn0gb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGhhbmRsZXIucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbmVydGlhLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudHMoe30sIHt9LCBhbGxvd0VuZEFuaW1hdGlvbik7XG4gICAgICAgIHRoaXMuX2NoYW5nZXMgPSBbXTtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCB7aGFuZGxlcn0gb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyLmlzQWN0aXZlKCkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1pvb21pbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3Muem9vbSB8fCB0aGlzLl9tYXAuc2Nyb2xsWm9vbS5pc1pvb21pbmcoKTtcbiAgICB9XG4gICAgaXNSb3RhdGluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcy5yb3RhdGU7XG4gICAgfVxuXG4gICAgaXNNb3ZpbmcoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKGlzTW92aW5nKHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MpKSB8fCB0aGlzLmlzWm9vbWluZygpO1xuICAgIH1cblxuICAgIF9ibG9ja2VkQnlBY3RpdmUoYWN0aXZlSGFuZGxlcnM6IHsgW3N0cmluZ106IEhhbmRsZXIgfSwgYWxsb3dlZDogQXJyYXk8c3RyaW5nPiwgbXlOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGFjdGl2ZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gbXlOYW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghYWxsb3dlZCB8fCBhbGxvd2VkLmluZGV4T2YobmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGhhbmRsZVdpbmRvd0V2ZW50KGU6IElucHV0RXZlbnQpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudChlLCBgJHtlLnR5cGV9V2luZG93YCk7XG4gICAgfVxuXG4gICAgX2dldE1hcFRvdWNoZXModG91Y2hlczogVG91Y2hMaXN0KSB7XG4gICAgICAgIGNvbnN0IG1hcFRvdWNoZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRvdWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICgodC50YXJnZXQ6IGFueSk6IE5vZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBtYXBUb3VjaGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgobWFwVG91Y2hlczogYW55KTogVG91Y2hMaXN0KTtcbiAgICB9XG5cbiAgICBoYW5kbGVFdmVudChlOiBJbnB1dEV2ZW50IHwgUmVuZGVyRnJhbWVFdmVudCwgZXZlbnROYW1lPzogc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGluZ0NhbWVyYSA9IHRydWU7XG4gICAgICAgIGFzc2VydChlLnRpbWVTdGFtcCAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBjb25zdCBpbnB1dEV2ZW50ID0gZS50eXBlID09PSAncmVuZGVyRnJhbWUnID8gdW5kZWZpbmVkIDogKChlOiBhbnkpOiBJbnB1dEV2ZW50KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBXZSBkb24ndCBjYWxsIGUucHJldmVudERlZmF1bHQoKSBmb3IgYW55IGV2ZW50cyBieSBkZWZhdWx0LlxuICAgICAgICAgKiBIYW5kbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgaXQgd2hlcmUgbmVjZXNzYXJ5LlxuICAgICAgICAgKi9cblxuICAgICAgICBjb25zdCBtZXJnZWRIYW5kbGVyUmVzdWx0OiBIYW5kbGVyUmVzdWx0ID0ge25lZWRzUmVuZGVyRnJhbWU6IGZhbHNlfTtcbiAgICAgICAgY29uc3QgZXZlbnRzSW5Qcm9ncmVzcyA9IHt9O1xuICAgICAgICBjb25zdCBhY3RpdmVIYW5kbGVycyA9IHt9O1xuXG4gICAgICAgIGNvbnN0IG1hcFRvdWNoZXMgPSBlLnRvdWNoZXMgPyB0aGlzLl9nZXRNYXBUb3VjaGVzKCgoZTogYW55KTogVG91Y2hFdmVudCkudG91Y2hlcykgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcFRvdWNoZXMgPyBET00udG91Y2hQb3ModGhpcy5fZWwsIG1hcFRvdWNoZXMpIDogRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCAoKGU6IGFueSk6IE1vdXNlRXZlbnQpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtoYW5kbGVyTmFtZSwgaGFuZGxlciwgYWxsb3dlZH0gb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmICghaGFuZGxlci5pc0VuYWJsZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGxldCBkYXRhOiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ibG9ja2VkQnlBY3RpdmUoYWN0aXZlSGFuZGxlcnMsIGFsbG93ZWQsIGhhbmRsZXJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIucmVzZXQoKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKGhhbmRsZXI6IGFueSlbZXZlbnROYW1lIHx8IGUudHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IChoYW5kbGVyOiBhbnkpW2V2ZW50TmFtZSB8fCBlLnR5cGVdKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VIYW5kbGVyUmVzdWx0KG1lcmdlZEhhbmRsZXJSZXN1bHQsIGV2ZW50c0luUHJvZ3Jlc3MsIGRhdGEsIGhhbmRsZXJOYW1lLCBpbnB1dEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5uZWVkc1JlbmRlckZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUmVuZGVyRnJhbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEgfHwgaGFuZGxlci5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlSGFuZGxlcnNbaGFuZGxlck5hbWVdID0gaGFuZGxlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlYWN0aXZhdGVkSGFuZGxlcnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmICghYWN0aXZlSGFuZGxlcnNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZEhhbmRsZXJzW25hbWVdID0gaW5wdXRFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmV2aW91c0FjdGl2ZUhhbmRsZXJzID0gYWN0aXZlSGFuZGxlcnM7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRlYWN0aXZhdGVkSGFuZGxlcnMpLmxlbmd0aCB8fCBoYXNDaGFuZ2UobWVyZ2VkSGFuZGxlclJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZXMucHVzaChbbWVyZ2VkSGFuZGxlclJlc3VsdCwgZXZlbnRzSW5Qcm9ncmVzcywgZGVhY3RpdmF0ZWRIYW5kbGVyc10pO1xuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlclJlbmRlckZyYW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWN0aXZlSGFuZGxlcnMpLmxlbmd0aCB8fCBoYXNDaGFuZ2UobWVyZ2VkSGFuZGxlclJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5fc3RvcCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0aW5nQ2FtZXJhID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qge2NhbWVyYUFuaW1hdGlvbn0gPSBtZXJnZWRIYW5kbGVyUmVzdWx0O1xuICAgICAgICBpZiAoY2FtZXJhQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmVydGlhLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnRzKHt9LCB7fSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VzID0gW107XG4gICAgICAgICAgICBjYW1lcmFBbmltYXRpb24odGhpcy5fbWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1lcmdlSGFuZGxlclJlc3VsdChtZXJnZWRIYW5kbGVyUmVzdWx0OiBIYW5kbGVyUmVzdWx0LCBldmVudHNJblByb2dyZXNzOiBPYmplY3QsIGhhbmRsZXJSZXN1bHQ6IEhhbmRsZXJSZXN1bHQsIG5hbWU6IHN0cmluZywgZT86IElucHV0RXZlbnQpIHtcbiAgICAgICAgaWYgKCFoYW5kbGVyUmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgZXh0ZW5kKG1lcmdlZEhhbmRsZXJSZXN1bHQsIGhhbmRsZXJSZXN1bHQpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IHtoYW5kbGVyTmFtZTogbmFtZSwgb3JpZ2luYWxFdmVudDogaGFuZGxlclJlc3VsdC5vcmlnaW5hbEV2ZW50IHx8IGV9O1xuXG4gICAgICAgIC8vIHRyYWNrIHdoaWNoIGhhbmRsZXIgY2hhbmdlZCB3aGljaCBjYW1lcmEgcHJvcGVydHlcbiAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQuem9vbURlbHRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50c0luUHJvZ3Jlc3Muem9vbSA9IGV2ZW50RGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlclJlc3VsdC5wYW5EZWx0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudHNJblByb2dyZXNzLmRyYWcgPSBldmVudERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQucGl0Y2hEZWx0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudHNJblByb2dyZXNzLnBpdGNoID0gZXZlbnREYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyUmVzdWx0LmJlYXJpbmdEZWx0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudHNJblByb2dyZXNzLnJvdGF0ZSA9IGV2ZW50RGF0YTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgX2FwcGx5Q2hhbmdlcygpIHtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSB7fTtcbiAgICAgICAgY29uc3QgY29tYmluZWRFdmVudHNJblByb2dyZXNzID0ge307XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkRGVhY3RpdmF0ZWRIYW5kbGVycyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW2NoYW5nZSwgZXZlbnRzSW5Qcm9ncmVzcywgZGVhY3RpdmF0ZWRIYW5kbGVyc10gb2YgdGhpcy5fY2hhbmdlcykge1xuXG4gICAgICAgICAgICBpZiAoY2hhbmdlLnBhbkRlbHRhKSBjb21iaW5lZC5wYW5EZWx0YSA9IChjb21iaW5lZC5wYW5EZWx0YSB8fCBuZXcgUG9pbnQoMCwgMCkpLl9hZGQoY2hhbmdlLnBhbkRlbHRhKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2Uuem9vbURlbHRhKSBjb21iaW5lZC56b29tRGVsdGEgPSAoY29tYmluZWQuem9vbURlbHRhIHx8IDApICsgY2hhbmdlLnpvb21EZWx0YTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UuYmVhcmluZ0RlbHRhKSBjb21iaW5lZC5iZWFyaW5nRGVsdGEgPSAoY29tYmluZWQuYmVhcmluZ0RlbHRhIHx8IDApICsgY2hhbmdlLmJlYXJpbmdEZWx0YTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UucGl0Y2hEZWx0YSkgY29tYmluZWQucGl0Y2hEZWx0YSA9IChjb21iaW5lZC5waXRjaERlbHRhIHx8IDApICsgY2hhbmdlLnBpdGNoRGVsdGE7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLmFyb3VuZCAhPT0gdW5kZWZpbmVkKSBjb21iaW5lZC5hcm91bmQgPSBjaGFuZ2UuYXJvdW5kO1xuICAgICAgICAgICAgaWYgKGNoYW5nZS5waW5jaEFyb3VuZCAhPT0gdW5kZWZpbmVkKSBjb21iaW5lZC5waW5jaEFyb3VuZCA9IGNoYW5nZS5waW5jaEFyb3VuZDtcbiAgICAgICAgICAgIGlmIChjaGFuZ2Uubm9JbmVydGlhKSBjb21iaW5lZC5ub0luZXJ0aWEgPSBjaGFuZ2Uubm9JbmVydGlhO1xuXG4gICAgICAgICAgICBleHRlbmQoY29tYmluZWRFdmVudHNJblByb2dyZXNzLCBldmVudHNJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGV4dGVuZChjb21iaW5lZERlYWN0aXZhdGVkSGFuZGxlcnMsIGRlYWN0aXZhdGVkSGFuZGxlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlTWFwVHJhbnNmb3JtKGNvbWJpbmVkLCBjb21iaW5lZEV2ZW50c0luUHJvZ3Jlc3MsIGNvbWJpbmVkRGVhY3RpdmF0ZWRIYW5kbGVycyk7XG4gICAgICAgIHRoaXMuX2NoYW5nZXMgPSBbXTtcbiAgICB9XG5cbiAgICBfdXBkYXRlTWFwVHJhbnNmb3JtKGNvbWJpbmVkUmVzdWx0OiBhbnksIGNvbWJpbmVkRXZlbnRzSW5Qcm9ncmVzczogT2JqZWN0LCBkZWFjdGl2YXRlZEhhbmRsZXJzOiBPYmplY3QpIHtcblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGNvbnN0IHRyID0gbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBpZiAoIWhhc0NoYW5nZShjb21iaW5lZFJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maXJlRXZlbnRzKGNvbWJpbmVkRXZlbnRzSW5Qcm9ncmVzcywgZGVhY3RpdmF0ZWRIYW5kbGVycywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQge3BhbkRlbHRhLCB6b29tRGVsdGEsIGJlYXJpbmdEZWx0YSwgcGl0Y2hEZWx0YSwgYXJvdW5kLCBwaW5jaEFyb3VuZH0gPSBjb21iaW5lZFJlc3VsdDtcblxuICAgICAgICBpZiAocGluY2hBcm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gcGluY2hBcm91bmQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9wIGFueSBvbmdvaW5nIGNhbWVyYSBhbmltYXRpb25zIChlYXNlVG8sIGZseVRvKVxuICAgICAgICBtYXAuX3N0b3AodHJ1ZSk7XG5cbiAgICAgICAgYXJvdW5kID0gYXJvdW5kIHx8IG1hcC50cmFuc2Zvcm0uY2VudGVyUG9pbnQ7XG4gICAgICAgIGNvbnN0IGxvYyA9IHRyLnBvaW50TG9jYXRpb24ocGFuRGVsdGEgPyBhcm91bmQuc3ViKHBhbkRlbHRhKSA6IGFyb3VuZCk7XG4gICAgICAgIGlmIChiZWFyaW5nRGVsdGEpIHRyLmJlYXJpbmcgKz0gYmVhcmluZ0RlbHRhO1xuICAgICAgICBpZiAocGl0Y2hEZWx0YSkgdHIucGl0Y2ggKz0gcGl0Y2hEZWx0YTtcbiAgICAgICAgaWYgKHpvb21EZWx0YSkgdHIuem9vbSArPSB6b29tRGVsdGE7XG4gICAgICAgIHRyLnNldExvY2F0aW9uQXRQb2ludChsb2MsIGFyb3VuZCk7XG5cbiAgICAgICAgdGhpcy5fbWFwLl91cGRhdGUoKTtcbiAgICAgICAgaWYgKCFjb21iaW5lZFJlc3VsdC5ub0luZXJ0aWEpIHRoaXMuX2luZXJ0aWEucmVjb3JkKGNvbWJpbmVkUmVzdWx0KTtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50cyhjb21iaW5lZEV2ZW50c0luUHJvZ3Jlc3MsIGRlYWN0aXZhdGVkSGFuZGxlcnMsIHRydWUpO1xuXG4gICAgfVxuXG4gICAgX2ZpcmVFdmVudHMobmV3RXZlbnRzSW5Qcm9ncmVzczogeyBbc3RyaW5nXTogT2JqZWN0IH0sIGRlYWN0aXZhdGVkSGFuZGxlcnM6IE9iamVjdCwgYWxsb3dFbmRBbmltYXRpb246IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCB3YXNNb3ZpbmcgPSBpc01vdmluZyh0aGlzLl9ldmVudHNJblByb2dyZXNzKTtcbiAgICAgICAgY29uc3Qgbm93TW92aW5nID0gaXNNb3ZpbmcobmV3RXZlbnRzSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRFdmVudHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiBuZXdFdmVudHNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB7b3JpZ2luYWxFdmVudH0gPSBuZXdFdmVudHNJblByb2dyZXNzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RXZlbnRzW2Ake2V2ZW50TmFtZX1zdGFydGBdID0gb3JpZ2luYWxFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXSA9IG5ld0V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcmUgc3RhcnQgZXZlbnRzIG9ubHkgYWZ0ZXIgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcyBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgIGlmICghd2FzTW92aW5nICYmIG5vd01vdmluZykge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3Zlc3RhcnQnLCBub3dNb3Zpbmcub3JpZ2luYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gc3RhcnRFdmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudChuYW1lLCBzdGFydEV2ZW50c1tuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm93TW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmUnLCBub3dNb3Zpbmcub3JpZ2luYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiBuZXdFdmVudHNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB7b3JpZ2luYWxFdmVudH0gPSBuZXdFdmVudHNJblByb2dyZXNzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoZXZlbnROYW1lLCBvcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZEV2ZW50cyA9IHt9O1xuXG4gICAgICAgIGxldCBvcmlnaW5hbEVuZEV2ZW50O1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0aGlzLl9ldmVudHNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB7aGFuZGxlck5hbWUsIG9yaWdpbmFsRXZlbnR9ID0gdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9oYW5kbGVyc0J5SWRbaGFuZGxlck5hbWVdLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kRXZlbnQgPSBkZWFjdGl2YXRlZEhhbmRsZXJzW2hhbmRsZXJOYW1lXSB8fCBvcmlnaW5hbEV2ZW50O1xuICAgICAgICAgICAgICAgIGVuZEV2ZW50c1tgJHtldmVudE5hbWV9ZW5kYF0gPSBvcmlnaW5hbEVuZEV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGVuZEV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KG5hbWUsIGVuZEV2ZW50c1tuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGlsbE1vdmluZyA9IGlzTW92aW5nKHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MpO1xuICAgICAgICBpZiAoYWxsb3dFbmRBbmltYXRpb24gJiYgKHdhc01vdmluZyB8fCBub3dNb3ZpbmcpICYmICFzdGlsbE1vdmluZykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdDYW1lcmEgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgaW5lcnRpYWxFYXNlID0gdGhpcy5faW5lcnRpYS5fb25Nb3ZlRW5kKHRoaXMuX21hcC5kcmFnUGFuLl9pbmVydGlhT3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNuYXBUb05vcnRoID0gYmVhcmluZyA9PiBiZWFyaW5nICE9PSAwICYmIC10aGlzLl9iZWFyaW5nU25hcCA8IGJlYXJpbmcgJiYgYmVhcmluZyA8IHRoaXMuX2JlYXJpbmdTbmFwO1xuXG4gICAgICAgICAgICBpZiAoaW5lcnRpYWxFYXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNuYXBUb05vcnRoKGluZXJ0aWFsRWFzZS5iZWFyaW5nIHx8IHRoaXMuX21hcC5nZXRCZWFyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZXJ0aWFsRWFzZS5iZWFyaW5nID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmVhc2VUbyhpbmVydGlhbEVhc2UsIHtvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEVuZEV2ZW50fSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIHtvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEVuZEV2ZW50fSkpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTbmFwVG9Ob3J0aCh0aGlzLl9tYXAuZ2V0QmVhcmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVzZXROb3J0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nQ2FtZXJhID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIF9maXJlRXZlbnQodHlwZTogc3RyaW5nLCBlOiAqKSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCh0eXBlLCBlID8ge29yaWdpbmFsRXZlbnQ6IGV9IDoge30pKTtcbiAgICB9XG5cbiAgICBfcmVxdWVzdEZyYW1lKCkge1xuICAgICAgICB0aGlzLl9tYXAudHJpZ2dlclJlcGFpbnQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5fcmVuZGVyVGFza1F1ZXVlLmFkZCh0aW1lU3RhbXAgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ZyYW1lSWQ7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUV2ZW50KG5ldyBSZW5kZXJGcmFtZUV2ZW50KCdyZW5kZXJGcmFtZScsIHt0aW1lU3RhbXB9KSk7XG4gICAgICAgICAgICB0aGlzLl9hcHBseUNoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJSZW5kZXJGcmFtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWVJZCA9IHRoaXMuX3JlcXVlc3RGcmFtZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhhbmRsZXJNYW5hZ2VyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdyc7XG5cbi8qKlxuICogVGhpcyBpcyBhIHByaXZhdGUgbmFtZXNwYWNlIGZvciB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IHdpbGwgZ2V0IGF1dG9tYXRpY2FsbHkgc3RyaXBwZWRcbiAqIG91dCBpbiBwcm9kdWN0aW9uIGJ1aWxkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgRGVidWcgPSB7XG4gICAgZXh0ZW5kKGRlc3Q6IE9iamVjdCwgLi4uc291cmNlczogQXJyYXk8P09iamVjdD4pOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKGRlc3QsIC4uLnNvdXJjZXMpO1xuICAgIH0sXG5cbiAgICBydW4oZm46ICgpID0+IGFueSkge1xuICAgICAgICBmbigpO1xuICAgIH0sXG5cbiAgICBsb2dUb0VsZW1lbnQobWVzc2FnZTogc3RyaW5nLCBvdmVyd3JpdGU6IGJvb2xlYW4gPSBmYWxzZSwgaWQ6IHN0cmluZyA9IFwibG9nXCIpIHtcbiAgICAgICAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChvdmVyd3JpdGUpIGVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgZWwuaW5uZXJIVE1MICs9IGA8YnI+JHttZXNzYWdlfWA7XG4gICAgICAgIH1cblxuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGJpbmRBbGwsXHJcbiAgICBleHRlbmQsXHJcbiAgICB3YXJuT25jZSxcclxuICAgIGNsYW1wLFxyXG4gICAgd3JhcCxcclxuICAgIGVhc2UgYXMgZGVmYXVsdEVhc2luZyxcclxuICAgIHBpY2tcclxufSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlJztcclxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcclxuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdCc7XHJcbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJztcclxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xyXG5pbXBvcnQge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQnO1xyXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XHJcbmltcG9ydCB7RGVidWd9IGZyb20gJy4uL3V0aWwvZGVidWcnO1xyXG5cclxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xyXG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xyXG5pbXBvcnQgdHlwZSB7TG5nTGF0Qm91bmRzTGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJztcclxuaW1wb3J0IHR5cGUge1Rhc2tJRH0gZnJvbSAnLi4vdXRpbC90YXNrX3F1ZXVlJztcclxuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XHJcbmltcG9ydCB0eXBlIHtQYWRkaW5nT3B0aW9uc30gZnJvbSAnLi4vZ2VvL2VkZ2VfaW5zZXRzJztcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGNvbW1vbiB0byB7QGxpbmsgTWFwI2p1bXBUb30sIHtAbGluayBNYXAjZWFzZVRvfSwgYW5kIHtAbGluayBNYXAjZmx5VG99LCBjb250cm9sbGluZyB0aGUgZGVzaXJlZCBsb2NhdGlvbixcclxuICogem9vbSwgYmVhcmluZywgYW5kIHBpdGNoIG9mIHRoZSBjYW1lcmEuIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCwgYW5kIHdoZW4gYSBwcm9wZXJ0eSBpcyBvbWl0dGVkLCB0aGUgY3VycmVudFxyXG4gKiBjYW1lcmEgdmFsdWUgZm9yIHRoYXQgcHJvcGVydHkgd2lsbCByZW1haW4gdW5jaGFuZ2VkLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW1lcmFPcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7TG5nTGF0TGlrZX0gY2VudGVyIFRoZSBkZXNpcmVkIGNlbnRlci5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHpvb20gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgVGhlIGRlc2lyZWQgYmVhcmluZyBpbiBkZWdyZWVzLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gdGhhdFxyXG4gKiBpcyBcInVwXCIuIEZvciBleGFtcGxlLCBgYmVhcmluZzogOTBgIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwaXRjaCBUaGUgZGVzaXJlZCBwaXRjaCBpbiBkZWdyZWVzLiBUaGUgcGl0Y2ggaXMgdGhlIGFuZ2xlIHRvd2FyZHMgdGhlIGhvcml6b25cclxuICogbWVhc3VyZWQgaW4gZGVncmVlcyB3aXRoIGEgcmFuZ2UgYmV0d2VlbiAwIGFuZCA2MCBkZWdyZWVzLiBGb3IgZXhhbXBsZSwgcGl0Y2g6IDAgcHJvdmlkZXMgdGhlIGFwcGVhcmFuY2VcclxuICogb2YgbG9va2luZyBzdHJhaWdodCBkb3duIGF0IHRoZSBtYXAsIHdoaWxlIHBpdGNoOiA2MCB0aWx0cyB0aGUgdXNlcidzIHBlcnNwZWN0aXZlIHRvd2FyZHMgdGhlIGhvcml6b24uXHJcbiAqIEluY3JlYXNpbmcgdGhlIHBpdGNoIHZhbHVlIGlzIG9mdGVuIHVzZWQgdG8gZGlzcGxheSAzRCBvYmplY3RzLlxyXG4gKiBAcHJvcGVydHkge0xuZ0xhdExpa2V9IGFyb3VuZCBJZiBgem9vbWAgaXMgc3BlY2lmaWVkLCBgYXJvdW5kYCBkZXRlcm1pbmVzIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHpvb20gaXMgY2VudGVyZWQuXHJcbiAqIEBwcm9wZXJ0eSB7UGFkZGluZ09wdGlvbnN9IHBhZGRpbmcgRGltZW5zaW9ucyBpbiBwaXhlbHMgYXBwbGllZCBvbiBlYWNoIHNpZGUgb2YgdGhlIHZpZXdwb3J0IGZvciBzaGlmdGluZyB0aGUgdmFuaXNoaW5nIHBvaW50LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBzZXQgdGhlIG1hcCdzIGluaXRpYWwgcGVyc3BlY3RpdmUgd2l0aCBDYW1lcmFPcHRpb25zXHJcbiAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHtcclxuICogICBjb250YWluZXI6ICdtYXAnLFxyXG4gKiAgIHN0eWxlOiAnbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMScsXHJcbiAqICAgY2VudGVyOiBbLTczLjU4MDQsIDQ1LjUzNDgzXSxcclxuICogICBwaXRjaDogNjAsXHJcbiAqICAgYmVhcmluZzogLTYwLFxyXG4gKiAgIHpvb206IDEwXHJcbiAqIH0pO1xyXG4gKiBAc2VlIFtTZXQgcGl0Y2ggYW5kIGJlYXJpbmddKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldC1wZXJzcGVjdGl2ZS8pXHJcbiAqIEBzZWUgW0p1bXAgdG8gYSBzZXJpZXMgb2YgbG9jYXRpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9qdW1wLXRvLylcclxuICogQHNlZSBbRmx5IHRvIGEgbG9jYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZseXRvLylcclxuICogQHNlZSBbRGlzcGxheSBidWlsZGluZ3MgaW4gM0RdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlLzNkLWJ1aWxkaW5ncy8pXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDYW1lcmFPcHRpb25zID0ge1xyXG4gICAgY2VudGVyPzogTG5nTGF0TGlrZSxcclxuICAgIHpvb20/OiBudW1iZXIsXHJcbiAgICBiZWFyaW5nPzogbnVtYmVyLFxyXG4gICAgcGl0Y2g/OiBudW1iZXIsXHJcbiAgICBhcm91bmQ/OiBMbmdMYXRMaWtlLFxyXG4gICAgcGFkZGluZz86IFBhZGRpbmdPcHRpb25zXHJcbn07XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBjb21tb24gdG8gbWFwIG1vdmVtZW50IG1ldGhvZHMgdGhhdCBpbnZvbHZlIGFuaW1hdGlvbiwgc3VjaCBhcyB7QGxpbmsgTWFwI3BhbkJ5fSBhbmRcclxuICoge0BsaW5rIE1hcCNlYXNlVG99LCBjb250cm9sbGluZyB0aGUgZHVyYXRpb24gYW5kIGVhc2luZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBBbGwgcHJvcGVydGllc1xyXG4gKiBhcmUgb3B0aW9uYWwuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFuaW1hdGlvbk9wdGlvbnNcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBlYXNpbmcgQSBmdW5jdGlvbiB0YWtpbmcgYSB0aW1lIGluIHRoZSByYW5nZSAwLi4xIGFuZCByZXR1cm5pbmcgYSBudW1iZXIgd2hlcmUgMCBpc1xyXG4gKiAgIHRoZSBpbml0aWFsIHN0YXRlIGFuZCAxIGlzIHRoZSBmaW5hbCBzdGF0ZS5cclxuICogQHByb3BlcnR5IHtQb2ludExpa2V9IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGNlbnRlciByZWxhdGl2ZSB0byByZWFsIG1hcCBjb250YWluZXIgY2VudGVyIGF0IHRoZSBlbmQgb2YgYW5pbWF0aW9uLlxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFuaW1hdGUgSWYgYGZhbHNlYCwgbm8gYW5pbWF0aW9uIHdpbGwgb2NjdXIuXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXNzZW50aWFsIElmIGB0cnVlYCwgdGhlbiB0aGUgYW5pbWF0aW9uIGlzIGNvbnNpZGVyZWQgZXNzZW50aWFsIGFuZCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieVxyXG4gKiAgIFtgcHJlZmVycy1yZWR1Y2VkLW1vdGlvbmBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9AbWVkaWEvcHJlZmVycy1yZWR1Y2VkLW1vdGlvbikuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBBbmltYXRpb25PcHRpb25zID0ge1xyXG4gICAgZHVyYXRpb24/OiBudW1iZXIsXHJcbiAgICBlYXNpbmc/OiAoXzogbnVtYmVyKSA9PiBudW1iZXIsXHJcbiAgICBvZmZzZXQ/OiBQb2ludExpa2UsXHJcbiAgICBhbmltYXRlPzogYm9vbGVhbixcclxuICAgIGVzc2VudGlhbD86IGJvb2xlYW5cclxufTtcclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciBzZXR0aW5nIHBhZGRpbmcgb24gY2FsbHMgdG8gbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZml0Qm91bmRzfSwge0BsaW5rIE1hcCNmaXRTY3JlZW5Db29yZGluYXRlc30sIGFuZCB7QGxpbmsgTWFwI3NldFBhZGRpbmd9LiBBZGp1c3QgdGhlc2Ugb3B0aW9ucyB0byBzZXQgdGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyBhZGRlZCB0byB0aGUgZWRnZXMgb2YgdGhlIGNhbnZhcy4gU2V0IGEgdW5pZm9ybSBwYWRkaW5nIG9uIGFsbCBlZGdlcyBvciBpbmRpdmlkdWFsIHZhbHVlcyBmb3IgZWFjaCBlZGdlLiBBbGwgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdCBtdXN0IGJlXHJcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycy5cclxuICpcclxuICogQHR5cGVkZWYge09iamVjdH0gUGFkZGluZ09wdGlvbnNcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCBQYWRkaW5nIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgdGhlIG1hcCBjYW52YXMuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBib3R0b20gUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBtYXAgY2FudmFzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCBQYWRkaW5nIGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0IG9mIHRoZSBtYXAgY2FudmFzLlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIG1hcCBjYW52YXMuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIHZhciBiYm94ID0gW1stNzksIDQzXSwgWy03MywgNDVdXTtcclxuICogbWFwLmZpdEJvdW5kcyhiYm94LCB7XHJcbiAqICAgcGFkZGluZzoge3RvcDogMTAsIGJvdHRvbToyNSwgbGVmdDogMTUsIHJpZ2h0OiA1fVxyXG4gKiB9KTtcclxuICpcclxuICogQGV4YW1wbGVcclxuICogdmFyIGJib3ggPSBbWy03OSwgNDNdLCBbLTczLCA0NV1dO1xyXG4gKiBtYXAuZml0Qm91bmRzKGJib3gsIHtcclxuICogICBwYWRkaW5nOiAyMFxyXG4gKiB9KTtcclxuICogQHNlZSBbRml0IHRvIHRoZSBib3VuZHMgb2YgYSBMaW5lU3RyaW5nXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS96b29tdG8tbGluZXN0cmluZy8pXHJcbiAqIEBzZWUgW0ZpdCBhIG1hcCB0byBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZml0Ym91bmRzLylcclxuICovXHJcblxyXG5jbGFzcyBDYW1lcmEgZXh0ZW5kcyBFdmVudGVkIHtcclxuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xyXG4gICAgX21vdmluZzogYm9vbGVhbjtcclxuICAgIF96b29taW5nOiBib29sZWFuO1xyXG4gICAgX3JvdGF0aW5nOiBib29sZWFuO1xyXG4gICAgX3BpdGNoaW5nOiBib29sZWFuO1xyXG4gICAgX3BhZGRpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgX2JlYXJpbmdTbmFwOiBudW1iZXI7XHJcbiAgICBfZWFzZVN0YXJ0OiBudW1iZXI7XHJcbiAgICBfZWFzZU9wdGlvbnM6IHtkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmc6IChfOiBudW1iZXIpID0+IG51bWJlcn07XHJcbiAgICBfZWFzZUlkOiBzdHJpbmcgfCB2b2lkO1xyXG5cclxuICAgIF9vbkVhc2VGcmFtZTogKF86IG51bWJlcikgPT4gdm9pZDtcclxuICAgIF9vbkVhc2VFbmQ6IChlYXNlSWQ/OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgICBfZWFzZUZyYW1lSWQ6ID9UYXNrSUQ7XHJcblxyXG4gICAgK19yZXF1ZXN0UmVuZGVyRnJhbWU6ICgoKSA9PiB2b2lkKSA9PiBUYXNrSUQ7XHJcbiAgICArX2NhbmNlbFJlbmRlckZyYW1lOiAoXzogVGFza0lEKSA9PiB2b2lkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybTogVHJhbnNmb3JtLCBvcHRpb25zOiB7YmVhcmluZ1NuYXA6IG51bWJlcn0pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX21vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcclxuICAgICAgICB0aGlzLl9iZWFyaW5nU25hcCA9IG9wdGlvbnMuYmVhcmluZ1NuYXA7XHJcblxyXG4gICAgICAgIGJpbmRBbGwoWydfcmVuZGVyRnJhbWVDYWxsYmFjayddLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy9hZGRBc3NlcnRpb25zKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIHJldHVybiBhIExuZ0xhdCBvYmplY3Qgc3VjaCBhcyB7bG5nOiAwLCBsYXQ6IDB9XHJcbiAgICAgKiB2YXIgY2VudGVyID0gbWFwLmdldENlbnRlcigpO1xyXG4gICAgICogLy8gYWNjZXNzIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgdmFsdWVzIGRpcmVjdGx5XHJcbiAgICAgKiB2YXIge2xvbmdpdHVkZSwgbGF0aXR1ZGV9ID0gbWFwLmdldENlbnRlcigpO1xyXG4gICAgICogQHNlZSBUdXRvcmlhbDogW1VzZSBNYXBib3ggR0wgSlMgaW4gYSBSZWFjdCBhcHBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvdHV0b3JpYWxzL3VzZS1tYXBib3gtZ2wtanMtd2l0aC1yZWFjdC8jc3RvcmUtdGhlLW5ldy1jb29yZGluYXRlcylcclxuICAgICAqL1xyXG4gICAgZ2V0Q2VudGVyKCk6IExuZ0xhdCB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcsIHRoaXMudHJhbnNmb3JtLmNlbnRlci5sYXQpOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7Y2VudGVyOiBjZW50ZXJ9KWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSBjZW50ZXIgVGhlIGNlbnRlcnBvaW50IHRvIHNldC5cclxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cclxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcclxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXHJcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBtYXAuc2V0Q2VudGVyKFstNzQsIDM4XSk7XHJcbiAgICAgKi9cclxuICAgIHNldENlbnRlcihjZW50ZXI6IExuZ0xhdExpa2UsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyh7Y2VudGVyfSwgZXZlbnREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhbnMgdGhlIG1hcCBieSB0aGUgc3BlY2lmaWVkIG9mZnNldC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHBhcmFtIG9mZnNldCBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyBieSB3aGljaCB0byBwYW4gdGhlIG1hcC5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKiBAc2VlIFtOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxyXG4gICAgICovXHJcbiAgICBwYW5CeShvZmZzZXQ6IFBvaW50TGlrZSwgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIG9mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KS5tdWx0KC0xKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYW5Ubyh0aGlzLnRyYW5zZm9ybS5jZW50ZXIsIGV4dGVuZCh7b2Zmc2V0fSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYW5zIHRoZSBtYXAgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSBsbmdsYXQgVGhlIGxvY2F0aW9uIHRvIHBhbiB0aGUgbWFwIHRvLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBkZXNjcmliaW5nIHRoZSBkZXN0aW5hdGlvbiBhbmQgYW5pbWF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLlxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5wYW5UbyhbLTc0LCAzOF0pO1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIFNwZWNpZnkgdGhhdCB0aGUgcGFuVG8gYW5pbWF0aW9uIHNob3VsZCBsYXN0IDUwMDAgbWlsbGlzZWNvbmRzLlxyXG4gICAgICogbWFwLnBhblRvKFstNzQsIDM4XSwge2R1cmF0aW9uOiA1MDAwfSk7XHJcbiAgICAgKiBAc2VlIFtVcGRhdGUgYSBmZWF0dXJlIGluIHJlYWx0aW1lXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9saXZlLXVwZGF0ZS1mZWF0dXJlLylcclxuICAgICAqL1xyXG4gICAgcGFuVG8obG5nbGF0OiBMbmdMYXRMaWtlLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKGV4dGVuZCh7XHJcbiAgICAgICAgICAgIGNlbnRlcjogbG5nbGF0XHJcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEByZXR1cm5zIFRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbWFwLmdldFpvb20oKTtcclxuICAgICAqL1xyXG4gICAgZ2V0Wm9vbSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uem9vbTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWFwJ3Mgem9vbSBsZXZlbC4gRXF1aXZhbGVudCB0byBganVtcFRvKHt6b29tOiB6b29tfSlgLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcGFyYW0gem9vbSBUaGUgem9vbSBsZXZlbCB0byBzZXQgKDAtMjApLlxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIHpvb21zdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVcclxuICAgICAqIEBmaXJlcyB6b29tXHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQGZpcmVzIHpvb21lbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIFpvb20gdG8gdGhlIHpvb20gbGV2ZWwgNSB3aXRob3V0IGFuIGFuaW1hdGVkIHRyYW5zaXRpb25cclxuICAgICAqIG1hcC5zZXRab29tKDUpO1xyXG4gICAgICovXHJcbiAgICBzZXRab29tKHpvb206IG51bWJlciwgZXZlbnREYXRhPzogT2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5qdW1wVG8oe3pvb219LCBldmVudERhdGEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogWm9vbXMgdGhlIG1hcCB0byB0aGUgc3BlY2lmaWVkIHpvb20gbGV2ZWwsIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHBhcmFtIHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gdHJhbnNpdGlvbiB0by5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgem9vbXN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgbW92ZVxyXG4gICAgICogQGZpcmVzIHpvb21cclxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXHJcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gWm9vbSB0byB0aGUgem9vbSBsZXZlbCA1IHdpdGhvdXQgYW4gYW5pbWF0ZWQgdHJhbnNpdGlvblxyXG4gICAgICogbWFwLnpvb21Ubyg1KTtcclxuICAgICAqIC8vIFpvb20gdG8gdGhlIHpvb20gbGV2ZWwgOCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb25cclxuICAgICAqIG1hcC56b29tVG8oOCwge1xyXG4gICAgICogICBkdXJhdGlvbjogMjAwMCxcclxuICAgICAqICAgb2Zmc2V0OiBbMTAwLCA1MF1cclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB6b29tVG8oem9vbTogbnVtYmVyLCBvcHRpb25zOiA/IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyhleHRlbmQoe1xyXG4gICAgICAgICAgICB6b29tXHJcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmNyZWFzZXMgdGhlIG1hcCdzIHpvb20gbGV2ZWwgYnkgMS5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcclxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cclxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcclxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcclxuICAgICAqIEBmaXJlcyBtb3ZlXHJcbiAgICAgKiBAZmlyZXMgem9vbVxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEBmaXJlcyB6b29tZW5kXHJcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgaW4gb25lIGxldmVsIHdpdGggYSBjdXN0b20gYW5pbWF0aW9uIGR1cmF0aW9uXHJcbiAgICAgKiBtYXAuem9vbUluKHtkdXJhdGlvbjogMTAwMH0pO1xyXG4gICAgICovXHJcbiAgICB6b29tSW4ob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpICsgMSwgb3B0aW9ucywgZXZlbnREYXRhKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlY3JlYXNlcyB0aGUgbWFwJ3Mgem9vbSBsZXZlbCBieSAxLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIHpvb21zdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVcclxuICAgICAqIEBmaXJlcyB6b29tXHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQGZpcmVzIHpvb21lbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIHpvb20gdGhlIG1hcCBvdXQgb25lIGxldmVsIHdpdGggYSBjdXN0b20gYW5pbWF0aW9uIG9mZnNldFxyXG4gICAgICogbWFwLnpvb21PdXQoe29mZnNldDogWzgwLCA2MF19KTtcclxuICAgICAqL1xyXG4gICAgem9vbU91dChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy56b29tVG8odGhpcy5nZXRab29tKCkgLSAxLCBvcHRpb25zLCBldmVudERhdGEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgY3VycmVudCBiZWFyaW5nLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gdGhhdCBpcyBcInVwXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmdcclxuICAgICAqIG9mIDkwwrAgb3JpZW50cyB0aGUgbWFwIHNvIHRoYXQgZWFzdCBpcyB1cC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHJldHVybnMgVGhlIG1hcCdzIGN1cnJlbnQgYmVhcmluZy5cclxuICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXHJcbiAgICAgKi9cclxuICAgIGdldEJlYXJpbmcoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmJlYXJpbmc7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1hcCdzIGJlYXJpbmcgKHJvdGF0aW9uKS4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXQgaXMgXCJ1cFwiOyBmb3IgZXhhbXBsZSwgYSBiZWFyaW5nXHJcbiAgICAgKiBvZiA5MMKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXHJcbiAgICAgKlxyXG4gICAgICogRXF1aXZhbGVudCB0byBganVtcFRvKHtiZWFyaW5nOiBiZWFyaW5nfSlgLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcGFyYW0gYmVhcmluZyBUaGUgZGVzaXJlZCBiZWFyaW5nLlxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIHJvdGF0ZSB0aGUgbWFwIHRvIDkwIGRlZ3JlZXNcclxuICAgICAqIG1hcC5zZXRCZWFyaW5nKDkwKTtcclxuICAgICAqL1xyXG4gICAgc2V0QmVhcmluZyhiZWFyaW5nOiBudW1iZXIsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHRoaXMuanVtcFRvKHtiZWFyaW5nfSwgZXZlbnREYXRhKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFkZGluZyBhcHBsaWVkIGFyb3VuZCB0aGUgbWFwIHZpZXdwb3J0LlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBwYWRkaW5nIGFyb3VuZCB0aGUgbWFwIHZpZXdwb3J0LlxyXG4gICAgICovXHJcbiAgICBnZXRQYWRkaW5nKCk6IFBhZGRpbmdPcHRpb25zIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBhZGRpbmc7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHBhZGRpbmcgaW4gcGl4ZWxzIGFyb3VuZCB0aGUgdmlld3BvcnQuXHJcbiAgICAgKlxyXG4gICAgICogRXF1aXZhbGVudCB0byBganVtcFRvKHtwYWRkaW5nOiBwYWRkaW5nfSlgLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcGFyYW0gcGFkZGluZyBUaGUgZGVzaXJlZCBwYWRkaW5nLiBGb3JtYXQ6IHsgbGVmdDogbnVtYmVyLCByaWdodDogbnVtYmVyLCB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIgfVxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIFNldHMgYSBsZWZ0IHBhZGRpbmcgb2YgMzAwcHgsIGFuZCBhIHRvcCBwYWRkaW5nIG9mIDUwcHhcclxuICAgICAqIG1hcC5zZXRQYWRkaW5nKHsgbGVmdDogMzAwLCB0b3A6IDUwIH0pO1xyXG4gICAgICovXHJcbiAgICBzZXRQYWRkaW5nKHBhZGRpbmc6IFBhZGRpbmdPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcclxuICAgICAgICB0aGlzLmp1bXBUbyh7cGFkZGluZ30sIGV2ZW50RGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoZSBtYXAgdG8gdGhlIHNwZWNpZmllZCBiZWFyaW5nLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uIFRoZSBiZWFyaW5nIGlzIHRoZSBjb21wYXNzIGRpcmVjdGlvblxyXG4gICAgICogdGhhdCBpcyBcXFwidXBcXFwiOyBmb3IgZXhhbXBsZSwgYSBiZWFyaW5nIG9mIDkwwrAgb3JpZW50cyB0aGUgbWFwIHNvIHRoYXQgZWFzdCBpcyB1cC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHBhcmFtIGJlYXJpbmcgVGhlIGRlc2lyZWQgYmVhcmluZy5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKi9cclxuICAgIHJvdGF0ZVRvKGJlYXJpbmc6IG51bWJlciwgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyhleHRlbmQoe1xyXG4gICAgICAgICAgICBiZWFyaW5nXHJcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3RhdGVzIHRoZSBtYXAgc28gdGhhdCBub3J0aCBpcyB1cCAoMMKwIGJlYXJpbmcpLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKi9cclxuICAgIHJlc2V0Tm9ydGgob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHRoaXMucm90YXRlVG8oMCwgZXh0ZW5kKHtkdXJhdGlvbjogMTAwMH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm90YXRlcyBhbmQgcGl0Y2hlcyB0aGUgbWFwIHNvIHRoYXQgbm9ydGggaXMgdXAgKDDCsCBiZWFyaW5nKSBhbmQgcGl0Y2ggaXMgMMKwLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKi9cclxuICAgIHJlc2V0Tm9ydGhQaXRjaChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5lYXNlVG8oZXh0ZW5kKHtcclxuICAgICAgICAgICAgYmVhcmluZzogMCxcclxuICAgICAgICAgICAgcGl0Y2g6IDAsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwXHJcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTbmFwcyB0aGUgbWFwIHNvIHRoYXQgbm9ydGggaXMgdXAgKDDCsCBiZWFyaW5nKSwgaWYgdGhlIGN1cnJlbnQgYmVhcmluZyBpcyBjbG9zZSBlbm91Z2ggdG8gaXQgKGkuZS4gd2l0aGluIHRoZVxyXG4gICAgICogYGJlYXJpbmdTbmFwYCB0aHJlc2hvbGQpLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICovXHJcbiAgICBzbmFwVG9Ob3J0aChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuZ2V0QmVhcmluZygpKSA8IHRoaXMuX2JlYXJpbmdTbmFwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2V0Tm9ydGgob3B0aW9ucywgZXZlbnREYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHBpdGNoICh0aWx0KS5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHJldHVybnMgVGhlIG1hcCdzIGN1cnJlbnQgcGl0Y2gsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuLlxyXG4gICAgICovXHJcbiAgICBnZXRQaXRjaCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucGl0Y2g7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1hcCdzIHBpdGNoICh0aWx0KS4gRXF1aXZhbGVudCB0byBganVtcFRvKHtwaXRjaDogcGl0Y2h9KWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSBwaXRjaCBUaGUgcGl0Y2ggdG8gc2V0LCBtZWFzdXJlZCBpbiBkZWdyZWVzIGF3YXkgZnJvbSB0aGUgcGxhbmUgb2YgdGhlIHNjcmVlbiAoMC02MCkuXHJcbiAgICAgKiBAcGFyYW0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZmlyZXMgcGl0Y2hzdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICovXHJcbiAgICBzZXRQaXRjaChwaXRjaDogbnVtYmVyLCBldmVudERhdGE/OiBPYmplY3QpIHtcclxuICAgICAgICB0aGlzLmp1bXBUbyh7cGl0Y2h9LCBldmVudERhdGEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZX0gYm91bmRzIENhbGN1bGF0ZSB0aGUgY2VudGVyIGZvciB0aGVzZSBib3VuZHMgaW4gdGhlIHZpZXdwb3J0IGFuZCB1c2VcclxuICAgICAqICAgICAgdGhlIGhpZ2hlc3Qgem9vbSBsZXZlbCB1cCB0byBhbmQgaW5jbHVkaW5nIGBNYXAjZ2V0TWF4Wm9vbSgpYCB0aGF0IGZpdHNcclxuICAgICAqICAgICAgaW4gdGhlIHZpZXdwb3J0LiBMbmdMYXRCb3VuZHMgcmVwcmVzZW50IGEgYm94IHRoYXQgaXMgYWx3YXlzIGF4aXMtYWxpZ25lZCB3aXRoIGJlYXJpbmcgMC5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IFBhZGRpbmdPcHRpb25zfSBbb3B0aW9ucy5wYWRkaW5nXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIHRvIGFkZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxyXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbV0gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBhbGxvdyB3aGVuIHRoZSBjYW1lcmEgd291bGQgdHJhbnNpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cclxuICAgICAqIEByZXR1cm5zIHtDYW1lcmFPcHRpb25zIHwgdm9pZH0gSWYgbWFwIGlzIGFibGUgdG8gZml0IHRvIHByb3ZpZGVkIGJvdW5kcywgcmV0dXJucyBgQ2FtZXJhT3B0aW9uc2Agd2l0aFxyXG4gICAgICogICAgICBgY2VudGVyYCwgYHpvb21gLCBhbmQgYGJlYXJpbmdgLiBJZiBtYXAgaXMgdW5hYmxlIHRvIGZpdCwgbWV0aG9kIHdpbGwgd2FybiBhbmQgcmV0dXJuIHVuZGVmaW5lZC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgYmJveCA9IFtbLTc5LCA0M10sIFstNzMsIDQ1XV07XHJcbiAgICAgKiB2YXIgbmV3Q2FtZXJhVHJhbnNmb3JtID0gbWFwLmNhbWVyYUZvckJvdW5kcyhiYm94LCB7XHJcbiAgICAgKiAgIHBhZGRpbmc6IHt0b3A6IDEwLCBib3R0b206MjUsIGxlZnQ6IDE1LCByaWdodDogNX1cclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBjYW1lcmFGb3JCb3VuZHMoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlLCBvcHRpb25zPzogQ2FtZXJhT3B0aW9ucyk6IHZvaWQgfCBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucyB7XHJcbiAgICAgICAgYm91bmRzID0gTG5nTGF0Qm91bmRzLmNvbnZlcnQoYm91bmRzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyhib3VuZHMuZ2V0Tm9ydGhXZXN0KCksIGJvdW5kcy5nZXRTb3V0aEVhc3QoKSwgMCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGNlbnRlciBvZiB0aGVzZSB0d28gcG9pbnRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlXHJcbiAgICAgKiB0aGUgaGlnaGVzdCB6b29tIGxldmVsIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0c1xyXG4gICAgICogdGhlIHBvaW50cyBpbiB0aGUgdmlld3BvcnQgYXQgdGhlIHNwZWNpZmllZCBiZWFyaW5nLlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gcDAgRmlyc3QgcG9pbnRcclxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gcDEgU2Vjb25kIHBvaW50XHJcbiAgICAgKiBAcGFyYW0gYmVhcmluZyBEZXNpcmVkIG1hcCBiZWFyaW5nIGF0IGVuZCBvZiBhbmltYXRpb24sIGluIGRlZ3JlZXNcclxuICAgICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IFBhZGRpbmdPcHRpb25zfSBbb3B0aW9ucy5wYWRkaW5nXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIHRvIGFkZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxyXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbV0gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBhbGxvdyB3aGVuIHRoZSBjYW1lcmEgd291bGQgdHJhbnNpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cclxuICAgICAqIEByZXR1cm5zIHtDYW1lcmFPcHRpb25zIHwgdm9pZH0gSWYgbWFwIGlzIGFibGUgdG8gZml0IHRvIHByb3ZpZGVkIGJvdW5kcywgcmV0dXJucyBgQ2FtZXJhT3B0aW9uc2Agd2l0aFxyXG4gICAgICogICAgICBgY2VudGVyYCwgYHpvb21gLCBhbmQgYGJlYXJpbmdgLiBJZiBtYXAgaXMgdW5hYmxlIHRvIGZpdCwgbWV0aG9kIHdpbGwgd2FybiBhbmQgcmV0dXJuIHVuZGVmaW5lZC5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIHAwID0gWy03OSwgNDNdO1xyXG4gICAgICogdmFyIHAxID0gWy03MywgNDVdO1xyXG4gICAgICogdmFyIGJlYXJpbmcgPSA5MDtcclxuICAgICAqIHZhciBuZXdDYW1lcmFUcmFuc2Zvcm0gPSBtYXAuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcocDAsIHAxLCBiZWFyaW5nLCB7XHJcbiAgICAgKiAgIHBhZGRpbmc6IHt0b3A6IDEwLCBib3R0b206MjUsIGxlZnQ6IDE1LCByaWdodDogNX1cclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBfY2FtZXJhRm9yQm94QW5kQmVhcmluZyhwMDogTG5nTGF0TGlrZSwgcDE6IExuZ0xhdExpa2UsIGJlYXJpbmc6IG51bWJlciwgb3B0aW9ucz86IENhbWVyYU9wdGlvbnMpOiB2b2lkIHwgQ2FtZXJhT3B0aW9ucyAmIEFuaW1hdGlvbk9wdGlvbnMge1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRQYWRkaW5nID0ge1xyXG4gICAgICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgICAgIGJvdHRvbTogMCxcclxuICAgICAgICAgICAgcmlnaHQ6IDAsXHJcbiAgICAgICAgICAgIGxlZnQ6IDBcclxuICAgICAgICB9O1xyXG4gICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe1xyXG4gICAgICAgICAgICBwYWRkaW5nOiBkZWZhdWx0UGFkZGluZyxcclxuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXHJcbiAgICAgICAgICAgIG1heFpvb206IHRoaXMudHJhbnNmb3JtLm1heFpvb21cclxuICAgICAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnBhZGRpbmcgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHAgPSBvcHRpb25zLnBhZGRpbmc7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucGFkZGluZyA9IHtcclxuICAgICAgICAgICAgICAgIHRvcDogcCxcclxuICAgICAgICAgICAgICAgIGJvdHRvbTogcCxcclxuICAgICAgICAgICAgICAgIHJpZ2h0OiBwLFxyXG4gICAgICAgICAgICAgICAgbGVmdDogcFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3B0aW9ucy5wYWRkaW5nID0gZXh0ZW5kKGRlZmF1bHRQYWRkaW5nLCBvcHRpb25zLnBhZGRpbmcpO1xyXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm07XHJcbiAgICAgICAgY29uc3QgZWRnZVBhZGRpbmcgPSB0ci5wYWRkaW5nO1xyXG5cclxuICAgICAgICAvLyBXZSB3YW50IHRvIGNhbGN1bGF0ZSB0aGUgdXBwZXIgcmlnaHQgYW5kIGxvd2VyIGxlZnQgb2YgdGhlIGJveCBkZWZpbmVkIGJ5IHAwIGFuZCBwMVxyXG4gICAgICAgIC8vIGluIGEgY29vcmRpbmF0ZSBzeXN0ZW0gcm90YXRlIHRvIG1hdGNoIHRoZSBkZXN0aW5hdGlvbiBiZWFyaW5nLlxyXG4gICAgICAgIGNvbnN0IHAwd29ybGQgPSB0ci5wcm9qZWN0KExuZ0xhdC5jb252ZXJ0KHAwKSk7XHJcbiAgICAgICAgY29uc3QgcDF3b3JsZCA9IHRyLnByb2plY3QoTG5nTGF0LmNvbnZlcnQocDEpKTtcclxuICAgICAgICBjb25zdCBwMHJvdGF0ZWQgPSBwMHdvcmxkLnJvdGF0ZSgtYmVhcmluZyAqIE1hdGguUEkgLyAxODApO1xyXG4gICAgICAgIGNvbnN0IHAxcm90YXRlZCA9IHAxd29ybGQucm90YXRlKC1iZWFyaW5nICogTWF0aC5QSSAvIDE4MCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVwcGVyUmlnaHQgPSBuZXcgUG9pbnQoTWF0aC5tYXgocDByb3RhdGVkLngsIHAxcm90YXRlZC54KSwgTWF0aC5tYXgocDByb3RhdGVkLnksIHAxcm90YXRlZC55KSk7XHJcbiAgICAgICAgY29uc3QgbG93ZXJMZWZ0ID0gbmV3IFBvaW50KE1hdGgubWluKHAwcm90YXRlZC54LCBwMXJvdGF0ZWQueCksIE1hdGgubWluKHAwcm90YXRlZC55LCBwMXJvdGF0ZWQueSkpO1xyXG5cclxuICAgICAgICAvLyBDYWxjdWxhdGUgem9vbTogY29uc2lkZXIgdGhlIG9yaWdpbmFsIGJib3ggYW5kIHBhZGRpbmcuXHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHVwcGVyUmlnaHQuc3ViKGxvd2VyTGVmdCk7XHJcbiAgICAgICAgY29uc3Qgc2NhbGVYID0gKHRyLndpZHRoIC0gKGVkZ2VQYWRkaW5nLmxlZnQgKyBlZGdlUGFkZGluZy5yaWdodCArIG9wdGlvbnMucGFkZGluZy5sZWZ0ICsgb3B0aW9ucy5wYWRkaW5nLnJpZ2h0KSkgLyBzaXplLng7XHJcbiAgICAgICAgY29uc3Qgc2NhbGVZID0gKHRyLmhlaWdodCAtIChlZGdlUGFkZGluZy50b3AgKyBlZGdlUGFkZGluZy5ib3R0b20gKyBvcHRpb25zLnBhZGRpbmcudG9wICsgb3B0aW9ucy5wYWRkaW5nLmJvdHRvbSkpIC8gc2l6ZS55O1xyXG5cclxuICAgICAgICBpZiAoc2NhbGVZIDwgMCB8fCBzY2FsZVggPCAwKSB7XHJcbiAgICAgICAgICAgIHdhcm5PbmNlKFxyXG4gICAgICAgICAgICAgICAgJ01hcCBjYW5ub3QgZml0IHdpdGhpbiBjYW52YXMgd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLCBwYWRkaW5nLCBhbmQvb3Igb2Zmc2V0LidcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgem9vbSA9IE1hdGgubWluKHRyLnNjYWxlWm9vbSh0ci5zY2FsZSAqIE1hdGgubWluKHNjYWxlWCwgc2NhbGVZKSksIG9wdGlvbnMubWF4Wm9vbSk7XHJcblxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBjZW50ZXI6IGFwcGx5IHRoZSB6b29tLCB0aGUgY29uZmlndXJlZCBvZmZzZXQsIGFzIHdlbGwgYXMgb2Zmc2V0IHRoYXQgZXhpc3RzIGFzIGEgcmVzdWx0IG9mIHBhZGRpbmcuXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCk7XHJcbiAgICAgICAgY29uc3QgcGFkZGluZ09mZnNldFggPSAob3B0aW9ucy5wYWRkaW5nLmxlZnQgLSBvcHRpb25zLnBhZGRpbmcucmlnaHQpIC8gMjtcclxuICAgICAgICBjb25zdCBwYWRkaW5nT2Zmc2V0WSA9IChvcHRpb25zLnBhZGRpbmcudG9wIC0gb3B0aW9ucy5wYWRkaW5nLmJvdHRvbSkgLyAyO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldEF0SW5pdGlhbFpvb20gPSBuZXcgUG9pbnQob2Zmc2V0LnggKyBwYWRkaW5nT2Zmc2V0WCwgb2Zmc2V0LnkgKyBwYWRkaW5nT2Zmc2V0WSk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0QXRGaW5hbFpvb20gPSBvZmZzZXRBdEluaXRpYWxab29tLm11bHQodHIuc2NhbGUgLyB0ci56b29tU2NhbGUoem9vbSkpO1xyXG5cclxuICAgICAgICBjb25zdCBjZW50ZXIgPSAgdHIudW5wcm9qZWN0KHAwd29ybGQuYWRkKHAxd29ybGQpLmRpdigyKS5zdWIob2Zmc2V0QXRGaW5hbFpvb20pKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY2VudGVyLFxyXG4gICAgICAgICAgICB6b29tLFxyXG4gICAgICAgICAgICBiZWFyaW5nXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhbnMgYW5kIHpvb21zIHRoZSBtYXAgdG8gY29udGFpbiBpdHMgdmlzaWJsZSBhcmVhIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGdlb2dyYXBoaWNhbCBib3VuZHMuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyByZXNldCB0aGUgbWFwJ3MgYmVhcmluZyB0byAwIGlmIGJlYXJpbmcgaXMgbm9uemVyby5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHBhcmFtIGJvdW5kcyBDZW50ZXIgdGhlc2UgYm91bmRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlIHRoZSBoaWdoZXN0XHJcbiAgICAgKiAgICAgIHpvb20gbGV2ZWwgdXAgdG8gYW5kIGluY2x1ZGluZyBgTWFwI2dldE1heFpvb20oKWAgdGhhdCBmaXRzIHRoZW0gaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIHN1cHBvcnRzIGFsbCBwcm9wZXJ0aWVzIGZyb20ge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9IGFuZCB7QGxpbmsgQ2FtZXJhT3B0aW9uc30gaW4gYWRkaXRpb24gdG8gdGhlIGZpZWxkcyBiZWxvdy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxpbmVhcj1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nXHJcbiAgICAgKiAgICAge0BsaW5rIE1hcCNlYXNlVG99LiBJZiBgZmFsc2VgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nIHtAbGluayBNYXAjZmx5VG99LiBTZWVcclxuICAgICAqICAgICB0aG9zZSBmdW5jdGlvbnMgYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUuXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lYXNpbmddIEFuIGVhc2luZyBmdW5jdGlvbiBmb3IgdGhlIGFuaW1hdGVkIHRyYW5zaXRpb24uIFNlZSB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30uXHJcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0PVswLCAwXV0gVGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gYm91bmRzIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIsIG1lYXN1cmVkIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXHJcbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcblx0ICogQGV4YW1wbGVcclxuICAgICAqIHZhciBiYm94ID0gW1stNzksIDQzXSwgWy03MywgNDVdXTtcclxuICAgICAqIG1hcC5maXRCb3VuZHMoYmJveCwge1xyXG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XHJcbiAgICAgKiB9KTtcclxuICAgICAqIEBzZWUgW0ZpdCBhIG1hcCB0byBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maXRib3VuZHMvKVxyXG4gICAgICovXHJcbiAgICBmaXRCb3VuZHMoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucyAmIENhbWVyYU9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maXRJbnRlcm5hbChcclxuICAgICAgICAgICAgdGhpcy5jYW1lcmFGb3JCb3VuZHMoYm91bmRzLCBvcHRpb25zKSxcclxuICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgZXZlbnREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhbnMsIHJvdGF0ZXMgYW5kIHpvb21zIHRoZSBtYXAgdG8gdG8gZml0IHRoZSBib3ggbWFkZSBieSBwb2ludHMgcDAgYW5kIHAxXHJcbiAgICAgKiBvbmNlIHRoZSBtYXAgaXMgcm90YXRlZCB0byB0aGUgc3BlY2lmaWVkIGJlYXJpbmcuIFRvIHpvb20gd2l0aG91dCByb3RhdGluZyxcclxuICAgICAqIHBhc3MgaW4gdGhlIGN1cnJlbnQgbWFwIGJlYXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSBwMCBGaXJzdCBwb2ludCBvbiBzY3JlZW4sIGluIHBpeGVsIGNvb3JkaW5hdGVzXHJcbiAgICAgKiBAcGFyYW0gcDEgU2Vjb25kIHBvaW50IG9uIHNjcmVlbiwgaW4gcGl4ZWwgY29vcmRpbmF0ZXNcclxuICAgICAqIEBwYXJhbSBiZWFyaW5nIERlc2lyZWQgbWFwIGJlYXJpbmcgYXQgZW5kIG9mIGFuaW1hdGlvbiwgaW4gZGVncmVlc1xyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxpbmVhcj1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nXHJcbiAgICAgKiAgICAge0BsaW5rIE1hcCNlYXNlVG99LiBJZiBgZmFsc2VgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nIHtAbGluayBNYXAjZmx5VG99LiBTZWVcclxuICAgICAqICAgICB0aG9zZSBmdW5jdGlvbnMgYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUuXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5lYXNpbmddIEFuIGVhc2luZyBmdW5jdGlvbiBmb3IgdGhlIGFuaW1hdGVkIHRyYW5zaXRpb24uIFNlZSB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30uXHJcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0PVswLCAwXV0gVGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gYm91bmRzIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIsIG1lYXN1cmVkIGluIHBpeGVscy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG5cdCAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgcDAgPSBbMjIwLCA0MDBdO1xyXG4gICAgICogdmFyIHAxID0gWzUwMCwgOTAwXTtcclxuICAgICAqIG1hcC5maXRTY3JlZW5Db29yZGluYXRlcyhwMCwgcDEsIG1hcC5nZXRCZWFyaW5nKCksIHtcclxuICAgICAqICAgcGFkZGluZzoge3RvcDogMTAsIGJvdHRvbToyNSwgbGVmdDogMTUsIHJpZ2h0OiA1fVxyXG4gICAgICogfSk7XHJcbiAgICAgKiBAc2VlIFVzZWQgYnkge0BsaW5rIEJveFpvb21IYW5kbGVyfVxyXG4gICAgICovXHJcbiAgICBmaXRTY3JlZW5Db29yZGluYXRlcyhwMDogUG9pbnRMaWtlLCBwMTogUG9pbnRMaWtlLCBiZWFyaW5nOiBudW1iZXIsIG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zICYgQ2FtZXJhT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpdEludGVybmFsKFxyXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nKFxyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHAwKSksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKFBvaW50LmNvbnZlcnQocDEpKSxcclxuICAgICAgICAgICAgICAgIGJlYXJpbmcsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zKSxcclxuICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgZXZlbnREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBfZml0SW50ZXJuYWwoY2FsY3VsYXRlZE9wdGlvbnM/OiBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucywgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMgJiBDYW1lcmFPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcclxuICAgICAgICAvLyBjYW1lcmFGb3JCb3VuZHMgd2FybnMgKyByZXR1cm5zIHVuZGVmaW5lZCBpZiB1bmFibGUgdG8gZml0OlxyXG4gICAgICAgIGlmICghY2FsY3VsYXRlZE9wdGlvbnMpIHJldHVybiB0aGlzO1xyXG5cclxuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKGNhbGN1bGF0ZWRPcHRpb25zLCBvcHRpb25zKTtcclxuICAgICAgICAvLyBFeHBsaWN0bHkgcmVtb3ZlIHRoZSBwYWRkaW5nIGZpZWxkIGJlY2F1c2UsIGNhbGN1bGF0ZWRPcHRpb25zIGFscmVhZHkgYWNjb3VudHMgZm9yIHBhZGRpbmcgYnkgc2V0dGluZyB6b29tIGFuZCBjZW50ZXIgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgZGVsZXRlIG9wdGlvbnMucGFkZGluZztcclxuXHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGluZWFyID9cclxuICAgICAgICAgICAgdGhpcy5lYXNlVG8ob3B0aW9ucywgZXZlbnREYXRhKSA6XHJcbiAgICAgICAgICAgIHRoaXMuZmx5VG8ob3B0aW9ucywgZXZlbnREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCB3aXRob3V0XHJcbiAgICAgKiBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLiBUaGUgbWFwIHdpbGwgcmV0YWluIGl0cyBjdXJyZW50IHZhbHVlcyBmb3IgYW55XHJcbiAgICAgKiBkZXRhaWxzIG5vdCBzcGVjaWZpZWQgaW4gYG9wdGlvbnNgLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNYXAjXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIHpvb21zdGFydFxyXG4gICAgICogQGZpcmVzIHBpdGNoc3RhcnRcclxuICAgICAqIEBmaXJlcyByb3RhdGVcclxuICAgICAqIEBmaXJlcyBtb3ZlXHJcbiAgICAgKiBAZmlyZXMgem9vbVxyXG4gICAgICogQGZpcmVzIHBpdGNoXHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQGZpcmVzIHpvb21lbmRcclxuICAgICAqIEBmaXJlcyBwaXRjaGVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8ganVtcCB0byBjb29yZGluYXRlcyBhdCBjdXJyZW50IHpvb21cclxuICAgICAqIG1hcC5qdW1wVG8oe2NlbnRlcjogWzAsIDBdfSk7XHJcbiAgICAgKiAvLyBqdW1wIHdpdGggem9vbSwgcGl0Y2gsIGFuZCBiZWFyaW5nIG9wdGlvbnNcclxuICAgICAqIG1hcC5qdW1wVG8oe1xyXG4gICAgICogICBjZW50ZXI6IFswLCAwXSxcclxuICAgICAqICAgem9vbTogOCxcclxuICAgICAqICAgcGl0Y2g6IDQ1LFxyXG4gICAgICogICBiZWFyaW5nOiA5MFxyXG4gICAgICogfSk7XHJcbiAgICAgKiBAc2VlIFtKdW1wIHRvIGEgc2VyaWVzIG9mIGxvY2F0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvanVtcC10by8pXHJcbiAgICAgKiBAc2VlIFtVcGRhdGUgYSBmZWF0dXJlIGluIHJlYWx0aW1lXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9saXZlLXVwZGF0ZS1mZWF0dXJlLylcclxuICAgICAqL1xyXG4gICAganVtcFRvKG9wdGlvbnM6IENhbWVyYU9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG5cclxuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtO1xyXG4gICAgICAgIGxldCB6b29tQ2hhbmdlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcclxuICAgICAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0ci56b29tID0gK29wdGlvbnMuem9vbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLmNlbnRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgnYmVhcmluZycgaW4gb3B0aW9ucyAmJiB0ci5iZWFyaW5nICE9PSArb3B0aW9ucy5iZWFyaW5nKSB7XHJcbiAgICAgICAgICAgIGJlYXJpbmdDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdHIuYmVhcmluZyA9ICtvcHRpb25zLmJlYXJpbmc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoJ3BpdGNoJyBpbiBvcHRpb25zICYmIHRyLnBpdGNoICE9PSArb3B0aW9ucy5waXRjaCkge1xyXG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0ci5waXRjaCA9ICtvcHRpb25zLnBpdGNoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMucGFkZGluZyAhPSBudWxsICYmICF0ci5pc1BhZGRpbmdFcXVhbChvcHRpb25zLnBhZGRpbmcpKSB7XHJcbiAgICAgICAgICAgIHRyLnBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3Zlc3RhcnQnLCBldmVudERhdGEpKVxyXG4gICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCBldmVudERhdGEpKTtcclxuXHJcbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb21zdGFydCcsIGV2ZW50RGF0YSkpXHJcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3pvb20nLCBldmVudERhdGEpKVxyXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJywgZXZlbnREYXRhKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncm90YXRlc3RhcnQnLCBldmVudERhdGEpKVxyXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdyb3RhdGUnLCBldmVudERhdGEpKVxyXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdyb3RhdGVlbmQnLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hzdGFydCcsIGV2ZW50RGF0YSkpXHJcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3BpdGNoJywgZXZlbnREYXRhKSlcclxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3ZlZW5kJywgZXZlbnREYXRhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2VzIGFueSBjb21iaW5hdGlvbiBvZiBgY2VudGVyYCwgYHpvb21gLCBgYmVhcmluZ2AsIGBwaXRjaGAsIGFuZCBgcGFkZGluZ2Agd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uXHJcbiAgICAgKiBiZXR3ZWVuIG9sZCBhbmQgbmV3IHZhbHVlcy4gVGhlIG1hcCB3aWxsIHJldGFpbiBpdHMgY3VycmVudCB2YWx1ZXMgZm9yIGFueVxyXG4gICAgICogZGV0YWlscyBub3Qgc3BlY2lmaWVkIGluIGBvcHRpb25zYC5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBUaGUgdHJhbnNpdGlvbiB3aWxsIGhhcHBlbiBpbnN0YW50bHkgaWYgdGhlIHVzZXIgaGFzIGVuYWJsZWRcclxuICAgICAqIHRoZSBgcmVkdWNlZCBtb3Rpb25gIGFjY2VzaWJpbGl0eSBmZWF0dXJlIGVuYWJsZWQgaW4gdGhlaXIgb3BlcmF0aW5nIHN5c3RlbSxcclxuICAgICAqIHVubGVzcyBgb3B0aW9uc2AgaW5jbHVkZXMgYGVzc2VudGlhbDogdHJ1ZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cclxuICAgICAqICAgICAgICAgICAgQWNjZXB0cyB7QGxpbmsgQ2FtZXJhT3B0aW9uc30gYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfS5cclxuICAgICAqIEBwYXJhbSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cclxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcclxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcclxuICAgICAqIEBmaXJlcyBwaXRjaHN0YXJ0XHJcbiAgICAgKiBAZmlyZXMgcm90YXRlXHJcbiAgICAgKiBAZmlyZXMgbW92ZVxyXG4gICAgICogQGZpcmVzIHpvb21cclxuICAgICAqIEBmaXJlcyBwaXRjaFxyXG4gICAgICogQGZpcmVzIG1vdmVlbmRcclxuICAgICAqIEBmaXJlcyB6b29tZW5kXHJcbiAgICAgKiBAZmlyZXMgcGl0Y2hlbmRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQHNlZSBbTmF2aWdhdGUgdGhlIG1hcCB3aXRoIGdhbWUtbGlrZSBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcclxuICAgICAqL1xyXG4gICAgZWFzZVRvKG9wdGlvbnM6IENhbWVyYU9wdGlvbnMgJiBBbmltYXRpb25PcHRpb25zICYge2Vhc2VJZD86IHN0cmluZ30sIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIHRoaXMuX3N0b3AoZmFsc2UsIG9wdGlvbnMuZWFzZUlkKTtcclxuXHJcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XHJcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxyXG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxyXG4gICAgICAgICAgICBlYXNpbmc6IGRlZmF1bHRFYXNpbmdcclxuICAgICAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UgfHwgKCFvcHRpb25zLmVzc2VudGlhbCAmJiBicm93c2VyLnByZWZlcnNSZWR1Y2VkTW90aW9uKSkgb3B0aW9ucy5kdXJhdGlvbiA9IDA7XHJcblxyXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm0sXHJcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxyXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcclxuICAgICAgICAgICAgc3RhcnRQaXRjaCA9IHRoaXMuZ2V0UGl0Y2goKSxcclxuICAgICAgICAgICAgc3RhcnRQYWRkaW5nID0gdGhpcy5nZXRQYWRkaW5nKCksXHJcblxyXG4gICAgICAgICAgICB6b29tID0gJ3pvb20nIGluIG9wdGlvbnMgPyArb3B0aW9ucy56b29tIDogc3RhcnRab29tLFxyXG4gICAgICAgICAgICBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZyxcclxuICAgICAgICAgICAgcGl0Y2ggPSAncGl0Y2gnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5waXRjaCA6IHN0YXJ0UGl0Y2gsXHJcbiAgICAgICAgICAgIHBhZGRpbmcgPSAncGFkZGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMucGFkZGluZyA6IHRyLnBhZGRpbmc7XHJcblxyXG4gICAgICAgIGNvbnN0IG9mZnNldEFzUG9pbnQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KTtcclxuICAgICAgICBsZXQgcG9pbnRBdE9mZnNldCA9IHRyLmNlbnRlclBvaW50LmFkZChvZmZzZXRBc1BvaW50KTtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbkF0T2Zmc2V0ID0gdHIucG9pbnRMb2NhdGlvbihwb2ludEF0T2Zmc2V0KTtcclxuICAgICAgICBjb25zdCBjZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlciB8fCBsb2NhdGlvbkF0T2Zmc2V0KTtcclxuICAgICAgICB0aGlzLl9ub3JtYWxpemVDZW50ZXIoY2VudGVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZnJvbSA9IHRyLnByb2plY3QobG9jYXRpb25BdE9mZnNldCk7XHJcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0ci5wcm9qZWN0KGNlbnRlcikuc3ViKGZyb20pO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsU2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSk7XHJcblxyXG4gICAgICAgIGxldCBhcm91bmQsIGFyb3VuZFBvaW50O1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5hcm91bmQpIHtcclxuICAgICAgICAgICAgYXJvdW5kID0gTG5nTGF0LmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xyXG4gICAgICAgICAgICBhcm91bmRQb2ludCA9IHRyLmxvY2F0aW9uUG9pbnQoYXJvdW5kKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRseSA9IHtcclxuICAgICAgICAgICAgbW92aW5nOiB0aGlzLl9tb3ZpbmcsXHJcbiAgICAgICAgICAgIHpvb21pbmc6IHRoaXMuX3pvb21pbmcsXHJcbiAgICAgICAgICAgIHJvdGF0aW5nOiB0aGlzLl9yb3RhdGluZyxcclxuICAgICAgICAgICAgcGl0Y2hpbmc6IHRoaXMuX3BpdGNoaW5nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fem9vbWluZyA9IHRoaXMuX3pvb21pbmcgfHwgKHpvb20gIT09IHN0YXJ0Wm9vbSk7XHJcbiAgICAgICAgdGhpcy5fcm90YXRpbmcgPSB0aGlzLl9yb3RhdGluZyB8fCAoc3RhcnRCZWFyaW5nICE9PSBiZWFyaW5nKTtcclxuICAgICAgICB0aGlzLl9waXRjaGluZyA9IHRoaXMuX3BpdGNoaW5nIHx8IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XHJcbiAgICAgICAgdGhpcy5fcGFkZGluZyA9ICF0ci5pc1BhZGRpbmdFcXVhbChwYWRkaW5nKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWFzZUlkID0gb3B0aW9ucy5lYXNlSWQ7XHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZUVhc2UoZXZlbnREYXRhLCBvcHRpb25zLm5vTW92ZVN0YXJ0LCBjdXJyZW50bHkpO1xyXG5cclxuICAgICAgICB0aGlzLl9lYXNlKChrKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl96b29taW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0ci56b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB6b29tLCBrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcm90YXRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRyLmJlYXJpbmcgPSBpbnRlcnBvbGF0ZShzdGFydEJlYXJpbmcsIGJlYXJpbmcsIGspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9waXRjaGluZykge1xyXG4gICAgICAgICAgICAgICAgdHIucGl0Y2ggPSBpbnRlcnBvbGF0ZShzdGFydFBpdGNoLCBwaXRjaCwgayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRyLmludGVycG9sYXRlUGFkZGluZyhzdGFydFBhZGRpbmcsIHBhZGRpbmcsIGspO1xyXG4gICAgICAgICAgICAgICAgLy8gV2hlbiBwYWRkaW5nIGlzIGJlaW5nIGFwcGxpZWQsIFRyYW5zZm9ybSNjZW50ZXJQb2ludCBpcyBjaGFuZ2luZyBjb250aW5vdXNseSxcclxuICAgICAgICAgICAgICAgIC8vIHRodXMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBvZmZzZXRQb2ludCBldmVyeSBmcmEsZVxyXG4gICAgICAgICAgICAgICAgcG9pbnRBdE9mZnNldCA9IHRyLmNlbnRlclBvaW50LmFkZChvZmZzZXRBc1BvaW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGFyb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KGFyb3VuZCwgYXJvdW5kUG9pbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSB0ci56b29tU2NhbGUodHIuem9vbSAtIHN0YXJ0Wm9vbSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gem9vbSA+IHN0YXJ0Wm9vbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMiwgZmluYWxTY2FsZSkgOlxyXG4gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAuNSwgZmluYWxTY2FsZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzcGVlZHVwID0gTWF0aC5wb3coYmFzZSwgMSAtIGspO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQoayAqIHNwZWVkdXApKS5tdWx0KHNjYWxlKSk7XHJcbiAgICAgICAgICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQodHIucmVuZGVyV29ybGRDb3BpZXMgPyBuZXdDZW50ZXIud3JhcCgpIDogbmV3Q2VudGVyLCBwb2ludEF0T2Zmc2V0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fZmlyZU1vdmVFdmVudHMoZXZlbnREYXRhKTtcclxuXHJcbiAgICAgICAgfSwgKGludGVycnVwdGluZ0Vhc2VJZD86IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9hZnRlckVhc2UoZXZlbnREYXRhLCBpbnRlcnJ1cHRpbmdFYXNlSWQpO1xyXG4gICAgICAgIH0sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBfcHJlcGFyZUVhc2UoZXZlbnREYXRhPzogT2JqZWN0LCBub01vdmVTdGFydDogYm9vbGVhbiwgY3VycmVudGx5OiBPYmplY3QgPSB7fSkge1xyXG4gICAgICAgIHRoaXMuX21vdmluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICghbm9Nb3ZlU3RhcnQgJiYgIWN1cnJlbnRseS5tb3ZpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZXN0YXJ0JywgZXZlbnREYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl96b29taW5nICYmICFjdXJyZW50bHkuem9vbWluZykge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW5nICYmICFjdXJyZW50bHkucm90YXRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncm90YXRlc3RhcnQnLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nICYmICFjdXJyZW50bHkucGl0Y2hpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hzdGFydCcsIGV2ZW50RGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZmlyZU1vdmVFdmVudHMoZXZlbnREYXRhPzogT2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZScsIGV2ZW50RGF0YSkpO1xyXG4gICAgICAgIGlmICh0aGlzLl96b29taW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb20nLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZScsIGV2ZW50RGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fcGl0Y2hpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2gnLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2FmdGVyRWFzZShldmVudERhdGE/OiBPYmplY3QsIGVhc2VJZD86IHN0cmluZykge1xyXG4gICAgICAgIC8vIGlmIHRoaXMgZWFzaW5nIGlzIGJlaW5nIHN0b3BwZWQgdG8gc3RhcnQgYW5vdGhlciBlYXNpbmcgd2l0aFxyXG4gICAgICAgIC8vIHRoZSBzYW1lIGlkIHRoZW4gZG9uJ3QgZmlyZSBhbnkgZXZlbnRzIHRvIGF2b2lkIGV4dHJhIHN0YXJ0L3N0b3AgZXZlbnRzXHJcbiAgICAgICAgaWYgKHRoaXMuX2Vhc2VJZCAmJiBlYXNlSWQgJiYgdGhpcy5fZWFzZUlkID09PSBlYXNlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgdGhpcy5fZWFzZUlkO1xyXG5cclxuICAgICAgICBjb25zdCB3YXNab29taW5nID0gdGhpcy5fem9vbWluZztcclxuICAgICAgICBjb25zdCB3YXNSb3RhdGluZyA9IHRoaXMuX3JvdGF0aW5nO1xyXG4gICAgICAgIGNvbnN0IHdhc1BpdGNoaW5nID0gdGhpcy5fcGl0Y2hpbmc7XHJcbiAgICAgICAgdGhpcy5fbW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fem9vbWluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3JvdGF0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcGl0Y2hpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wYWRkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh3YXNab29taW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb21lbmQnLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHdhc1JvdGF0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZWVuZCcsIGV2ZW50RGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2FzUGl0Y2hpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnLCBldmVudERhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIGV2ZW50RGF0YSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hhbmdlcyBhbnkgY29tYmluYXRpb24gb2YgY2VudGVyLCB6b29tLCBiZWFyaW5nLCBhbmQgcGl0Y2gsIGFuaW1hdGluZyB0aGUgdHJhbnNpdGlvbiBhbG9uZyBhIGN1cnZlIHRoYXRcclxuICAgICAqIGV2b2tlcyBmbGlnaHQuIFRoZSBhbmltYXRpb24gc2VhbWxlc3NseSBpbmNvcnBvcmF0ZXMgem9vbWluZyBhbmQgcGFubmluZyB0byBoZWxwXHJcbiAgICAgKiB0aGUgdXNlciBtYWludGFpbiBoZXIgYmVhcmluZ3MgZXZlbiBhZnRlciB0cmF2ZXJzaW5nIGEgZ3JlYXQgZGlzdGFuY2UuXHJcbiAgICAgKlxyXG4gICAgICogTm90ZTogVGhlIGFuaW1hdGlvbiB3aWxsIGJlIHNraXBwZWQsIGFuZCB0aGlzIHdpbGwgYmVoYXZlIGVxdWl2YWxlbnRseSB0byBganVtcFRvYFxyXG4gICAgICogaWYgdGhlIHVzZXIgaGFzIHRoZSBgcmVkdWNlZCBtb3Rpb25gIGFjY2VzaWJpbGl0eSBmZWF0dXJlIGVuYWJsZWQgaW4gdGhlaXIgb3BlcmF0aW5nIHN5c3RlbSxcclxuICAgICAqIHVubGVzcyAnb3B0aW9ucycgaW5jbHVkZXMgYGVzc2VudGlhbDogdHJ1ZWAuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1hcCNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cclxuICAgICAqICAgICBBY2NlcHRzIHtAbGluayBDYW1lcmFPcHRpb25zfSwge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LFxyXG4gICAgICogICAgIGFuZCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jdXJ2ZT0xLjQyXSBUaGUgem9vbWluZyBcImN1cnZlXCIgdGhhdCB3aWxsIG9jY3VyIGFsb25nIHRoZVxyXG4gICAgICogICAgIGZsaWdodCBwYXRoLiBBIGhpZ2ggdmFsdWUgbWF4aW1pemVzIHpvb21pbmcgZm9yIGFuIGV4YWdnZXJhdGVkIGFuaW1hdGlvbiwgd2hpbGUgYSBsb3dcclxuICAgICAqICAgICB2YWx1ZSBtaW5pbWl6ZXMgem9vbWluZyBmb3IgYW4gZWZmZWN0IGNsb3NlciB0byB7QGxpbmsgTWFwI2Vhc2VUb30uIDEuNDIgaXMgdGhlIGF2ZXJhZ2VcclxuICAgICAqICAgICB2YWx1ZSBzZWxlY3RlZCBieSBwYXJ0aWNpcGFudHMgaW4gdGhlIHVzZXIgc3R1ZHkgZGlzY3Vzc2VkIGluXHJcbiAgICAgKiAgICAgW3ZhbiBXaWprICgyMDAzKV0oaHR0cHM6Ly93d3cud2luLnR1ZS5ubC9+dmFud2lqay96b29tcGFuLnBkZikuIEEgdmFsdWUgb2ZcclxuICAgICAqICAgICBgTWF0aC5wb3coNiwgMC4yNSlgIHdvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHJvb3QgbWVhbiBzcXVhcmVkIGF2ZXJhZ2UgdmVsb2NpdHkuIEFcclxuICAgICAqICAgICB2YWx1ZSBvZiAxIHdvdWxkIHByb2R1Y2UgYSBjaXJjdWxhciBtb3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbV0gVGhlIHplcm8tYmFzZWQgem9vbSBsZXZlbCBhdCB0aGUgcGVhayBvZiB0aGUgZmxpZ2h0IHBhdGguIElmXHJcbiAgICAgKiAgICAgYG9wdGlvbnMuY3VydmVgIGlzIHNwZWNpZmllZCwgdGhpcyBvcHRpb24gaXMgaWdub3JlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjJdIFRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gZGVmaW5lZCBpbiByZWxhdGlvbiB0b1xyXG4gICAgICogICAgIGBvcHRpb25zLmN1cnZlYC4gQSBzcGVlZCBvZiAxLjIgbWVhbnMgdGhhdCB0aGUgbWFwIGFwcGVhcnMgdG8gbW92ZSBhbG9uZyB0aGUgZmxpZ2h0IHBhdGhcclxuICAgICAqICAgICBieSAxLjIgdGltZXMgYG9wdGlvbnMuY3VydmVgIHNjcmVlbmZ1bHMgZXZlcnkgc2Vjb25kLiBBIF9zY3JlZW5mdWxfIGlzIHRoZSBtYXAncyB2aXNpYmxlIHNwYW4uXHJcbiAgICAgKiAgICAgSXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZpeGVkIHBoeXNpY2FsIGRpc3RhbmNlLCBidXQgdmFyaWVzIGJ5IHpvb20gbGV2ZWwuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2NyZWVuU3BlZWRdIFRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gbWVhc3VyZWQgaW4gc2NyZWVuZnVsc1xyXG4gICAgICogICAgIHBlciBzZWNvbmQsIGFzc3VtaW5nIGEgbGluZWFyIHRpbWluZyBjdXJ2ZS4gSWYgYG9wdGlvbnMuc3BlZWRgIGlzIHNwZWNpZmllZCwgdGhpcyBvcHRpb24gaXMgaWdub3JlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhEdXJhdGlvbl0gVGhlIGFuaW1hdGlvbidzIG1heGltdW0gZHVyYXRpb24sIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcy5cclxuICAgICAqICAgICBJZiBkdXJhdGlvbiBleGNlZWRzIG1heGltdW0gZHVyYXRpb24sIGl0IHJlc2V0cyB0byAwLlxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxyXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxyXG4gICAgICogQGZpcmVzIHpvb21zdGFydFxyXG4gICAgICogQGZpcmVzIHBpdGNoc3RhcnRcclxuICAgICAqIEBmaXJlcyBtb3ZlXHJcbiAgICAgKiBAZmlyZXMgem9vbVxyXG4gICAgICogQGZpcmVzIHJvdGF0ZVxyXG4gICAgICogQGZpcmVzIHBpdGNoXHJcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxyXG4gICAgICogQGZpcmVzIHpvb21lbmRcclxuICAgICAqIEBmaXJlcyBwaXRjaGVuZFxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gZmx5IHdpdGggZGVmYXVsdCBvcHRpb25zIHRvIG51bGwgaXNsYW5kXHJcbiAgICAgKiBtYXAuZmx5VG8oe2NlbnRlcjogWzAsIDBdLCB6b29tOiA5fSk7XHJcbiAgICAgKiAvLyB1c2luZyBmbHlUbyBvcHRpb25zXHJcbiAgICAgKiBtYXAuZmx5VG8oe1xyXG4gICAgICogICBjZW50ZXI6IFswLCAwXSxcclxuICAgICAqICAgem9vbTogOSxcclxuICAgICAqICAgc3BlZWQ6IDAuMixcclxuICAgICAqICAgY3VydmU6IDEsXHJcbiAgICAgKiAgIGVhc2luZyh0KSB7XHJcbiAgICAgKiAgICAgcmV0dXJuIHQ7XHJcbiAgICAgKiAgIH1cclxuICAgICAqIH0pO1xyXG4gICAgICogQHNlZSBbRmx5IHRvIGEgbG9jYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmx5dG8vKVxyXG4gICAgICogQHNlZSBbU2xvd2x5IGZseSB0byBhIGxvY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZseXRvLW9wdGlvbnMvKVxyXG4gICAgICogQHNlZSBbRmx5IHRvIGEgbG9jYXRpb24gYmFzZWQgb24gc2Nyb2xsIHBvc2l0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3Njcm9sbC1mbHktdG8vKVxyXG4gICAgICovXHJcbiAgICBmbHlUbyhvcHRpb25zOiBPYmplY3QsIGV2ZW50RGF0YT86IE9iamVjdCkge1xyXG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBqdW1wVG8gaWYgdXNlciBoYXMgc2V0IHByZWZlcnMtcmVkdWNlZC1tb3Rpb25cclxuICAgICAgICBpZiAoIW9wdGlvbnMuZXNzZW50aWFsICYmIGJyb3dzZXIucHJlZmVyc1JlZHVjZWRNb3Rpb24pIHtcclxuICAgICAgICAgICAgY29uc3QgY29lcmNlZE9wdGlvbnMgPSAocGljayhvcHRpb25zLCBbJ2NlbnRlcicsICd6b29tJywgJ2JlYXJpbmcnLCAncGl0Y2gnLCAnYXJvdW5kJ10pOiBDYW1lcmFPcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKGNvZXJjZWRPcHRpb25zLCBldmVudERhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaW1wbGVtZW50cyBhbiDigJxvcHRpbWFsIHBhdGjigJ0gYW5pbWF0aW9uLCBhcyBkZXRhaWxlZCBpbjpcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFZhbiBXaWprLCBKYXJrZSBKLjsgTnVpaiwgV2ltIEEuIEEuIOKAnFNtb290aCBhbmQgZWZmaWNpZW50IHpvb21pbmcgYW5kIHBhbm5pbmcu4oCdIElORk9WSVNcclxuICAgICAgICAvLyAgIOKAmTAzLiBwcC4gMTXigJMyMi4gPGh0dHBzOi8vd3d3Lndpbi50dWUubmwvfnZhbndpamsvem9vbXBhbi5wZGYjcGFnZT01Pi5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdoZXJlIGFwcGxpY2FibGUsIGxvY2FsIHZhcmlhYmxlIGRvY3VtZW50YXRpb24gYmVnaW5zIHdpdGggdGhlIGFzc29jaWF0ZWQgdmFyaWFibGUgb3JcclxuICAgICAgICAvLyBmdW5jdGlvbiBpbiB2YW4gV2lqayAoMjAwMykuXHJcblxyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG5cclxuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHtcclxuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXHJcbiAgICAgICAgICAgIHNwZWVkOiAxLjIsXHJcbiAgICAgICAgICAgIGN1cnZlOiAxLjQyLFxyXG4gICAgICAgICAgICBlYXNpbmc6IGRlZmF1bHRFYXNpbmdcclxuICAgICAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybSxcclxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXHJcbiAgICAgICAgICAgIHN0YXJ0QmVhcmluZyA9IHRoaXMuZ2V0QmVhcmluZygpLFxyXG4gICAgICAgICAgICBzdGFydFBpdGNoID0gdGhpcy5nZXRQaXRjaCgpLFxyXG4gICAgICAgICAgICBzdGFydFBhZGRpbmcgPSB0aGlzLmdldFBhZGRpbmcoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gY2xhbXAoK29wdGlvbnMuem9vbSwgdHIubWluWm9vbSwgdHIubWF4Wm9vbSkgOiBzdGFydFpvb207XHJcbiAgICAgICAgY29uc3QgYmVhcmluZyA9ICdiZWFyaW5nJyBpbiBvcHRpb25zID8gdGhpcy5fbm9ybWFsaXplQmVhcmluZyhvcHRpb25zLmJlYXJpbmcsIHN0YXJ0QmVhcmluZykgOiBzdGFydEJlYXJpbmc7XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSAncGl0Y2gnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5waXRjaCA6IHN0YXJ0UGl0Y2g7XHJcbiAgICAgICAgY29uc3QgcGFkZGluZyA9ICdwYWRkaW5nJyBpbiBvcHRpb25zID8gb3B0aW9ucy5wYWRkaW5nIDogdHIucGFkZGluZztcclxuXHJcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0QXNQb2ludCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpO1xyXG4gICAgICAgIGxldCBwb2ludEF0T2Zmc2V0ID0gdHIuY2VudGVyUG9pbnQuYWRkKG9mZnNldEFzUG9pbnQpO1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQXRPZmZzZXQgPSB0ci5wb2ludExvY2F0aW9uKHBvaW50QXRPZmZzZXQpO1xyXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyIHx8IGxvY2F0aW9uQXRPZmZzZXQpO1xyXG4gICAgICAgIHRoaXMuX25vcm1hbGl6ZUNlbnRlcihjZW50ZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmcm9tID0gdHIucHJvamVjdChsb2NhdGlvbkF0T2Zmc2V0KTtcclxuICAgICAgICBjb25zdCBkZWx0YSA9IHRyLnByb2plY3QoY2VudGVyKS5zdWIoZnJvbSk7XHJcblxyXG4gICAgICAgIGxldCByaG8gPSBvcHRpb25zLmN1cnZlO1xyXG5cclxuICAgICAgICAvLyB34oKAOiBJbml0aWFsIHZpc2libGUgc3BhbiwgbWVhc3VyZWQgaW4gcGl4ZWxzIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxyXG4gICAgICAgIGNvbnN0IHcwID0gTWF0aC5tYXgodHIud2lkdGgsIHRyLmhlaWdodCksXHJcbiAgICAgICAgICAgIC8vIHfigoE6IEZpbmFsIHZpc2libGUgc3BhbiwgbWVhc3VyZWQgaW4gcGl4ZWxzIHdpdGggcmVzcGVjdCB0byB0aGUgaW5pdGlhbCBzY2FsZS5cclxuICAgICAgICAgICAgdzEgPSB3MCAvIHNjYWxlLFxyXG4gICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhlIGZsaWdodCBwYXRoIGFzIHByb2plY3RlZCBvbnRvIHRoZSBncm91bmQgcGxhbmUsIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tXHJcbiAgICAgICAgICAgIC8vIHRoZSB3b3JsZCBpbWFnZSBvcmlnaW4gYXQgdGhlIGluaXRpYWwgc2NhbGUuXHJcbiAgICAgICAgICAgIHUxID0gZGVsdGEubWFnKCk7XHJcblxyXG4gICAgICAgIGlmICgnbWluWm9vbScgaW4gb3B0aW9ucykge1xyXG4gICAgICAgICAgICBjb25zdCBtaW5ab29tID0gY2xhbXAoTWF0aC5taW4ob3B0aW9ucy5taW5ab29tLCBzdGFydFpvb20sIHpvb20pLCB0ci5taW5ab29tLCB0ci5tYXhab29tKTtcclxuICAgICAgICAgICAgLy8gdzxzdWI+bTwvc3ViPjogTWF4aW11bSB2aXNpYmxlIHNwYW4sIG1lYXN1cmVkIGluIHBpeGVscyB3aXRoIHJlc3BlY3QgdG8gdGhlIGluaXRpYWxcclxuICAgICAgICAgICAgLy8gc2NhbGUuXHJcbiAgICAgICAgICAgIGNvbnN0IHdNYXggPSB3MCAvIHRyLnpvb21TY2FsZShtaW5ab29tIC0gc3RhcnRab29tKTtcclxuICAgICAgICAgICAgcmhvID0gTWF0aC5zcXJ0KHdNYXggLyB1MSAqIDIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gz4HCslxyXG4gICAgICAgIGNvbnN0IHJobzIgPSByaG8gKiByaG87XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHLhtaI6IFJldHVybnMgdGhlIHpvb20tb3V0IGZhY3RvciBhdCBvbmUgZW5kIG9mIHRoZSBhbmltYXRpb24uXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBAcGFyYW0gaSAwIGZvciB0aGUgYXNjZW50IG9yIDEgZm9yIHRoZSBkZXNjZW50LlxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZnVuY3Rpb24gcihpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodzEgKiB3MSAtIHcwICogdzAgKyAoaSA/IC0xIDogMSkgKiByaG8yICogcmhvMiAqIHUxICogdTEpIC8gKDIgKiAoaSA/IHcxIDogdzApICogcmhvMiAqIHUxKTtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubG9nKE1hdGguc3FydChiICogYiArIDEpIC0gYik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBzaW5oKG4pIHsgcmV0dXJuIChNYXRoLmV4cChuKSAtIE1hdGguZXhwKC1uKSkgLyAyOyB9XHJcbiAgICAgICAgZnVuY3Rpb24gY29zaChuKSB7IHJldHVybiAoTWF0aC5leHAobikgKyBNYXRoLmV4cCgtbikpIC8gMjsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHRhbmgobikgeyByZXR1cm4gc2luaChuKSAvIGNvc2gobik7IH1cclxuXHJcbiAgICAgICAgLy8gcuKCgDogWm9vbS1vdXQgZmFjdG9yIGR1cmluZyBhc2NlbnQuXHJcbiAgICAgICAgY29uc3QgcjAgPSByKDApO1xyXG5cclxuICAgICAgICAvLyB3KHMpOiBSZXR1cm5zIHRoZSB2aXNpYmxlIHNwYW4gb24gdGhlIGdyb3VuZCwgbWVhc3VyZWQgaW4gcGl4ZWxzIHdpdGggcmVzcGVjdCB0byB0aGVcclxuICAgICAgICAvLyBpbml0aWFsIHNjYWxlLiBBc3N1bWVzIGFuIGFuZ3VsYXIgZmllbGQgb2YgdmlldyBvZiAyIGFyY3RhbiDCvSDiiYggNTPCsC5cclxuICAgICAgICBsZXQgdzogKF86IG51bWJlcikgPT4gbnVtYmVyID0gZnVuY3Rpb24gKHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChjb3NoKHIwKSAvIGNvc2gocjAgKyByaG8gKiBzKSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gdShzKTogUmV0dXJucyB0aGUgZGlzdGFuY2UgYWxvbmcgdGhlIGZsaWdodCBwYXRoIGFzIHByb2plY3RlZCBvbnRvIHRoZSBncm91bmQgcGxhbmUsXHJcbiAgICAgICAgLy8gbWVhc3VyZWQgaW4gcGl4ZWxzIGZyb20gdGhlIHdvcmxkIGltYWdlIG9yaWdpbiBhdCB0aGUgaW5pdGlhbCBzY2FsZS5cclxuICAgICAgICBsZXQgdTogKF86IG51bWJlcikgPT4gbnVtYmVyID0gZnVuY3Rpb24gKHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHcwICogKChjb3NoKHIwKSAqIHRhbmgocjAgKyByaG8gKiBzKSAtIHNpbmgocjApKSAvIHJobzIpIC8gdTE7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gUzogVG90YWwgbGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gz4Etc2NyZWVuZnVscy5cclxuICAgICAgICBsZXQgUyA9IChyKDEpIC0gcjApIC8gcmhvO1xyXG5cclxuICAgICAgICAvLyBXaGVuIHXigoAgPSB14oKBLCB0aGUgb3B0aW1hbCBwYXRoIGRvZXNu4oCZdCByZXF1aXJlIGJvdGggYXNjZW50IGFuZCBkZXNjZW50LlxyXG4gICAgICAgIGlmIChNYXRoLmFicyh1MSkgPCAwLjAwMDAwMSB8fCAhaXNGaW5pdGUoUykpIHtcclxuICAgICAgICAgICAgLy8gUGVyZm9ybSBhIG1vcmUgb3IgbGVzcyBpbnN0YW50YW5lb3VzIHRyYW5zaXRpb24gaWYgdGhlIHBhdGggaXMgdG9vIHNob3J0LlxyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModzAgLSB3MSkgPCAwLjAwMDAwMSkgcmV0dXJuIHRoaXMuZWFzZVRvKG9wdGlvbnMsIGV2ZW50RGF0YSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBrID0gdzEgPCB3MCA/IC0xIDogMTtcclxuICAgICAgICAgICAgUyA9IE1hdGguYWJzKE1hdGgubG9nKHcxIC8gdzApKSAvIHJobztcclxuXHJcbiAgICAgICAgICAgIHUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XHJcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbihzKSB7IHJldHVybiBNYXRoLmV4cChrICogcmhvICogcyk7IH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoJ2R1cmF0aW9uJyBpbiBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSArb3B0aW9ucy5kdXJhdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBWID0gJ3NjcmVlblNwZWVkJyBpbiBvcHRpb25zID8gK29wdGlvbnMuc2NyZWVuU3BlZWQgLyByaG8gOiArb3B0aW9ucy5zcGVlZDtcclxuICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9IDEwMDAgKiBTIC8gVjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLm1heER1cmF0aW9uICYmIG9wdGlvbnMuZHVyYXRpb24gPiBvcHRpb25zLm1heER1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fem9vbWluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcm90YXRpbmcgPSAoc3RhcnRCZWFyaW5nICE9PSBiZWFyaW5nKTtcclxuICAgICAgICB0aGlzLl9waXRjaGluZyA9IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XHJcbiAgICAgICAgdGhpcy5fcGFkZGluZyA9ICF0ci5pc1BhZGRpbmdFcXVhbChwYWRkaW5nKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJlcGFyZUVhc2UoZXZlbnREYXRhLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2Vhc2UoKGspID0+IHtcclxuICAgICAgICAgICAgLy8gczogVGhlIGRpc3RhbmNlIHRyYXZlbGVkIGFsb25nIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gz4Etc2NyZWVuZnVscy5cclxuICAgICAgICAgICAgY29uc3QgcyA9IGsgKiBTO1xyXG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IDEgLyB3KHMpO1xyXG4gICAgICAgICAgICB0ci56b29tID0gayA9PT0gMSA/IHpvb20gOiBzdGFydFpvb20gKyB0ci5zY2FsZVpvb20oc2NhbGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0ci5iZWFyaW5nID0gaW50ZXJwb2xhdGUoc3RhcnRCZWFyaW5nLCBiZWFyaW5nLCBrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcGl0Y2hpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRyLnBpdGNoID0gaW50ZXJwb2xhdGUoc3RhcnRQaXRjaCwgcGl0Y2gsIGspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYWRkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0ci5pbnRlcnBvbGF0ZVBhZGRpbmcoc3RhcnRQYWRkaW5nLCBwYWRkaW5nLCBrKTtcclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gcGFkZGluZyBpcyBiZWluZyBhcHBsaWVkLCBUcmFuc2Zvcm0jY2VudGVyUG9pbnQgaXMgY2hhbmdpbmcgY29udGlub3VzbHksXHJcbiAgICAgICAgICAgICAgICAvLyB0aHVzIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgb2Zmc2V0UG9pbnQgZXZlcnkgZnJhbWVcclxuICAgICAgICAgICAgICAgIHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQob2Zmc2V0QXNQb2ludCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NlbnRlciA9IGsgPT09IDEgPyBjZW50ZXIgOiB0ci51bnByb2plY3QoZnJvbS5hZGQoZGVsdGEubXVsdCh1KHMpKSkubXVsdChzY2FsZSkpO1xyXG4gICAgICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQodHIucmVuZGVyV29ybGRDb3BpZXMgPyBuZXdDZW50ZXIud3JhcCgpIDogbmV3Q2VudGVyLCBwb2ludEF0T2Zmc2V0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XHJcblxyXG4gICAgICAgIH0sICgpID0+IHRoaXMuX2FmdGVyRWFzZShldmVudERhdGEpLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaXNFYXNpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZWFzZUZyYW1lSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdG9wcyBhbnkgYW5pbWF0ZWQgdHJhbnNpdGlvbiB1bmRlcndheS5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKi9cclxuICAgIHN0b3AoKTogdGhpcyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBfc3RvcChhbGxvd0dlc3R1cmVzPzogYm9vbGVhbiwgZWFzZUlkPzogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Vhc2VGcmFtZUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFJlbmRlckZyYW1lKHRoaXMuX2Vhc2VGcmFtZUlkKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2Vhc2VGcmFtZUlkO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb25FYXNlRnJhbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb25FYXNlRW5kKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBfb25FYXNlRW5kIGZ1bmN0aW9uIG1pZ2h0IGVtaXQgZXZlbnRzIHdoaWNoIHRyaWdnZXIgbmV3XHJcbiAgICAgICAgICAgIC8vIGFuaW1hdGlvbiwgd2hpY2ggc2V0cyBhIG5ldyBfb25FYXNlRW5kLiBFbnN1cmUgd2UgZG9uJ3QgZGVsZXRlXHJcbiAgICAgICAgICAgIC8vIGl0IHVuaW50ZW50aW9uYWxseS5cclxuICAgICAgICAgICAgY29uc3Qgb25FYXNlRW5kID0gdGhpcy5fb25FYXNlRW5kO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb25FYXNlRW5kO1xyXG4gICAgICAgICAgICBvbkVhc2VFbmQuY2FsbCh0aGlzLCBlYXNlSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFsbG93R2VzdHVyZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSAodGhpczogYW55KS5oYW5kbGVycztcclxuICAgICAgICAgICAgaWYgKGhhbmRsZXJzKSBoYW5kbGVycy5zdG9wKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgX2Vhc2UoZnJhbWU6IChfOiBudW1iZXIpID0+IHZvaWQsXHJcbiAgICAgICAgICBmaW5pc2g6ICgpID0+IHZvaWQsXHJcbiAgICAgICAgICBvcHRpb25zOiB7YW5pbWF0ZTogYm9vbGVhbiwgZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAoXzogbnVtYmVyKSA9PiBudW1iZXJ9KSB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UgfHwgb3B0aW9ucy5kdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgICAgICBmcmFtZSgxKTtcclxuICAgICAgICAgICAgZmluaXNoKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWFzZVN0YXJ0ID0gYnJvd3Nlci5ub3coKTtcclxuICAgICAgICAgICAgdGhpcy5fZWFzZU9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgICAgICB0aGlzLl9vbkVhc2VGcmFtZSA9IGZyYW1lO1xyXG4gICAgICAgICAgICB0aGlzLl9vbkVhc2VFbmQgPSBmaW5pc2g7XHJcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VGcmFtZUlkID0gdGhpcy5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWxsYmFjayBmb3IgbWFwLl9yZXF1ZXN0UmVuZGVyRnJhbWVcclxuICAgIF9yZW5kZXJGcmFtZUNhbGxiYWNrKCkge1xyXG4gICAgICAgIGNvbnN0IHQgPSBNYXRoLm1pbigoYnJvd3Nlci5ub3coKSAtIHRoaXMuX2Vhc2VTdGFydCkgLyB0aGlzLl9lYXNlT3B0aW9ucy5kdXJhdGlvbiwgMSk7XHJcbiAgICAgICAgdGhpcy5fb25FYXNlRnJhbWUodGhpcy5fZWFzZU9wdGlvbnMuZWFzaW5nKHQpKTtcclxuICAgICAgICBpZiAodCA8IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWFzZUZyYW1lSWQgPSB0aGlzLl9yZXF1ZXN0UmVuZGVyRnJhbWUodGhpcy5fcmVuZGVyRnJhbWVDYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnZlcnQgYmVhcmluZyBzbyB0aGF0IGl0J3MgbnVtZXJpY2FsbHkgY2xvc2UgdG8gdGhlIGN1cnJlbnQgb25lIHNvIHRoYXQgaXQgaW50ZXJwb2xhdGVzIHByb3Blcmx5XHJcbiAgICBfbm9ybWFsaXplQmVhcmluZyhiZWFyaW5nOiBudW1iZXIsIGN1cnJlbnRCZWFyaW5nOiBudW1iZXIpIHtcclxuICAgICAgICBiZWFyaW5nID0gd3JhcChiZWFyaW5nLCAtMTgwLCAxODApO1xyXG4gICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhiZWFyaW5nIC0gY3VycmVudEJlYXJpbmcpO1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhiZWFyaW5nIC0gMzYwIC0gY3VycmVudEJlYXJpbmcpIDwgZGlmZikgYmVhcmluZyAtPSAzNjA7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGJlYXJpbmcgKyAzNjAgLSBjdXJyZW50QmVhcmluZykgPCBkaWZmKSBiZWFyaW5nICs9IDM2MDtcclxuICAgICAgICByZXR1cm4gYmVhcmluZztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBhIHBhdGggY3Jvc3NpbmcgdGhlIGFudGltZXJpZGlhbiB3b3VsZCBiZSBzaG9ydGVyLCBleHRlbmQgdGhlIGZpbmFsIGNvb3JkaW5hdGUgc28gdGhhdFxyXG4gICAgLy8gaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIHdpbGwgY3Jvc3MgaXQuXHJcbiAgICBfbm9ybWFsaXplQ2VudGVyKGNlbnRlcjogTG5nTGF0KSB7XHJcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybTtcclxuICAgICAgICBpZiAoIXRyLnJlbmRlcldvcmxkQ29waWVzIHx8IHRyLmxuZ1JhbmdlKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbHRhID0gY2VudGVyLmxuZyAtIHRyLmNlbnRlci5sbmc7XHJcbiAgICAgICAgY2VudGVyLmxuZyArPVxyXG4gICAgICAgICAgICBkZWx0YSA+IDE4MCA/IC0zNjAgOlxyXG4gICAgICAgICAgICBkZWx0YSA8IC0xODAgPyAzNjAgOiAwO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBJbiBkZWJ1ZyBidWlsZHMsIGNoZWNrIHRoYXQgY2FtZXJhIGNoYW5nZSBldmVudHMgYXJlIGZpcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxyXG4vLyAtIF9fX3N0YXJ0IGV2ZW50cyBuZWVkcyB0byBiZSBmaXJlZCBiZWZvcmUgX19fIGFuZCBfX19lbmQgZXZlbnRzXHJcbi8vIC0gYW5vdGhlciBfX19zdGFydCBldmVudCBjYW4ndCBiZSBmaXJlZCBiZWZvcmUgYSBfX19lbmQgZXZlbnQgaGFzIGJlZW4gZmlyZWQgZm9yIHRoZSBwcmV2aW91cyBvbmVcclxuZnVuY3Rpb24gYWRkQXNzZXJ0aW9ucyhjYW1lcmE6IENhbWVyYSkgeyAvL2VzbGludC1kaXNhYmxlLWxpbmVcclxuICAgIERlYnVnLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5Qcm9ncmVzcyA9IHt9O1xyXG5cclxuICAgICAgICBbJ2RyYWcnLCAnem9vbScsICdyb3RhdGUnLCAncGl0Y2gnLCAnbW92ZSddLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgICAgIGluUHJvZ3Jlc3NbbmFtZV0gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGNhbWVyYS5vbihgJHtuYW1lfXN0YXJ0YCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXNzZXJ0KCFpblByb2dyZXNzW25hbWVdLCBgXCIke25hbWV9c3RhcnRcIiBmaXJlZCB0d2ljZSB3aXRob3V0IGEgXCIke25hbWV9ZW5kXCJgKTtcclxuICAgICAgICAgICAgICAgIGluUHJvZ3Jlc3NbbmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGluUHJvZ3Jlc3MubW92ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY2FtZXJhLm9uKG5hbWUsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGFzc2VydChpblByb2dyZXNzW25hbWVdKTtcclxuICAgICAgICAgICAgICAgIGFzc2VydChpblByb2dyZXNzLm1vdmUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNhbWVyYS5vbihgJHtuYW1lfWVuZGAsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGFzc2VydChpblByb2dyZXNzLm1vdmUpO1xyXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGluUHJvZ3Jlc3NbbmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgaW5Qcm9ncmVzc1tuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ2FuYXJ5IHVzZWQgdG8gdGVzdCB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaXMgc3RyaXBwZWQgaW4gcHJvZCBidWlsZFxyXG4gICAgICAgIGNhbmFyeSA9ICdjYW5hcnkgZGVidWcgcnVuJztcclxuICAgIH0pO1xyXG59XHJcblxyXG5sZXQgY2FuYXJ5OyAvL2VzbGludC1kaXNhYmxlLWxpbmVcclxuXHJcbmV4cG9ydCBkZWZhdWx0IENhbWVyYTtcclxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5pbXBvcnQge2JpbmRBbGx9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4uLy4uL3V0aWwvY29uZmlnJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBjb21wYWN0PzogYm9vbGVhbixcbiAgICBjdXN0b21BdHRyaWJ1dGlvbj86IHN0cmluZyB8IEFycmF5PHN0cmluZz5cbn07XG5cbi8qKlxuICogQW4gYEF0dHJpYnV0aW9uQ29udHJvbGAgY29udHJvbCBwcmVzZW50cyB0aGUgbWFwJ3MgW2F0dHJpYnV0aW9uIGluZm9ybWF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2hvdy1tYXBib3gtd29ya3MvYXR0cmlidXRpb24vKS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvbXBhY3RdIElmIGB0cnVlYCwgZm9yY2UgYSBjb21wYWN0IGF0dHJpYnV0aW9uIHRoYXQgc2hvd3MgdGhlIGZ1bGwgYXR0cmlidXRpb24gb24gbW91c2UgaG92ZXIuIElmIGBmYWxzZWAsIGZvcmNlIHRoZSBmdWxsIGF0dHJpYnV0aW9uIGNvbnRyb2wuIFRoZSBkZWZhdWx0IGlzIGEgcmVzcG9uc2l2ZSBhdHRyaWJ1dGlvbiB0aGF0IGNvbGxhcHNlcyB3aGVuIHRoZSBtYXAgaXMgbGVzcyB0aGFuIDY0MCBwaXhlbHMgd2lkZS4gKipBdHRyaWJ1dGlvbiBzaG91bGQgbm90IGJlIGNvbGxhcHNlZCBpZiBpdCBjYW4gY29tZm9ydGFibHkgZml0IG9uIHRoZSBtYXAuIGBjb21wYWN0YCBzaG91bGQgb25seSBiZSB1c2VkIHRvIG1vZGlmeSBkZWZhdWx0IGF0dHJpYnV0aW9uIHdoZW4gbWFwIHNpemUgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBmaXQgW2RlZmF1bHQgYXR0cmlidXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvaG93LW1hcGJveC13b3Jrcy9hdHRyaWJ1dGlvbi8pIGFuZCB3aGVuIHRoZSBhdXRvbWF0aWMgY29tcGFjdCByZXNpemluZyBmb3IgZGVmYXVsdCBzZXR0aW5ncyBhcmUgbm90IHN1ZmZpY2llbnQuKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gW29wdGlvbnMuY3VzdG9tQXR0cmlidXRpb25dIFN0cmluZyBvciBzdHJpbmdzIHRvIHNob3cgaW4gYWRkaXRpb24gdG8gYW55IG90aGVyIGF0dHJpYnV0aW9ucy5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7YXR0cmlidXRpb25Db250cm9sOiBmYWxzZX0pXG4gKiAgICAgLmFkZENvbnRyb2wobmV3IG1hcGJveGdsLkF0dHJpYnV0aW9uQ29udHJvbCh7XG4gKiAgICAgICAgIGNvbXBhY3Q6IHRydWVcbiAqICAgICB9KSk7XG4gKi9cbmNsYXNzIEF0dHJpYnV0aW9uQ29udHJvbCB7XG4gICAgb3B0aW9uczogT3B0aW9ucztcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2lubmVyQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfZWRpdExpbms6ID9IVE1MQW5jaG9yRWxlbWVudDtcbiAgICBfYXR0cmliSFRNTDogc3RyaW5nO1xuICAgIHN0eWxlSWQ6IHN0cmluZztcbiAgICBzdHlsZU93bmVyOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfdXBkYXRlRWRpdExpbmsnLFxuICAgICAgICAgICAgJ191cGRhdGVEYXRhJyxcbiAgICAgICAgICAgICdfdXBkYXRlQ29tcGFjdCdcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ2JvdHRvbS1yaWdodCc7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgY29uc3QgY29tcGFjdCA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuY29tcGFjdDtcblxuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtYXR0cmliJyk7XG4gICAgICAgIHRoaXMuX2lubmVyQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwtYXR0cmliLWlubmVyJywgdGhpcy5fY29udGFpbmVyKTtcblxuICAgICAgICBpZiAoY29tcGFjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignc3R5bGVkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vbignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVFZGl0TGluayk7XG5cbiAgICAgICAgaWYgKGNvbXBhY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBhY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcblxuICAgICAgICB0aGlzLl9tYXAub2ZmKCdzdHlsZWRhdGEnLCB0aGlzLl91cGRhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlRWRpdExpbmspO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcblxuICAgICAgICB0aGlzLl9tYXAgPSAodW5kZWZpbmVkOiBhbnkpO1xuICAgICAgICB0aGlzLl9hdHRyaWJIVE1MID0gKHVuZGVmaW5lZDogYW55KTtcbiAgICB9XG5cbiAgICBfdXBkYXRlRWRpdExpbmsoKSB7XG4gICAgICAgIGxldCBlZGl0TGluayA9IHRoaXMuX2VkaXRMaW5rO1xuICAgICAgICBpZiAoIWVkaXRMaW5rKSB7XG4gICAgICAgICAgICBlZGl0TGluayA9IHRoaXMuX2VkaXRMaW5rID0gKHRoaXMuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcubWFwYm94LWltcHJvdmUtbWFwJyk6IGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBbXG4gICAgICAgICAgICB7a2V5OiBcIm93bmVyXCIsIHZhbHVlOiB0aGlzLnN0eWxlT3duZXJ9LFxuICAgICAgICAgICAge2tleTogXCJpZFwiLCB2YWx1ZTogdGhpcy5zdHlsZUlkfSxcbiAgICAgICAgICAgIHtrZXk6IFwiYWNjZXNzX3Rva2VuXCIsIHZhbHVlOiB0aGlzLl9tYXAuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOfVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChlZGl0TGluaykge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1TdHJpbmcgPSBwYXJhbXMucmVkdWNlKChhY2MsIG5leHQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gYCR7bmV4dC5rZXl9PSR7bmV4dC52YWx1ZX0ke2kgPCBwYXJhbXMubGVuZ3RoIC0gMSA/ICcmJyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCBgP2ApO1xuICAgICAgICAgICAgZWRpdExpbmsuaHJlZiA9IGAke2NvbmZpZy5GRUVEQkFDS19VUkx9LyR7cGFyYW1TdHJpbmd9JHt0aGlzLl9tYXAuX2hhc2ggPyB0aGlzLl9tYXAuX2hhc2guZ2V0SGFzaFN0cmluZyh0cnVlKSA6ICcnfWA7XG4gICAgICAgICAgICBlZGl0TGluay5yZWwgPSBcIm5vb3BlbmVyIG5vZm9sbG93XCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlRGF0YShlOiBhbnkpIHtcbiAgICAgICAgaWYgKGUgJiYgKGUuc291cmNlRGF0YVR5cGUgPT09ICdtZXRhZGF0YScgfHwgZS5kYXRhVHlwZSA9PT0gJ3N0eWxlJykpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlRWRpdExpbmsoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVBdHRyaWJ1dGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwLnN0eWxlKSByZXR1cm47XG4gICAgICAgIGxldCBhdHRyaWJ1dGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucyA9IGF0dHJpYnV0aW9ucy5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbi5tYXAoYXR0cmlidXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGlvbiAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucy5wdXNoKHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwLnN0eWxlLnN0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQ6IGFueSA9IHRoaXMuX21hcC5zdHlsZS5zdHlsZXNoZWV0O1xuICAgICAgICAgICAgdGhpcy5zdHlsZU93bmVyID0gc3R5bGVzaGVldC5vd25lcjtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVJZCA9IHN0eWxlc2hlZXQuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9tYXAuc3R5bGUuc291cmNlQ2FjaGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLnVzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmF0dHJpYnV0aW9uICYmIGF0dHJpYnV0aW9ucy5pbmRleE9mKHNvdXJjZS5hdHRyaWJ1dGlvbikgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucy5wdXNoKHNvdXJjZS5hdHRyaWJ1dGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFueSBlbnRyaWVzIHRoYXQgYXJlIHN1YnN0cmluZ3Mgb2YgYW5vdGhlciBlbnRyeS5cbiAgICAgICAgLy8gZmlyc3Qgc29ydCBieSBsZW5ndGggc28gdGhhdCBzdWJzdHJpbmdzIGNvbWUgZmlyc3RcbiAgICAgICAgYXR0cmlidXRpb25zLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xuICAgICAgICBhdHRyaWJ1dGlvbnMgPSBhdHRyaWJ1dGlvbnMuZmlsdGVyKChhdHRyaWIsIGkpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGF0dHJpYnV0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGlvbnNbal0uaW5kZXhPZihhdHRyaWIpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYXR0cmlidXRpb24gc3RyaW5nIGlzIGRpZmZlcmVudCB0byBtaW5pbWl6ZSBET00gY2hhbmdlc1xuICAgICAgICBjb25zdCBhdHRyaWJIVE1MID0gYXR0cmlidXRpb25zLmpvaW4oJyB8ICcpO1xuICAgICAgICBpZiAoYXR0cmliSFRNTCA9PT0gdGhpcy5fYXR0cmliSFRNTCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2F0dHJpYkhUTUwgPSBhdHRyaWJIVE1MO1xuXG4gICAgICAgIGlmIChhdHRyaWJ1dGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9pbm5lckNvbnRhaW5lci5pbm5lckhUTUwgPSBhdHRyaWJIVE1MO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWF0dHJpYi1lbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBvbGQgRE9NIG5vZGUgZnJvbSBfZWRpdExpbmtcbiAgICAgICAgdGhpcy5fZWRpdExpbmsgPSBudWxsO1xuICAgIH1cblxuICAgIF91cGRhdGVDb21wYWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLm9mZnNldFdpZHRoIDw9IDY0MCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXR0cmlidXRpb25Db250cm9sO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5cbmltcG9ydCB7YmluZEFsbH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbi8qKlxuICogQSBgTG9nb0NvbnRyb2xgIGlzIGEgY29udHJvbCB0aGF0IGFkZHMgdGhlIE1hcGJveCB3YXRlcm1hcmtcbiAqIHRvIHRoZSBtYXAgYXMgcmVxdWlyZWQgYnkgdGhlIFt0ZXJtcyBvZiBzZXJ2aWNlXShodHRwczovL3d3dy5tYXBib3guY29tL3Rvcy8pIGZvciBNYXBib3hcbiAqIHZlY3RvciB0aWxlcyBhbmQgY29yZSBzdHlsZXMuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHByaXZhdGVcbioqL1xuXG5jbGFzcyBMb2dvQ29udHJvbCB7XG4gICAgX21hcDogTWFwO1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGJpbmRBbGwoWydfdXBkYXRlTG9nbyddLCB0aGlzKTtcbiAgICAgICAgYmluZEFsbChbJ191cGRhdGVDb21wYWN0J10sIHRoaXMpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwnKTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gRE9NLmNyZWF0ZSgnYScsICdtYXBib3hnbC1jdHJsLWxvZ28nKTtcbiAgICAgICAgYW5jaG9yLnRhcmdldCA9IFwiX2JsYW5rXCI7XG4gICAgICAgIGFuY2hvci5yZWwgPSBcIm5vb3BlbmVyIG5vZm9sbG93XCI7XG4gICAgICAgIGFuY2hvci5ocmVmID0gXCJodHRwczovL3d3dy5tYXBib3guY29tL1wiO1xuICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdMb2dvQ29udHJvbC5UaXRsZScpKTtcbiAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZShcInJlbFwiLCBcIm5vb3BlbmVyIG5vZm9sbG93XCIpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoYW5jaG9yKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlTG9nbyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxvZ28oKTtcblxuICAgICAgICB0aGlzLl9tYXAub24oJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb21wYWN0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlTG9nbyk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdib3R0b20tbGVmdCc7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUxvZ28oZTogYW55KSB7XG4gICAgICAgIGlmICghZSB8fCBlLnNvdXJjZURhdGFUeXBlID09PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IHRoaXMuX2xvZ29SZXF1aXJlZCgpID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9sb2dvUmVxdWlyZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwLnN0eWxlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fbWFwLnN0eWxlLnNvdXJjZUNhY2hlcztcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlLm1hcGJveF9sb2dvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUNvbXBhY3QoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckNoaWxkcmVuID0gdGhpcy5fY29udGFpbmVyLmNoaWxkcmVuO1xuICAgICAgICBpZiAoY29udGFpbmVyQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBhbmNob3IgPSBjb250YWluZXJDaGlsZHJlblswXTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkub2Zmc2V0V2lkdGggPCAyNTApIHtcbiAgICAgICAgICAgICAgICBhbmNob3IuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY29tcGFjdCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbmNob3IuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY29tcGFjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IExvZ29Db250cm9sO1xuIiwiLy8gQGZsb3cgc3RyaWN0XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmV4cG9ydCB0eXBlIFRhc2tJRCA9IG51bWJlcjsgLy8gY2FuJ3QgbWFyayBvcGFxdWUgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG93dHlwZS9mbG93LXJlbW92ZS10eXBlcy9wdWxsLzYxXG50eXBlIFRhc2sgPSB7XG4gICAgY2FsbGJhY2s6ICh0aW1lU3RhbXA6IG51bWJlcikgPT4gdm9pZDtcbiAgICBpZDogVGFza0lEO1xuICAgIGNhbmNlbGxlZDogYm9vbGVhbjtcbn07XG5cbmNsYXNzIFRhc2tRdWV1ZSB7XG4gICAgX3F1ZXVlOiBBcnJheTxUYXNrPjtcbiAgICBfaWQ6IFRhc2tJRDtcbiAgICBfY2xlYXJlZDogYm9vbGVhbjtcbiAgICBfY3VycmVudGx5UnVubmluZzogQXJyYXk8VGFzaz4gfCBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKCkgIHtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5faWQgPSAwO1xuICAgICAgICB0aGlzLl9jbGVhcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhZGQoY2FsbGJhY2s6ICh0aW1lU3RhbXA6IG51bWJlcikgPT4gdm9pZCk6IFRhc2tJRCB7XG4gICAgICAgIGNvbnN0IGlkID0gKyt0aGlzLl9pZDtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLl9xdWV1ZTtcbiAgICAgICAgcXVldWUucHVzaCh7Y2FsbGJhY2ssIGlkLCBjYW5jZWxsZWQ6IGZhbHNlfSk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICByZW1vdmUoaWQ6IFRhc2tJRCkge1xuICAgICAgICBjb25zdCBydW5uaW5nID0gdGhpcy5fY3VycmVudGx5UnVubmluZztcbiAgICAgICAgY29uc3QgcXVldWUgPSBydW5uaW5nID8gdGhpcy5fcXVldWUuY29uY2F0KHJ1bm5pbmcpIDogdGhpcy5fcXVldWU7XG4gICAgICAgIGZvciAoY29uc3QgdGFzayBvZiBxdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRhc2suaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgdGFzay5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJ1bih0aW1lU3RhbXA6IG51bWJlciA9IDApIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLl9jdXJyZW50bHlSdW5uaW5nKTtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLl9jdXJyZW50bHlSdW5uaW5nID0gdGhpcy5fcXVldWU7XG5cbiAgICAgICAgLy8gVGFza3MgcXVldWVkIGJ5IGNhbGxiYWNrcyBpbiB0aGUgY3VycmVudCBxdWV1ZSBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICAgICAgLy8gb24gdGhlIG5leHQgcnVuLCBub3QgdGhlIGN1cnJlbnQgcnVuLlxuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGFzayBvZiBxdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRhc2suY2FuY2VsbGVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRhc2suY2FsbGJhY2sodGltZVN0YW1wKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbGVhcmVkKSBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NsZWFyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5UnVubmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudGx5UnVubmluZykge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRhc2tRdWV1ZTtcbiIsImltcG9ydCB0bWVyYyBmcm9tICdwcm9qNC9saWIvcHJvamVjdGlvbnMvdG1lcmMnO1xuaW1wb3J0IGV0bWVyYyBmcm9tICdwcm9qNC9saWIvcHJvamVjdGlvbnMvZXRtZXJjJztcbmltcG9ydCB1dG0gZnJvbSAncHJvajQvbGliL3Byb2plY3Rpb25zL3V0bSc7XG5pbXBvcnQgc3RlcmVhIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9zdGVyZWEnO1xuaW1wb3J0IHN0ZXJlIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9zdGVyZSc7XG5pbXBvcnQgc29tZXJjIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9zb21lcmMnO1xuaW1wb3J0IG9tZXJjIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9vbWVyYyc7XG5pbXBvcnQgbGNjIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9sY2MnO1xuaW1wb3J0IGtyb3ZhayBmcm9tICdwcm9qNC9saWIvcHJvamVjdGlvbnMva3JvdmFrJztcbmltcG9ydCBjYXNzIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9jYXNzJztcbmltcG9ydCBsYWVhIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9sYWVhJztcbmltcG9ydCBhZWEgZnJvbSAncHJvajQvbGliL3Byb2plY3Rpb25zL2FlYSc7XG5pbXBvcnQgZ25vbSBmcm9tICdwcm9qNC9saWIvcHJvamVjdGlvbnMvZ25vbSc7XG5pbXBvcnQgY2VhIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9jZWEnO1xuaW1wb3J0IGVxYyBmcm9tICdwcm9qNC9saWIvcHJvamVjdGlvbnMvZXFjJztcbmltcG9ydCBwb2x5IGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9wb2x5JztcbmltcG9ydCBuem1nIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9uem1nJztcbmltcG9ydCBtaWxsIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9taWxsJztcbmltcG9ydCBzaW51IGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9zaW51JztcbmltcG9ydCBtb2xsIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9tb2xsJztcbmltcG9ydCBlcWRjIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9lcWRjJztcbmltcG9ydCB2YW5kZyBmcm9tICdwcm9qNC9saWIvcHJvamVjdGlvbnMvdmFuZGcnO1xuaW1wb3J0IGFlcWQgZnJvbSAncHJvajQvbGliL3Byb2plY3Rpb25zL2FlcWQnO1xuaW1wb3J0IG9ydGhvIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9vcnRobyc7XG5pbXBvcnQgcXNjIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9xc2MnO1xuaW1wb3J0IHJvYmluIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9yb2Jpbic7XG5pbXBvcnQgZ2VvY2VudCBmcm9tICdwcm9qNC9saWIvcHJvamVjdGlvbnMvZ2VvY2VudCc7XG5pbXBvcnQgdHBlcnMgZnJvbSAncHJvajQvbGliL3Byb2plY3Rpb25zL3RwZXJzJztcbmltcG9ydCBnZW9zIGZyb20gJ3Byb2o0L2xpYi9wcm9qZWN0aW9ucy9nZW9zJztcbmltcG9ydCBwYXJzZUNvZGUgZnJvbSAncHJvajQvbGliL3BhcnNlQ29kZSc7XG5pbXBvcnQgeyBwcm9qNCB9IGZyb20gXCIuLi91dGlsL21hcGJveFwiO1xuXG5jb25zdCBuYW1lcyA9IFtdO1xuZnVuY3Rpb24gYWRkKHByb2opIHtcbiAgbmFtZXMucHVzaCguLi4ocHJvai5uYW1lcyB8fCBbXSkpO1xufVxuYWRkKHRtZXJjKTtcbmFkZChldG1lcmMpO1xuYWRkKHV0bSk7XG5hZGQoc3RlcmVhKTtcbmFkZChzdGVyZSk7XG5hZGQoc29tZXJjKTtcbmFkZChvbWVyYyk7XG5hZGQobGNjKTtcbmFkZChrcm92YWspO1xuYWRkKGNhc3MpO1xuYWRkKGxhZWEpO1xuYWRkKGFlYSk7XG5hZGQoZ25vbSk7XG5hZGQoY2VhKTtcbmFkZChlcWMpO1xuYWRkKHBvbHkpO1xuYWRkKG56bWcpO1xuYWRkKG1pbGwpO1xuYWRkKHNpbnUpO1xuYWRkKG1vbGwpO1xuYWRkKGVxZGMpO1xuYWRkKHZhbmRnKTtcbmFkZChhZXFkKTtcbmFkZChvcnRobyk7XG5hZGQocXNjKTtcbmFkZChyb2Jpbik7XG5hZGQoZ2VvY2VudCk7XG5hZGQodHBlcnMpO1xuYWRkKGdlb3MpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JzQ2hlY2sod2t0KSB7XG4gIGNvbnN0IGpzb25PYmogPSBwYXJzZUNvZGUod2t0KTtcbiAgaWYgKHR5cGVvZiBqc29uT2JqICE9PSAnb2JqZWN0Jykge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBwcm9qZWN0aW9uIGRlZnMgdmFsdWUgaXMgbm90IHZhbGlkJyk7XG4gIH1cbiAgaWYgKCFwcm9qNC5Qcm9qLnByb2plY3Rpb25zLmdldChqc29uT2JqLnByb2pOYW1lKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBwcm9qZWN0aW9uIG5hbWUgJHtqc29uT2JqLnByb2pOYW1lfSBpcyBub3Qgc3VwcG9ydGVkLlBlcmhhcHMgdmFsdWVzIGFyZSAke3RyeVRvUGlja1Byb2plY3Rpb24oanNvbk9iai5wcm9qTmFtZSkuam9pbignLCcpfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVRvUGlja1Byb2plY3Rpb24ocHJvak5hbWUpIHtcbiAgY29uc3QgZnJvbU5hbWVzID0gcHJvak5hbWUuc3BsaXQoL1tcXHNfLV0rLyk7XG4gIGNvbnN0IHBlcmhhcHMgPSBuZXcgU2V0KCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBuYW1lID0gbmFtZXNbaW5kZXhdO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZnJvbU5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZnJvbU5hbWVzW2pdLnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgcGVyaGFwcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwZXJoYXBzLnNpemUgPiAwID8gQXJyYXkuZnJvbShwZXJoYXBzKSA6IG5hbWVzO1xufSIsIi8vIEBmbG93XHJcbmltcG9ydCB7IHByb2o0IH0gZnJvbSBcIi4uL3V0aWwvbWFwYm94XCI7XHJcbmltcG9ydCB7IHVuaXF1ZUlkLHdyYXAsY2xhbXAgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5pbXBvcnQgTG5nTGF0IGZyb20gJy4vbG5nX2xhdCc7XHJcbmltcG9ydCB7IGNyc0NoZWNrIH0gZnJvbSAnLi9jcnNfY2hlY2snO1xyXG5jbGFzcyBDUlMge1xyXG4gICAgZXBzZ0NvZGU7XHJcbiAgICBleHRlbnQ7XHJcbiAgICBjb25zdHJ1Y3RvcihlcHNnQ29kZSwgV0tULCBleHRlbnQpIHtcclxuICAgICAgICB0aGlzLmVwc2dDb2RlID0gZXBzZ0NvZGU7XHJcbiAgICAgICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJXb3JsZENvcGllcyA9IHRydWU7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoV0tUKSkge1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVudCA9IFdLVDtcclxuICAgICAgICAgICAgV0tUID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5XS1QgPSBXS1QgfHwgQ1JTLmRlZmF1bHRXS1RzW2Vwc2dDb2RlXTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocHJvajQuUHJvaih0aGlzLldLVCkpO1xyXG4gICAgICAgIGlmICh0aGlzLldLVCkge1xyXG4gICAgICAgICAgICBjcnNDaGVjayh0aGlzLldLVCk7XHJcbiAgICAgICAgICAgIHByb2o0LmRlZnMoZXBzZ0NvZGUsIHRoaXMuV0tUKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGVmcyA9IHByb2o0LmRlZnMoZXBzZ0NvZGUpO1xyXG4gICAgICAgIGlmICghZGVmcykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXBzZ0NvZGV9IHdhcyBub3QgZGVmaW5lZCxtYWtlIHN1cmUgdGhlIFdLVCBwYXJhbSB3YXMgbm90IG51bGxgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51bml0ID0gZGVmcy51bml0cyB8fCAnZGVncmVlJztcclxuICAgICAgICB0aGlzLnByb2o0UHJvamVjdGlvbiA9IHByb2o0KGVwc2dDb2RlKTtcclxuICAgICAgICBjb25zdCBsZWZ0Qm90dG9tTG5nTGF0ID0gdGhpcy5wcm9qNFByb2plY3Rpb24uaW52ZXJzZShbdGhpcy5leHRlbnRbMF0sIHRoaXMuZXh0ZW50WzFdXSk7XHJcbiAgICAgICAgY29uc3QgcmlnaHRUb3BMbmdMYXQgPSB0aGlzLnByb2o0UHJvamVjdGlvbi5pbnZlcnNlKFt0aGlzLmV4dGVudFsyXSwgdGhpcy5leHRlbnRbM11dKTtcclxuICAgICAgICB0aGlzLmxuZ0xhdEV4dGVudCA9IFsuLi5sZWZ0Qm90dG9tTG5nTGF0LCAuLi5yaWdodFRvcExuZ0xhdF07XHJcbiAgICAgICAgdGhpcy5faWQgPSB1bmlxdWVJZCgpO1xyXG4gICAgICAgIENSUy5zZXQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBnZXRFeHRlbnQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9yZWN0aWZ5RXh0ZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5leHRlbnRbMl0gLSB0aGlzLmV4dGVudFswXTtcclxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5leHRlbnRbM10gLSB0aGlzLmV4dGVudFsxXTtcclxuICAgICAgICAgICAgaWYgKHdpZHRoID09PSBoZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlY3RpZnlFeHRlbnQgPSBbdGhpcy5leHRlbnRbMF0sIHRoaXMuZXh0ZW50WzFdLCB0aGlzLmV4dGVudFsyXSwgdGhpcy5leHRlbnRbM11dO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVjdGlmeUV4dGVudCA9IFt0aGlzLmV4dGVudFswXSwgdGhpcy5leHRlbnRbM10gLSBhLCB0aGlzLmV4dGVudFswXSArIGEsIHRoaXMuZXh0ZW50WzNdXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWN0aWZ5RXh0ZW50O1xyXG4gICAgfVxyXG4gICAgZ2V0TG5nTGF0Q2VudGVyKCkge1xyXG4gICAgICAgIHJldHVybiBbdGhpcy5sbmdMYXRFeHRlbnRbMl0gLSAodGhpcy5sbmdMYXRFeHRlbnRbMl0gLSB0aGlzLmxuZ0xhdEV4dGVudFswXSkgLyAyLCB0aGlzLmxuZ0xhdEV4dGVudFszXSAtICh0aGlzLmxuZ0xhdEV4dGVudFszXSAtIHRoaXMubG5nTGF0RXh0ZW50WzFdKSAvIDJdO1xyXG4gICAgfVxyXG4gICAgZ2V0TG5nTGF0RXh0ZW50KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fcmVjdGlmeUxuZ0xhdEV4dGVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0Qm90dG9tTG5nTGF0ID0gdGhpcy5wcm9qNFByb2plY3Rpb24uaW52ZXJzZShbdGhpcy5leHRlbnRbMF0sIHRoaXMuZXh0ZW50WzFdXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0VG9wTG5nTGF0ID0gdGhpcy5wcm9qNFByb2plY3Rpb24uaW52ZXJzZShbdGhpcy5leHRlbnRbMl0sIHRoaXMuZXh0ZW50WzNdXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHRUb3BMbmdMYXRbMF0gLSBsZWZ0Qm90dG9tTG5nTGF0WzBdO1xyXG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSByaWdodFRvcExuZ0xhdFsxXSAtIGxlZnRCb3R0b21MbmdMYXRbMV07XHJcbiAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWN0aWZ5TG5nTGF0RXh0ZW50ID0gW2xlZnRCb3R0b21MbmdMYXRbMF0sIGxlZnRCb3R0b21MbmdMYXRbMV0sIHJpZ2h0VG9wTG5nTGF0WzBdLCByaWdodFRvcExuZ0xhdFswXV07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gTWF0aC5tYXgod2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWN0aWZ5TG5nTGF0RXh0ZW50ID0gW2xlZnRCb3R0b21MbmdMYXRbMF0sIHJpZ2h0VG9wTG5nTGF0WzFdIC0gYSwgbGVmdEJvdHRvbUxuZ0xhdFswXSArIGEsIHJpZ2h0VG9wTG5nTGF0WzFdXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVjdGlmeUxuZ0xhdEV4dGVudDtcclxuICAgIH1cclxuICAgIGdldE9yaWdpbigpIHtcclxuICAgICAgICByZXR1cm4gW3RoaXMuZXh0ZW50WzBdLCB0aGlzLmV4dGVudFszXV07XHJcbiAgICB9XHJcbiAgICBnZXRFcHNnQ29kZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lcHNnQ29kZTtcclxuICAgIH1cclxuICAgIGdldFVuaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pdDtcclxuICAgIH1cclxuICAgIGdldFdLVCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5XS1Q7XHJcbiAgICB9XHJcbiAgICBnZXRXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVjdGlmeUV4dGVudFsyXSAtIHRoaXMuX3JlY3RpZnlFeHRlbnRbMF07XHJcbiAgICB9XHJcbiAgICBnZXRIZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlY3RpZnlFeHRlbnRbM10gLSB0aGlzLl9yZWN0aWZ5RXh0ZW50WzFdO1xyXG4gICAgfVxyXG4gICAgZ2V0T3JpZ2luWCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVjdGlmeUV4dGVudFswXTtcclxuICAgIH1cclxuICAgIGdldE9yaWdpblkoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlY3RpZnlFeHRlbnRbM107XHJcbiAgICB9XHJcbiAgICB0b1dHUzg0KHh5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvajRQcm9qZWN0aW9uLmludmVyc2UoeHkpO1xyXG4gICAgfVxyXG4gICAgZnJvbVdHUzg0KGxuZ0xhdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2o0UHJvamVjdGlvbi5mb3J3YXJkKGxuZ0xhdCk7XHJcbiAgICB9XHJcbiAgICBmcm9tTG5nTGF0KGxuZ0xhdExpa2UpIHtcclxuICAgICAgICBjb25zdCBsbmdMYXQgPSBMbmdMYXQuY29udmVydChsbmdMYXRMaWtlKTtcclxuICAgICAgICBjb25zdCB2YWxpZExuZyA9IHRoaXMucmVuZGVyV29ybGRDb3BpZXMgPyBsbmdMYXQubG5nOmNsYW1wKGxuZ0xhdC5sbmcsLTE4MCwxODApO1xyXG4gICAgICAgIGNvbnN0IGZvcndhcmQgPSB0aGlzLmZyb21XR1M4NChbdmFsaWRMbmcsIGxuZ0xhdC5sYXRdKTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4OiAoZm9yd2FyZFswXSAtIHRoaXMuZ2V0T3JpZ2luWCgpKSAvIHRoaXMuZ2V0V2lkdGgoKSxcclxuICAgICAgICAgICAgeTogKHRoaXMuZ2V0T3JpZ2luWSgpIC0gZm9yd2FyZFsxXSkgLyB0aGlzLmdldEhlaWdodCgpLFxyXG4gICAgICAgICAgICB6OiAwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHRvTG5nTGF0KHgsIHkpIHtcclxuICAgICAgICBjb25zdCB2YWxpZFggPSB0aGlzLnJlbmRlcldvcmxkQ29waWVzID8geDpjbGFtcCh4LDAsMSk7XHJcbiAgICAgICAgY29uc3QgaW52ZXJzZSA9IHRoaXMudG9XR1M4NChbdmFsaWRYICogdGhpcy5nZXRXaWR0aCgpICsgdGhpcy5nZXRPcmlnaW5YKCksIHRoaXMuZ2V0T3JpZ2luWSgpIC0geSAqIHRoaXMuZ2V0SGVpZ2h0KCldKTtcclxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChpbnZlcnNlWzBdLCBpbnZlcnNlWzFdKTtcclxuICAgIH1cclxufVxyXG5DUlMuZ2V0ID0gZnVuY3Rpb24gKGNvZGVTcGVjKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBDUlMpIHtcclxuICAgICAgICBpZiAoQ1JTLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgaWYgKENSU1trZXldLmdldEVwc2dDb2RlICYmIENSU1trZXldLmdldEVwc2dDb2RlKCkgPT09IGNvZGVTcGVjKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQ1JTW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuQ1JTLnNldCA9IGZ1bmN0aW9uIChjcnMpIHtcclxuICAgIGNvbnN0IGtleSA9IGNycy5nZXRFcHNnQ29kZSgpLnJlcGxhY2UoXCI6XCIsIFwiXCIpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICBDUlNba2V5XSA9IGNycztcclxufTtcclxuQ1JTLmRlZmF1bHRXS1RzID0ge1xyXG4gICAgJ0VQU0c6NDQ5MCc6ICdHRU9HQ1NbXCJDaGluYSBHZW9kZXRpYyBDb29yZGluYXRlIFN5c3RlbSAyMDAwXCIsREFUVU1bXCJDaGluYV8yMDAwXCIsU1BIRVJPSURbXCJDR0NTMjAwMFwiLDYzNzgxMzcsMjk4LjI1NzIyMjEwMSxBVVRIT1JJVFlbXCJFUFNHXCIsXCIxMDI0XCJdXSxBVVRIT1JJVFlbXCJFUFNHXCIsXCIxMDQzXCJdXSxQUklNRU1bXCJHcmVlbndpY2hcIiwwLEFVVEhPUklUWVtcIkVQU0dcIixcIjg5MDFcIl1dLFVOSVRbXCJkZWdyZWVcIiwwLjAxNzQ1MzI5MjUxOTk0MzMsQVVUSE9SSVRZW1wiRVBTR1wiLFwiOTEyMlwiXV0sQVVUSE9SSVRZW1wiRVBTR1wiLFwiNDQ5MFwiXV0nLFxyXG4gICAgJ0VQU0c6NDIxNCc6ICdHRU9HQ1NbXCJCZWlqaW5nIDE5NTRcIixEQVRVTVtcIkJlaWppbmdfMTk1NFwiLFNQSEVST0lEW1wiS3Jhc3Nvd3NreSAxOTQwXCIsNjM3ODI0NSwyOTguM10sVE9XR1M4NFsxNS44LC0xNTQuNCwtODIuMywwLDAsMCwwXV0sUFJJTUVNW1wiR3JlZW53aWNoXCIsMCxBVVRIT1JJVFlbXCJFUFNHXCIsXCI4OTAxXCJdXSxVTklUW1wiZGVncmVlXCIsMC4wMTc0NTMyOTI1MTk5NDMzLEFVVEhPUklUWVtcIkVQU0dcIixcIjkxMjJcIl1dLEFVVEhPUklUWVtcIkVQU0dcIixcIjQyMTRcIl1dJyxcclxuICAgICdFUFNHOjQ2MTAnOiAnR0VPR0NTW1wiWGlhbiAxOTgwXCIsREFUVU1bXCJYaWFuXzE5ODBcIixTUEhFUk9JRFtcIklBRyAxOTc1XCIsNjM3ODE0MCwyOTguMjU3LEFVVEhPUklUWVtcIkVQU0dcIixcIjcwNDlcIl1dLEFVVEhPUklUWVtcIkVQU0dcIixcIjY2MTBcIl1dLFBSSU1FTVtcIkdyZWVud2ljaFwiLDAsQVVUSE9SSVRZW1wiRVBTR1wiLFwiODkwMVwiXV0sVU5JVFtcImRlZ3JlZVwiLDAuMDE3NDUzMjkyNTE5OTQzMyxBVVRIT1JJVFlbXCJFUFNHXCIsXCI5MTIyXCJdXSxBVVRIT1JJVFlbXCJFUFNHXCIsXCI0NjEwXCJdXSdcclxufTtcclxuQ1JTLkVQU0c0MzI2ID0gbmV3IENSUygnRVBTRzo0MzI2JywgWy0xODAsIC05MCwgMTgwLCA5MF0pO1xyXG5DUlMuRVBTRzQ0OTAgPSBuZXcgQ1JTKCdFUFNHOjQ0OTAnLCBbLTE4MCwgLTkwLCAxODAsIDkwXSk7XHJcbkNSUy5FUFNHNDIxNCA9IG5ldyBDUlMoJ0VQU0c6NDIxNCcsIFstMTgwLCAtOTAsIDE4MCwgOTBdKTtcclxuQ1JTLkVQU0c0NjEwID0gbmV3IENSUygnRVBTRzo0NjEwJywgWy0xODAsIC05MCwgMTgwLCA5MF0pOy8vbmV3IENSUygnRVBTRzo0NDkwJywgWzczLjYyLCAxNi43LCAxMzQuNzcsIDUzLjU2XSk7XHJcbkNSUy5FUFNHMzg1NyA9IG5ldyBDUlMoJ0VQU0c6Mzg1NycsIFstMjAwMzc1MDguMzQyNzg5MiwgLTIwMDM3NTA4LjM0Mjc4OTIsIDIwMDM3NTA4LjM0Mjc4OTIsIDIwMDM3NTA4LjM0Mjc4OTJdKTtcclxuZXhwb3J0IGRlZmF1bHQgQ1JTO1xyXG4iLCIvLyBAZmxvd1xuXG5jb25zdCBkZWZhdWx0TG9jYWxlID0ge1xuICAgICdGdWxsc2NyZWVuQ29udHJvbC5FbnRlcic6ICdFbnRlciBmdWxsc2NyZWVuJyxcbiAgICAnRnVsbHNjcmVlbkNvbnRyb2wuRXhpdCc6ICdFeGl0IGZ1bGxzY3JlZW4nLFxuICAgICdHZW9sb2NhdGVDb250cm9sLkZpbmRNeUxvY2F0aW9uJzogJ0ZpbmQgbXkgbG9jYXRpb24nLFxuICAgICdHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlJzogJ0xvY2F0aW9uIG5vdCBhdmFpbGFibGUnLFxuICAgICdMb2dvQ29udHJvbC5UaXRsZSc6ICdNYXBib3ggbG9nbycsXG4gICAgJ05hdmlnYXRpb25Db250cm9sLlJlc2V0QmVhcmluZyc6ICdSZXNldCBiZWFyaW5nIHRvIG5vcnRoJyxcbiAgICAnTmF2aWdhdGlvbkNvbnRyb2wuWm9vbUluJzogJ1pvb20gaW4nLFxuICAgICdOYXZpZ2F0aW9uQ29udHJvbC5ab29tT3V0JzogJ1pvb20gb3V0JyxcbiAgICAnU2NhbGVDb250cm9sLkZlZXQnOiAnZnQnLFxuICAgICdTY2FsZUNvbnRyb2wuTWV0ZXJzJzogJ20nLFxuICAgICdTY2FsZUNvbnRyb2wuS2lsb21ldGVycyc6ICdrbScsXG4gICAgJ1NjYWxlQ29udHJvbC5NaWxlcyc6ICdtaScsXG4gICAgJ1NjYWxlQ29udHJvbC5OYXV0aWNhbE1pbGVzJzogJ25tJ1xuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0TG9jYWxlO1xuIiwiLy8gQGZsb3dcclxuXHJcbmltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcclxuaW1wb3J0IHtleHRlbmQsIGJpbmRBbGwsIHdhcm5PbmNlLCB1bmlxdWVJZH0gZnJvbSAnLi4vdXRpbC91dGlsJztcclxuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyJztcclxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XHJcbmNvbnN0IHtIVE1MSW1hZ2VFbGVtZW50LCBIVE1MRWxlbWVudCwgSW1hZ2VCaXRtYXB9ID0gd2luZG93O1xyXG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcclxuaW1wb3J0IHtnZXRJbWFnZSwgZ2V0SlNPTiwgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXgnO1xyXG5pbXBvcnQge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveCc7XHJcbmltcG9ydCBTdHlsZSBmcm9tICcuLi9zdHlsZS9zdHlsZSc7XHJcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMnO1xyXG5pbXBvcnQgUGFpbnRlciBmcm9tICcuLi9yZW5kZXIvcGFpbnRlcic7XHJcbmltcG9ydCBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybSc7XHJcbmltcG9ydCBIYXNoIGZyb20gJy4vaGFzaCc7XHJcbmltcG9ydCBIYW5kbGVyTWFuYWdlciBmcm9tICcuL2hhbmRsZXJfbWFuYWdlcic7XHJcbmltcG9ydCBDYW1lcmEgZnJvbSAnLi9jYW1lcmEnO1xyXG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0JztcclxuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMnO1xyXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XHJcbmltcG9ydCBBdHRyaWJ1dGlvbkNvbnRyb2wgZnJvbSAnLi9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wnO1xyXG5pbXBvcnQgTG9nb0NvbnRyb2wgZnJvbSAnLi9jb250cm9sL2xvZ29fY29udHJvbCc7XHJcbmltcG9ydCBpc1N1cHBvcnRlZCBmcm9tICdAbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQnO1xyXG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZSc7XHJcbmltcG9ydCB7RXZlbnQsIEVycm9yRXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XHJcbmltcG9ydCB7TWFwTW91c2VFdmVudH0gZnJvbSAnLi9ldmVudHMnO1xyXG5pbXBvcnQgVGFza1F1ZXVlIGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZSc7XHJcbmltcG9ydCB3ZWJwU3VwcG9ydGVkIGZyb20gJy4uL3V0aWwvd2VicF9zdXBwb3J0ZWQnO1xyXG5pbXBvcnQge1BlcmZvcm1hbmNlTWFya2VycywgUGVyZm9ybWFuY2VVdGlsc30gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZSc7XHJcblxyXG5pbXBvcnQge3NldENhY2hlTGltaXRzfSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZSc7XHJcblxyXG5pbXBvcnQgRmVhdHVyZSBmcm9tICcuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbi5qcyc7XHJcbmltcG9ydCB7XHJcbiAgICBDYW5vbmljYWxUaWxlSURcclxufSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZCc7XHJcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUsIHtcclxuICAgIG1lcmNhdG9yWmZyb21BbHRpdHVkZVxyXG59IGZyb20gXCIuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZVwiO1xyXG5pbXBvcnQgQ1JTIGZyb20gJy4uL2dlby9jcnMnO1xyXG5pbXBvcnQgUmFzdGVyVGlsZVNvdXJjZSBmcm9tICcuLi9zb3VyY2UvcmFzdGVyX3RpbGVfc291cmNlJztcclxuaW1wb3J0IFZlY3RvclRpbGVTb3VyY2UgZnJvbSAnLi4vc291cmNlL3ZlY3Rvcl90aWxlX3NvdXJjZSc7XHJcbmltcG9ydCBUaWxlQm91bmRzIGZyb20gJy4uL3NvdXJjZS90aWxlX2JvdW5kcyc7XHJcblxyXG5cclxuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XHJcbmltcG9ydCB0eXBlIHtSZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb259IGZyb20gJy4uL3V0aWwvbWFwYm94JztcclxuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0JztcclxuaW1wb3J0IHR5cGUge0xuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0X2JvdW5kcyc7XHJcbmltcG9ydCB0eXBlIHtTdHlsZU9wdGlvbnMsIFN0eWxlU2V0dGVyT3B0aW9uc30gZnJvbSAnLi4vc3R5bGUvc3R5bGUnO1xyXG5pbXBvcnQgdHlwZSB7TWFwRXZlbnQsIE1hcERhdGFFdmVudH0gZnJvbSAnLi9ldmVudHMnO1xyXG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllcic7XHJcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlSW50ZXJmYWNlLCBTdHlsZUltYWdlTWV0YWRhdGF9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlJztcclxuXHJcbmltcG9ydCB0eXBlIFNjcm9sbFpvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zY3JvbGxfem9vbSc7XHJcbmltcG9ydCB0eXBlIEJveFpvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9ib3hfem9vbSc7XHJcbmltcG9ydCB0eXBlIHtUb3VjaFBpdGNoSGFuZGxlcn0gZnJvbSAnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlJztcclxuaW1wb3J0IHR5cGUgRHJhZ1JvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vZHJhZ19yb3RhdGUnO1xyXG5pbXBvcnQgdHlwZSBEcmFnUGFuSGFuZGxlciwge0RyYWdQYW5PcHRpb25zfSBmcm9tICcuL2hhbmRsZXIvc2hpbS9kcmFnX3Bhbic7XHJcbmltcG9ydCB0eXBlIEtleWJvYXJkSGFuZGxlciBmcm9tICcuL2hhbmRsZXIva2V5Ym9hcmQnO1xyXG5pbXBvcnQgdHlwZSBEb3VibGVDbGlja1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zaGltL2RibGNsaWNrX3pvb20nO1xyXG5pbXBvcnQgdHlwZSBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zaGltL3RvdWNoX3pvb21fcm90YXRlJztcclxuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSAnLi9kZWZhdWx0X2xvY2FsZSc7XHJcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZSc7XHJcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlJztcclxuaW1wb3J0IHR5cGUge1xyXG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxyXG4gICAgRmlsdGVyU3BlY2lmaWNhdGlvbixcclxuICAgIFN0eWxlU3BlY2lmaWNhdGlvbixcclxuICAgIExpZ2h0U3BlY2lmaWNhdGlvbixcclxuICAgIFNvdXJjZVNwZWNpZmljYXRpb25cclxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzJztcclxuXHJcbnR5cGUgQ29udHJvbFBvc2l0aW9uID0gJ3RvcC1sZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JyB8ICdib3R0b20tcmlnaHQnO1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xyXG50eXBlIElDb250cm9sID0ge1xyXG4gICAgb25BZGQobWFwOiBNYXApOiBIVE1MRWxlbWVudDtcclxuICAgIG9uUmVtb3ZlKG1hcDogTWFwKTogdm9pZDtcclxuXHJcbiAgICArZ2V0RGVmYXVsdFBvc2l0aW9uPzogKCkgPT4gQ29udHJvbFBvc2l0aW9uO1xyXG59XHJcbi8qIGVzbGludC1lbmFibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cclxuXHJcbnR5cGUgTWFwT3B0aW9ucyA9IHtcclxuICAgIGhhc2g/OiBib29sZWFuIHwgc3RyaW5nLFxyXG4gICAgaW50ZXJhY3RpdmU/OiBib29sZWFuLFxyXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHN0cmluZyxcclxuICAgIGJlYXJpbmdTbmFwPzogbnVtYmVyLFxyXG4gICAgYXR0cmlidXRpb25Db250cm9sPzogYm9vbGVhbixcclxuICAgIGN1c3RvbUF0dHJpYnV0aW9uPzogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPixcclxuICAgIGxvZ29Qb3NpdGlvbj86IENvbnRyb2xQb3NpdGlvbixcclxuICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/OiBib29sZWFuLFxyXG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyPzogYm9vbGVhbixcclxuICAgIGFudGlhbGlhcz86IGJvb2xlYW4sXHJcbiAgICByZWZyZXNoRXhwaXJlZFRpbGVzPzogYm9vbGVhbixcclxuICAgIG1heEJvdW5kcz86IExuZ0xhdEJvdW5kc0xpa2UsXHJcbiAgICBzY3JvbGxab29tPzogYm9vbGVhbixcclxuICAgIG1pblpvb20/OiA/bnVtYmVyLFxyXG4gICAgbWF4Wm9vbT86ID9udW1iZXIsXHJcbiAgICBtaW5QaXRjaD86ID9udW1iZXIsXHJcbiAgICBtYXhQaXRjaD86ID9udW1iZXIsXHJcbiAgICBib3hab29tPzogYm9vbGVhbixcclxuICAgIGRyYWdSb3RhdGU/OiBib29sZWFuLFxyXG4gICAgZHJhZ1Bhbj86IERyYWdQYW5PcHRpb25zLFxyXG4gICAga2V5Ym9hcmQ/OiBib29sZWFuLFxyXG4gICAgZG91YmxlQ2xpY2tab29tPzogYm9vbGVhbixcclxuICAgIHRvdWNoWm9vbVJvdGF0ZT86IGJvb2xlYW4sXHJcbiAgICB0b3VjaFBpdGNoPzogYm9vbGVhbixcclxuICAgIHRyYWNrUmVzaXplPzogYm9vbGVhbixcclxuICAgIGNlbnRlcj86IExuZ0xhdExpa2UsXHJcbiAgICB6b29tPzogbnVtYmVyLFxyXG4gICAgYmVhcmluZz86IG51bWJlcixcclxuICAgIHBpdGNoPzogbnVtYmVyLFxyXG4gICAgcmVuZGVyV29ybGRDb3BpZXM/OiBib29sZWFuLFxyXG4gICAgbWF4VGlsZUNhY2hlU2l6ZT86IG51bWJlcixcclxuICAgIHRyYW5zZm9ybVJlcXVlc3Q/OiBSZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb24sXHJcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxyXG4gICAgbG9jYWxlPzogT2JqZWN0XHJcbn07XHJcblxyXG5jb25zdCBkZWZhdWx0TWluWm9vbSA9IC0yO1xyXG5jb25zdCBkZWZhdWx0TWF4Wm9vbSA9IDIyO1xyXG5cclxuLy8gdGhlIGRlZmF1bHQgdmFsdWVzLCBidXQgYWxzbyB0aGUgdmFsaWQgcmFuZ2VcclxuY29uc3QgZGVmYXVsdE1pblBpdGNoID0gMDtcclxuY29uc3QgZGVmYXVsdE1heFBpdGNoID0gNjA7XHJcblxyXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcclxuICAgIGNlbnRlcjogWzAsIDBdLFxyXG4gICAgem9vbTogMCxcclxuICAgIGJlYXJpbmc6IDAsXHJcbiAgICBwaXRjaDogMCxcclxuXHJcbiAgICBtaW5ab29tOiBkZWZhdWx0TWluWm9vbSxcclxuICAgIG1heFpvb206IGRlZmF1bHRNYXhab29tLFxyXG5cclxuICAgIG1pblBpdGNoOiBkZWZhdWx0TWluUGl0Y2gsXHJcbiAgICBtYXhQaXRjaDogZGVmYXVsdE1heFBpdGNoLFxyXG5cclxuICAgIGludGVyYWN0aXZlOiB0cnVlLFxyXG4gICAgc2Nyb2xsWm9vbTogdHJ1ZSxcclxuICAgIGJveFpvb206IHRydWUsXHJcbiAgICBkcmFnUm90YXRlOiB0cnVlLFxyXG4gICAgZHJhZ1BhbjogdHJ1ZSxcclxuICAgIGtleWJvYXJkOiB0cnVlLFxyXG4gICAgZG91YmxlQ2xpY2tab29tOiB0cnVlLFxyXG4gICAgdG91Y2hab29tUm90YXRlOiB0cnVlLFxyXG4gICAgdG91Y2hQaXRjaDogdHJ1ZSxcclxuXHJcbiAgICBiZWFyaW5nU25hcDogNyxcclxuICAgIGNsaWNrVG9sZXJhbmNlOiAzLFxyXG4gICAgcGl0Y2hXaXRoUm90YXRlOiB0cnVlLFxyXG5cclxuICAgIGhhc2g6IGZhbHNlLFxyXG4gICAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxyXG5cclxuICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGZhbHNlLFxyXG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcclxuICAgIHRyYWNrUmVzaXplOiB0cnVlLFxyXG4gICAgcmVuZGVyV29ybGRDb3BpZXM6IHRydWUsXHJcbiAgICByZWZyZXNoRXhwaXJlZFRpbGVzOiB0cnVlLFxyXG4gICAgbWF4VGlsZUNhY2hlU2l6ZTogbnVsbCxcclxuICAgIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogJ3NhbnMtc2VyaWYnLFxyXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogbnVsbCxcclxuICAgIGFjY2Vzc1Rva2VuOiBudWxsLFxyXG4gICAgZmFkZUR1cmF0aW9uOiAzMDAsXHJcbiAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IHRydWVcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgYE1hcGAgb2JqZWN0IHJlcHJlc2VudHMgdGhlIG1hcCBvbiB5b3VyIHBhZ2UuIEl0IGV4cG9zZXMgbWV0aG9kc1xyXG4gKiBhbmQgcHJvcGVydGllcyB0aGF0IGVuYWJsZSB5b3UgdG8gcHJvZ3JhbW1hdGljYWxseSBjaGFuZ2UgdGhlIG1hcCxcclxuICogYW5kIGZpcmVzIGV2ZW50cyBhcyB1c2VycyBpbnRlcmFjdCB3aXRoIGl0LlxyXG4gKlxyXG4gKiBZb3UgY3JlYXRlIGEgYE1hcGAgYnkgc3BlY2lmeWluZyBhIGBjb250YWluZXJgIGFuZCBvdGhlciBvcHRpb25zLlxyXG4gKiBUaGVuIE1hcGJveCBHTCBKUyBpbml0aWFsaXplcyB0aGUgbWFwIG9uIHRoZSBwYWdlIGFuZCByZXR1cm5zIHlvdXIgYE1hcGBcclxuICogb2JqZWN0LlxyXG4gKlxyXG4gKiBAZXh0ZW5kcyBFdmVudGVkXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8c3RyaW5nfSBvcHRpb25zLmNvbnRhaW5lciBUaGUgSFRNTCBlbGVtZW50IGluIHdoaWNoIE1hcGJveCBHTCBKUyB3aWxsIHJlbmRlciB0aGUgbWFwLCBvciB0aGUgZWxlbWVudCdzIHN0cmluZyBgaWRgLiBUaGUgc3BlY2lmaWVkIGVsZW1lbnQgbXVzdCBoYXZlIG5vIGNoaWxkcmVuLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbT0wXSBUaGUgbWluaW11bSB6b29tIGxldmVsIG9mIHRoZSBtYXAgKDAtMjQpLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbT0yMl0gVGhlIG1heGltdW0gem9vbSBsZXZlbCBvZiB0aGUgbWFwICgwLTI0KS5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pblBpdGNoPTBdIFRoZSBtaW5pbXVtIHBpdGNoIG9mIHRoZSBtYXAgKDAtNjApLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4UGl0Y2g9NjBdIFRoZSBtYXhpbXVtIHBpdGNoIG9mIHRoZSBtYXAgKDAtNjApLlxyXG4gKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IFtvcHRpb25zLnN0eWxlXSBUaGUgbWFwJ3MgTWFwYm94IHN0eWxlLiBUaGlzIG11c3QgYmUgYW4gYSBKU09OIG9iamVjdCBjb25mb3JtaW5nIHRvXHJcbiAqIHRoZSBzY2hlbWEgZGVzY3JpYmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pLCBvciBhIFVSTCB0b1xyXG4gKiBzdWNoIEpTT04uXHJcbiAqXHJcbiAqIFRvIGxvYWQgYSBzdHlsZSBmcm9tIHRoZSBNYXBib3ggQVBJLCB5b3UgY2FuIHVzZSBhIFVSTCBvZiB0aGUgZm9ybSBgbWFwYm94Oi8vc3R5bGVzLzpvd25lci86c3R5bGVgLFxyXG4gKiB3aGVyZSBgOm93bmVyYCBpcyB5b3VyIE1hcGJveCBhY2NvdW50IG5hbWUgYW5kIGA6c3R5bGVgIGlzIHRoZSBzdHlsZSBJRC4gT3IgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmdcclxuICogW3RoZSBwcmVkZWZpbmVkIE1hcGJveCBzdHlsZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwcy8pOlxyXG4gKlxyXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMWBcclxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvb3V0ZG9vcnMtdjExYFxyXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9saWdodC12MTBgXHJcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2RhcmstdjEwYFxyXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zYXRlbGxpdGUtdjlgXHJcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3NhdGVsbGl0ZS1zdHJlZXRzLXYxMWBcclxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbmF2aWdhdGlvbi1wcmV2aWV3LWRheS12NGBcclxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbmF2aWdhdGlvbi1wcmV2aWV3LW5pZ2h0LXY0YFxyXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9uYXZpZ2F0aW9uLWd1aWRhbmNlLWRheS12NGBcclxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbmF2aWdhdGlvbi1ndWlkYW5jZS1uaWdodC12NGBcclxuICpcclxuICogVGlsZXNldHMgaG9zdGVkIHdpdGggTWFwYm94IGNhbiBiZSBzdHlsZS1vcHRpbWl6ZWQgaWYgeW91IGFwcGVuZCBgP29wdGltaXplPXRydWVgIHRvIHRoZSBlbmQgb2YgeW91ciBzdHlsZSBVUkwsIGxpa2UgYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc3RyZWV0cy12MTE/b3B0aW1pemU9dHJ1ZWAuXHJcbiAqIExlYXJuIG1vcmUgYWJvdXQgc3R5bGUtb3B0aW1pemVkIHZlY3RvciB0aWxlcyBpbiBvdXIgW0FQSSBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uL21hcHMvI3JldHJpZXZlLXRpbGVzKS5cclxuICpcclxuICogQHBhcmFtIHsoYm9vbGVhbnxzdHJpbmcpfSBbb3B0aW9ucy5oYXNoPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAncyBwb3NpdGlvbiAoem9vbSwgY2VudGVyIGxhdGl0dWRlLCBjZW50ZXIgbG9uZ2l0dWRlLCBiZWFyaW5nLCBhbmQgcGl0Y2gpIHdpbGwgYmUgc3luY2VkIHdpdGggdGhlIGhhc2ggZnJhZ21lbnQgb2YgdGhlIHBhZ2UncyBVUkwuXHJcbiAqICAgRm9yIGV4YW1wbGUsIGBodHRwOi8vcGF0aC90by9teS9wYWdlLmh0bWwjMi41OS8zOS4yNi81My4wNy8tMjQuMS82MGAuXHJcbiAqICAgQW4gYWRkaXRpb25hbCBzdHJpbmcgbWF5IG9wdGlvbmFsbHkgYmUgcHJvdmlkZWQgdG8gaW5kaWNhdGUgYSBwYXJhbWV0ZXItc3R5bGVkIGhhc2gsXHJcbiAqICAgZS5nLiBodHRwOi8vcGF0aC90by9teS9wYWdlLmh0bWwjbWFwPTIuNTkvMzkuMjYvNTMuMDcvLTI0LjEvNjAmZm9vPWJhciwgd2hlcmUgZm9vXHJcbiAqICAgaXMgYSBjdXN0b20gcGFyYW1ldGVyIGFuZCBiYXIgaXMgYW4gYXJiaXRyYXJ5IGhhc2ggZGlzdGluY3QgZnJvbSB0aGUgbWFwIGhhc2guXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW50ZXJhY3RpdmU9dHJ1ZV0gSWYgYGZhbHNlYCwgbm8gbW91c2UsIHRvdWNoLCBvciBrZXlib2FyZCBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGludGVyYWN0aW9uLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZ1NuYXA9N10gVGhlIHRocmVzaG9sZCwgbWVhc3VyZWQgaW4gZGVncmVlcywgdGhhdCBkZXRlcm1pbmVzIHdoZW4gdGhlIG1hcCdzXHJcbiAqICAgYmVhcmluZyB3aWxsIHNuYXAgdG8gbm9ydGguIEZvciBleGFtcGxlLCB3aXRoIGEgYGJlYXJpbmdTbmFwYCBvZiA3LCBpZiB0aGUgdXNlciByb3RhdGVzXHJcbiAqICAgdGhlIG1hcCB3aXRoaW4gNyBkZWdyZWVzIG9mIG5vcnRoLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSBzbmFwIHRvIGV4YWN0IG5vcnRoLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnBpdGNoV2l0aFJvdGF0ZT10cnVlXSBJZiBgZmFsc2VgLCB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpIGNvbnRyb2wgd2l0aCBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gd2lsbCBiZSBkaXNhYmxlZC5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNsaWNrVG9sZXJhbmNlPTNdIFRoZSBtYXggbnVtYmVyIG9mIHBpeGVscyBhIHVzZXIgY2FuIHNoaWZ0IHRoZSBtb3VzZSBwb2ludGVyIGR1cmluZyBhIGNsaWNrIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIGEgdmFsaWQgY2xpY2sgKGFzIG9wcG9zZWQgdG8gYSBtb3VzZSBkcmFnKS5cclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2w9dHJ1ZV0gSWYgYHRydWVgLCBhbiB7QGxpbmsgQXR0cmlidXRpb25Db250cm9sfSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXAuXHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gW29wdGlvbnMuY3VzdG9tQXR0cmlidXRpb25dIFN0cmluZyBvciBzdHJpbmdzIHRvIHNob3cgaW4gYW4ge0BsaW5rIEF0dHJpYnV0aW9uQ29udHJvbH0uIE9ubHkgYXBwbGljYWJsZSBpZiBgb3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2xgIGlzIGB0cnVlYC5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvZ29Qb3NpdGlvbj0nYm90dG9tLWxlZnQnXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBNYXBib3ggd29yZG1hcmsgb24gdGhlIG1hcC4gVmFsaWQgb3B0aW9ucyBhcmUgYHRvcC1sZWZ0YCxgdG9wLXJpZ2h0YCwgYGJvdHRvbS1sZWZ0YCwgYGJvdHRvbS1yaWdodGAuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gSWYgYHRydWVgLCBtYXAgY3JlYXRpb24gd2lsbCBmYWlsIGlmIHRoZSBwZXJmb3JtYW5jZSBvZiBNYXBib3hcclxuICogICBHTCBKUyB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhbiBleHBlY3RlZCAoaS5lLiBhIHNvZnR3YXJlIHJlbmRlcmVyIHdvdWxkIGJlIHVzZWQpLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnByZXNlcnZlRHJhd2luZ0J1ZmZlcj1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwJ3MgY2FudmFzIGNhbiBiZSBleHBvcnRlZCB0byBhIFBORyB1c2luZyBgbWFwLmdldENhbnZhcygpLnRvRGF0YVVSTCgpYC4gVGhpcyBpcyBgZmFsc2VgIGJ5IGRlZmF1bHQgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYW50aWFsaWFzXSBJZiBgdHJ1ZWAsIHRoZSBnbCBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIE1TQUEgYW50aWFsaWFzaW5nLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciBhbnRpYWxpYXNpbmcgY3VzdG9tIGxheWVycy4gdGhpcyBpcyBgZmFsc2VgIGJ5IGRlZmF1bHQgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVmcmVzaEV4cGlyZWRUaWxlcz10cnVlXSBJZiBgZmFsc2VgLCB0aGUgbWFwIHdvbid0IGF0dGVtcHQgdG8gcmUtcmVxdWVzdCB0aWxlcyBvbmNlIHRoZXkgZXhwaXJlIHBlciB0aGVpciBIVFRQIGBjYWNoZUNvbnRyb2xgL2BleHBpcmVzYCBoZWFkZXJzLlxyXG4gKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IFtvcHRpb25zLm1heEJvdW5kc10gSWYgc2V0LCB0aGUgbWFwIHdpbGwgYmUgY29uc3RyYWluZWQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cclxuICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gW29wdGlvbnMuc2Nyb2xsWm9vbT10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8ge0BsaW5rIFNjcm9sbFpvb21IYW5kbGVyI2VuYWJsZX0uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYm94Wm9vbT10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZCAoc2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0pLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRyYWdSb3RhdGU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9KS5cclxuICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gW29wdGlvbnMuZHJhZ1Bhbj10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8ge0BsaW5rIERyYWdQYW5IYW5kbGVyI2VuYWJsZX0uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMua2V5Ym9hcmQ9dHJ1ZV0gSWYgYHRydWVgLCBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGVuYWJsZWQgKHNlZSB7QGxpbmsgS2V5Ym9hcmRIYW5kbGVyfSkuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZG91YmxlQ2xpY2tab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIERvdWJsZUNsaWNrWm9vbUhhbmRsZXJ9KS5cclxuICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gW29wdGlvbnMudG91Y2hab29tUm90YXRlPXRydWVdIElmIGB0cnVlYCwgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8ge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIjZW5hYmxlfS5cclxuICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gW29wdGlvbnMudG91Y2hQaXRjaD10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImRyYWcgdG8gcGl0Y2hcIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLiBBbiBgT2JqZWN0YCB2YWx1ZSBpcyBwYXNzZWQgYXMgb3B0aW9ucyB0byB7QGxpbmsgVG91Y2hQaXRjaEhhbmRsZXIjZW5hYmxlfS5cclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFja1Jlc2l6ZT10cnVlXSAgSWYgYHRydWVgLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSByZXNpemUgd2hlbiB0aGUgYnJvd3NlciB3aW5kb3cgcmVzaXplcy5cclxuICogQHBhcmFtIHtMbmdMYXRMaWtlfSBbb3B0aW9ucy5jZW50ZXI9WzAsIDBdXSBUaGUgaW5pdGFsIGdlb2dyYXBoaWNhbCBjZW50ZXJwb2ludCBvZiB0aGUgbWFwLiBJZiBgY2VudGVyYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYFswLCAwXWAgTm90ZTogTWFwYm94IEdMIHVzZXMgbG9uZ2l0dWRlLCBsYXRpdHVkZSBjb29yZGluYXRlIG9yZGVyIChhcyBvcHBvc2VkIHRvIGxhdGl0dWRlLCBsb25naXR1ZGUpIHRvIG1hdGNoIEdlb0pTT04uXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy56b29tPTBdIFRoZSBpbml0aWFsIHpvb20gbGV2ZWwgb2YgdGhlIG1hcC4gSWYgYHpvb21gIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iZWFyaW5nPTBdIFRoZSBpbml0aWFsIGJlYXJpbmcgKHJvdGF0aW9uKSBvZiB0aGUgbWFwLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gbm9ydGguIElmIGBiZWFyaW5nYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGl0Y2g9MF0gVGhlIGluaXRpYWwgcGl0Y2ggKHRpbHQpIG9mIHRoZSBtYXAsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS4gSWYgYHBpdGNoYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxyXG4gKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IFtvcHRpb25zLmJvdW5kc10gVGhlIGluaXRpYWwgYm91bmRzIG9mIHRoZSBtYXAuIElmIGBib3VuZHNgIGlzIHNwZWNpZmllZCwgaXQgb3ZlcnJpZGVzIGBjZW50ZXJgIGFuZCBgem9vbWAgY29uc3RydWN0b3Igb3B0aW9ucy5cclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpdEJvdW5kc09wdGlvbnNdIEEge0BsaW5rIE1hcCNmaXRCb3VuZHN9IG9wdGlvbnMgb2JqZWN0IHRvIHVzZSBfb25seV8gd2hlbiBmaXR0aW5nIHRoZSBpbml0aWFsIGBib3VuZHNgIHByb3ZpZGVkIGFib3ZlLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJlbmRlcldvcmxkQ29waWVzPXRydWVdICBJZiBgdHJ1ZWAsIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgd29ybGQgd2lsbCBiZSByZW5kZXJlZCBzaWRlIGJ5IHNpZGUgYmV5b25kIC0xODAgYW5kIDE4MCBkZWdyZWVzIGxvbmdpdHVkZS4gSWYgc2V0IHRvIGBmYWxzZWA6XHJcbiAqIC0gV2hlbiB0aGUgbWFwIGlzIHpvb21lZCBvdXQgZmFyIGVub3VnaCB0aGF0IGEgc2luZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3b3JsZCBkb2VzIG5vdCBmaWxsIHRoZSBtYXAncyBlbnRpcmVcclxuICogY29udGFpbmVyLCB0aGVyZSB3aWxsIGJlIGJsYW5rIHNwYWNlIGJleW9uZCAxODAgYW5kIC0xODAgZGVncmVlcyBsb25naXR1ZGUuXHJcbiAqIC0gRmVhdHVyZXMgdGhhdCBjcm9zcyAxODAgYW5kIC0xODAgZGVncmVlcyBsb25naXR1ZGUgd2lsbCBiZSBjdXQgaW4gdHdvICh3aXRoIG9uZSBwb3J0aW9uIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZVxyXG4gKiBtYXAgYW5kIHRoZSBvdGhlciBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYXApIGF0IGV2ZXJ5IHpvb20gbGV2ZWwuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplPW51bGxdICBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGlsZXMgc3RvcmVkIGluIHRoZSB0aWxlIGNhY2hlIGZvciBhIGdpdmVuIHNvdXJjZS4gSWYgb21pdHRlZCwgdGhlIGNhY2hlIHdpbGwgYmUgZHluYW1pY2FsbHkgc2l6ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld3BvcnQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk9J3NhbnMtc2VyaWYnXSBEZWZpbmVzIGEgQ1NTXHJcbiAqICAgZm9udC1mYW1pbHkgZm9yIGxvY2FsbHkgb3ZlcnJpZGluZyBnZW5lcmF0aW9uIG9mIGdseXBocyBpbiB0aGUgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnLCAnSGlyYWdhbmEnLCAnS2F0YWthbmEnIGFuZCAnSGFuZ3VsIFN5bGxhYmxlcycgcmFuZ2VzLlxyXG4gKiAgIEluIHRoZXNlIHJhbmdlcywgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgZm9udC13ZWlnaHQga2V5d29yZHMgKGxpZ2h0L3JlZ3VsYXIvbWVkaXVtL2JvbGQpLlxyXG4gKiAgIFNldCB0byBgZmFsc2VgLCB0byBlbmFibGUgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSBmb3IgdGhlc2UgZ2x5cGggcmFuZ2VzLiAgTm90ZSB0aGF0IFtNYXBib3ggU3R1ZGlvXShodHRwczovL3N0dWRpby5tYXBib3guY29tLykgc2V0cyB0aGlzIHZhbHVlIHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cclxuICogICBUaGUgcHVycG9zZSBvZiB0aGlzIG9wdGlvbiBpcyB0byBhdm9pZCBiYW5kd2lkdGgtaW50ZW5zaXZlIGdseXBoIHNlcnZlciByZXF1ZXN0cy4gKFNlZSBbVXNlIGxvY2FsbHkgZ2VuZXJhdGVkIGlkZW9ncmFwaHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbG9jYWwtaWRlb2dyYXBocykuKVxyXG4gKiBAcGFyYW0ge1JlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbn0gW29wdGlvbnMudHJhbnNmb3JtUmVxdWVzdD1udWxsXSBBIGNhbGxiYWNrIHJ1biBiZWZvcmUgdGhlIE1hcCBtYWtlcyBhIHJlcXVlc3QgZm9yIGFuIGV4dGVybmFsIFVSTC4gVGhlIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgdXJsLCBzZXQgaGVhZGVycywgb3Igc2V0IHRoZSBjcmVkZW50aWFscyBwcm9wZXJ0eSBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzLlxyXG4gKiAgIEV4cGVjdGVkIHRvIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhIGB1cmxgIHByb3BlcnR5IGFuZCBvcHRpb25hbGx5IGBoZWFkZXJzYCBhbmQgYGNyZWRlbnRpYWxzYCBwcm9wZXJ0aWVzLlxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZz1mYWxzZV0gSWYgYHRydWVgLCBSZXNvdXJjZSBUaW1pbmcgQVBJIGluZm9ybWF0aW9uIHdpbGwgYmUgY29sbGVjdGVkIGZvciByZXF1ZXN0cyBtYWRlIGJ5IEdlb0pTT04gYW5kIFZlY3RvciBUaWxlIHdlYiB3b3JrZXJzICh0aGlzIGluZm9ybWF0aW9uIGlzIG5vcm1hbGx5IGluYWNjZXNzaWJsZSBmcm9tIHRoZSBtYWluIEphdmFzY3JpcHQgdGhyZWFkKS4gSW5mb3JtYXRpb24gd2lsbCBiZSByZXR1cm5lZCBpbiBhIGByZXNvdXJjZVRpbWluZ2AgcHJvcGVydHkgb2YgcmVsZXZhbnQgYGRhdGFgIGV2ZW50cy5cclxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmZhZGVEdXJhdGlvbj0zMDBdIENvbnRyb2xzIHRoZSBkdXJhdGlvbiBvZiB0aGUgZmFkZS1pbi9mYWRlLW91dCBhbmltYXRpb24gZm9yIGxhYmVsIGNvbGxpc2lvbnMsIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzZXR0aW5nIGFmZmVjdHMgYWxsIHN5bWJvbCBsYXllcnMuIFRoaXMgc2V0dGluZyBkb2VzIG5vdCBhZmZlY3QgdGhlIGR1cmF0aW9uIG9mIHJ1bnRpbWUgc3R5bGluZyB0cmFuc2l0aW9ucyBvciByYXN0ZXIgdGlsZSBjcm9zcy1mYWRpbmcuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zPXRydWVdIElmIGB0cnVlYCwgc3ltYm9scyBmcm9tIG11bHRpcGxlIHNvdXJjZXMgY2FuIGNvbGxpZGUgd2l0aCBlYWNoIG90aGVyIGR1cmluZyBjb2xsaXNpb24gZGV0ZWN0aW9uLiBJZiBgZmFsc2VgLCBjb2xsaXNpb24gZGV0ZWN0aW9uIGlzIHJ1biBzZXBhcmF0ZWx5IGZvciB0aGUgc3ltYm9scyBpbiBlYWNoIHNvdXJjZS5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFjY2Vzc1Rva2VuPW51bGxdIElmIHNwZWNpZmllZCwgbWFwIHdpbGwgdXNlIHRoaXMgdG9rZW4gaW5zdGVhZCBvZiB0aGUgb25lIGRlZmluZWQgaW4gbWFwYm94Z2wuYWNjZXNzVG9rZW4uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5sb2NhbGU9bnVsbF0gQSBwYXRjaCB0byBhcHBseSB0byB0aGUgZGVmYXVsdCBsb2NhbGl6YXRpb24gdGFibGUgZm9yIFVJIHN0cmluZ3MsIGUuZy4gY29udHJvbCB0b29sdGlwcy4gVGhlIGBsb2NhbGVgIG9iamVjdCBtYXBzIG5hbWVzcGFjZWQgVUkgc3RyaW5nIElEcyB0byB0cmFuc2xhdGVkIHN0cmluZ3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZTsgc2VlIGBzcmMvdWkvZGVmYXVsdF9sb2NhbGUuanNgIGZvciBhbiBleGFtcGxlIHdpdGggYWxsIHN1cHBvcnRlZCBzdHJpbmcgSURzLiBUaGUgb2JqZWN0IG1heSBzcGVjaWZ5IGFsbCBVSSBzdHJpbmdzICh0aGVyZWJ5IGFkZGluZyBzdXBwb3J0IGZvciBhIG5ldyB0cmFuc2xhdGlvbikgb3Igb25seSBhIHN1YnNldCBvZiBzdHJpbmdzICh0aGVyZWJ5IHBhdGNoaW5nIHRoZSBkZWZhdWx0IHRyYW5zbGF0aW9uIHRhYmxlKS5cclxuICogQGV4YW1wbGVcclxuICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xyXG4gKiAgIGNvbnRhaW5lcjogJ21hcCcsXHJcbiAqICAgY2VudGVyOiBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN10sXHJcbiAqICAgem9vbTogMTMsXHJcbiAqICAgc3R5bGU6IHN0eWxlX29iamVjdCxcclxuICogICBoYXNoOiB0cnVlLFxyXG4gKiAgIHRyYW5zZm9ybVJlcXVlc3Q6ICh1cmwsIHJlc291cmNlVHlwZSk9PiB7XHJcbiAqICAgICBpZihyZXNvdXJjZVR5cGUgPT09ICdTb3VyY2UnICYmIHVybC5zdGFydHNXaXRoKCdodHRwOi8vbXlIb3N0JykpIHtcclxuICogICAgICAgcmV0dXJuIHtcclxuICogICAgICAgIHVybDogdXJsLnJlcGxhY2UoJ2h0dHAnLCAnaHR0cHMnKSxcclxuICogICAgICAgIGhlYWRlcnM6IHsgJ215LWN1c3RvbS1oZWFkZXInOiB0cnVlfSxcclxuICogICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScgIC8vIEluY2x1ZGUgY29va2llcyBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzXHJcbiAqICAgICAgfVxyXG4gKiAgICAgfVxyXG4gKiAgIH1cclxuICogfSk7XHJcbiAqIEBzZWUgW0Rpc3BsYXkgYSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGVzLylcclxuICovXHJcbmNsYXNzIE1hcCBleHRlbmRzIENhbWVyYSB7XHJcbiAgICBzdHlsZTogU3R5bGU7XHJcbiAgICBwYWludGVyOiBQYWludGVyO1xyXG4gICAgaGFuZGxlcnM6IEhhbmRsZXJNYW5hZ2VyO1xyXG5cclxuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgX21pc3NpbmdDU1NDYW5hcnk6IEhUTUxFbGVtZW50O1xyXG4gICAgX2NhbnZhc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBfY29udHJvbENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICBfY29udHJvbFBvc2l0aW9uczogeyBbXzogc3RyaW5nXTogSFRNTEVsZW1lbnQgfTtcclxuICAgIF9pbnRlcmFjdGl2ZTogP2Jvb2xlYW47XHJcbiAgICBfc2hvd1RpbGVCb3VuZGFyaWVzOiA/Ym9vbGVhbjtcclxuICAgIF9zaG93Q29sbGlzaW9uQm94ZXM6ID9ib29sZWFuO1xyXG4gICAgX3Nob3dQYWRkaW5nOiA/Ym9vbGVhbjtcclxuICAgIF9zaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW47XHJcbiAgICBfcmVwYWludDogP2Jvb2xlYW47XHJcbiAgICBfdmVydGljZXM6ID9ib29sZWFuO1xyXG4gICAgX2NhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICBfbWF4VGlsZUNhY2hlU2l6ZTogbnVtYmVyO1xyXG4gICAgX2ZyYW1lOiA/Q2FuY2VsYWJsZTtcclxuICAgIF9zdHlsZURpcnR5OiA/Ym9vbGVhbjtcclxuICAgIF9zb3VyY2VzRGlydHk6ID9ib29sZWFuO1xyXG4gICAgX3BsYWNlbWVudERpcnR5OiA/Ym9vbGVhbjtcclxuICAgIF9sb2FkZWQ6IGJvb2xlYW47XHJcbiAgICAvLyBhY2NvdW50cyBmb3IgcGxhY2VtZW50IGZpbmlzaGluZyBhcyB3ZWxsXHJcbiAgICBfZnVsbHlMb2FkZWQ6IGJvb2xlYW47XHJcbiAgICBfdHJhY2tSZXNpemU6IGJvb2xlYW47XHJcbiAgICBfcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBib29sZWFuO1xyXG4gICAgX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGJvb2xlYW47XHJcbiAgICBfYW50aWFsaWFzOiBib29sZWFuO1xyXG4gICAgX3JlZnJlc2hFeHBpcmVkVGlsZXM6IGJvb2xlYW47XHJcbiAgICBfaGFzaDogSGFzaDtcclxuICAgIF9kZWxlZ2F0ZWRMaXN0ZW5lcnM6IGFueTtcclxuICAgIF9mYWRlRHVyYXRpb246IG51bWJlcjtcclxuICAgIF9jcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW47XHJcbiAgICBfY3Jvc3NGYWRpbmdGYWN0b3I6IG51bWJlcjtcclxuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XHJcbiAgICBfcmVuZGVyVGFza1F1ZXVlOiBUYXNrUXVldWU7XHJcbiAgICBfY29udHJvbHM6IEFycmF5PElDb250cm9sPjtcclxuICAgIF9tYXBJZDogbnVtYmVyO1xyXG4gICAgX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogc3RyaW5nO1xyXG4gICAgX3JlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcjtcclxuICAgIF9sb2NhbGU6IE9iamVjdDtcclxuICAgIF9yZW1vdmVkOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBTY3JvbGxab29tSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgem9vbWluZyBpbiBhbmQgb3V0IHdpdGggYSBzY3JvbGwgd2hlZWwgb3IgdHJhY2twYWQuXHJcbiAgICAgKiBGaW5kIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMgdXNpbmcgYHNjcm9sbFpvb21gIGluIHRoZSB7QGxpbmsgU2Nyb2xsWm9vbUhhbmRsZXJ9IHNlY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIHNjcm9sbFpvb206IFNjcm9sbFpvb21IYW5kbGVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBCb3hab29tSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgem9vbWluZyB1c2luZyBhIGRyYWcgZ2VzdHVyZSB3aXRoIHRoZSBTaGlmdCBrZXkgcHJlc3NlZC5cclxuICAgICAqIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBgYm94Wm9vbWAgaW4gdGhlIHtAbGluayBCb3hab29tSGFuZGxlcn0gc2VjdGlvbi5cclxuICAgICAqL1xyXG4gICAgYm94Wm9vbTogQm94Wm9vbUhhbmRsZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIERyYWdSb3RhdGVIYW5kbGVyfSwgd2hpY2ggaW1wbGVtZW50cyByb3RhdGluZyB0aGUgbWFwIHdoaWxlIGRyYWdnaW5nIHdpdGggdGhlIHJpZ2h0XHJcbiAgICAgKiBtb3VzZSBidXR0b24gb3Igd2l0aCB0aGUgQ29udHJvbCBrZXkgcHJlc3NlZC4gRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBkcmFnUm90YXRlYFxyXG4gICAgICogaW4gdGhlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0gc2VjdGlvbi5cclxuICAgICAqL1xyXG4gICAgZHJhZ1JvdGF0ZTogRHJhZ1JvdGF0ZUhhbmRsZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIERyYWdQYW5IYW5kbGVyfSwgd2hpY2ggaW1wbGVtZW50cyBkcmFnZ2luZyB0aGUgbWFwIHdpdGggYSBtb3VzZSBvciB0b3VjaCBnZXN0dXJlLlxyXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBkcmFnUGFuYCBpbiB0aGUge0BsaW5rIERyYWdQYW5IYW5kbGVyfSBzZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICBkcmFnUGFuOiBEcmFnUGFuSGFuZGxlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgS2V5Ym9hcmRIYW5kbGVyfSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20sIHJvdGF0ZSwgYW5kIHBhbiB0aGUgbWFwIHVzaW5nIGtleWJvYXJkXHJcbiAgICAgKiBzaG9ydGN1dHMuIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBga2V5Ym9hcmRgIGluIHRoZSB7QGxpbmsgS2V5Ym9hcmRIYW5kbGVyfSBzZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICBrZXlib2FyZDogS2V5Ym9hcmRIYW5kbGVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBEb3VibGVDbGlja1pvb21IYW5kbGVyfSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gYnkgZG91YmxlIGNsaWNraW5nLlxyXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBkb3VibGVDbGlja1pvb21gIGluIHRoZSB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn0gc2VjdGlvbi5cclxuICAgICAqL1xyXG4gICAgZG91YmxlQ2xpY2tab29tOiBEb3VibGVDbGlja1pvb21IYW5kbGVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyfSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gb3Igcm90YXRlIHRoZSBtYXAgd2l0aCB0b3VjaCBnZXN0dXJlcy5cclxuICAgICAqIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBgdG91Y2hab29tUm90YXRlYCBpbiB0aGUge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJ9IHNlY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIHRvdWNoWm9vbVJvdGF0ZTogVG91Y2hab29tUm90YXRlSGFuZGxlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgVG91Y2hQaXRjaEhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gcGl0Y2ggdGhlIG1hcCB3aXRoIHRvdWNoIGdlc3R1cmVzLlxyXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGB0b3VjaFBpdGNoYCBpbiB0aGUge0BsaW5rIFRvdWNoUGl0Y2hIYW5kbGVyfSBzZWN0aW9uLlxyXG4gICAgICovXHJcbiAgICB0b3VjaFBpdGNoOiBUb3VjaFBpdGNoSGFuZGxlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYXBPcHRpb25zKSB7XHJcbiAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5tYXJrKFBlcmZvcm1hbmNlTWFya2Vycy5jcmVhdGUpO1xyXG5cclxuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgb3B0aW9ucy5taW5ab29tICE9IG51bGwgJiZcclxuICAgICAgICAgICAgb3B0aW9ucy5tYXhab29tICE9IG51bGwgJiZcclxuICAgICAgICAgICAgb3B0aW9ucy5taW5ab29tID4gb3B0aW9ucy5tYXhab29tXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWF4Wm9vbSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5ab29tYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG9wdGlvbnMubWluUGl0Y2ggIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICBvcHRpb25zLm1heFBpdGNoICE9IG51bGwgJiZcclxuICAgICAgICAgICAgb3B0aW9ucy5taW5QaXRjaCA+IG9wdGlvbnMubWF4UGl0Y2hcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYG1heFBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pblBpdGNoYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMubWluUGl0Y2ggIT0gbnVsbCAmJiBvcHRpb25zLm1pblBpdGNoIDwgZGVmYXVsdE1pblBpdGNoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgIGBtaW5QaXRjaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke2RlZmF1bHRNaW5QaXRjaH1gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5tYXhQaXRjaCAhPSBudWxsICYmIG9wdGlvbnMubWF4UGl0Y2ggPiBkZWZhdWx0TWF4UGl0Y2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYG1heFBpdGNoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1heFBpdGNofWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oXHJcbiAgICAgICAgICAgIG9wdGlvbnMubWluWm9vbSxcclxuICAgICAgICAgICAgb3B0aW9ucy5tYXhab29tLFxyXG4gICAgICAgICAgICBvcHRpb25zLm1pblBpdGNoLFxyXG4gICAgICAgICAgICBvcHRpb25zLm1heFBpdGNoLFxyXG4gICAgICAgICAgICBvcHRpb25zLnJlbmRlcldvcmxkQ29waWVzLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgc3VwZXIodHJhbnNmb3JtLCBvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcclxuICAgICAgICB0aGlzLmNycyA9IHRoaXMudG9DUlMob3B0aW9ucy5jcnMpO1xyXG4gICAgICAgIHRoaXMuaW5pdENSUyh0aGlzLmNycyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2ludGVyYWN0aXZlID0gb3B0aW9ucy5pbnRlcmFjdGl2ZTtcclxuICAgICAgICB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplO1xyXG4gICAgICAgIHRoaXMuX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPVxyXG4gICAgICAgICAgICBvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ7XHJcbiAgICAgICAgdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gb3B0aW9ucy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI7XHJcbiAgICAgICAgdGhpcy5fYW50aWFsaWFzID0gb3B0aW9ucy5hbnRpYWxpYXM7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tSZXNpemUgPSBvcHRpb25zLnRyYWNrUmVzaXplO1xyXG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcclxuICAgICAgICB0aGlzLl9yZWZyZXNoRXhwaXJlZFRpbGVzID0gb3B0aW9ucy5yZWZyZXNoRXhwaXJlZFRpbGVzO1xyXG4gICAgICAgIHRoaXMuX2ZhZGVEdXJhdGlvbiA9IG9wdGlvbnMuZmFkZUR1cmF0aW9uO1xyXG4gICAgICAgIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyA9IG9wdGlvbnMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zO1xyXG4gICAgICAgIHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yID0gMTtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcclxuICAgICAgICB0aGlzLl9yZW5kZXJUYXNrUXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHMgPSBbXTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJzQ2FjaGUgPSBbXTtcclxuICAgICAgICB0aGlzLl9tYXBJZCA9IHVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZXh0ZW5kKHt9LCBkZWZhdWx0TG9jYWxlLCBvcHRpb25zLmxvY2FsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKFxyXG4gICAgICAgICAgICBvcHRpb25zLnRyYW5zZm9ybVJlcXVlc3QsXHJcbiAgICAgICAgICAgIG9wdGlvbnMuYWNjZXNzVG9rZW5cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGFpbmVyID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcHRpb25zLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnRhaW5lciAnJHtvcHRpb25zLmNvbnRhaW5lcn0nIG5vdCBmb3VuZC5gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgSW52YWxpZCB0eXBlOiAnY29udGFpbmVyJyBtdXN0IGJlIGEgU3RyaW5nIG9yIEhUTUxFbGVtZW50LmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLm1heEJvdW5kcykge1xyXG4gICAgICAgICAgICB0aGlzLnNldE1heEJvdW5kcyhvcHRpb25zLm1heEJvdW5kcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBiaW5kQWxsKFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICBcIl9vbldpbmRvd09ubGluZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJfb25XaW5kb3dSZXNpemVcIixcclxuICAgICAgICAgICAgICAgIFwiX2NvbnRleHRMb3N0XCIsXHJcbiAgICAgICAgICAgICAgICBcIl9jb250ZXh0UmVzdG9yZWRcIixcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgdGhpc1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3NldHVwQ29udGFpbmVyKCk7XHJcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucGFpbnRlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgV2ViR0wuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uKFwibW92ZVwiLCAoKSA9PiB0aGlzLl91cGRhdGUoZmFsc2UpKTtcclxuICAgICAgICB0aGlzLm9uKFwibW92ZWVuZFwiLCAoKSA9PiB0aGlzLl91cGRhdGUoZmFsc2UpKTtcclxuICAgICAgICB0aGlzLm9uKFwiem9vbVwiLCAoKSA9PiB0aGlzLl91cGRhdGUodHJ1ZSkpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAgICAgICAgIFwib3JpZW50YXRpb25jaGFuZ2VcIixcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uV2luZG93UmVzaXplLFxyXG4gICAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBuZXcgSGFuZGxlck1hbmFnZXIodGhpcywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc2hOYW1lID1cclxuICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmhhc2ggPT09IFwic3RyaW5nXCIgJiYgb3B0aW9ucy5oYXNoKSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5faGFzaCA9IG9wdGlvbnMuaGFzaCAmJiBuZXcgSGFzaChoYXNoTmFtZSkuYWRkVG8odGhpcyk7XHJcbiAgICAgICAgLy8gZG9uJ3Qgc2V0IHBvc2l0aW9uIGZyb20gb3B0aW9ucyBpZiBzZXQgdGhyb3VnaCBoYXNoXHJcbiAgICAgICAgaWYgKCF0aGlzLl9oYXNoIHx8ICF0aGlzLl9oYXNoLl9vbkhhc2hDaGFuZ2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmp1bXBUbyh7XHJcbiAgICAgICAgICAgICAgICBjZW50ZXI6IG9wdGlvbnMuY2VudGVyLFxyXG4gICAgICAgICAgICAgICAgem9vbTogb3B0aW9ucy56b29tLFxyXG4gICAgICAgICAgICAgICAgYmVhcmluZzogb3B0aW9ucy5iZWFyaW5nLFxyXG4gICAgICAgICAgICAgICAgcGl0Y2g6IG9wdGlvbnMucGl0Y2gsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXRCb3VuZHMoXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ib3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHt9LCBvcHRpb25zLmZpdEJvdW5kc09wdGlvbnMsIHsgZHVyYXRpb246IDAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzaXplKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9IG9wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5O1xyXG4gICAgICAgIGlmIChvcHRpb25zLnN0eWxlKVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0eWxlKG9wdGlvbnMuc3R5bGUsIHtcclxuICAgICAgICAgICAgICAgIGxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHksXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wpXHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ29udHJvbChcclxuICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGlvbkNvbnRyb2woe1xyXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUF0dHJpYnV0aW9uOiBvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5hZGRDb250cm9sKG5ldyBMb2dvQ29udHJvbCgpLCBvcHRpb25zLmxvZ29Qb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMub24oXCJzdHlsZS5sb2FkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLnVubW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuanVtcFRvKCh0aGlzLnN0eWxlLnN0eWxlc2hlZXQ6IGFueSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5vbihcImRhdGFcIiwgKGV2ZW50OiBNYXBEYXRhRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKGV2ZW50LmRhdGFUeXBlID09PSBcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KGAke2V2ZW50LmRhdGFUeXBlfWRhdGFgLCBldmVudCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub24oXCJkYXRhbG9hZGluZ1wiLCAoZXZlbnQ6IE1hcERhdGFFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KGAke2V2ZW50LmRhdGFUeXBlfWRhdGFsb2FkaW5nYCwgZXZlbnQpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NSUyhjcnMpIHtcclxuICAgICAgICBpZiAoY3JzICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBjcnMpIHtcclxuICAgICAgICAgICAgY3JzID0gQ1JTLmdldChjcnMpO1xyXG4gICAgICAgICAgICBpZiAoIWNycykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjcnMgJHtjcnN9IGlzIG5vdCBkZWZpbmVgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3JzIHx8IENSUy5FUFNHMzg1NztcclxuICAgIH1cclxuICAgIGdldENSUygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFJldHVybnMgYSB1bmlxdWUgbnVtYmVyIGZvciB0aGlzIG1hcCBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIGZvciB0aGUgTWFwTG9hZEV2ZW50XHJcbiAgICAgKiB0byBtYWtlIHN1cmUgd2Ugb25seSBmaXJlIG9uZSBldmVudCBwZXIgaW5zdGFudGlhdGVkIG1hcCBvYmplY3QuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICogQHJldHVybnMge251bWJlcn1cclxuICAgICAqL1xyXG4gICAgX2dldE1hcElkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXBJZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4ge0BsaW5rIElDb250cm9sfSB0byB0aGUgbWFwLCBjYWxsaW5nIGBjb250cm9sLm9uQWRkKHRoaXMpYC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0lDb250cm9sfSBjb250cm9sIFRoZSB7QGxpbmsgSUNvbnRyb2x9IHRvIGFkZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcG9zaXRpb25dIHBvc2l0aW9uIG9uIHRoZSBtYXAgdG8gd2hpY2ggdGhlIGNvbnRyb2wgd2lsbCBiZSBhZGRlZC5cclxuICAgICAqIFZhbGlkIHZhbHVlcyBhcmUgYCd0b3AtbGVmdCdgLCBgJ3RvcC1yaWdodCdgLCBgJ2JvdHRvbS1sZWZ0J2AsIGFuZCBgJ2JvdHRvbS1yaWdodCdgLiBEZWZhdWx0cyB0byBgJ3RvcC1yaWdodCdgLlxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gQWRkIHpvb20gYW5kIHJvdGF0aW9uIGNvbnRyb2xzIHRvIHRoZSBtYXAuXHJcbiAgICAgKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuTmF2aWdhdGlvbkNvbnRyb2woKSk7XHJcbiAgICAgKiBAc2VlIFtEaXNwbGF5IG1hcCBuYXZpZ2F0aW9uIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL25hdmlnYXRpb24vKVxyXG4gICAgICovXHJcbiAgICBhZGRDb250cm9sKGNvbnRyb2w6IElDb250cm9sLCBwb3NpdGlvbj86IENvbnRyb2xQb3NpdGlvbikge1xyXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkICYmIGNvbnRyb2wuZ2V0RGVmYXVsdFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uID0gY29udHJvbC5nZXREZWZhdWx0UG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSBcInRvcC1yaWdodFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wub25BZGQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShcclxuICAgICAgICAgICAgICAgIG5ldyBFcnJvckV2ZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJJbnZhbGlkIGFyZ3VtZW50IHRvIG1hcC5hZGRDb250cm9sKCkuIEFyZ3VtZW50IG11c3QgYmUgYSBjb250cm9sIHdpdGggb25BZGQgYW5kIG9uUmVtb3ZlIG1ldGhvZHMuXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xFbGVtZW50ID0gY29udHJvbC5vbkFkZCh0aGlzKTtcclxuICAgICAgICB0aGlzLl9jb250cm9scy5wdXNoKGNvbnRyb2wpO1xyXG5cclxuICAgICAgICBjb25zdCBwb3NpdGlvbkNvbnRhaW5lciA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnNbcG9zaXRpb25dO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi5pbmRleE9mKFwiYm90dG9tXCIpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBwb3NpdGlvbkNvbnRhaW5lci5pbnNlcnRCZWZvcmUoXHJcbiAgICAgICAgICAgICAgICBjb250cm9sRWxlbWVudCxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uQ29udGFpbmVyLmZpcnN0Q2hpbGRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwb3NpdGlvbkNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250cm9sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY29udHJvbCBmcm9tIHRoZSBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtJQ29udHJvbH0gY29udHJvbCBUaGUge0BsaW5rIElDb250cm9sfSB0byByZW1vdmUuXHJcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBEZWZpbmUgYSBuZXcgbmF2aWdhdGlvbiBjb250cm9sLlxyXG4gICAgICogdmFyIG5hdmlnYXRpb24gPSBuZXcgbWFwYm94Z2wuTmF2aWdhdGlvbkNvbnRyb2woKTtcclxuICAgICAqIC8vIEFkZCB6b29tIGFuZCByb3RhdGlvbiBjb250cm9scyB0byB0aGUgbWFwLlxyXG4gICAgICogbWFwLmFkZENvbnRyb2wobmF2aWdhdGlvbik7XHJcbiAgICAgKiAvLyBSZW1vdmUgem9vbSBhbmQgcm90YXRpb24gY29udHJvbHMgZnJvbSB0aGUgbWFwLlxyXG4gICAgICogbWFwLnJlbW92ZUNvbnRyb2wobmF2aWdhdGlvbik7XHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUNvbnRyb2woY29udHJvbDogSUNvbnRyb2wpIHtcclxuICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wub25SZW1vdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShcclxuICAgICAgICAgICAgICAgIG5ldyBFcnJvckV2ZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJJbnZhbGlkIGFyZ3VtZW50IHRvIG1hcC5yZW1vdmVDb250cm9sKCkuIEFyZ3VtZW50IG11c3QgYmUgYSBjb250cm9sIHdpdGggb25BZGQgYW5kIG9uUmVtb3ZlIG1ldGhvZHMuXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNpID0gdGhpcy5fY29udHJvbHMuaW5kZXhPZihjb250cm9sKTtcclxuICAgICAgICBpZiAoY2kgPiAtMSkgdGhpcy5fY29udHJvbHMuc3BsaWNlKGNpLCAxKTtcclxuICAgICAgICBjb250cm9sLm9uUmVtb3ZlKHRoaXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzaXplcyB0aGUgbWFwIGFjY29yZGluZyB0byB0aGUgZGltZW5zaW9ucyBvZiBpdHNcclxuICAgICAqIGBjb250YWluZXJgIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBtYXAgY29udGFpbmVyIHNpemUgY2hhbmdlZCBhbmQgdXBkYXRlcyB0aGUgbWFwIGlmIGl0IGhhcyBjaGFuZ2VkLlxyXG4gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG1hcCdzIGBjb250YWluZXJgIGlzIHJlc2l6ZWQgcHJvZ3JhbW1hdGljYWxseVxyXG4gICAgICogb3Igd2hlbiB0aGUgbWFwIGlzIHNob3duIGFmdGVyIGJlaW5nIGluaXRpYWxseSBoaWRkZW4gd2l0aCBDU1MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgcGFzc2VkIHRvIGBtb3Zlc3RhcnRgLCBgbW92ZWAsIGByZXNpemVgLCBhbmQgYG1vdmVlbmRgXHJcbiAgICAgKiAgIGV2ZW50cyB0aGF0IGdldCB0cmlnZ2VyZWQgYXMgYSByZXN1bHQgb2YgcmVzaXplLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGRpZmZlcmVudGlhdGluZyB0aGVcclxuICAgICAqICAgc291cmNlIG9mIGFuIGV2ZW50IChmb3IgZXhhbXBsZSwgdXNlci1pbml0aWF0ZWQgb3IgcHJvZ3JhbW1hdGljYWxseS10cmlnZ2VyZWQgZXZlbnRzKS5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIFJlc2l6ZSB0aGUgbWFwIHdoZW4gdGhlIG1hcCBjb250YWluZXIgaXMgc2hvd25cclxuICAgICAqIC8vIGFmdGVyIGJlaW5nIGluaXRpYWxseSBoaWRkZW4gd2l0aCBDU1MuXHJcbiAgICAgKiB2YXIgbWFwRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hcCcpO1xyXG4gICAgICogaWYgKG1hcERpdi5zdHlsZS52aXNpYmlsaXR5ID09PSB0cnVlKSBtYXAucmVzaXplKCk7XHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZShldmVudERhdGE/OiBPYmplY3QpIHtcclxuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5fY29udGFpbmVyRGltZW5zaW9ucygpO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9uc1swXTtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBkaW1lbnNpb25zWzFdO1xyXG5cclxuICAgICAgICB0aGlzLl9yZXNpemVDYW52YXMod2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMucGFpbnRlci5yZXNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpcmVNb3ZpbmcgPSAhdGhpcy5fbW92aW5nO1xyXG4gICAgICAgIGlmIChmaXJlTW92aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KFwibW92ZXN0YXJ0XCIsIGV2ZW50RGF0YSkpLmZpcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgRXZlbnQoXCJtb3ZlXCIsIGV2ZW50RGF0YSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoXCJyZXNpemVcIiwgZXZlbnREYXRhKSk7XHJcblxyXG4gICAgICAgIGlmIChmaXJlTW92aW5nKSB0aGlzLmZpcmUobmV3IEV2ZW50KFwibW92ZWVuZFwiLCBldmVudERhdGEpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLiBXaGVuIHRoZSBiZWFyaW5nIG9yIHBpdGNoIGlzIG5vbi16ZXJvLCB0aGUgdmlzaWJsZSByZWdpb24gaXMgbm90XHJcbiAgICAgKiBhbiBheGlzLWFsaWduZWQgcmVjdGFuZ2xlLCBhbmQgdGhlIHJlc3VsdCBpcyB0aGUgc21hbGxlc3QgYm91bmRzIHRoYXQgZW5jb21wYXNzZXMgdGhlIHZpc2libGUgcmVnaW9uLlxyXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gVGhlIGdlb2dyYXBoaWNhbCBib3VuZHMgb2YgdGhlIG1hcCBhcyB7QGxpbmsgTG5nTGF0Qm91bmRzfS5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgYm91bmRzID0gbWFwLmdldEJvdW5kcygpO1xyXG4gICAgICovXHJcbiAgICBnZXRCb3VuZHMoKTogTG5nTGF0Qm91bmRzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0uZ2V0Qm91bmRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGdlb2dyYXBoaWNhbCBib3VuZHMgdGhlIG1hcCBpcyBjb25zdHJhaW5lZCB0bywgb3IgYG51bGxgIGlmIG5vbmUgc2V0LlxyXG4gICAgICogQHJldHVybnMgVGhlIG1hcCBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIG1heEJvdW5kcyA9IG1hcC5nZXRNYXhCb3VuZHMoKTtcclxuICAgICAqL1xyXG4gICAgZ2V0TWF4Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5nZXRNYXhCb3VuZHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIFBhbiBhbmQgem9vbSBvcGVyYXRpb25zIGFyZSBjb25zdHJhaW5lZCB3aXRoaW4gdGhlc2UgYm91bmRzLlxyXG4gICAgICogSWYgYSBwYW4gb3Igem9vbSBpcyBwZXJmb3JtZWQgdGhhdCB3b3VsZFxyXG4gICAgICogZGlzcGxheSByZWdpb25zIG91dHNpZGUgdGhlc2UgYm91bmRzLCB0aGUgbWFwIHdpbGxcclxuICAgICAqIGluc3RlYWQgZGlzcGxheSBhIHBvc2l0aW9uIGFuZCB6b29tIGxldmVsXHJcbiAgICAgKiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgb3BlcmF0aW9uJ3MgcmVxdWVzdCB3aGlsZSBzdGlsbFxyXG4gICAgICogcmVtYWluaW5nIHdpdGhpbiB0aGUgYm91bmRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IGJvdW5kcyBUaGUgbWF4aW11bSBib3VuZHMgdG8gc2V0LiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBtYXAncyBtYXhpbXVtIGJvdW5kcy5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIERlZmluZSBib3VuZHMgdGhhdCBjb25mb3JtIHRvIHRoZSBgTG5nTGF0Qm91bmRzTGlrZWAgb2JqZWN0LlxyXG4gICAgICogdmFyIGJvdW5kcyA9IFtcclxuICAgICAqICAgWy03NC4wNDcyOCwgNDAuNjgzOTJdLCAvLyBbd2VzdCwgc291dGhdXHJcbiAgICAgKiAgIFstNzMuOTEwNTgsIDQwLjg3NzY0XSAgLy8gW2Vhc3QsIG5vcnRoXVxyXG4gICAgICogXTtcclxuICAgICAqIC8vIFNldCB0aGUgbWFwJ3MgbWF4IGJvdW5kcy5cclxuICAgICAqIG1hcC5zZXRNYXhCb3VuZHMoYm91bmRzKTtcclxuICAgICAqL1xyXG4gICAgc2V0TWF4Qm91bmRzKGJvdW5kczogTG5nTGF0Qm91bmRzTGlrZSkge1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnNldE1heEJvdW5kcyhMbmdMYXRCb3VuZHMuY29udmVydChib3VuZHMpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWluaW11bSB6b29tIGxldmVsLlxyXG4gICAgICogSWYgdGhlIG1hcCdzIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBsb3dlciB0aGFuIHRoZSBuZXcgbWluaW11bSxcclxuICAgICAqIHRoZSBtYXAgd2lsbCB6b29tIHRvIHRoZSBuZXcgbWluaW11bS5cclxuICAgICAqXHJcbiAgICAgKiBJdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIHpvb20gb3V0IGFuZCByZWFjaCB0aGUgc2V0IGBtaW5ab29tYC5cclxuICAgICAqIE90aGVyIGZhY3RvcnMgc3VjaCBhcyBtYXAgaGVpZ2h0IG1heSByZXN0cmljdCB6b29taW5nLiBGb3IgZXhhbXBsZSxcclxuICAgICAqIGlmIHRoZSBtYXAgaXMgNTEycHggdGFsbCBpdCB3aWxsIG5vdCBiZSBwb3NzaWJsZSB0byB6b29tIGJlbG93IHpvb20gMFxyXG4gICAgICogbm8gbWF0dGVyIHdoYXQgdGhlIGBtaW5ab29tYCBpcyBzZXQgdG8uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBtaW5ab29tIFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgdG8gc2V0ICgtMiAtIDI0KS5cclxuICAgICAqICAgSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBtaW5pbXVtIHpvb20gKGkuZS4gc2V0cyBpdCB0byAtMikuXHJcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBtYXAuc2V0TWluWm9vbSgxMi4yNSk7XHJcbiAgICAgKi9cclxuICAgIHNldE1pblpvb20obWluWm9vbT86ID9udW1iZXIpIHtcclxuICAgICAgICBtaW5ab29tID1cclxuICAgICAgICAgICAgbWluWm9vbSA9PT0gbnVsbCB8fCBtaW5ab29tID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgID8gZGVmYXVsdE1pblpvb21cclxuICAgICAgICAgICAgICAgIDogbWluWm9vbTtcclxuXHJcbiAgICAgICAgaWYgKG1pblpvb20gPj0gZGVmYXVsdE1pblpvb20gJiYgbWluWm9vbSA8PSB0aGlzLnRyYW5zZm9ybS5tYXhab29tKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1pblpvb20gPSBtaW5ab29tO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFpvb20oKSA8IG1pblpvb20pIHRoaXMuc2V0Wm9vbShtaW5ab29tKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgbWluWm9vbSBtdXN0IGJlIGJldHdlZW4gJHtkZWZhdWx0TWluWm9vbX0gYW5kIHRoZSBjdXJyZW50IG1heFpvb20sIGluY2x1c2l2ZWBcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1pbmltdW0gYWxsb3dhYmxlIHpvb20gbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gbWluWm9vbVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciBtaW5ab29tID0gbWFwLmdldE1pblpvb20oKTtcclxuICAgICAqL1xyXG4gICAgZ2V0TWluWm9vbSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBtYXhpbXVtIHpvb20gbGV2ZWwuXHJcbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsIGlzIGhpZ2hlciB0aGFuIHRoZSBuZXcgbWF4aW11bSxcclxuICAgICAqIHRoZSBtYXAgd2lsbCB6b29tIHRvIHRoZSBuZXcgbWF4aW11bS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IG1heFpvb20gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBzZXQuXHJcbiAgICAgKiAgIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgbWF4aW11bSB6b29tIChzZXRzIGl0IHRvIDIyKS5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5zZXRNYXhab29tKDE4Ljc1KTtcclxuICAgICAqL1xyXG4gICAgc2V0TWF4Wm9vbShtYXhab29tPzogP251bWJlcikge1xyXG4gICAgICAgIG1heFpvb20gPVxyXG4gICAgICAgICAgICBtYXhab29tID09PSBudWxsIHx8IG1heFpvb20gPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyBkZWZhdWx0TWF4Wm9vbVxyXG4gICAgICAgICAgICAgICAgOiBtYXhab29tO1xyXG5cclxuICAgICAgICBpZiAobWF4Wm9vbSA+PSB0aGlzLnRyYW5zZm9ybS5taW5ab29tKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1heFpvb20gPSBtYXhab29tO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFpvb20oKSA+IG1heFpvb20pIHRoaXMuc2V0Wm9vbShtYXhab29tKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbWluWm9vbWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgbWF4aW11bSBhbGxvd2FibGUgem9vbSBsZXZlbC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBtYXhab29tXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIG1heFpvb20gPSBtYXAuZ2V0TWF4Wm9vbSgpO1xyXG4gICAgICovXHJcbiAgICBnZXRNYXhab29tKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5tYXhab29tO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIG1pbmltdW0gcGl0Y2guXHJcbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCBwaXRjaCBpcyBsb3dlciB0aGFuIHRoZSBuZXcgbWluaW11bSxcclxuICAgICAqIHRoZSBtYXAgd2lsbCBwaXRjaCB0byB0aGUgbmV3IG1pbmltdW0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBtaW5QaXRjaCBUaGUgbWluaW11bSBwaXRjaCB0byBzZXQgKDAtNjApLlxyXG4gICAgICogICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1pbmltdW0gcGl0Y2ggKGkuZS4gc2V0cyBpdCB0byAwKS5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICovXHJcbiAgICBzZXRNaW5QaXRjaChtaW5QaXRjaD86ID9udW1iZXIpIHtcclxuICAgICAgICBtaW5QaXRjaCA9XHJcbiAgICAgICAgICAgIG1pblBpdGNoID09PSBudWxsIHx8IG1pblBpdGNoID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgID8gZGVmYXVsdE1pblBpdGNoXHJcbiAgICAgICAgICAgICAgICA6IG1pblBpdGNoO1xyXG5cclxuICAgICAgICBpZiAobWluUGl0Y2ggPCBkZWZhdWx0TWluUGl0Y2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYG1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1pblBpdGNofWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgbWluUGl0Y2ggPj0gZGVmYXVsdE1pblBpdGNoICYmXHJcbiAgICAgICAgICAgIG1pblBpdGNoIDw9IHRoaXMudHJhbnNmb3JtLm1heFBpdGNoXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1pblBpdGNoID0gbWluUGl0Y2g7XHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGl0Y2goKSA8IG1pblBpdGNoKSB0aGlzLnNldFBpdGNoKG1pblBpdGNoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgbWluUGl0Y2ggbXVzdCBiZSBiZXR3ZWVuICR7ZGVmYXVsdE1pblBpdGNofSBhbmQgdGhlIGN1cnJlbnQgbWF4UGl0Y2gsIGluY2x1c2l2ZWBcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1pbmltdW0gYWxsb3dhYmxlIHBpdGNoLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IG1pblBpdGNoXHJcbiAgICAgKi9cclxuICAgIGdldE1pblBpdGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5taW5QaXRjaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBtYXhpbXVtIHBpdGNoLlxyXG4gICAgICogSWYgdGhlIG1hcCdzIGN1cnJlbnQgcGl0Y2ggaXMgaGlnaGVyIHRoYW4gdGhlIG5ldyBtYXhpbXVtLFxyXG4gICAgICogdGhlIG1hcCB3aWxsIHBpdGNoIHRvIHRoZSBuZXcgbWF4aW11bS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IG1heFBpdGNoIFRoZSBtYXhpbXVtIHBpdGNoIHRvIHNldC5cclxuICAgICAqICAgSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBtYXhpbXVtIHBpdGNoIChzZXRzIGl0IHRvIDYwKS5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICovXHJcbiAgICBzZXRNYXhQaXRjaChtYXhQaXRjaD86ID9udW1iZXIpIHtcclxuICAgICAgICBtYXhQaXRjaCA9XHJcbiAgICAgICAgICAgIG1heFBpdGNoID09PSBudWxsIHx8IG1heFBpdGNoID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgID8gZGVmYXVsdE1heFBpdGNoXHJcbiAgICAgICAgICAgICAgICA6IG1heFBpdGNoO1xyXG5cclxuICAgICAgICBpZiAobWF4UGl0Y2ggPiBkZWZhdWx0TWF4UGl0Y2gpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYG1heFBpdGNoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1heFBpdGNofWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtYXhQaXRjaCA+PSB0aGlzLnRyYW5zZm9ybS5taW5QaXRjaCkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5tYXhQaXRjaCA9IG1heFBpdGNoO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldFBpdGNoKCkgPiBtYXhQaXRjaCkgdGhpcy5zZXRQaXRjaChtYXhQaXRjaCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYG1heFBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG1pblBpdGNoYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgbWF4aW11bSBhbGxvd2FibGUgcGl0Y2guXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gbWF4UGl0Y2hcclxuICAgICAqL1xyXG4gICAgZ2V0TWF4UGl0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1heFBpdGNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgYHJlbmRlcldvcmxkQ29waWVzYC4gSWYgYHRydWVgLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHdvcmxkIHdpbGwgYmUgcmVuZGVyZWQgc2lkZSBieSBzaWRlIGJleW9uZCAtMTgwIGFuZCAxODAgZGVncmVlcyBsb25naXR1ZGUuIElmIHNldCB0byBgZmFsc2VgOlxyXG4gICAgICogLSBXaGVuIHRoZSBtYXAgaXMgem9vbWVkIG91dCBmYXIgZW5vdWdoIHRoYXQgYSBzaW5nbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdvcmxkIGRvZXMgbm90IGZpbGwgdGhlIG1hcCdzIGVudGlyZVxyXG4gICAgICogY29udGFpbmVyLCB0aGVyZSB3aWxsIGJlIGJsYW5rIHNwYWNlIGJleW9uZCAxODAgYW5kIC0xODAgZGVncmVlcyBsb25naXR1ZGUuXHJcbiAgICAgKiAtIEZlYXR1cmVzIHRoYXQgY3Jvc3MgMTgwIGFuZCAtMTgwIGRlZ3JlZXMgbG9uZ2l0dWRlIHdpbGwgYmUgY3V0IGluIHR3byAod2l0aCBvbmUgcG9ydGlvbiBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGVcclxuICAgICAqIG1hcCBhbmQgdGhlIG90aGVyIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIG1hcCkgYXQgZXZlcnkgem9vbSBsZXZlbC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSByZW5kZXJXb3JsZENvcGllc1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciB3b3JsZENvcGllc1JlbmRlcmVkID0gbWFwLmdldFJlbmRlcldvcmxkQ29waWVzKCk7XHJcbiAgICAgKiBAc2VlIFtSZW5kZXIgd29ybGQgY29waWVzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9yZW5kZXItd29ybGQtY29waWVzLylcclxuICAgICAqL1xyXG4gICAgZ2V0UmVuZGVyV29ybGRDb3BpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgYHJlbmRlcldvcmxkQ29waWVzYC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlbmRlcldvcmxkQ29waWVzIElmIGB0cnVlYCwgbXVsdGlwbGUgY29waWVzIG9mIHRoZSB3b3JsZCB3aWxsIGJlIHJlbmRlcmVkIHNpZGUgYnkgc2lkZSBiZXlvbmQgLTE4MCBhbmQgMTgwIGRlZ3JlZXMgbG9uZ2l0dWRlLiBJZiBzZXQgdG8gYGZhbHNlYDpcclxuICAgICAqIC0gV2hlbiB0aGUgbWFwIGlzIHpvb21lZCBvdXQgZmFyIGVub3VnaCB0aGF0IGEgc2luZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3b3JsZCBkb2VzIG5vdCBmaWxsIHRoZSBtYXAncyBlbnRpcmVcclxuICAgICAqIGNvbnRhaW5lciwgdGhlcmUgd2lsbCBiZSBibGFuayBzcGFjZSBiZXlvbmQgMTgwIGFuZCAtMTgwIGRlZ3JlZXMgbG9uZ2l0dWRlLlxyXG4gICAgICogLSBGZWF0dXJlcyB0aGF0IGNyb3NzIDE4MCBhbmQgLTE4MCBkZWdyZWVzIGxvbmdpdHVkZSB3aWxsIGJlIGN1dCBpbiB0d28gKHdpdGggb25lIHBvcnRpb24gb24gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlXHJcbiAgICAgKiBtYXAgYW5kIHRoZSBvdGhlciBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYXApIGF0IGV2ZXJ5IHpvb20gbGV2ZWwuXHJcbiAgICAgKlxyXG4gICAgICogYHVuZGVmaW5lZGAgaXMgdHJlYXRlZCBhcyBgdHJ1ZWAsIGBudWxsYCBpcyB0cmVhdGVkIGFzIGBmYWxzZWAuXHJcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBtYXAuc2V0UmVuZGVyV29ybGRDb3BpZXModHJ1ZSk7XHJcbiAgICAgKiBAc2VlIFtSZW5kZXIgd29ybGQgY29waWVzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9yZW5kZXItd29ybGQtY29waWVzLylcclxuICAgICAqL1xyXG4gICAgc2V0UmVuZGVyV29ybGRDb3BpZXMocmVuZGVyV29ybGRDb3BpZXM/OiA/Ym9vbGVhbikge1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzID0gcmVuZGVyV29ybGRDb3BpZXM7XHJcbiAgICAgICAgdGhpcy5jcnMucmVuZGVyV29ybGRDb3BpZXMgPSByZW5kZXJXb3JsZENvcGllcztcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFBvaW50fSByZXByZXNlbnRpbmcgcGl4ZWwgY29vcmRpbmF0ZXMsIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBgY29udGFpbmVyYCxcclxuICAgICAqIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc3BlY2lmaWVkIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIHRvIHByb2plY3QuXHJcbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IFRoZSB7QGxpbmsgUG9pbnR9IGNvcnJlc3BvbmRpbmcgdG8gYGxuZ2xhdGAsIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBgY29udGFpbmVyYC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgY29vcmRpbmF0ZSA9IFstMTIyLjQyMDY3OSwgMzcuNzcyNTM3XTtcclxuICAgICAqIHZhciBwb2ludCA9IG1hcC5wcm9qZWN0KGNvb3JkaW5hdGUpO1xyXG4gICAgICovXHJcbiAgICBwcm9qZWN0KGxuZ2xhdDogTG5nTGF0TGlrZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHtAbGluayBMbmdMYXR9IHJlcHJlc2VudGluZyBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgdGhhdCBjb3JyZXNwb25kXHJcbiAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHBpeGVsIGNvb3JkaW5hdGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBwb2ludCBUaGUgcGl4ZWwgY29vcmRpbmF0ZXMgdG8gdW5wcm9qZWN0LlxyXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIHtAbGluayBMbmdMYXR9IGNvcnJlc3BvbmRpbmcgdG8gYHBvaW50YC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICogICAvLyBXaGVuIHRoZSBtYXAgaXMgY2xpY2tlZCwgZ2V0IHRoZSBnZW9ncmFwaGljIGNvb3JkaW5hdGUuXHJcbiAgICAgKiAgIHZhciBjb29yZGluYXRlID0gbWFwLnVucHJvamVjdChlLnBvaW50KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB1bnByb2plY3QocG9pbnQ6IFBvaW50TGlrZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKFBvaW50LmNvbnZlcnQocG9pbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHBhbm5pbmcsIHpvb21pbmcsIHJvdGF0aW5nLCBvciBwaXRjaGluZyBkdWUgdG8gYSBjYW1lcmEgYW5pbWF0aW9uIG9yIHVzZXIgZ2VzdHVyZS5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXAgaXMgbW92aW5nLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciBpc01vdmluZyA9IG1hcC5pc01vdmluZygpO1xyXG4gICAgICovXHJcbiAgICBpc01vdmluZygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbW92aW5nIHx8IHRoaXMuaGFuZGxlcnMuaXNNb3ZpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHpvb21pbmcgZHVlIHRvIGEgY2FtZXJhIGFuaW1hdGlvbiBvciB1c2VyIGdlc3R1cmUuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWFwIGlzIHpvb21pbmcuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIGlzWm9vbWluZyA9IG1hcC5pc1pvb21pbmcoKTtcclxuICAgICAqL1xyXG4gICAgaXNab29taW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl96b29taW5nIHx8IHRoaXMuaGFuZGxlcnMuaXNab29taW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcCBpcyByb3RhdGluZyBkdWUgdG8gYSBjYW1lcmEgYW5pbWF0aW9uIG9yIHVzZXIgZ2VzdHVyZS5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXAgaXMgcm90YXRpbmcuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbWFwLmlzUm90YXRpbmcoKTtcclxuICAgICAqL1xyXG4gICAgaXNSb3RhdGluZygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpbmcgfHwgdGhpcy5oYW5kbGVycy5pc1JvdGF0aW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHR5cGU6IE1hcEV2ZW50LCBsYXllcklkOiBhbnksIGxpc3RlbmVyOiBhbnkpIHtcclxuICAgICAgICBpZiAodHlwZSA9PT0gXCJtb3VzZWVudGVyXCIgfHwgdHlwZSA9PT0gXCJtb3VzZW92ZXJcIikge1xyXG4gICAgICAgICAgICBsZXQgbW91c2VpbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBtb3VzZW1vdmUgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdldExheWVyKGxheWVySWQpXHJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7IGxheWVyczogW2xheWVySWRdIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgOiBbXTtcclxuICAgICAgICAgICAgICAgIGlmICghZmVhdHVyZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbW91c2Vpbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYXBNb3VzZUV2ZW50KHR5cGUsIHRoaXMsIGUub3JpZ2luYWxFdmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgbW91c2VvdXQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBtb3VzZWluID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBsYXllcjogbGF5ZXJJZCxcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxyXG4gICAgICAgICAgICAgICAgZGVsZWdhdGVzOiB7IG1vdXNlbW92ZSwgbW91c2VvdXQgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibW91c2VsZWF2ZVwiIHx8IHR5cGUgPT09IFwibW91c2VvdXRcIikge1xyXG4gICAgICAgICAgICBsZXQgbW91c2VpbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBtb3VzZW1vdmUgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdldExheWVyKGxheWVySWQpXHJcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7IGxheWVyczogW2xheWVySWRdIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgOiBbXTtcclxuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZWluID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW91c2Vpbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwTW91c2VFdmVudCh0eXBlLCB0aGlzLCBlLm9yaWdpbmFsRXZlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3QgbW91c2VvdXQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1vdXNlaW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBtb3VzZWluID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hcE1vdXNlRXZlbnQodHlwZSwgdGhpcywgZS5vcmlnaW5hbEV2ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBsYXllcjogbGF5ZXJJZCxcclxuICAgICAgICAgICAgICAgIGxpc3RlbmVyLFxyXG4gICAgICAgICAgICAgICAgZGVsZWdhdGVzOiB7IG1vdXNlbW92ZSwgbW91c2VvdXQgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZClcclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGUucG9pbnQsIHsgbGF5ZXJzOiBbbGF5ZXJJZF0gfSlcclxuICAgICAgICAgICAgICAgICAgICA6IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgbmVlZCB0byBtdXRhdGUgdGhlIG9yaWdpbmFsIGV2ZW50LCBzbyB0aGF0IHByZXZlbnREZWZhdWx0IHdvcmtzIGFzIGV4cGVjdGVkLlxyXG4gICAgICAgICAgICAgICAgICAgIGUuZmVhdHVyZXMgPSBmZWF0dXJlcztcclxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlLmZlYXR1cmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXI6IGxheWVySWQsXHJcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcixcclxuICAgICAgICAgICAgICAgIGRlbGVnYXRlczogeyBbdHlwZV06IGRlbGVnYXRlIH0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciBldmVudHMgb2YgYSBzcGVjaWZpZWQgdHlwZSwgb3B0aW9uYWxseSBsaW1pdGVkIHRvIGZlYXR1cmVzIGluIGEgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGxpc3RlbiBmb3IuIEV2ZW50cyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIgYXJlIHRyaWdnZXJlZFxyXG4gICAgICogd2hlbiB0aGUgY3Vyc29yIGVudGVycyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyIGZyb20gb3V0c2lkZSB0aGF0IGxheWVyIG9yIG91dHNpZGUgdGhlIG1hcCBjYW52YXMuXHJcbiAgICAgKlxyXG4gICAgICogfCBFdmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb21wYXRpYmxlIHdpdGggYGxheWVySWRgIHxcclxuICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XHJcbiAgICAgKiB8IFtgbW91c2Vkb3duYF0oI21hcC5ldmVudDptb3VzZWRvd24pICAgICAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYG1vdXNldXBgXSgjbWFwLmV2ZW50Om1vdXNldXApICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2Btb3VzZW92ZXJgXSgjbWFwLmV2ZW50Om1vdXNlb3ZlcikgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgbW91c2VvdXRgXSgjbWFwLmV2ZW50Om1vdXNlb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYG1vdXNlbW92ZWBdKCNtYXAuZXZlbnQ6bW91c2Vtb3ZlKSAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2Btb3VzZWVudGVyYF0oI21hcC5ldmVudDptb3VzZWVudGVyKSAgICAgICAgICAgICAgICAgICAgIHwgeWVzIChyZXF1aXJlZCkgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgbW91c2VsZWF2ZWBdKCNtYXAuZXZlbnQ6bW91c2VsZWF2ZSkgICAgICAgICAgICAgICAgICAgICB8IHllcyAocmVxdWlyZWQpICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYGNsaWNrYF0oI21hcC5ldmVudDpjbGljaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2BkYmxjbGlja2BdKCNtYXAuZXZlbnQ6ZGJsY2xpY2spICAgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgY29udGV4dG1lbnVgXSgjbWFwLmV2ZW50OmNvbnRleHRtZW51KSAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHRvdWNoc3RhcnRgXSgjbWFwLmV2ZW50OnRvdWNoc3RhcnQpICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2B0b3VjaGVuZGBdKCNtYXAuZXZlbnQ6dG91Y2hlbmQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgdG91Y2hjYW5jZWxgXSgjbWFwLmV2ZW50OnRvdWNoY2FuY2VsKSAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHdoZWVsYF0oI21hcC5ldmVudDp3aGVlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2ByZXNpemVgXSgjbWFwLmV2ZW50OnJlc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgcmVtb3ZlYF0oI21hcC5ldmVudDpyZW1vdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHRvdWNobW92ZWBdKCNtYXAuZXZlbnQ6dG91Y2htb3ZlKSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2Btb3Zlc3RhcnRgXSgjbWFwLmV2ZW50Om1vdmVzdGFydCkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgbW92ZWBdKCNtYXAuZXZlbnQ6bW92ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYG1vdmVlbmRgXSgjbWFwLmV2ZW50Om1vdmVlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2BkcmFnc3RhcnRgXSgjbWFwLmV2ZW50OmRyYWdzdGFydCkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgZHJhZ2BdKCNtYXAuZXZlbnQ6ZHJhZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYGRyYWdlbmRgXSgjbWFwLmV2ZW50OmRyYWdlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2B6b29tc3RhcnRgXSgjbWFwLmV2ZW50Onpvb21zdGFydCkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgem9vbWBdKCNtYXAuZXZlbnQ6em9vbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHpvb21lbmRgXSgjbWFwLmV2ZW50Onpvb21lbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2Byb3RhdGVzdGFydGBdKCNtYXAuZXZlbnQ6cm90YXRlc3RhcnQpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgcm90YXRlYF0oI21hcC5ldmVudDpyb3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHJvdGF0ZWVuZGBdKCNtYXAuZXZlbnQ6cm90YXRlZW5kKSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2BwaXRjaHN0YXJ0YF0oI21hcC5ldmVudDpwaXRjaHN0YXJ0KSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgcGl0Y2hgXSgjbWFwLmV2ZW50OnBpdGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHBpdGNoZW5kYF0oI21hcC5ldmVudDpwaXRjaGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2Bib3h6b29tc3RhcnRgXSgjbWFwLmV2ZW50OmJveHpvb21zdGFydCkgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgYm94em9vbWVuZGBdKCNtYXAuZXZlbnQ6Ym94em9vbWVuZCkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYGJveHpvb21jYW5jZWxgXSgjbWFwLmV2ZW50OmJveHpvb21jYW5jZWwpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2B3ZWJnbGNvbnRleHRsb3N0YF0oI21hcC5ldmVudDp3ZWJnbGNvbnRleHRsb3N0KSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgd2ViZ2xjb250ZXh0cmVzdG9yZWRgXSgjbWFwLmV2ZW50OndlYmdsY29udGV4dHJlc3RvcmVkKSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYGxvYWRgXSgjbWFwLmV2ZW50OmxvYWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2ByZW5kZXJgXSgjbWFwLmV2ZW50OnJlbmRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgaWRsZWBdKCNtYXAuZXZlbnQ6aWRsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYGVycm9yYF0oI21hcC5ldmVudDplcnJvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2BkYXRhYF0oI21hcC5ldmVudDpkYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgc3R5bGVkYXRhYF0oI21hcC5ldmVudDpzdHlsZWRhdGEpICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHNvdXJjZWRhdGFgXSgjbWFwLmV2ZW50OnNvdXJjZWRhdGEpICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2BkYXRhbG9hZGluZ2BdKCNtYXAuZXZlbnQ6ZGF0YWxvYWRpbmcpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKiB8IFtgc3R5bGVkYXRhbG9hZGluZ2BdKCNtYXAuZXZlbnQ6c3R5bGVkYXRhbG9hZGluZykgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxyXG4gICAgICogfCBbYHNvdXJjZWRhdGFsb2FkaW5nYF0oI21hcC5ldmVudDpzb3VyY2VkYXRhbG9hZGluZykgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcclxuICAgICAqIHwgW2BzdHlsZWltYWdlbWlzc2luZ2BdKCNtYXAuZXZlbnQ6c3R5bGVpbWFnZW1pc3NpbmcpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgKG9wdGlvbmFsKSBUaGUgSUQgb2YgYSBzdHlsZSBsYXllci4gRXZlbnQgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBpZiBpdHMgbG9jYXRpb25cclxuICAgICAqIGlzIHdpdGhpbiBhIHZpc2libGUgZmVhdHVyZSBpbiB0aGlzIGxheWVyLiBUaGUgZXZlbnQgd2lsbCBoYXZlIGEgYGZlYXR1cmVzYCBwcm9wZXJ0eSBjb250YWluaW5nXHJcbiAgICAgKiBhbiBhcnJheSBvZiB0aGUgbWF0Y2hpbmcgZmVhdHVyZXMuIElmIGBsYXllcklkYCBpcyBub3Qgc3VwcGxpZWQsIHRoZSBldmVudCB3aWxsIG5vdCBoYXZlIGEgYGZlYXR1cmVzYCBwcm9wZXJ0eS5cclxuICAgICAqIFBsZWFzZSBub3RlIHRoYXQgbWFueSBldmVudCB0eXBlcyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGZpcmVcclxuICAgICAqIC8vIHdoZW4gdGhlIG1hcCBoYXMgZmluaXNoZWQgbG9hZGluZ1xyXG4gICAgICogbWFwLm9uKCdsb2FkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgKiAgIC8vIE9uY2UgdGhlIG1hcCBoYXMgZmluaXNoZWQgbG9hZGluZyxcclxuICAgICAqICAgLy8gYWRkIGEgbmV3IGxheWVyXHJcbiAgICAgKiAgIG1hcC5hZGRMYXllcih7XHJcbiAgICAgKiAgICAgaWQ6ICdwb2ludHMtb2YtaW50ZXJlc3QnLFxyXG4gICAgICogICAgIHNvdXJjZToge1xyXG4gICAgICogICAgICAgdHlwZTogJ3ZlY3RvcicsXHJcbiAgICAgKiAgICAgICB1cmw6ICdtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjgnXHJcbiAgICAgKiAgICAgfSxcclxuICAgICAqICAgICAnc291cmNlLWxheWVyJzogJ3BvaV9sYWJlbCcsXHJcbiAgICAgKiAgICAgdHlwZTogJ2NpcmNsZScsXHJcbiAgICAgKiAgICAgcGFpbnQ6IHtcclxuICAgICAqICAgICAgIC8vIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uIHBhaW50IHByb3BlcnRpZXNcclxuICAgICAqICAgICB9LFxyXG4gICAgICogICAgIGxheW91dDoge1xyXG4gICAgICogICAgICAgLy8gTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gbGF5b3V0IHByb3BlcnRpZXNcclxuICAgICAqICAgICB9XHJcbiAgICAgKiAgIH0pO1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBmaXJlXHJcbiAgICAgKiAvLyB3aGVuIGEgZmVhdHVyZSBvbiB0aGUgY291bnRyaWVzIGxheWVyIG9mIHRoZSBtYXAgaXMgY2xpY2tlZFxyXG4gICAgICogbWFwLm9uKCdjbGljaycsICdjb3VudHJpZXMnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgKiAgIG5ldyBtYXBib3hnbC5Qb3B1cCgpXHJcbiAgICAgKiAgICAgLnNldExuZ0xhdChlLmxuZ0xhdClcclxuICAgICAqICAgICAuc2V0SFRNTChgQ291bnRyeSBuYW1lOiAke2UuZmVhdHVyZXNbMF0ucHJvcGVydGllcy5uYW1lfWApXHJcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XHJcbiAgICAgKiB9KTtcclxuICAgICAqIEBzZWUgW0Rpc3BsYXkgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcclxuICAgICAqIEBzZWUgW0NlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxyXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgaG92ZXIgZWZmZWN0XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxyXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIG1hcmtlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcclxuICAgICAqL1xyXG4gICAgb24odHlwZTogTWFwRXZlbnQsIGxheWVySWQ6IGFueSwgbGlzdGVuZXI6IGFueSkge1xyXG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5vbih0eXBlLCBsYXllcklkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbGVnYXRlZExpc3RlbmVyID0gdGhpcy5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIoXHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIGxheWVySWQsXHJcbiAgICAgICAgICAgIGxpc3RlbmVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzID0gdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzIHx8IHt9O1xyXG4gICAgICAgIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXSA9IHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXSB8fCBbXTtcclxuICAgICAgICB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0ucHVzaChkZWxlZ2F0ZWRMaXN0ZW5lcik7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMub24oKGV2ZW50OiBhbnkpLCBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXNbZXZlbnRdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUuXHJcbiAgICAgKlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG5hbWUgb25jZVxyXG4gICAgICogQG1lbWJlcm9mIE1hcFxyXG4gICAgICogQGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBhZGQgYSBsaXN0ZW5lciBmb3IuXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLlxyXG4gICAgICogICBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byBgZmlyZWAsXHJcbiAgICAgKiAgIGV4dGVuZGVkIHdpdGggYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzLlxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSB0byBhIHNwZWNpZmllZCBldmVudCB0eXBlIG9jY3VycmluZyBvbiBmZWF0dXJlcyBpbiBhIHNwZWNpZmllZCBzdHlsZSBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yOyBvbmUgb2YgYCdtb3VzZWRvd24nYCwgYCdtb3VzZXVwJ2AsIGAnY2xpY2snYCwgYCdkYmxjbGljaydgLFxyXG4gICAgICogYCdtb3VzZW1vdmUnYCwgYCdtb3VzZWVudGVyJ2AsIGAnbW91c2VsZWF2ZSdgLCBgJ21vdXNlb3ZlcidgLCBgJ21vdXNlb3V0J2AsIGAnY29udGV4dG1lbnUnYCwgYCd0b3VjaHN0YXJ0J2AsXHJcbiAgICAgKiBgJ3RvdWNoZW5kJ2AsIG9yIGAndG91Y2hjYW5jZWwnYC4gYG1vdXNlZW50ZXJgIGFuZCBgbW91c2VvdmVyYCBldmVudHMgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjdXJzb3IgZW50ZXJzXHJcbiAgICAgKiBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyIGZyb20gb3V0c2lkZSB0aGF0IGxheWVyIG9yIG91dHNpZGUgdGhlIG1hcCBjYW52YXMuIGBtb3VzZWxlYXZlYFxyXG4gICAgICogYW5kIGBtb3VzZW91dGAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY3Vyc29yIGxlYXZlcyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLCBvciBsZWF2ZXNcclxuICAgICAqIHRoZSBtYXAgY2FudmFzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIGEgc3R5bGUgbGF5ZXIuIE9ubHkgZXZlbnRzIHdob3NlIGxvY2F0aW9uIGlzIHdpdGhpbiBhIHZpc2libGVcclxuICAgICAqIGZlYXR1cmUgaW4gdGhpcyBsYXllciB3aWxsIHRyaWdnZXIgdGhlIGxpc3RlbmVyLiBUaGUgZXZlbnQgd2lsbCBoYXZlIGEgYGZlYXR1cmVzYCBwcm9wZXJ0eSBjb250YWluaW5nXHJcbiAgICAgKiBhbiBhcnJheSBvZiB0aGUgbWF0Y2hpbmcgZmVhdHVyZXMuXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkLlxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKi9cclxuXHJcbiAgICBvbmNlKHR5cGU6IE1hcEV2ZW50LCBsYXllcklkOiBhbnksIGxpc3RlbmVyOiBhbnkpIHtcclxuICAgICAgICBpZiAobGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIub25jZSh0eXBlLCBsYXllcklkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbGVnYXRlZExpc3RlbmVyID0gdGhpcy5fY3JlYXRlRGVsZWdhdGVkTGlzdGVuZXIoXHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIGxheWVySWQsXHJcbiAgICAgICAgICAgIGxpc3RlbmVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBldmVudCBpbiBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5vbmNlKChldmVudDogYW55KSwgZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzW2V2ZW50XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgcHJldmlvdXNseSBhZGRlZCB3aXRoIGBNYXAjb25gLlxyXG4gICAgICpcclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBuYW1lIG9mZlxyXG4gICAgICogQG1lbWJlcm9mIE1hcFxyXG4gICAgICogQGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSBwcmV2aW91c2x5IHVzZWQgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gcHJldmlvdXNseSBpbnN0YWxsZWQgYXMgYSBsaXN0ZW5lci5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciBsYXllci1zcGVjaWZpYyBldmVudHMgcHJldmlvdXNseSBhZGRlZCB3aXRoIGBNYXAjb25gLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHByZXZpb3VzbHkgdXNlZCB0byBpbnN0YWxsIHRoZSBsaXN0ZW5lci5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBsYXllciBJRCBwcmV2aW91c2x5IHVzZWQgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gcHJldmlvdXNseSBpbnN0YWxsZWQgYXMgYSBsaXN0ZW5lci5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICovXHJcbiAgICBvZmYodHlwZTogTWFwRXZlbnQsIGxheWVySWQ6IGFueSwgbGlzdGVuZXI6IGFueSkge1xyXG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5vZmYodHlwZSwgbGF5ZXJJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZW1vdmVEZWxlZ2F0ZWRMaXN0ZW5lciA9IChkZWxlZ2F0ZWRMaXN0ZW5lcnMpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZGVsZWdhdGVkTGlzdGVuZXJzW3R5cGVdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsZWdhdGVkTGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVkTGlzdGVuZXIubGF5ZXIgPT09IGxheWVySWQgJiZcclxuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZWRMaXN0ZW5lci5saXN0ZW5lciA9PT0gbGlzdGVuZXJcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50OiBhbnkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzW2V2ZW50XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlZExpc3RlbmVycyAmJiB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgcmVtb3ZlRGVsZWdhdGVkTGlzdGVuZXIodGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcclxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKVxyXG4gICAgICogcmVwcmVzZW50aW5nIHZpc2libGUgZmVhdHVyZXMgdGhhdCBzYXRpc2Z5IHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfEFycmF5PFBvaW50TGlrZT59IFtnZW9tZXRyeV0gLSBUaGUgZ2VvbWV0cnkgb2YgdGhlIHF1ZXJ5IHJlZ2lvbjpcclxuICAgICAqIGVpdGhlciBhIHNpbmdsZSBwb2ludCBvciBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBwb2ludHMgZGVzY3JpYmluZyBhIGJvdW5kaW5nIGJveC5cclxuICAgICAqIE9taXR0aW5nIHRoaXMgcGFyYW1ldGVyIChpLmUuIGNhbGxpbmcge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IHdpdGggemVybyBhcmd1bWVudHMsXHJcbiAgICAgKiBvciB3aXRoIG9ubHkgYSBgb3B0aW9uc2AgYXJndW1lbnQpIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBhIGJvdW5kaW5nIGJveCBlbmNvbXBhc3NpbmcgdGhlIGVudGlyZVxyXG4gICAgICogbWFwIHZpZXdwb3J0LlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW29wdGlvbnMubGF5ZXJzXSBBbiBhcnJheSBvZiBbc3R5bGUgbGF5ZXIgSURzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5ZXItaWQpIGZvciB0aGUgcXVlcnkgdG8gaW5zcGVjdC5cclxuICAgICAqICAgT25seSBmZWF0dXJlcyB3aXRoaW4gdGhlc2UgbGF5ZXJzIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCwgYWxsIGxheWVycyB3aWxsIGJlIGNoZWNrZWQuXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5maWx0ZXJdIEEgW2ZpbHRlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLyNmaWx0ZXIpXHJcbiAgICAgKiAgIHRvIGxpbWl0IHF1ZXJ5IHJlc3VsdHMuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgdGhlIFtvcHRpb25zLmZpbHRlcl0gY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IEFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxyXG4gICAgICogW2ZlYXR1cmUgb2JqZWN0c10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjIpLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBgcHJvcGVydGllc2AgdmFsdWUgb2YgZWFjaCByZXR1cm5lZCBmZWF0dXJlIG9iamVjdCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiBpdHMgc291cmNlIGZlYXR1cmUuIEZvciBHZW9KU09OIHNvdXJjZXMsIG9ubHlcclxuICAgICAqIHN0cmluZyBhbmQgbnVtZXJpYyBwcm9wZXJ0eSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCAoaS5lLiBgbnVsbGAsIGBBcnJheWAsIGFuZCBgT2JqZWN0YCB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQpLlxyXG4gICAgICpcclxuICAgICAqIEVhY2ggZmVhdHVyZSBpbmNsdWRlcyB0b3AtbGV2ZWwgYGxheWVyYCwgYHNvdXJjZWAsIGFuZCBgc291cmNlTGF5ZXJgIHByb3BlcnRpZXMuIFRoZSBgbGF5ZXJgIHByb3BlcnR5IGlzIGFuIG9iamVjdFxyXG4gICAgICogcmVwcmVzZW50aW5nIHRoZSBzdHlsZSBsYXllciB0byAgd2hpY2ggdGhlIGZlYXR1cmUgYmVsb25ncy4gTGF5b3V0IGFuZCBwYWludCBwcm9wZXJ0aWVzIGluIHRoaXMgb2JqZWN0IGNvbnRhaW4gdmFsdWVzXHJcbiAgICAgKiB3aGljaCBhcmUgZnVsbHkgZXZhbHVhdGVkIGZvciB0aGUgZ2l2ZW4gem9vbSBsZXZlbCBhbmQgZmVhdHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBPbmx5IGZlYXR1cmVzIHRoYXQgYXJlIGN1cnJlbnRseSByZW5kZXJlZCBhcmUgaW5jbHVkZWQuIFNvbWUgZmVhdHVyZXMgd2lsbCAqKm5vdCoqIGJlIGluY2x1ZGVkLCBsaWtlOlxyXG4gICAgICpcclxuICAgICAqIC0gRmVhdHVyZXMgZnJvbSBsYXllcnMgd2hvc2UgYHZpc2liaWxpdHlgIHByb3BlcnR5IGlzIGBcIm5vbmVcImAuXHJcbiAgICAgKiAtIEZlYXR1cmVzIGZyb20gbGF5ZXJzIHdob3NlIHpvb20gcmFuZ2UgZXhjbHVkZXMgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cclxuICAgICAqIC0gU3ltYm9sIGZlYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGhpZGRlbiBkdWUgdG8gdGV4dCBvciBpY29uIGNvbGxpc2lvbi5cclxuICAgICAqXHJcbiAgICAgKiBGZWF0dXJlcyBmcm9tIGFsbCBvdGhlciBsYXllcnMgYXJlIGluY2x1ZGVkLCBpbmNsdWRpbmcgZmVhdHVyZXMgdGhhdCBtYXkgaGF2ZSBubyB2aXNpYmxlXHJcbiAgICAgKiBjb250cmlidXRpb24gdG8gdGhlIHJlbmRlcmVkIHJlc3VsdDsgZm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhlIGxheWVyJ3Mgb3BhY2l0eSBvciBjb2xvciBhbHBoYSBjb21wb25lbnQgaXMgc2V0IHRvXHJcbiAgICAgKiAwLlxyXG4gICAgICpcclxuICAgICAqIFRoZSB0b3Btb3N0IHJlbmRlcmVkIGZlYXR1cmUgYXBwZWFycyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXksIGFuZCBzdWJzZXF1ZW50IGZlYXR1cmVzIGFyZSBzb3J0ZWQgYnlcclxuICAgICAqIGRlc2NlbmRpbmcgei1vcmRlci4gRmVhdHVyZXMgdGhhdCBhcmUgcmVuZGVyZWQgbXVsdGlwbGUgdGltZXMgKGR1ZSB0byB3cmFwcGluZyBhY3Jvc3MgdGhlIGFudGltZXJpZGlhbiBhdCBsb3dcclxuICAgICAqIHpvb20gbGV2ZWxzKSBhcmUgcmV0dXJuZWQgb25seSBvbmNlICh0aG91Z2ggc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNhdmVhdCkuXHJcbiAgICAgKlxyXG4gICAgICogQmVjYXVzZSBmZWF0dXJlcyBjb21lIGZyb20gdGlsZWQgdmVjdG9yIGRhdGEgb3IgR2VvSlNPTiBkYXRhIHRoYXQgaXMgY29udmVydGVkIHRvIHRpbGVzIGludGVybmFsbHksIGZlYXR1cmVcclxuICAgICAqIGdlb21ldHJpZXMgbWF5IGJlIHNwbGl0IG9yIGR1cGxpY2F0ZWQgYWNyb3NzIHRpbGUgYm91bmRhcmllcyBhbmQsIGFzIGEgcmVzdWx0LCBmZWF0dXJlcyBtYXkgYXBwZWFyIG11bHRpcGxlXHJcbiAgICAgKiB0aW1lcyBpbiBxdWVyeSByZXN1bHRzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGVyZSBpcyBhIGhpZ2h3YXkgcnVubmluZyB0aHJvdWdoIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgYSBxdWVyeS5cclxuICAgICAqIFRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSB3aWxsIGJlIHRob3NlIHBhcnRzIG9mIHRoZSBoaWdod2F5IHRoYXQgbGllIHdpdGhpbiB0aGUgbWFwIHRpbGVzIGNvdmVyaW5nIHRoZSBib3VuZGluZ1xyXG4gICAgICogcmVjdGFuZ2xlLCBldmVuIGlmIHRoZSBoaWdod2F5IGV4dGVuZHMgaW50byBvdGhlciB0aWxlcywgYW5kIHRoZSBwb3J0aW9uIG9mIHRoZSBoaWdod2F5IHdpdGhpbiBlYWNoIG1hcCB0aWxlXHJcbiAgICAgKiB3aWxsIGJlIHJldHVybmVkIGFzIGEgc2VwYXJhdGUgZmVhdHVyZS4gU2ltaWxhcmx5LCBhIHBvaW50IGZlYXR1cmUgbmVhciBhIHRpbGUgYm91bmRhcnkgbWF5IGFwcGVhciBpbiBtdWx0aXBsZVxyXG4gICAgICogdGlsZXMgZHVlIHRvIHRpbGUgYnVmZmVyaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyBhdCBhIHBvaW50XHJcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxyXG4gICAgICogICBbMjAsIDM1XSxcclxuICAgICAqICAgeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH1cclxuICAgICAqICk7XHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIHdpdGhpbiBhIHN0YXRpYyBib3VuZGluZyBib3hcclxuICAgICAqIHZhciBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoXHJcbiAgICAgKiAgIFtbMTAsIDIwXSwgWzMwLCA1MF1dLFxyXG4gICAgICogICB7IGxheWVyczogWydteS1sYXllci1uYW1lJ10gfVxyXG4gICAgICogKTtcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gRmluZCBhbGwgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94IGFyb3VuZCBhIHBvaW50XHJcbiAgICAgKiB2YXIgd2lkdGggPSAxMDtcclxuICAgICAqIHZhciBoZWlnaHQgPSAyMDtcclxuICAgICAqIHZhciBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoW1xyXG4gICAgICogICBbcG9pbnQueCAtIHdpZHRoIC8gMiwgcG9pbnQueSAtIGhlaWdodCAvIDJdLFxyXG4gICAgICogICBbcG9pbnQueCArIHdpZHRoIC8gMiwgcG9pbnQueSArIGhlaWdodCAvIDJdXHJcbiAgICAgKiBdLCB7IGxheWVyczogWydteS1sYXllci1uYW1lJ10gfSk7XHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIFF1ZXJ5IGFsbCByZW5kZXJlZCBmZWF0dXJlcyBmcm9tIGEgc2luZ2xlIGxheWVyXHJcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHsgbGF5ZXJzOiBbJ215LWxheWVyLW5hbWUnXSB9KTtcclxuICAgICAqIEBzZWUgW0dldCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxyXG4gICAgICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcclxuICAgICAqIEBzZWUgW0ZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXHJcbiAgICAgKi9cclxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcclxuICAgICAgICBnZW9tZXRyeT86IFBvaW50TGlrZSB8IFtQb2ludExpa2UsIFBvaW50TGlrZV0sXHJcbiAgICAgICAgb3B0aW9ucz86IE9iamVjdFxyXG4gICAgKSB7XHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBjYW4gYmUgb21pdHRlZCBlbnRpcmVseSwgbWFraW5nIHRoaXMgZWZmZWN0aXZlbHkgYW4gb3ZlcmxvYWRlZCBtZXRob2RcclxuICAgICAgICAvLyB3aXRoIHR3byBzaWduYXR1cmVzOlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhnZW9tZXRyeTogUG9pbnRMaWtlIHwgW1BvaW50TGlrZSwgUG9pbnRMaWtlXSwgb3B0aW9ucz86IE9iamVjdClcclxuICAgICAgICAvLyAgICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKG9wdGlvbnM/OiBPYmplY3QpXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBUaGVyZSBubyB3YXkgdG8gZXhwcmVzcyB0aGF0IGluIGEgd2F5IHRoYXQncyBjb21wYXRpYmxlIHdpdGggYm90aCBmbG93IGFuZCBkb2N1bWVudGF0aW9uLmpzLlxyXG4gICAgICAgIC8vIFJlbGF0ZWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNTU2XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zdHlsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICEoZ2VvbWV0cnkgaW5zdGFuY2VvZiBQb2ludCkgJiZcclxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZ2VvbWV0cnkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSAoZ2VvbWV0cnk6IE9iamVjdCk7XHJcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcbiAgICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeSB8fCBbXHJcbiAgICAgICAgICAgIFswLCAwXSxcclxuICAgICAgICAgICAgW3RoaXMudHJhbnNmb3JtLndpZHRoLCB0aGlzLnRyYW5zZm9ybS5oZWlnaHRdLFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGxldCBxdWVyeUdlb21ldHJ5O1xyXG4gICAgICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIFBvaW50IHx8IHR5cGVvZiBnZW9tZXRyeVswXSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5ID0gW1BvaW50LmNvbnZlcnQoZ2VvbWV0cnkpXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0bCA9IFBvaW50LmNvbnZlcnQoZ2VvbWV0cnlbMF0pO1xyXG4gICAgICAgICAgICBjb25zdCBiciA9IFBvaW50LmNvbnZlcnQoZ2VvbWV0cnlbMV0pO1xyXG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5ID0gW1xyXG4gICAgICAgICAgICAgICAgdGwsXHJcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoYnIueCwgdGwueSksXHJcbiAgICAgICAgICAgICAgICBicixcclxuICAgICAgICAgICAgICAgIG5ldyBQb2ludCh0bC54LCBici55KSxcclxuICAgICAgICAgICAgICAgIHRsLFxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxyXG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5LFxyXG4gICAgICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxyXG4gICAgICogW0ZlYXR1cmUgb2JqZWN0c10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjIpXHJcbiAgICAgKiByZXByZXNlbnRpbmcgZmVhdHVyZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgdmVjdG9yIHRpbGUgb3IgR2VvSlNPTiBzb3VyY2UgdGhhdCBzYXRpc2Z5IHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VJZCBUaGUgSUQgb2YgdGhlIHZlY3RvciB0aWxlIG9yIEdlb0pTT04gc291cmNlIHRvIHF1ZXJ5LlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbWV0ZXJzXSBPcHRpb25zIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1ldGVycy5zb3VyY2VMYXllcl0gVGhlIG5hbWUgb2YgdGhlIFtzb3VyY2UgbGF5ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc291cmNlLWxheWVyLylcclxuICAgICAqICAgdG8gcXVlcnkuICpGb3IgdmVjdG9yIHRpbGUgc291cmNlcywgdGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuKiBGb3IgR2VvSlNPTiBzb3VyY2VzLCBpdCBpcyBpZ25vcmVkLlxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcmFtZXRlcnMuZmlsdGVyXSBBIFtmaWx0ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL2xheWVycy8jZmlsdGVyKVxyXG4gICAgICogICB0byBsaW1pdCBxdWVyeSByZXN1bHRzLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIHRoZSBbcGFyYW1ldGVycy5maWx0ZXJdIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcclxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKS5cclxuICAgICAqXHJcbiAgICAgKiBJbiBjb250cmFzdCB0byB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbGwgZmVhdHVyZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsXHJcbiAgICAgKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSByZW5kZXJlZCBieSB0aGUgY3VycmVudCBzdHlsZSAoaS5lLiB2aXNpYmxlKS4gVGhlIGRvbWFpbiBvZiB0aGUgcXVlcnkgaW5jbHVkZXMgYWxsIGN1cnJlbnRseS1sb2FkZWRcclxuICAgICAqIHZlY3RvciB0aWxlcyBhbmQgR2VvSlNPTiBzb3VyY2UgdGlsZXM6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgdGlsZXMgb3V0c2lkZSB0aGUgY3VycmVudGx5XHJcbiAgICAgKiB2aXNpYmxlIHZpZXdwb3J0LlxyXG4gICAgICpcclxuICAgICAqIEJlY2F1c2UgZmVhdHVyZXMgY29tZSBmcm9tIHRpbGVkIHZlY3RvciBkYXRhIG9yIEdlb0pTT04gZGF0YSB0aGF0IGlzIGNvbnZlcnRlZCB0byB0aWxlcyBpbnRlcm5hbGx5LCBmZWF0dXJlXHJcbiAgICAgKiBnZW9tZXRyaWVzIG1heSBiZSBzcGxpdCBvciBkdXBsaWNhdGVkIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMgYW5kLCBhcyBhIHJlc3VsdCwgZmVhdHVyZXMgbWF5IGFwcGVhciBtdWx0aXBsZVxyXG4gICAgICogdGltZXMgaW4gcXVlcnkgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBoaWdod2F5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIGEgcXVlcnkuXHJcbiAgICAgKiBUaGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkgd2lsbCBiZSB0aG9zZSBwYXJ0cyBvZiB0aGUgaGlnaHdheSB0aGF0IGxpZSB3aXRoaW4gdGhlIG1hcCB0aWxlcyBjb3ZlcmluZyB0aGUgYm91bmRpbmdcclxuICAgICAqIHJlY3RhbmdsZSwgZXZlbiBpZiB0aGUgaGlnaHdheSBleHRlbmRzIGludG8gb3RoZXIgdGlsZXMsIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgaGlnaHdheSB3aXRoaW4gZWFjaCBtYXAgdGlsZVxyXG4gICAgICogd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIGZlYXR1cmUuIFNpbWlsYXJseSwgYSBwb2ludCBmZWF0dXJlIG5lYXIgYSB0aWxlIGJvdW5kYXJ5IG1heSBhcHBlYXIgaW4gbXVsdGlwbGVcclxuICAgICAqIHRpbGVzIGR1ZSB0byB0aWxlIGJ1ZmZlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gRmluZCBhbGwgZmVhdHVyZXMgaW4gb25lIHNvdXJjZSBsYXllciBpbiBhIHZlY3RvciBzb3VyY2VcclxuICAgICAqIHZhciBmZWF0dXJlcyA9IG1hcC5xdWVyeVNvdXJjZUZlYXR1cmVzKCd5b3VyLXNvdXJjZS1pZCcsIHtcclxuICAgICAqICAgc291cmNlTGF5ZXI6ICd5b3VyLXNvdXJjZS1sYXllcidcclxuICAgICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyBjb250YWluaW5nIHNpbWlsYXIgZGF0YV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeS1zaW1pbGFyLWZlYXR1cmVzLylcclxuICAgICAqL1xyXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhcclxuICAgICAgICBzb3VyY2VJZDogc3RyaW5nLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6ID97XHJcbiAgICAgICAgICAgIHNvdXJjZUxheWVyOiA/c3RyaW5nLFxyXG4gICAgICAgICAgICBmaWx0ZXI6ID9BcnJheTxhbnk+LFxyXG4gICAgICAgICAgICB2YWxpZGF0ZT86IGJvb2xlYW4sXHJcbiAgICAgICAgfVxyXG4gICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUucXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJZCwgcGFyYW1ldGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBtYXAncyBNYXBib3ggc3R5bGUgb2JqZWN0IHdpdGggYSBuZXcgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgYSBzdHlsZSBpcyBhbHJlYWR5IHNldCB3aGVuIHRoaXMgaXMgdXNlZCBhbmQgb3B0aW9ucy5kaWZmIGlzIHNldCB0byB0cnVlLCB0aGUgbWFwIHJlbmRlcmVyIHdpbGwgYXR0ZW1wdCB0byBjb21wYXJlIHRoZSBnaXZlbiBzdHlsZVxyXG4gICAgICogYWdhaW5zdCB0aGUgbWFwJ3MgY3VycmVudCBzdGF0ZSBhbmQgcGVyZm9ybSBvbmx5IHRoZSBjaGFuZ2VzIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBtYXAgc3R5bGUgbWF0Y2ggdGhlIGRlc2lyZWQgc3RhdGUuIENoYW5nZXMgaW4gc3ByaXRlc1xyXG4gICAgICogKGltYWdlcyB1c2VkIGZvciBpY29ucyBhbmQgcGF0dGVybnMpIGFuZCBnbHlwaHMgKGZvbnRzIGZvciBsYWJlbCB0ZXh0KSAqKmNhbm5vdCoqIGJlIGRpZmZlZC4gSWYgdGhlIHNwcml0ZXMgb3IgZm9udHMgdXNlZCBpbiB0aGUgY3VycmVudFxyXG4gICAgICogc3R5bGUgYW5kIHRoZSBnaXZlbiBzdHlsZSBhcmUgZGlmZmVyZW50IGluIGFueSB3YXksIHRoZSBtYXAgcmVuZGVyZXIgd2lsbCBmb3JjZSBhIGZ1bGwgdXBkYXRlLCByZW1vdmluZyB0aGUgY3VycmVudCBzdHlsZSBhbmQgYnVpbGRpbmdcclxuICAgICAqIHRoZSBnaXZlbiBvbmUgZnJvbSBzY3JhdGNoLlxyXG4gICAgICpcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc3R5bGUgQSBKU09OIG9iamVjdCBjb25mb3JtaW5nIHRvIHRoZSBzY2hlbWEgZGVzY3JpYmVkIGluIHRoZVxyXG4gICAgICogICBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pLCBvciBhIFVSTCB0byBzdWNoIEpTT04uXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaWZmPXRydWVdIElmIGZhbHNlLCBmb3JjZSBhICdmdWxsJyB1cGRhdGUsIHJlbW92aW5nIHRoZSBjdXJyZW50IHN0eWxlXHJcbiAgICAgKiAgIGFuZCBidWlsZGluZyB0aGUgZ2l2ZW4gb25lIGluc3RlYWQgb2YgYXR0ZW1wdGluZyBhIGRpZmYtYmFzZWQgdXBkYXRlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseT0nc2Fucy1zZXJpZiddIERlZmluZXMgYSBDU1NcclxuICAgICAqICAgZm9udC1mYW1pbHkgZm9yIGxvY2FsbHkgb3ZlcnJpZGluZyBnZW5lcmF0aW9uIG9mIGdseXBocyBpbiB0aGUgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnLCAnSGlyYWdhbmEnLCAnS2F0YWthbmEnIGFuZCAnSGFuZ3VsIFN5bGxhYmxlcycgcmFuZ2VzLlxyXG4gICAgICogICBJbiB0aGVzZSByYW5nZXMsIGZvbnQgc2V0dGluZ3MgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUgd2lsbCBiZSBpZ25vcmVkLCBleGNlcHQgZm9yIGZvbnQtd2VpZ2h0IGtleXdvcmRzIChsaWdodC9yZWd1bGFyL21lZGl1bS9ib2xkKS5cclxuICAgICAqICAgU2V0IHRvIGBmYWxzZWAsIHRvIGVuYWJsZSBmb250IHNldHRpbmdzIGZyb20gdGhlIG1hcCdzIHN0eWxlIGZvciB0aGVzZSBnbHlwaCByYW5nZXMuXHJcbiAgICAgKiAgIEZvcmNlcyBhIGZ1bGwgdXBkYXRlLlxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5zZXRTdHlsZShcIm1hcGJveDovL3N0eWxlcy9tYXBib3gvc3RyZWV0cy12MTFcIik7XHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBbQ2hhbmdlIGEgbWFwJ3Mgc3R5bGVdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0c3R5bGUvKVxyXG4gICAgICovXHJcbiAgICBzZXRTdHlsZShcclxuICAgICAgICBzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uIHwgc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBvcHRpb25zPzogeyBkaWZmPzogYm9vbGVhbiB9ICYgU3R5bGVPcHRpb25zXHJcbiAgICApIHtcclxuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgeyBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSB9LFxyXG4gICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBvcHRpb25zLmRpZmYgIT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgIG9wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID09PVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ICYmXHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgJiZcclxuICAgICAgICAgICAgc3R5bGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5fZGlmZlN0eWxlKHN0eWxlLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID0gb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVTdHlsZShzdHlsZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9nZXRVSVN0cmluZyhrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMuX2xvY2FsZVtrZXldO1xyXG4gICAgICAgIGlmIChzdHIgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgVUkgc3RyaW5nICcke2tleX0nYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIF91cGRhdGVTdHlsZShcclxuICAgICAgICBzdHlsZTogU3R5bGVTcGVjaWZpY2F0aW9uIHwgc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBvcHRpb25zPzogeyBkaWZmPzogYm9vbGVhbiB9ICYgU3R5bGVPcHRpb25zXHJcbiAgICApIHtcclxuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzdHlsZSkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZSA9IG5ldyBTdHlsZSh0aGlzLCBvcHRpb25zIHx8IHt9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7IHN0eWxlOiB0aGlzLnN0eWxlIH0pO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUubG9hZFVSTChzdHlsZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkSlNPTihzdHlsZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBfbGF6eUluaXRFbXB0eVN0eWxlKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zdHlsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gbmV3IFN0eWxlKHRoaXMsIHt9KTtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHsgc3R5bGU6IHRoaXMuc3R5bGUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUubG9hZEVtcHR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9kaWZmU3R5bGUoXHJcbiAgICAgICAgc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiB8IHN0cmluZyxcclxuICAgICAgICBvcHRpb25zPzogeyBkaWZmPzogYm9vbGVhbiB9ICYgU3R5bGVPcHRpb25zXHJcbiAgICApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVN0eWxlVVJMKHN0eWxlKTtcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QoXHJcbiAgICAgICAgICAgICAgICB1cmwsXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUuU3R5bGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgZ2V0SlNPTihyZXF1ZXN0LCAoZXJyb3I6ID9FcnJvciwganNvbjogP09iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycm9yKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVEaWZmKGpzb24sIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHlsZSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVEaWZmKHN0eWxlLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3VwZGF0ZURpZmYoXHJcbiAgICAgICAgc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbixcclxuICAgICAgICBvcHRpb25zPzogeyBkaWZmPzogYm9vbGVhbiB9ICYgU3R5bGVPcHRpb25zXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCB2ZWN0b3JUaWxlUmVzb3VyY2VzID0gc3R5bGUuc291cmNlcztcclxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlLnNwcml0ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBjb25zdCBzcHJpdGUgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmVjdG9yVGlsZVJlc291cmNlcykge1xyXG4gICAgICAgICAgICAgICAgc3ByaXRlW2tleV0gPSBzdHlsZS5zcHJpdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3R5bGUuc3ByaXRlID0gc3ByaXRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlLmdseXBocyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBjb25zdCBnbHlwaHMgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmVjdG9yVGlsZVJlc291cmNlcykge1xyXG4gICAgICAgICAgICAgICAgZ2x5cGhzW2tleV0gPSBzdHlsZS5nbHlwaHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3R5bGUuZ2x5cGhzID0gZ2x5cGhzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZS5zZXRTdGF0ZShzdHlsZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgd2Fybk9uY2UoXHJcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHBlcmZvcm0gc3R5bGUgZGlmZjogJHtcclxuICAgICAgICAgICAgICAgICAgICBlLm1lc3NhZ2UgfHwgZS5lcnJvciB8fCBlXHJcbiAgICAgICAgICAgICAgICB9LiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3R5bGUoc3R5bGUsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFkZFN0eWxlKFxyXG4gICAgICAgIHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24gfCBzdHJpbmcsXHJcbiAgICAgICAgYmVmb3JlPzogc3RyaW5nLFxyXG4gICAgICAgIG1pblpvb20/OiA/bnVtYmVyLFxyXG4gICAgICAgIG1heFpvb20/OiA/bnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoXCJkYXRhbG9hZGluZ1wiLCB7IGRhdGFUeXBlOiBcInN0eWxlXCIgfSkpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QoXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTChzdHlsZSksXHJcbiAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUuU3R5bGVcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGdldEpTT04ocmVxdWVzdCwgKGVycm9yOiA/RXJyb3IsIGpzb246ID9PYmplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnJvcikpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZEJ5QWRkKGpzb24sIGJlZm9yZSwgbWluWm9vbSwgbWF4Wm9vbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRCeUFkZChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0eWxlKSksIGJlZm9yZSwgbWluWm9vbSwgbWF4Wm9vbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2xvYWRCeUFkZChqc29uLCBiZWZvcmUsIG1pblpvb20sIG1heFpvb20pIHtcclxuICAgICAgICBjb25zdCB2ZWN0b3JUaWxlTGF5ZXJzID0ganNvbi5sYXllcnM7XHJcbiAgICAgICAgY29uc3QgdmVjdG9yVGlsZVJlc291cmNlcyA9IGpzb24uc291cmNlcztcclxuICAgICAgICBjb25zdCBzcHJpdGUgPSBqc29uLnNwcml0ZSB8fCB7fTtcclxuICAgICAgICBjb25zdCBnbHlwaHMgPSBqc29uLmdseXBocyB8fCB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2ZWN0b3JUaWxlUmVzb3VyY2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKGtleSwgdmVjdG9yVGlsZVJlc291cmNlc1trZXldKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzcHJpdGUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuYWRkU3ByaXRlKGtleSwgc3ByaXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNwcml0ZVtrZXldICYmIHRoaXMuc3R5bGUuYWRkU3ByaXRlKGtleSwgc3ByaXRlW2tleV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ2x5cGhzID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmFkZEdseXBocyhrZXksIGdseXBocyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBnbHlwaHNba2V5XSAmJiB0aGlzLnN0eWxlLmFkZEdseXBocyhrZXksIGdseXBoc1trZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2ZWN0b3JUaWxlTGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlICE9IFwiYmFja2dyb3VuZFwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZExheWVyKGxheWVyLCBiZWZvcmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihtaW5ab29tKSB8fCAhaXNOYU4obWF4Wm9vbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExheWVyWm9vbVJhbmdlKGxheWVyLmlkLCBtaW5ab29tLCBtYXhab29tKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgTWFwYm94IFtzdHlsZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9zdHlsZS8pIG9iamVjdCwgYSBKU09OIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgbWFwJ3Mgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gVGhlIG1hcCdzIHN0eWxlIEpTT04gb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgc3R5bGVKc29uID0gbWFwLmdldFN0eWxlKCk7XHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBnZXRTdHlsZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zZXJpYWxpemUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCdzIHN0eWxlIGlzIGZ1bGx5IGxvYWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3R5bGUgaXMgZnVsbHkgbG9hZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgc3R5bGVMb2FkU3RhdHVzID0gbWFwLmlzU3R5bGVMb2FkZWQoKTtcclxuICAgICAqL1xyXG4gICAgaXNTdHlsZUxvYWRlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB3YXJuT25jZShcIlRoZXJlIGlzIG5vIHN0eWxlIGFkZGVkIHRvIHRoZSBtYXAuXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmxvYWRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHNvdXJjZSB0byB0aGUgbWFwJ3Mgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGFkZC4gTXVzdCBub3QgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBzb3VyY2VzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCwgY29uZm9ybWluZyB0byB0aGVcclxuICAgICAqIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3MgW3NvdXJjZSBkZWZpbml0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzKSBvclxyXG4gICAgICoge0BsaW5rIENhbnZhc1NvdXJjZU9wdGlvbnN9LlxyXG4gICAgICogQGZpcmVzIHNvdXJjZS5hZGRcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ215LWRhdGEnLCB7XHJcbiAgICAgKiAgIHR5cGU6ICd2ZWN0b3InLFxyXG4gICAgICogICB1cmw6ICdtYXBib3g6Ly9teXVzZXJuYW1lLnRpbGVzZXRpZCdcclxuICAgICAqIH0pO1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ215LWRhdGEnLCB7XHJcbiAgICAgKiAgIFwidHlwZVwiOiBcImdlb2pzb25cIixcclxuICAgICAqICAgXCJkYXRhXCI6IHtcclxuICAgICAqICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXHJcbiAgICAgKiAgICAgXCJnZW9tZXRyeVwiOiB7XHJcbiAgICAgKiAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxyXG4gICAgICogICAgICAgXCJjb29yZGluYXRlc1wiOiBbLTc3LjAzMjMsIDM4LjkxMzFdXHJcbiAgICAgKiAgICAgfSxcclxuICAgICAqICAgICBcInByb3BlcnRpZXNcIjoge1xyXG4gICAgICogICAgICAgXCJ0aXRsZVwiOiBcIk1hcGJveCBEQ1wiLFxyXG4gICAgICogICAgICAgXCJtYXJrZXItc3ltYm9sXCI6IFwibW9udW1lbnRcIlxyXG4gICAgICogICAgIH1cclxuICAgICAqICAgfVxyXG4gICAgICogfSk7XHJcbiAgICAgKiBAc2VlIFZlY3RvciBzb3VyY2U6IFtTaG93IGFuZCBoaWRlIGxheWVyc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWxheWVycy8pXHJcbiAgICAgKiBAc2VlIEdlb0pTT04gc291cmNlOiBbQWRkIGxpdmUgcmVhbHRpbWUgZGF0YV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS1nZW9qc29uLylcclxuICAgICAqIEBzZWUgUmFzdGVyIERFTSBzb3VyY2U6IFtBZGQgaGlsbHNoYWRpbmddKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hpbGxzaGFkZS8pXHJcbiAgICAgKi9cclxuICAgIGFkZFNvdXJjZShpZDogc3RyaW5nLCBzb3VyY2U6IFNvdXJjZVNwZWNpZmljYXRpb24pIHtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLl9tYXBDUlMgJiZcclxuICAgICAgICAgICAgXCJnZW9qc29uXCIgPT0gc291cmNlLnR5cGUgJiZcclxuICAgICAgICAgICAgc291cmNlLmRhdGEgJiZcclxuICAgICAgICAgICAgIXNvdXJjZS5kYXRhLmN1c3RvbXByalxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzb3VyY2UuY3VzdG9tcHJqID0gdGhpcy5jdXN0b21Db252ZXJ0UG9pbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xyXG4gICAgICAgIHRoaXMuc3R5bGUuYWRkU291cmNlKGlkLCBzb3VyY2UpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNvdXJjZSBpcyBsb2FkZWQuIFJldHVybnMgYHRydWVgIGlmIHRoZSBzb3VyY2Ugd2l0aFxyXG4gICAgICogdGhlIGdpdmVuIElEIGluIHRoZSBtYXAncyBzdHlsZSBoYXMgbm8gb3V0c3RhbmRpbmcgbmV0d29yayByZXF1ZXN0cywgb3RoZXJ3aXNlIGBmYWxzZWAuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGJlIGNoZWNrZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc291cmNlIGlzIGxvYWRlZC5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgc291cmNlTG9hZGVkID0gbWFwLmlzU291cmNlTG9hZGVkKCdiYXRoeW1ldHJ5LWRhdGEnKTtcclxuICAgICAqL1xyXG4gICAgaXNTb3VyY2VMb2FkZWQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXNbaWRdO1xyXG4gICAgICAgIGlmIChzb3VyY2UgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIElEICcke2lkfSdgKSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc291cmNlLmxvYWRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCB0aWxlcyBpbiB0aGUgdmlld3BvcnQgZnJvbSBhbGwgc291cmNlcyBvblxyXG4gICAgICogdGhlIHN0eWxlIGFyZSBsb2FkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIHRpbGVzIGFyZSBsb2FkZWQuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIHRpbGVzTG9hZGVkID0gbWFwLmFyZVRpbGVzTG9hZGVkKCk7XHJcbiAgICAgKi9cclxuXHJcbiAgICBhcmVUaWxlc0xvYWRlZCgpIHtcclxuICAgICAgICBjb25zdCBzb3VyY2VzID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcztcclxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlc1tpZF07XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGVzID0gc291cmNlLl90aWxlcztcclxuICAgICAgICAgICAgZm9yIChjb25zdCB0IGluIHRpbGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbdF07XHJcbiAgICAgICAgICAgICAgICBpZiAoISh0aWxlLnN0YXRlID09PSBcImxvYWRlZFwiIHx8IHRpbGUuc3RhdGUgPT09IFwiZXJyb3JlZFwiKSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgW2N1c3RvbSBzb3VyY2UgdHlwZV0oI0N1c3RvbSBTb3VyY2VzKSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgdXNlIHdpdGhcclxuICAgICAqIHtAbGluayBNYXAjYWRkU291cmNlfS5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc291cmNlIHR5cGU7IHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdHMgdXNlIHRoaXMgbmFtZSBpbiB0aGUgYHt0eXBlOiAuLi59YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFNvdXJjZVR5cGUgQSB7QGxpbmsgU291cmNlfSBjb25zdHJ1Y3Rvci5cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCB3aGVuIHRoZSBzb3VyY2UgdHlwZSBpcyByZWFkeSBvciB3aXRoIGFuIGVycm9yIGFyZ3VtZW50IGlmIHRoZXJlIGlzIGFuIGVycm9yLlxyXG4gICAgICovXHJcbiAgICBhZGRTb3VyY2VUeXBlKG5hbWU6IHN0cmluZywgU291cmNlVHlwZTogYW55LCBjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5hZGRTb3VyY2VUeXBlKG5hbWUsIFNvdXJjZVR5cGUsIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBzb3VyY2UgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIHJlbW92ZS5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5yZW1vdmVTb3VyY2UoJ2JhdGh5bWV0cnktZGF0YScpO1xyXG4gICAgICovXHJcbiAgICByZW1vdmVTb3VyY2UoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlU291cmNlKGlkKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgb2Z0ZW4gdXNlZCB0byB1cGRhdGUgYSBzb3VyY2UgdXNpbmcgdGhlIGluc3RhbmNlIG1lbWJlcnMgZm9yIHRoZSByZWxldmFudFxyXG4gICAgICogc291cmNlIHR5cGUgYXMgZGVmaW5lZCBpbiBbU291cmNlc10oI3NvdXJjZXMpLlxyXG4gICAgICogRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGBkYXRhYCBmb3IgYSBHZW9KU09OIHNvdXJjZSBvciB1cGRhdGluZyB0aGUgYHVybGAgYW5kIGBjb29yZGluYXRlc2BcclxuICAgICAqIG9mIGFuIGltYWdlIHNvdXJjZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gZ2V0LlxyXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IFRoZSBzdHlsZSBzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIElEIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBJRFxyXG4gICAgICogY29ycmVzcG9uZHMgdG8gbm8gZXhpc3Rpbmcgc291cmNlcy5cclxuICAgICAqIFRoZSBzaGFwZSBvZiB0aGUgb2JqZWN0IHZhcmllcyBieSBzb3VyY2UgdHlwZS5cclxuICAgICAqIEEgbGlzdCBvZiBvcHRpb25zIGZvciBlYWNoIHNvdXJjZSB0eXBlIGlzIGF2YWlsYWJsZSBvbiB0aGUgTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24nc1xyXG4gICAgICogW1NvdXJjZXNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvKSBwYWdlLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciBzb3VyY2VPYmplY3QgPSBtYXAuZ2V0U291cmNlKCdwb2ludHMnKTtcclxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcclxuICAgICAqIEBzZWUgW0FuaW1hdGUgYSBwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYW5pbWF0ZS1wb2ludC1hbG9uZy1saW5lLylcclxuICAgICAqIEBzZWUgW0FkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtZ2VvanNvbi8pXHJcbiAgICAgKi9cclxuICAgIGdldFNvdXJjZShpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhbiBpbWFnZSB0byB0aGUgc3R5bGUuIFRoaXMgaW1hZ2UgY2FuIGJlIGRpc3BsYXllZCBvbiB0aGUgbWFwIGxpa2UgYW55IG90aGVyIGljb24gaW4gdGhlIHN0eWxlJ3NcclxuICAgICAqIFtzcHJpdGVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc3ByaXRlLykgdXNpbmcgdGhlIGltYWdlJ3MgSUQgd2l0aFxyXG4gICAgICogW2BpY29uLWltYWdlYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI2xheW91dC1zeW1ib2wtaWNvbi1pbWFnZSksXHJcbiAgICAgKiBbYGJhY2tncm91bmQtcGF0dGVybmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNwYWludC1iYWNrZ3JvdW5kLWJhY2tncm91bmQtcGF0dGVybiksXHJcbiAgICAgKiBbYGZpbGwtcGF0dGVybmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNwYWludC1maWxsLWZpbGwtcGF0dGVybiksXHJcbiAgICAgKiBvciBbYGxpbmUtcGF0dGVybmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNwYWludC1saW5lLWxpbmUtcGF0dGVybikuXHJcbiAgICAgKiBBIHtAbGluayBNYXAuZXZlbnQ6ZXJyb3J9IGV2ZW50IHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBpbiB0aGUgc3ByaXRlIHRvIGFkZCB0aGlzIGltYWdlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxyXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSBhcyBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgIG9yIG9iamVjdCB3aXRoIGB3aWR0aGAsIGBoZWlnaHRgLCBhbmQgYGRhdGFgXHJcbiAgICAgKiBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5waXhlbFJhdGlvIFRoZSByYXRpbyBvZiBwaXhlbHMgaW4gdGhlIGltYWdlIHRvIHBoeXNpY2FsIHBpeGVscyBvbiB0aGUgc2NyZWVuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5zZGYgV2hldGhlciB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGFuIFNERiBpbWFnZVxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMuY29udGVudCAgYFt4MSwgeTEsIHgyLCB5Ml1gICBJZiBgaWNvbi10ZXh0LWZpdGAgaXMgdXNlZCBpbiBhIGxheWVyIHdpdGggdGhpcyBpbWFnZSwgdGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgcGFydCBvZiB0aGUgaW1hZ2UgdGhhdCBjYW4gYmUgY292ZXJlZCBieSB0aGUgY29udGVudCBpbiBgdGV4dC1maWVsZGAuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5zdHJldGNoWCAgYFtbeDEsIHgyXSwgLi4uXWAgSWYgYGljb24tdGV4dC1maXRgIGlzIHVzZWQgaW4gYSBsYXllciB3aXRoIHRoaXMgaW1hZ2UsIHRoaXMgb3B0aW9uIGRlZmluZXMgdGhlIHBhcnQocykgb2YgdGhlIGltYWdlIHRoYXQgY2FuIGJlIHN0cmV0Y2hlZCBob3Jpem9udGFsbHkuXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5zdHJldGNoWSAgYFtbeTEsIHkyXSwgLi4uXWAgSWYgYGljb24tdGV4dC1maXRgIGlzIHVzZWQgaW4gYSBsYXllciB3aXRoIHRoaXMgaW1hZ2UsIHRoaXMgb3B0aW9uIGRlZmluZXMgdGhlIHBhcnQocykgb2YgdGhlIGltYWdlIHRoYXQgY2FuIGJlIHN0cmV0Y2hlZCB2ZXJ0aWNhbGx5LlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBJZiB0aGUgc3R5bGUncyBzcHJpdGUgZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuIGltYWdlIHdpdGggSUQgJ2NhdCcsXHJcbiAgICAgKiAvLyBhZGQgdGhlIGltYWdlICdjYXQtaWNvbi5wbmcnIHRvIHRoZSBzdHlsZSdzIHNwcml0ZSB3aXRoIHRoZSBJRCAnY2F0Jy5cclxuICAgICAqIG1hcC5sb2FkSW1hZ2UoJ2h0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvNi82MC9DYXRfc2lsaG91ZXR0ZS5zdmcvNDAwcHgtQ2F0X3NpbGhvdWV0dGUuc3ZnLnBuZycsIGZ1bmN0aW9uKGVycm9yLCBpbWFnZSkge1xyXG4gICAgICogICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcclxuICAgICAqICAgIGlmICghbWFwLmhhc0ltYWdlKCdjYXQnKSkgbWFwLmFkZEltYWdlKCdjYXQnLCBpbWFnZSk7XHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKlxyXG4gICAgICogLy8gQWRkIGEgc3RyZXRjaGFibGUgaW1hZ2UgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGBpY29uLXRleHQtZml0YFxyXG4gICAgICogLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgaW1hZ2UgaXMgNjAwcHggd2lkZSBieSA0MDBweCBoaWdoLlxyXG4gICAgICogbWFwLmxvYWRJbWFnZSgnaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy84Lzg5L0JsYWNrX2FuZF9XaGl0ZV9Cb3hlZF8lMjhib3JkZXJlZCUyOS5wbmcnLCBmdW5jdGlvbihlcnJvciwgaW1hZ2UpIHtcclxuICAgICAqICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XHJcbiAgICAgKiAgICBpZiAoIW1hcC5oYXNJbWFnZSgnYm9yZGVyLWltYWdlJykpIHtcclxuICAgICAqICAgICAgbWFwLmFkZEltYWdlKCdib3JkZXItaW1hZ2UnLCBpbWFnZSwge1xyXG4gICAgICogICAgICAgICAgY29udGVudDogWzE2LCAxNiwgMzAwLCAzODRdLCAvLyBwbGFjZSB0ZXh0IG92ZXIgbGVmdCBoYWxmIG9mIGltYWdlLCBhdm9pZGluZyB0aGUgMTZweCBib3JkZXJcclxuICAgICAqICAgICAgICAgIHN0cmV0Y2hYOiBbWzE2LCA1ODRdXSwgLy8gc3RyZXRjaCBldmVyeXRoaW5nIGhvcml6b250YWxseSBleGNlcHQgdGhlIDE2cHggYm9yZGVyXHJcbiAgICAgKiAgICAgICAgICBzdHJldGNoWTogW1sxNiwgMzg0XV0sIC8vIHN0cmV0Y2ggZXZlcnl0aGluZyB2ZXJ0aWNhbGx5IGV4Y2VwdCB0aGUgMTZweCBib3JkZXJcclxuICAgICAqICAgICAgfSk7XHJcbiAgICAgKiAgICB9XHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBVc2UgYEhUTUxJbWFnZUVsZW1lbnRgOiBbQWRkIGFuIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UvKVxyXG4gICAgICogQHNlZSBVc2UgYEltYWdlRGF0YWA6IFtBZGQgYSBnZW5lcmF0ZWQgaWNvbiB0byB0aGUgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1nZW5lcmF0ZWQvKVxyXG4gICAgICovXHJcbiAgICBhZGRJbWFnZShcclxuICAgICAgICBpZDogc3RyaW5nLFxyXG4gICAgICAgIGltYWdlOlxyXG4gICAgICAgICAgICB8IEhUTUxJbWFnZUVsZW1lbnRcclxuICAgICAgICAgICAgfCBJbWFnZUJpdG1hcFxyXG4gICAgICAgICAgICB8IEltYWdlRGF0YVxyXG4gICAgICAgICAgICB8IHtcclxuICAgICAgICAgICAgICAgICAgd2lkdGg6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHwgU3R5bGVJbWFnZUludGVyZmFjZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBpeGVsUmF0aW8gPSAxLFxyXG4gICAgICAgICAgICBzZGYgPSBmYWxzZSxcclxuICAgICAgICAgICAgc3RyZXRjaFgsXHJcbiAgICAgICAgICAgIHN0cmV0Y2hZLFxyXG4gICAgICAgICAgICBjb250ZW50LFxyXG4gICAgICAgIH06ICRTaGFwZTxTdHlsZUltYWdlTWV0YWRhdGE+ID0ge31cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xyXG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSAwO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fFxyXG4gICAgICAgICAgICAoSW1hZ2VCaXRtYXAgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkYXRhIH0gPSBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoaWQsIHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IG5ldyBSR0JBSW1hZ2UoeyB3aWR0aCwgaGVpZ2h0IH0sIGRhdGEpLFxyXG4gICAgICAgICAgICAgICAgcGl4ZWxSYXRpbyxcclxuICAgICAgICAgICAgICAgIHN0cmV0Y2hYLFxyXG4gICAgICAgICAgICAgICAgc3RyZXRjaFksXHJcbiAgICAgICAgICAgICAgICBjb250ZW50LFxyXG4gICAgICAgICAgICAgICAgc2RmLFxyXG4gICAgICAgICAgICAgICAgdmVyc2lvbixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZS53aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGltYWdlLmhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3JFdmVudChcclxuICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLmFkZEltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgLCBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yIG9iamVjdCB3aXRoIGB3aWR0aGAsIGBoZWlnaHRgLCBhbmQgYGRhdGFgIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgYEltYWdlRGF0YWBcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGRhdGEgfSA9IGltYWdlO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VySW1hZ2UgPSAoKGltYWdlOiBhbnkpOiBTdHlsZUltYWdlSW50ZXJmYWNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoaWQsIHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IG5ldyBSR0JBSW1hZ2UoeyB3aWR0aCwgaGVpZ2h0IH0sIG5ldyBVaW50OEFycmF5KGRhdGEpKSxcclxuICAgICAgICAgICAgICAgIHBpeGVsUmF0aW8sXHJcbiAgICAgICAgICAgICAgICBzdHJldGNoWCxcclxuICAgICAgICAgICAgICAgIHN0cmV0Y2hZLFxyXG4gICAgICAgICAgICAgICAgY29udGVudCxcclxuICAgICAgICAgICAgICAgIHNkZixcclxuICAgICAgICAgICAgICAgIHZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICB1c2VySW1hZ2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHVzZXJJbWFnZS5vbkFkZCkge1xyXG4gICAgICAgICAgICAgICAgdXNlckltYWdlLm9uQWRkKHRoaXMsIGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSBhbiBleGlzdGluZyBpbWFnZSBpbiBhIHN0eWxlLiBUaGlzIGltYWdlIGNhbiBiZSBkaXNwbGF5ZWQgb24gdGhlIG1hcCBsaWtlIGFueSBvdGhlciBpY29uIGluIHRoZSBzdHlsZSdzXHJcbiAgICAgKiBbc3ByaXRlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3Nwcml0ZS8pIHVzaW5nIHRoZSBpbWFnZSdzIElEIHdpdGhcclxuICAgICAqIFtgaWNvbi1pbWFnZWBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXlvdXQtc3ltYm9sLWljb24taW1hZ2UpLFxyXG4gICAgICogW2BiYWNrZ3JvdW5kLXBhdHRlcm5gXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jcGFpbnQtYmFja2dyb3VuZC1iYWNrZ3JvdW5kLXBhdHRlcm4pLFxyXG4gICAgICogW2BmaWxsLXBhdHRlcm5gXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jcGFpbnQtZmlsbC1maWxsLXBhdHRlcm4pLFxyXG4gICAgICogb3IgW2BsaW5lLXBhdHRlcm5gXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jcGFpbnQtbGluZS1saW5lLXBhdHRlcm4pLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxyXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSBhcyBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgIG9yIG9iamVjdCB3aXRoIGB3aWR0aGAsIGBoZWlnaHRgLCBhbmQgYGRhdGFgXHJcbiAgICAgKiBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBJZiBhbiBpbWFnZSB3aXRoIHRoZSBJRCAnY2F0JyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3R5bGUncyBzcHJpdGUsXHJcbiAgICAgKiAvLyByZXBsYWNlIHRoYXQgaW1hZ2Ugd2l0aCBhIG5ldyBpbWFnZSwgJ290aGVyLWNhdC1pY29uLnBuZycuXHJcbiAgICAgKiBpZiAobWFwLmhhc0ltYWdlKCdjYXQnKSkgbWFwLnVwZGF0ZUltYWdlKCdjYXQnLCAnLi9vdGhlci1jYXQtaWNvbi5wbmcnKTtcclxuICAgICAqL1xyXG4gICAgdXBkYXRlSW1hZ2UoXHJcbiAgICAgICAgaWQ6IHN0cmluZyxcclxuICAgICAgICBpbWFnZTpcclxuICAgICAgICAgICAgfCBIVE1MSW1hZ2VFbGVtZW50XHJcbiAgICAgICAgICAgIHwgSW1hZ2VCaXRtYXBcclxuICAgICAgICAgICAgfCBJbWFnZURhdGFcclxuICAgICAgICAgICAgfCB7XHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB8IFN0eWxlSW1hZ2VJbnRlcmZhY2VcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW1hZ2UgPSB0aGlzLnN0eWxlLmdldEltYWdlKGlkKTtcclxuICAgICAgICBpZiAoIWV4aXN0aW5nSW1hZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShcclxuICAgICAgICAgICAgICAgIG5ldyBFcnJvckV2ZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgbWFwIGhhcyBubyBpbWFnZSB3aXRoIHRoYXQgaWQuIElmIHlvdSBhcmUgYWRkaW5nIGEgbmV3IGltYWdlIHVzZSBgbWFwLmFkZEltYWdlKC4uLilgIGluc3RlYWQuXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9XHJcbiAgICAgICAgICAgIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fFxyXG4gICAgICAgICAgICAoSW1hZ2VCaXRtYXAgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClcclxuICAgICAgICAgICAgICAgID8gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1hZ2UpXHJcbiAgICAgICAgICAgICAgICA6IGltYWdlO1xyXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgZGF0YSB9ID0gaW1hZ2VEYXRhO1xyXG5cclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKFxyXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yRXZlbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkludmFsaWQgYXJndW1lbnRzIHRvIG1hcC51cGRhdGVJbWFnZSgpLiBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgYEltYWdlQml0bWFwYCwgXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpZHRoICE9PSBleGlzdGluZ0ltYWdlLmRhdGEud2lkdGggfHxcclxuICAgICAgICAgICAgaGVpZ2h0ICE9PSBleGlzdGluZ0ltYWdlLmRhdGEuaGVpZ2h0XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUoXHJcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3JFdmVudChcclxuICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHVwZGF0ZWQgaW1hZ2UgbXVzdCBiZSB0aGF0IHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb3B5ID0gIShcclxuICAgICAgICAgICAgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8XHJcbiAgICAgICAgICAgIChJbWFnZUJpdG1hcCAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZXhpc3RpbmdJbWFnZS5kYXRhLnJlcGxhY2UoZGF0YSwgY29weSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3R5bGUudXBkYXRlSW1hZ2UoaWQsIGV4aXN0aW5nSW1hZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgd2hldGhlciBvciBub3QgYW4gaW1hZ2Ugd2l0aCBhIHNwZWNpZmljIElEIGV4aXN0cyBpbiB0aGUgc3R5bGUuIFRoaXMgY2hlY2tzIGJvdGggaW1hZ2VzXHJcbiAgICAgKiBpbiB0aGUgc3R5bGUncyBvcmlnaW5hbCBbc3ByaXRlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3Nwcml0ZS8pIGFuZCBhbnkgaW1hZ2VzXHJcbiAgICAgKiB0aGF0IGhhdmUgYmVlbiBhZGRlZCBhdCBydW50aW1lIHVzaW5nIHtAbGluayBNYXAjYWRkSW1hZ2V9LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAgQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW1hZ2UgZXhpc3RzLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIENoZWNrIGlmIGFuIGltYWdlIHdpdGggdGhlIElEICdjYXQnIGV4aXN0cyBpblxyXG4gICAgICogLy8gdGhlIHN0eWxlJ3Mgc3ByaXRlLlxyXG4gICAgICogdmFyIGNhdEljb25FeGlzdHMgPSBtYXAuaGFzSW1hZ2UoJ2NhdCcpO1xyXG4gICAgICovXHJcbiAgICBoYXNJbWFnZShpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFwiTWlzc2luZyByZXF1aXJlZCBpbWFnZSBpZFwiKSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gISF0aGlzLnN0eWxlLmdldEltYWdlKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhbiBpbWFnZSBmcm9tIGEgc3R5bGUuIFRoaXMgY2FuIGJlIGFuIGltYWdlIGZyb20gdGhlIHN0eWxlJ3Mgb3JpZ2luYWxcclxuICAgICAqIFtzcHJpdGVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc3ByaXRlLykgb3IgYW55IGltYWdlc1xyXG4gICAgICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgYXQgcnVudGltZSB1c2luZyB7QGxpbmsgTWFwI2FkZEltYWdlfS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gSWYgYW4gaW1hZ2Ugd2l0aCB0aGUgSUQgJ2NhdCcgZXhpc3RzIGluXHJcbiAgICAgKiAvLyB0aGUgc3R5bGUncyBzcHJpdGUsIHJlbW92ZSBpdC5cclxuICAgICAqIGlmIChtYXAuaGFzSW1hZ2UoJ2NhdCcpKSBtYXAucmVtb3ZlSW1hZ2UoJ2NhdCcpO1xyXG4gICAgICovXHJcbiAgICByZW1vdmVJbWFnZShpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVJbWFnZShpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkIGFuIGltYWdlIGZyb20gYW4gZXh0ZXJuYWwgVVJMIHRvIGJlIHVzZWQgd2l0aCB7QGxpbmsgTWFwI2FkZEltYWdlfS4gRXh0ZXJuYWxcclxuICAgICAqIGRvbWFpbnMgbXVzdCBzdXBwb3J0IFtDT1JTXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0FjY2Vzc19jb250cm9sX0NPUlMpLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgZmlsZS4gSW1hZ2UgZmlsZSBtdXN0IGJlIGluIHBuZywgd2VicCwgb3IganBnIGZvcm1hdC5cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEV4cGVjdGluZyBgY2FsbGJhY2soZXJyb3IsIGRhdGEpYC4gQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGhhcyBsb2FkZWQgb3Igd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gTG9hZCBhbiBpbWFnZSBmcm9tIGFuIGV4dGVybmFsIFVSTC5cclxuICAgICAqIG1hcC5sb2FkSW1hZ2UoJ2h0dHA6Ly9wbGFjZWtpdHRlbi5jb20vNTAvNTAnLCBmdW5jdGlvbihlcnJvciwgaW1hZ2UpIHtcclxuICAgICAqICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcclxuICAgICAqICAgLy8gQWRkIHRoZSBsb2FkZWQgaW1hZ2UgdG8gdGhlIHN0eWxlJ3Mgc3ByaXRlIHdpdGggdGhlIElEICdraXR0ZW4nLlxyXG4gICAgICogICBtYXAuYWRkSW1hZ2UoJ2tpdHRlbicsIGltYWdlKTtcclxuICAgICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIEBzZWUgW0FkZCBhbiBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLylcclxuICAgICAqL1xyXG4gICAgbG9hZEltYWdlKHVybDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgICAgICBnZXRJbWFnZShcclxuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5JbWFnZSksXHJcbiAgICAgICAgICAgIGNhbGxiYWNrXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gQXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBJRHMgb2YgYWxsIGltYWdlcyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSBtYXAuXHJcbiAgICAgKiBUaGlzIGluY2x1ZGVzIGJvdGggaW1hZ2VzIGZyb20gdGhlIHN0eWxlJ3Mgb3JpZ2luYWwgW3Nwcml0ZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9zcHJpdGUvKVxyXG4gICAgICogYW5kIGFueSBpbWFnZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYXQgcnVudGltZSB1c2luZyB7QGxpbmsgTWFwI2FkZEltYWdlfS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gQXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgc3ByaXRlcy9pbWFnZXMgY3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgYWxsSW1hZ2VzID0gbWFwLmxpc3RJbWFnZXMoKTtcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGxpc3RJbWFnZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUubGlzdEltYWdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGxpc3RNYXJrZXJzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tYXJrZXJzQ2FjaGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgW01hcGJveCBzdHlsZSBsYXllcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI2xheWVycylcclxuICAgICAqIHRvIHRoZSBtYXAncyBzdHlsZS5cclxuICAgICAqXHJcbiAgICAgKiBBIGxheWVyIGRlZmluZXMgaG93IGRhdGEgZnJvbSBhIHNwZWNpZmllZCBzb3VyY2Ugd2lsbCBiZSBzdHlsZWQuIFJlYWQgbW9yZSBhYm91dCBsYXllciB0eXBlc1xyXG4gICAgICogYW5kIGF2YWlsYWJsZSBwYWludCBhbmQgbGF5b3V0IHByb3BlcnRpZXMgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI2xheWVycykuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBDdXN0b21MYXllckludGVyZmFjZX0gbGF5ZXIgVGhlIGxheWVyIHRvIGFkZCwgY29uZm9ybWluZyB0byBlaXRoZXIgdGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3MgW2xheWVyIGRlZmluaXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXllcnMpIG9yLCBsZXNzIGNvbW1vbmx5LCB0aGUge0BsaW5rIEN1c3RvbUxheWVySW50ZXJmYWNlfSBzcGVjaWZpY2F0aW9uLlxyXG4gICAgICogVGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3MgbGF5ZXIgZGVmaW5pdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgbW9zdCBsYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyLmlkIEEgdW5pcXVlIGlkZW5maWVyIHRoYXQgeW91IGRlZmluZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllci50eXBlIFRoZSB0eXBlIG9mIGxheWVyIChmb3IgZXhhbXBsZSBgZmlsbGAgb3IgYHN5bWJvbGApLlxyXG4gICAgICogQSBsaXN0IG9mIGxheWVyIHR5cGVzIGlzIGF2YWlsYWJsZSBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvI3R5cGUpLlxyXG4gICAgICpcclxuICAgICAqIChUaGlzIGNhbiBhbHNvIGJlIGBjdXN0b21gLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHtAbGluayBDdXN0b21MYXllckludGVyZmFjZX0uKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBPYmplY3R9IFtsYXllci5zb3VyY2VdIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxheWVyLlxyXG4gICAgICogUmVmZXJlbmNlIGEgc291cmNlIHRoYXQgaGFzIF9hbHJlYWR5IGJlZW4gZGVmaW5lZF8gdXNpbmcgdGhlIHNvdXJjZSdzIHVuaXF1ZSBpZC5cclxuICAgICAqIFJlZmVyZW5jZSBhIF9uZXcgc291cmNlXyB1c2luZyBhIHNvdXJjZSBvYmplY3QgKGFzIGRlZmluZWQgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8pKSBkaXJlY3RseS5cclxuICAgICAqIFRoaXMgaXMgKipyZXF1aXJlZCoqIGZvciBhbGwgYGxheWVyLnR5cGVgIG9wdGlvbnMgX2V4Y2VwdF8gZm9yIGBjdXN0b21gLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtsYXllci5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgW3NvdXJjZSBsYXllcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9zb3VyY2UtbGF5ZXIvKSB3aXRoaW4gdGhlIHNwZWNpZmllZCBgbGF5ZXIuc291cmNlYCB0byB1c2UgZm9yIHRoaXMgc3R5bGUgbGF5ZXIuXHJcbiAgICAgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgdmVjdG9yIHRpbGUgc291cmNlcyBhbmQgaXMgKipyZXF1aXJlZCoqIHdoZW4gYGxheWVyLnNvdXJjZWAgaXMgb2YgdGhlIHR5cGUgYHZlY3RvcmAuXHJcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBbbGF5ZXIuZmlsdGVyXSAob3B0aW9uYWwpIEFuIGV4cHJlc3Npb24gc3BlY2lmeWluZyBjb25kaXRpb25zIG9uIHNvdXJjZSBmZWF0dXJlcy5cclxuICAgICAqIE9ubHkgZmVhdHVyZXMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIGFyZSBkaXNwbGF5ZWQuXHJcbiAgICAgKiBUaGUgTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gaW5jbHVkZXMgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbGltaXRhdGlvbnMgb2YgdGhlIFtgZmlsdGVyYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLyNmaWx0ZXIpIHBhcmFtZXRlclxyXG4gICAgICogYW5kIGEgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgW2V4cHJlc3Npb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9leHByZXNzaW9ucy8pLlxyXG4gICAgICogSWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkLCBhbGwgZmVhdHVyZXMgaW4gdGhlIHNvdXJjZSAob3Igc291cmNlIGxheWVyIGZvciB2ZWN0b3IgdGlsZXNldHMpIHdpbGwgYmUgZGlzcGxheWVkLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtsYXllci5wYWludF0gKG9wdGlvbmFsKSBQYWludCBwcm9wZXJ0aWVzIGZvciB0aGUgbGF5ZXIuXHJcbiAgICAgKiBBdmFpbGFibGUgcGFpbnQgcHJvcGVydGllcyB2YXJ5IGJ5IGBsYXllci50eXBlYC5cclxuICAgICAqIEEgZnVsbCBsaXN0IG9mIHBhaW50IHByb3BlcnRpZXMgZm9yIGVhY2ggbGF5ZXIgdHlwZSBpcyBhdmFpbGFibGUgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLykuXHJcbiAgICAgKiBJZiBubyBwYWludCBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbbGF5ZXIubGF5b3V0XSAob3B0aW9uYWwpIExheW91dCBwcm9wZXJ0aWVzIGZvciB0aGUgbGF5ZXIuXHJcbiAgICAgKiBBdmFpbGFibGUgbGF5b3V0IHByb3BlcnRpZXMgdmFyeSBieSBgbGF5ZXIudHlwZWAuXHJcbiAgICAgKiBBIGZ1bGwgbGlzdCBvZiBsYXlvdXQgcHJvcGVydGllcyBmb3IgZWFjaCBsYXllciB0eXBlIGlzIGF2YWlsYWJsZSBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvKS5cclxuICAgICAqIElmIG5vIGxheW91dCBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGF5ZXIubWF4em9vbV0gKG9wdGlvbmFsKSBUaGUgbWF4aW11bSB6b29tIGxldmVsIGZvciB0aGUgbGF5ZXIuXHJcbiAgICAgKiBBdCB6b29tIGxldmVscyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIG1heHpvb20sIHRoZSBsYXllciB3aWxsIGJlIGhpZGRlbi5cclxuICAgICAqIFRoZSB2YWx1ZSBjYW4gYmUgYW55IG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgYDI0YCAoaW5jbHVzaXZlKS5cclxuICAgICAqIElmIG5vIG1heHpvb20gaXMgcHJvdmlkZWQsIHRoZSBsYXllciB3aWxsIGJlIHZpc2libGUgYXQgYWxsIHpvb20gbGV2ZWxzIGZvciB3aGljaCB0aGVyZSBhcmUgdGlsZXMgYXZhaWxhYmxlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsYXllci5taW56b29tXSAob3B0aW9uYWwpIFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgZm9yIHRoZSBsYXllci5cclxuICAgICAqIEF0IHpvb20gbGV2ZWxzIGxlc3MgdGhhbiB0aGUgbWluem9vbSwgdGhlIGxheWVyIHdpbGwgYmUgaGlkZGVuLlxyXG4gICAgICogVGhlIHZhbHVlIGNhbiBiZSBhbnkgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCBgMjRgIChpbmNsdXNpdmUpLlxyXG4gICAgICogSWYgbm8gbWluem9vbSBpcyBwcm92aWRlZCwgdGhlIGxheWVyIHdpbGwgYmUgdmlzaWJsZSBhdCBhbGwgem9vbSBsZXZlbHMgZm9yIHdoaWNoIHRoZXJlIGFyZSB0aWxlcyBhdmFpbGFibGUuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2xheWVyLm1ldGFkYXRhXSAob3B0aW9uYWwpIEFyYml0cmFyeSBwcm9wZXJ0aWVzIHVzZWZ1bCB0byB0cmFjayB3aXRoIHRoZSBsYXllciwgYnV0IGRvIG5vdCBpbmZsdWVuY2UgcmVuZGVyaW5nLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtsYXllci5yZW5kZXJpbmdNb2RlXSBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgbGF5ZXJzIHdpdGggdGhlIHR5cGUgYGN1c3RvbWAuXHJcbiAgICAgKiBTZWUge0BsaW5rIEN1c3RvbUxheWVySW50ZXJmYWNlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlSWRdIFRoZSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgdGhlIG5ldyBsYXllciBiZWZvcmUsXHJcbiAgICAgKiByZXN1bHRpbmcgaW4gdGhlIG5ldyBsYXllciBhcHBlYXJpbmcgdmlzdWFsbHkgYmVuZWF0aCB0aGUgZXhpc3RpbmcgbGF5ZXIuXHJcbiAgICAgKiBJZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXllciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxheWVycyBhcnJheVxyXG4gICAgICogYW5kIGFwcGVhciB2aXN1YWxseSBhYm92ZSBhbGwgb3RoZXIgbGF5ZXJzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBBZGQgYSBjaXJjbGUgbGF5ZXIgd2l0aCBhIHZlY3RvciBzb3VyY2VcclxuICAgICAqIG1hcC5hZGRMYXllcih7XHJcbiAgICAgKiAgIGlkOiAncG9pbnRzLW9mLWludGVyZXN0JyxcclxuICAgICAqICAgc291cmNlOiB7XHJcbiAgICAgKiAgICAgdHlwZTogJ3ZlY3RvcicsXHJcbiAgICAgKiAgICAgdXJsOiAnbWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY4J1xyXG4gICAgICogICB9LFxyXG4gICAgICogICAnc291cmNlLWxheWVyJzogJ3BvaV9sYWJlbCcsXHJcbiAgICAgKiAgIHR5cGU6ICdjaXJjbGUnLFxyXG4gICAgICogICBwYWludDoge1xyXG4gICAgICogICAgIC8vIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uIHBhaW50IHByb3BlcnRpZXNcclxuICAgICAqICAgfSxcclxuICAgICAqICAgbGF5b3V0OiB7XHJcbiAgICAgKiAgICAgLy8gTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gbGF5b3V0IHByb3BlcnRpZXNcclxuICAgICAqICAgfVxyXG4gICAgICogfSk7XHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIERlZmluZSBhIHNvdXJjZSBiZWZvcmUgdXNpbmcgaXQgdG8gY3JlYXRlIGEgbmV3IGxheWVyXHJcbiAgICAgKiBtYXAuYWRkU291cmNlKCdzdGF0ZS1kYXRhJywge1xyXG4gICAgICogICB0eXBlOiAnZ2VvanNvbicsXHJcbiAgICAgKiAgIGRhdGE6ICdwYXRoL3RvL2RhdGEuZ2VvanNvbidcclxuICAgICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIG1hcC5hZGRMYXllcih7XHJcbiAgICAgKiAgIGlkOiAnc3RhdGVzJyxcclxuICAgICAqICAgLy8gUmVmZXJlbmNlcyB0aGUgR2VvSlNPTiBzb3VyY2UgZGVmaW5lZCBhYm92ZVxyXG4gICAgICogICAvLyBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIGBzb3VyY2UtbGF5ZXJgXHJcbiAgICAgKiAgIHNvdXJjZTogJ3N0YXRlLWRhdGEnLFxyXG4gICAgICogICB0eXBlOiAnc3ltYm9sJyxcclxuICAgICAqICAgbGF5b3V0OiB7XHJcbiAgICAgKiAgICAgLy8gU2V0IHRoZSBsYWJlbCBjb250ZW50IHRvIHRoZVxyXG4gICAgICogICAgIC8vIGZlYXR1cmUncyBgbmFtZWAgcHJvcGVydHlcclxuICAgICAqICAgICB0ZXh0LWZpZWxkOiBbJ2dldCcsICduYW1lJ11cclxuICAgICAqICAgfVxyXG4gICAgICogfSk7XHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIEFkZCBhIG5ldyBzeW1ib2wgbGF5ZXIgYmVmb3JlIGFuIGV4aXN0aW5nIGxheWVyXHJcbiAgICAgKiBtYXAuYWRkTGF5ZXIoe1xyXG4gICAgICogICBpZDogJ3N0YXRlcycsXHJcbiAgICAgKiAgIC8vIFJlZmVyZW5jZXMgYSBzb3VyY2UgdGhhdCdzIGFscmVhZHkgYmVlbiBkZWZpbmVkXHJcbiAgICAgKiAgIHNvdXJjZTogJ3N0YXRlLWRhdGEnLFxyXG4gICAgICogICB0eXBlOiAnc3ltYm9sJyxcclxuICAgICAqICAgbGF5b3V0OiB7XHJcbiAgICAgKiAgICAgLy8gU2V0IHRoZSBsYWJlbCBjb250ZW50IHRvIHRoZVxyXG4gICAgICogICAgIC8vIGZlYXR1cmUncyBgbmFtZWAgcHJvcGVydHlcclxuICAgICAqICAgICB0ZXh0LWZpZWxkOiBbJ2dldCcsICduYW1lJ11cclxuICAgICAqICAgfVxyXG4gICAgICogLy8gQWRkIHRoZSBsYXllciBiZWZvcmUgdGhlIGV4aXN0aW5nIGBjaXRpZXNgIGxheWVyXHJcbiAgICAgKiB9LCAnY2l0aWVzJyk7XHJcbiAgICAgKlxyXG4gICAgICogQHNlZSBbQ3JlYXRlIGFuZCBzdHlsZSBjbHVzdGVyc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci8pXHJcbiAgICAgKiBAc2VlIFtBZGQgYSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKVxyXG4gICAgICogQHNlZSBbQWRkIGEgV01TIHNvdXJjZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvd21zLylcclxuICAgICAqL1xyXG4gICAgYWRkTGF5ZXIoXHJcbiAgICAgICAgbGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlLFxyXG4gICAgICAgIGJlZm9yZUlkPzogc3RyaW5nXHJcbiAgICApIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBsYXllci5zb3VyY2UgPT09IFwib2JqZWN0XCIgJiZcclxuICAgICAgICAgICAgdGhpcy5fbWFwQ1JTICYmXHJcbiAgICAgICAgICAgIGxheWVyLnNvdXJjZSAmJlxyXG4gICAgICAgICAgICBsYXllci5zb3VyY2UudHlwZSA9PSBcImdlb2pzb25cIiAmJlxyXG4gICAgICAgICAgICBsYXllci5zb3VyY2UuZGF0YSAmJlxyXG4gICAgICAgICAgICAhbGF5ZXIuc291cmNlLmRhdGEuY3VzdG9tcHJqXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGxheWVyLnNvdXJjZS5jdXN0b21wcmogPSB0aGlzLmN1c3RvbUNvbnZlcnRQb2ludDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCk7XHJcbiAgICAgICAgdGhpcy5zdHlsZS5hZGRMYXllcihsYXllciwgYmVmb3JlSWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyBhIGxheWVyIHRvIGEgZGlmZmVyZW50IHotcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gbW92ZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlSWRdIFRoZSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgdGhlIG5ldyBsYXllciBiZWZvcmUuIFdoZW4gdmlld2luZyB0aGUgbWFwLCB0aGUgYGlkYCBsYXllciB3aWxsIGFwcGVhciBiZW5lYXRoIHRoZSBgYmVmb3JlSWRgIGxheWVyLiBJZiBgYmVmb3JlSWRgIGlzIG9taXR0ZWQsIHRoZSBsYXllciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxheWVycyBhcnJheSBhbmQgYXBwZWFyIGFib3ZlIGFsbCBvdGhlciBsYXllcnMgb24gdGhlIG1hcC5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBNb3ZlIGEgbGF5ZXIgd2l0aCBJRCAncG9seWdvbicgYmVmb3JlIHRoZSBsYXllciB3aXRoIElEICdjb3VudHJ5LWxhYmVsJy4gVGhlIGBwb2x5Z29uYCBsYXllciB3aWxsIGFwcGVhciBiZW5lYXRoIHRoZSBgY291bnRyeS1sYWJlbGAgbGF5ZXIgb24gdGhlIG1hcC5cclxuICAgICAqIG1hcC5tb3ZlTGF5ZXIoJ3BvbHlnb24nLCAnY291bnRyeS1sYWJlbCcpO1xyXG4gICAgICovXHJcbiAgICBtb3ZlTGF5ZXIoaWQ6IHN0cmluZywgYmVmb3JlSWQ/OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnN0eWxlLm1vdmVMYXllcihpZCwgYmVmb3JlSWQpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJuc1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIHRoZSBsYXllciB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBtYXAncyBzdHlsZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBzdWNoIGxheWVyIGV4aXN0cywgYW4gYGVycm9yYCBldmVudCBpcyBmaXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIGxheWVyIHRvIHJlbW92ZVxyXG4gICAgICogQGZpcmVzIGVycm9yXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIElmIGEgbGF5ZXIgd2l0aCBJRCAnc3RhdGUtZGF0YScgZXhpc3RzLCByZW1vdmUgaXQuXHJcbiAgICAgKiBpZiAobWFwLmdldExheWVyKCdzdGF0ZS1kYXRhJykpIG1hcC5yZW1vdmVMYXllcignc3RhdGUtZGF0YScpO1xyXG4gICAgICovXHJcbiAgICByZW1vdmVMYXllcihpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVMYXllcihpZCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGxheWVyIHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0LlxyXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IFRoZSBsYXllciB3aXRoIHRoZSBzcGVjaWZpZWQgSUQsIG9yIGB1bmRlZmluZWRgXHJcbiAgICAgKiAgIGlmIHRoZSBJRCBjb3JyZXNwb25kcyB0byBubyBleGlzdGluZyBsYXllcnMuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciBzdGF0ZURhdGFMYXllciA9IG1hcC5nZXRMYXllcignc3RhdGUtZGF0YScpO1xyXG4gICAgICpcclxuICAgICAqIEBzZWUgW0ZpbHRlciBzeW1ib2xzIGJ5IHRvZ2dsaW5nIGEgbGlzdF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy8pXHJcbiAgICAgKiBAc2VlIFtGaWx0ZXIgc3ltYm9scyBieSB0ZXh0IGlucHV0XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1tYXJrZXJzLWJ5LWlucHV0LylcclxuICAgICAqL1xyXG4gICAgZ2V0TGF5ZXIoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExheWVyKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHpvb20gZXh0ZW50IGZvciB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLiBUaGUgem9vbSBleHRlbnQgaW5jbHVkZXMgdGhlXHJcbiAgICAgKiBbbWluaW11bSB6b29tIGxldmVsXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5ZXItbWluem9vbSlcclxuICAgICAqIGFuZCBbbWF4aW11bSB6b29tIGxldmVsXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5ZXItbWF4em9vbSkpXHJcbiAgICAgKiBhdCB3aGljaCB0aGUgbGF5ZXIgd2lsbCBiZSByZW5kZXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBGb3Igc3R5bGUgbGF5ZXJzIHVzaW5nIHZlY3RvciBzb3VyY2VzLCBzdHlsZSBsYXllcnMgY2Fubm90IGJlIHJlbmRlcmVkIGF0IHpvb20gbGV2ZWxzIGxvd2VyIHRoYW4gdGhlXHJcbiAgICAgKiBtaW5pbXVtIHpvb20gbGV2ZWwgb2YgdGhlIF9zb3VyY2UgbGF5ZXJfIGJlY2F1c2UgdGhlIGRhdGEgZG9lcyBub3QgZXhpc3QgYXQgdGhvc2Ugem9vbSBsZXZlbHMuIElmIHRoZSBtaW5pbXVtXHJcbiAgICAgKiB6b29tIGxldmVsIG9mIHRoZSBzb3VyY2UgbGF5ZXIgaXMgaGlnaGVyIHRoYW4gdGhlIG1pbmltdW0gem9vbSBsZXZlbCBkZWZpbmVkIGluIHRoZSBzdHlsZSBsYXllciwgdGhlIHN0eWxlXHJcbiAgICAgKiBsYXllciB3aWxsIG5vdCBiZSByZW5kZXJlZCBhdCBhbGwgem9vbSBsZXZlbHMgaW4gdGhlIHpvb20gcmFuZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byB3aGljaCB0aGUgem9vbSBleHRlbnQgd2lsbCBiZSBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnpvb20gVGhlIG1pbmltdW0gem9vbSB0byBzZXQgKDAtMjQpLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heHpvb20gVGhlIG1heGltdW0gem9vbSB0byBzZXQgKDAtMjQpLlxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5zZXRMYXllclpvb21SYW5nZSgnbXktbGF5ZXInLCAyLCA1KTtcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIHNldExheWVyWm9vbVJhbmdlKGxheWVySWQ6IHN0cmluZywgbWluem9vbTogbnVtYmVyLCBtYXh6b29tOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnN0eWxlLnNldExheWVyWm9vbVJhbmdlKGxheWVySWQsIG1pbnpvb20sIG1heHpvb20pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBmaWx0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogRmlsdGVycyBjb250cm9sIHdoaWNoIGZlYXR1cmVzIGEgc3R5bGUgbGF5ZXIgcmVuZGVycyBmcm9tIGl0cyBzb3VyY2UuXHJcbiAgICAgKiBBbnkgZmVhdHVyZSBmb3Igd2hpY2ggdGhlIGZpbHRlciBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBgdHJ1ZWAgd2lsbCBiZVxyXG4gICAgICogcmVuZGVyZWQgb24gdGhlIG1hcC4gVGhvc2UgdGhhdCBhcmUgZmFsc2Ugd2lsbCBiZSBoaWRkZW4uXHJcbiAgICAgKlxyXG4gICAgICogVXNlIGBzZXRGaWx0ZXJgIHRvIHNob3cgYSBzdWJzZXQgb2YgeW91ciBzb3VyY2UgZGF0YS5cclxuICAgICAqXHJcbiAgICAgKiBUbyBjbGVhciB0aGUgZmlsdGVyLCBwYXNzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHdoaWNoIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkLlxyXG4gICAgICogQHBhcmFtIHtBcnJheSB8IG51bGwgfCB1bmRlZmluZWR9IGZpbHRlciBUaGUgZmlsdGVyLCBjb25mb3JtaW5nIHRvIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzXHJcbiAgICAgKiAgIFtmaWx0ZXIgZGVmaW5pdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLyNmaWx0ZXIpLiAgSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyBhbnkgZXhpc3RpbmcgZmlsdGVyIGZyb20gdGhlIGxheWVyLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgZmlsdGVyIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIGRpc3BsYXkgb25seSBmZWF0dXJlcyB3aXRoIHRoZSAnbmFtZScgcHJvcGVydHkgJ1VTQSdcclxuICAgICAqIG1hcC5zZXRGaWx0ZXIoJ215LWxheWVyJywgWyc9PScsIFsnZ2V0JywgJ25hbWUnXSwgJ1VTQSddKTtcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBkaXNwbGF5IG9ubHkgZmVhdHVyZXMgd2l0aCBmaXZlIG9yIG1vcmUgJ2F2YWlsYWJsZS1zcG90cydcclxuICAgICAqIG1hcC5zZXRGaWx0ZXIoJ2Jpa2UtZG9ja3MnLCBbJz49JywgWydnZXQnLCAnYXZhaWxhYmxlLXNwb3RzJ10sIDVdKTtcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyByZW1vdmUgdGhlIGZpbHRlciBmb3IgdGhlICdiaWtlLWRvY2tzJyBzdHlsZSBsYXllclxyXG4gICAgICogbWFwLnNldEZpbHRlcignYmlrZS1kb2NrcycsIG51bGwpO1xyXG4gICAgICpcclxuICAgICAqIEBzZWUgW0ZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXHJcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgY29udGFpbmluZyBzaW1pbGFyIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnktc2ltaWxhci1mZWF0dXJlcy8pXHJcbiAgICAgKiBAc2VlIFtDcmVhdGUgYSB0aW1lbGluZSBhbmltYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdGltZWxpbmUtYW5pbWF0aW9uLylcclxuICAgICAqIEBzZWUgVHV0b3JpYWw6IFtTaG93IGNoYW5nZXMgb3ZlciB0aW1lXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL3R1dG9yaWFscy9zaG93LWNoYW5nZXMtb3Zlci10aW1lLylcclxuICAgICAqL1xyXG4gICAgc2V0RmlsdGVyKFxyXG4gICAgICAgIGxheWVySWQ6IHN0cmluZyxcclxuICAgICAgICBmaWx0ZXI6ID9GaWx0ZXJTcGVjaWZpY2F0aW9uLFxyXG4gICAgICAgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnN0eWxlLnNldEZpbHRlcihsYXllcklkLCBmaWx0ZXIsIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgc3R5bGUgbGF5ZXIgd2hvc2UgZmlsdGVyIHRvIGdldC5cclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gVGhlIGxheWVyJ3MgZmlsdGVyLlxyXG4gICAgICovXHJcbiAgICBnZXRGaWx0ZXIobGF5ZXJJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0RmlsdGVyKGxheWVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gc2V0IHRoZSBwYWludCBwcm9wZXJ0eSBpbi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWludCBwcm9wZXJ0eSB0byBzZXQuXHJcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcGFpbnQgcHJvcGVydHkgdG8gc2V0LlxyXG4gICAgICogICBNdXN0IGJlIG9mIGEgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5LCBhcyBkZWZpbmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgYHZhbHVlYCBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC5zZXRQYWludFByb3BlcnR5KCdteS1sYXllcicsICdmaWxsLWNvbG9yJywgJyNmYWFmZWUnKTtcclxuICAgICAqIEBzZWUgW0NoYW5nZSBhIGxheWVyJ3MgY29sb3Igd2l0aCBidXR0b25zXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NvbG9yLXN3aXRjaGVyLylcclxuICAgICAqIEBzZWUgW0FkanVzdCBhIGxheWVyJ3Mgb3BhY2l0eV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGp1c3QtbGF5ZXItb3BhY2l0eS8pXHJcbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcclxuICAgICAqL1xyXG4gICAgc2V0UGFpbnRQcm9wZXJ0eShcclxuICAgICAgICBsYXllcklkOiBzdHJpbmcsXHJcbiAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgIHZhbHVlOiBhbnksXHJcbiAgICAgICAgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge31cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcGFpbnQgcHJvcGVydHkgaW4gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIGdldCB0aGUgcGFpbnQgcHJvcGVydHkgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIGEgcGFpbnQgcHJvcGVydHkgdG8gZ2V0LlxyXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhaW50IHByb3BlcnR5LlxyXG4gICAgICovXHJcbiAgICBnZXRQYWludFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgbGF5b3V0IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBzZXQgdGhlIGxheW91dCBwcm9wZXJ0eSBpbi5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgcHJvcGVydHkgdG8gc2V0LlxyXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eS4gTXVzdCBiZSBvZiBhIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSwgYXMgZGVmaW5lZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIGB2YWx1ZWAgY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBtYXAuc2V0TGF5b3V0UHJvcGVydHkoJ215LWxheWVyJywgJ3Zpc2liaWxpdHknLCAnbm9uZScpO1xyXG4gICAgICogQHNlZSBbU2hvdyBhbmQgaGlkZSBsYXllcnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RvZ2dsZS1sYXllcnMvKVxyXG4gICAgICovXHJcbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShcclxuICAgICAgICBsYXllcklkOiBzdHJpbmcsXHJcbiAgICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgIHZhbHVlOiBhbnksXHJcbiAgICAgICAgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge31cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZCwgbmFtZSwgdmFsdWUsIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0IHRoZSBsYXlvdXQgcHJvcGVydHkgZnJvbS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgcHJvcGVydHkgdG8gZ2V0LlxyXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGxheW91dCBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkLCBuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGFueSBjb21iaW5hdGlvbiBvZiBsaWdodCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGxpZ2h0IExpZ2h0IHByb3BlcnRpZXMgdG8gc2V0LiBNdXN0IGNvbmZvcm0gdG8gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jbGlnaHQpLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgZmlsdGVyIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxyXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIGxheWVyVmlzaWJpbGl0eSA9IG1hcC5nZXRMYXlvdXRQcm9wZXJ0eSgnbXktbGF5ZXInLCAndmlzaWJpbGl0eScpO1xyXG4gICAgICogQHNlZSBbU2hvdyBhbmQgaGlkZSBsYXllcnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RvZ2dsZS1sYXllcnMvKVxyXG4gICAgICovXHJcbiAgICBzZXRMaWdodChsaWdodDogTGlnaHRTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xyXG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGlnaHQobGlnaHQsIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGlnaHQgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGxpZ2h0IExpZ2h0IHByb3BlcnRpZXMgb2YgdGhlIHN0eWxlLlxyXG4gICAgICovXHJcbiAgICBnZXRMaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMaWdodCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnNcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgYHN0YXRlYCBvZiBhIGZlYXR1cmUuXHJcbiAgICAgKiBBIGZlYXR1cmUncyBgc3RhdGVgIGlzIGEgc2V0IG9mIHVzZXItZGVmaW5lZCBrZXktdmFsdWUgcGFpcnMgdGhhdCBhcmUgYXNzaWduZWQgdG8gYSBmZWF0dXJlIGF0IHJ1bnRpbWUuXHJcbiAgICAgKiBXaGVuIHVzaW5nIHRoaXMgbWV0aG9kLCB0aGUgYHN0YXRlYCBvYmplY3QgaXMgbWVyZ2VkIHdpdGggYW55IGV4aXN0aW5nIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgZmVhdHVyZSdzIHN0YXRlLlxyXG4gICAgICogRmVhdHVyZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYGZlYXR1cmUuaWRgIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIGJlIGFueSBudW1iZXIgb3Igc3RyaW5nLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzb3VyY2VzIHRoYXQgaGF2ZSBhIGBmZWF0dXJlLmlkYCBhdHRyaWJ1dGUuIFRoZSBgZmVhdHVyZS5pZGAgYXR0cmlidXRlIGNhbiBiZSBkZWZpbmVkIGluIHRocmVlIHdheXM6XHJcbiAgICAgKiAtIEZvciB2ZWN0b3Igb3IgR2VvSlNPTiBzb3VyY2VzLCBpbmNsdWRpbmcgYW4gYGlkYCBhdHRyaWJ1dGUgaW4gdGhlIG9yaWdpbmFsIGRhdGEgZmlsZS5cclxuICAgICAqIC0gRm9yIHZlY3RvciBvciBHZW9KU09OIHNvdXJjZXMsIHVzaW5nIHRoZSBbYHByb21vdGVJZGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvI3ZlY3Rvci1wcm9tb3RlSWQpIG9wdGlvbiBhdCB0aGUgdGltZSB0aGUgc291cmNlIGlzIGRlZmluZWQuXHJcbiAgICAgKiAtIEZvciBHZW9KU09OIHNvdXJjZXMsIHVzaW5nIHRoZSBbYGdlbmVyYXRlSWRgXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9zb3VyY2VzLyNnZW9qc29uLWdlbmVyYXRlSWQpIG9wdGlvbiB0byBhdXRvLWFzc2lnbiBhbiBgaWRgIGJhc2VkIG9uIHRoZSBmZWF0dXJlJ3MgaW5kZXggaW4gdGhlIHNvdXJjZSBkYXRhLiBJZiB5b3UgY2hhbmdlIGZlYXR1cmUgZGF0YSB1c2luZyBgbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpLnNldERhdGEoLi4pYCwgeW91IG1heSBuZWVkIHRvIHJlLWFwcGx5IHN0YXRlIHRha2luZyBpbnRvIGFjY291bnQgdXBkYXRlZCBgaWRgIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBfTm90ZTogWW91IGNhbiB1c2UgdGhlIFtgZmVhdHVyZS1zdGF0ZWAgZXhwcmVzc2lvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvZXhwcmVzc2lvbnMvI2ZlYXR1cmUtc3RhdGUpIHRvIGFjY2VzcyB0aGUgdmFsdWVzIGluIGEgZmVhdHVyZSdzIHN0YXRlIG9iamVjdCBmb3IgdGhlIHB1cnBvc2VzIG9mIHN0eWxpbmcuX1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlIEZlYXR1cmUgaWRlbnRpZmllci4gRmVhdHVyZSBvYmplY3RzIHJldHVybmVkIGZyb21cclxuICAgICAqIHtAbGluayBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzfSBvciBldmVudCBoYW5kbGVycyBjYW4gYmUgdXNlZCBhcyBmZWF0dXJlIGlkZW50aWZpZXJzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGZlYXR1cmUuaWQgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUuc291cmNlIFRoZSBpZCBvZiB0aGUgdmVjdG9yIG9yIEdlb0pTT04gc291cmNlIGZvciB0aGUgZmVhdHVyZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZmVhdHVyZS5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIGBzb3VyY2VMYXllcmAgaXMgcmVxdWlyZWQuKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIEEgc2V0IG9mIGtleS12YWx1ZSBwYWlycy4gVGhlIHZhbHVlcyBzaG91bGQgYmUgdmFsaWQgSlNPTiB0eXBlcy5cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gV2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciB0aGUgYG15LWxheWVyYCBsYXllciwgdXBkYXRlXHJcbiAgICAgKiAvLyB0aGUgZmVhdHVyZSBzdGF0ZSBmb3IgdGhlIGZlYXR1cmUgdW5kZXIgdGhlIG1vdXNlXHJcbiAgICAgKiBtYXAub24oJ21vdXNlbW92ZScsICdteS1sYXllcicsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAqICAgaWYgKGUuZmVhdHVyZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICogICAgIG1hcC5zZXRGZWF0dXJlU3RhdGUoe1xyXG4gICAgICogICAgICAgc291cmNlOiAnbXktc291cmNlJyxcclxuICAgICAqICAgICAgIHNvdXJjZUxheWVyOiAnbXktc291cmNlLWxheWVyJyxcclxuICAgICAqICAgICAgIGlkOiBlLmZlYXR1cmVzWzBdLmlkLFxyXG4gICAgICogICAgIH0sIHtcclxuICAgICAqICAgICAgIGhvdmVyOiB0cnVlXHJcbiAgICAgKiAgICAgfSk7XHJcbiAgICAgKiAgIH1cclxuICAgICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIEBzZWUgW0NyZWF0ZSBhIGhvdmVyIGVmZmVjdF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcclxuICAgICAqIEBzZWUgVHV0b3JpYWw6IFtDcmVhdGUgaW50ZXJhY3RpdmUgaG92ZXIgZWZmZWN0cyB3aXRoIE1hcGJveCBHTCBKU10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC90dXRvcmlhbHMvY3JlYXRlLWludGVyYWN0aXZlLWhvdmVyLWVmZmVjdHMtd2l0aC1tYXBib3gtZ2wtanMvKVxyXG4gICAgICovXHJcbiAgICBzZXRGZWF0dXJlU3RhdGUoXHJcbiAgICAgICAgZmVhdHVyZTogeyBzb3VyY2U6IHN0cmluZywgc291cmNlTGF5ZXI/OiBzdHJpbmcsIGlkOiBzdHJpbmcgfCBudW1iZXIgfSxcclxuICAgICAgICBzdGF0ZTogT2JqZWN0XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnN0eWxlLnNldEZlYXR1cmVTdGF0ZShmZWF0dXJlLCBzdGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnNcclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgYHN0YXRlYCBvZiBhIGZlYXR1cmUsIHNldHRpbmcgaXQgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvci5cclxuICAgICAqIElmIG9ubHkgYSBgdGFyZ2V0LnNvdXJjZWAgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHJlbW92ZSB0aGUgc3RhdGUgZm9yIGFsbCBmZWF0dXJlcyBmcm9tIHRoYXQgc291cmNlLlxyXG4gICAgICogSWYgYHRhcmdldC5pZGAgaXMgYWxzbyBzcGVjaWZpZWQsIGl0IHdpbGwgcmVtb3ZlIGFsbCBrZXlzIGZvciB0aGF0IGZlYXR1cmUncyBzdGF0ZS5cclxuICAgICAqIElmIGBrZXlgIGlzIGFsc28gc3BlY2lmaWVkLCBpdCByZW1vdmVzIG9ubHkgdGhhdCBrZXkgZnJvbSB0aGF0IGZlYXR1cmUncyBzdGF0ZS5cclxuICAgICAqIEZlYXR1cmVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGBmZWF0dXJlLmlkYCBhdHRyaWJ1dGUsIHdoaWNoIGNhbiBiZSBhbnkgbnVtYmVyIG9yIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IElkZW50aWZpZXIgb2Ygd2hlcmUgdG8gcmVtb3ZlIHN0YXRlLiBJdCBjYW4gYmUgYSBzb3VyY2UsIGEgZmVhdHVyZSwgb3IgYSBzcGVjaWZpYyBrZXkgb2YgZmVhdHVyZS5cclxuICAgICAqIEZlYXR1cmUgb2JqZWN0cyByZXR1cm5lZCBmcm9tIHtAbGluayBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzfSBvciBldmVudCBoYW5kbGVycyBjYW4gYmUgdXNlZCBhcyBmZWF0dXJlIGlkZW50aWZpZXJzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHRhcmdldC5pZCAob3B0aW9uYWwpIFVuaXF1ZSBpZCBvZiB0aGUgZmVhdHVyZS4gT3B0aW9uYWwgaWYga2V5IGlzIG5vdCBzcGVjaWZpZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0LnNvdXJjZSBUaGUgaWQgb2YgdGhlIHZlY3RvciBvciBHZW9KU09OIHNvdXJjZSBmb3IgdGhlIGZlYXR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldC5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIGBzb3VyY2VMYXllcmAgaXMgcmVxdWlyZWQuKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAob3B0aW9uYWwpIFRoZSBrZXkgaW4gdGhlIGZlYXR1cmUgc3RhdGUgdG8gcmVzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIC8vIFJlc2V0IHRoZSBlbnRpcmUgc3RhdGUgb2JqZWN0IGZvciBhbGwgZmVhdHVyZXNcclxuICAgICAqIC8vIGluIHRoZSBgbXktc291cmNlYCBzb3VyY2VcclxuICAgICAqIG1hcC5yZW1vdmVGZWF0dXJlU3RhdGUoe1xyXG4gICAgICogICBzb3VyY2U6ICdteS1zb3VyY2UnXHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gV2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBgbXktbGF5ZXJgIGxheWVyLFxyXG4gICAgICogLy8gcmVzZXQgdGhlIGVudGlyZSBzdGF0ZSBvYmplY3QgZm9yIHRoZVxyXG4gICAgICogLy8gZmVhdHVyZSB1bmRlciB0aGUgbW91c2VcclxuICAgICAqIG1hcC5vbignbW91c2VsZWF2ZScsICdteS1sYXllcicsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAqICAgbWFwLnJlbW92ZUZlYXR1cmVTdGF0ZSh7XHJcbiAgICAgKiAgICAgc291cmNlOiAnbXktc291cmNlJyxcclxuICAgICAqICAgICBzb3VyY2VMYXllcjogJ215LXNvdXJjZS1sYXllcicsXHJcbiAgICAgKiAgICAgaWQ6IGUuZmVhdHVyZXNbMF0uaWRcclxuICAgICAqICAgfSk7XHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogLy8gV2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBgbXktbGF5ZXJgIGxheWVyLFxyXG4gICAgICogLy8gcmVzZXQgb25seSB0aGUgYGhvdmVyYCBrZXktdmFsdWUgcGFpciBpbiB0aGVcclxuICAgICAqIC8vIHN0YXRlIGZvciB0aGUgZmVhdHVyZSB1bmRlciB0aGUgbW91c2VcclxuICAgICAqIG1hcC5vbignbW91c2VsZWF2ZScsICdteS1sYXllcicsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAqICAgbWFwLnJlbW92ZUZlYXR1cmVTdGF0ZSh7XHJcbiAgICAgKiAgICAgc291cmNlOiAnbXktc291cmNlJyxcclxuICAgICAqICAgICBzb3VyY2VMYXllcjogJ215LXNvdXJjZS1sYXllcicsXHJcbiAgICAgKiAgICAgaWQ6IGUuZmVhdHVyZXNbMF0uaWRcclxuICAgICAqICAgfSwgJ2hvdmVyJyk7XHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUZlYXR1cmVTdGF0ZShcclxuICAgICAgICB0YXJnZXQ6IHsgc291cmNlOiBzdHJpbmcsIHNvdXJjZUxheWVyPzogc3RyaW5nLCBpZD86IHN0cmluZyB8IG51bWJlciB9LFxyXG4gICAgICAgIGtleT86IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVGZWF0dXJlU3RhdGUodGFyZ2V0LCBrZXkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGBzdGF0ZWAgb2YgYSBmZWF0dXJlLlxyXG4gICAgICogQSBmZWF0dXJlJ3MgYHN0YXRlYCBpcyBhIHNldCBvZiB1c2VyLWRlZmluZWQga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGEgZmVhdHVyZSBhdCBydW50aW1lLlxyXG4gICAgICogRmVhdHVyZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYGZlYXR1cmUuaWRgIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIGJlIGFueSBudW1iZXIgb3Igc3RyaW5nLlxyXG4gICAgICpcclxuICAgICAqIF9Ob3RlOiBUbyBhY2Nlc3MgdGhlIHZhbHVlcyBpbiBhIGZlYXR1cmUncyBzdGF0ZSBvYmplY3QgZm9yIHRoZSBwdXJwb3NlcyBvZiBzdHlsaW5nIHRoZSBmZWF0dXJlLCB1c2UgdGhlIFtgZmVhdHVyZS1zdGF0ZWAgZXhwcmVzc2lvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvZXhwcmVzc2lvbnMvI2ZlYXR1cmUtc3RhdGUpLl9cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmVhdHVyZSBGZWF0dXJlIGlkZW50aWZpZXIuIEZlYXR1cmUgb2JqZWN0cyByZXR1cm5lZCBmcm9tXHJcbiAgICAgKiB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gb3IgZXZlbnQgaGFuZGxlcnMgY2FuIGJlIHVzZWQgYXMgZmVhdHVyZSBpZGVudGlmaWVycy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBmZWF0dXJlLmlkIFVuaXF1ZSBpZCBvZiB0aGUgZmVhdHVyZS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHZlY3RvciBvciBHZW9KU09OIHNvdXJjZSBmb3IgdGhlIGZlYXR1cmUuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZlYXR1cmUuc291cmNlTGF5ZXJdIChvcHRpb25hbCkgKkZvciB2ZWN0b3IgdGlsZSBzb3VyY2VzLCBgc291cmNlTGF5ZXJgIGlzIHJlcXVpcmVkLipcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc3RhdGUgb2YgdGhlIGZlYXR1cmU6IGEgc2V0IG9mIGtleS12YWx1ZSBwYWlycyB0aGF0IHdhcyBhc3NpZ25lZCB0byB0aGUgZmVhdHVyZSBhdCBydW50aW1lLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiAvLyBXaGVuIHRoZSBtb3VzZSBtb3ZlcyBvdmVyIHRoZSBgbXktbGF5ZXJgIGxheWVyLFxyXG4gICAgICogLy8gZ2V0IHRoZSBmZWF0dXJlIHN0YXRlIGZvciB0aGUgZmVhdHVyZSB1bmRlciB0aGUgbW91c2VcclxuICAgICAqIG1hcC5vbignbW91c2Vtb3ZlJywgJ215LWxheWVyJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICogICBpZiAoZS5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgKiAgICAgbWFwLmdldEZlYXR1cmVTdGF0ZSh7XHJcbiAgICAgKiAgICAgICBzb3VyY2U6ICdteS1zb3VyY2UnLFxyXG4gICAgICogICAgICAgc291cmNlTGF5ZXI6ICdteS1zb3VyY2UtbGF5ZXInXHJcbiAgICAgKiAgICAgICBpZDogZS5mZWF0dXJlc1swXS5pZFxyXG4gICAgICogICAgIH0pO1xyXG4gICAgICogICB9XHJcbiAgICAgKiB9KTtcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIGdldEZlYXR1cmVTdGF0ZShmZWF0dXJlOiB7XHJcbiAgICAgICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICAgICAgc291cmNlTGF5ZXI/OiBzdHJpbmcsXHJcbiAgICAgICAgaWQ6IHN0cmluZyB8IG51bWJlcixcclxuICAgIH0pOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZlYXR1cmVTdGF0ZShmZWF0dXJlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGNvbnRhaW5pbmcgSFRNTCBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG1hcCdzIGNvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgZ2V0Q29udGFpbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGVsZW1lbnQgY29udGFpbmluZyB0aGUgbWFwJ3MgYDxjYW52YXM+YCBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIElmIHlvdSB3YW50IHRvIGFkZCBub24tR0wgb3ZlcmxheXMgdG8gdGhlIG1hcCwgeW91IHNob3VsZCBhcHBlbmQgdGhlbSB0byB0aGlzIGVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyB0aGUgZWxlbWVudCB0byB3aGljaCBldmVudCBiaW5kaW5ncyBmb3IgbWFwIGludGVyYWN0aXZpdHkgKHN1Y2ggYXMgcGFubmluZyBhbmQgem9vbWluZykgYXJlXHJcbiAgICAgKiBhdHRhY2hlZC4gSXQgd2lsbCByZWNlaXZlIGJ1YmJsZWQgZXZlbnRzIGZyb20gY2hpbGQgZWxlbWVudHMgc3VjaCBhcyB0aGUgYDxjYW52YXM+YCwgYnV0IG5vdCBmcm9tXHJcbiAgICAgKiBtYXAgY29udHJvbHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgY29udGFpbmVyIG9mIHRoZSBtYXAncyBgPGNhbnZhcz5gLlxyXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXHJcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxyXG4gICAgICovXHJcbiAgICBnZXRDYW52YXNDb250YWluZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhc0NvbnRhaW5lcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGA8Y2FudmFzPmAgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXHJcbiAgICAgKiBAc2VlIFtNZWFzdXJlIGRpc3RhbmNlc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tZWFzdXJlLylcclxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXHJcbiAgICAgKiBAc2VlIFtDZW50ZXIgdGhlIG1hcCBvbiBhIGNsaWNrZWQgc3ltYm9sXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxyXG4gICAgICovXHJcbiAgICBnZXRDYW52YXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhcztcclxuICAgIH1cclxuXHJcbiAgICBfY29udGFpbmVyRGltZW5zaW9ucygpIHtcclxuICAgICAgICBsZXQgd2lkdGggPSAwO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSAwO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5fY29udGFpbmVyLmNsaWVudFdpZHRoIHx8IDQwMDtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLmNsaWVudEhlaWdodCB8fCAzMDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xyXG4gICAgfVxyXG5cclxuICAgIF9kZXRlY3RNaXNzaW5nQ1NTKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3dcclxuICAgICAgICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy5fbWlzc2luZ0NTU0NhbmFyeSlcclxuICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kLWNvbG9yXCIpO1xyXG4gICAgICAgIGlmIChjb21wdXRlZENvbG9yICE9PSBcInJnYigyNTAsIDEyOCwgMTE0KVwiKSB7XHJcbiAgICAgICAgICAgIHdhcm5PbmNlKFxyXG4gICAgICAgICAgICAgICAgXCJUaGlzIHBhZ2UgYXBwZWFycyB0byBiZSBtaXNzaW5nIENTUyBkZWNsYXJhdGlvbnMgZm9yIFwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIk1hcGJveCBHTCBKUywgd2hpY2ggbWF5IGNhdXNlIHRoZSBtYXAgdG8gZGlzcGxheSBpbmNvcnJlY3RseS4gXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiUGxlYXNlIGVuc3VyZSB5b3VyIHBhZ2UgaW5jbHVkZXMgbWFwYm94LWdsLmNzcywgYXMgZGVzY3JpYmVkIFwiICtcclxuICAgICAgICAgICAgICAgICAgICBcImluIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS8uXCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3NldHVwQ29udGFpbmVyKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcclxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLW1hcFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWlzc2luZ0NTU0NhbmFyeSA9ICh0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5ID0gRE9NLmNyZWF0ZShcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgXCJtYXBib3hnbC1jYW5hcnlcIixcclxuICAgICAgICAgICAgY29udGFpbmVyXHJcbiAgICAgICAgKSk7XHJcbiAgICAgICAgbWlzc2luZ0NTU0NhbmFyeS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgICAgICB0aGlzLl9kZXRlY3RNaXNzaW5nQ1NTKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbnZhc0NvbnRhaW5lciA9ICh0aGlzLl9jYW52YXNDb250YWluZXIgPSBET00uY3JlYXRlKFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICBcIm1hcGJveGdsLWNhbnZhcy1jb250YWluZXJcIixcclxuICAgICAgICAgICAgY29udGFpbmVyXHJcbiAgICAgICAgKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyYWN0aXZlKSB7XHJcbiAgICAgICAgICAgIGNhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtaW50ZXJhY3RpdmVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYW52YXMgPSBET00uY3JlYXRlKFwiY2FudmFzXCIsIFwibWFwYm94Z2wtY2FudmFzXCIsIGNhbnZhc0NvbnRhaW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgIFwid2ViZ2xjb250ZXh0bG9zdFwiLFxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0TG9zdCxcclxuICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICBcIndlYmdsY29udGV4dHJlc3RvcmVkXCIsXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRSZXN0b3JlZCxcclxuICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XHJcbiAgICAgICAgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJNYXBcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCk7XHJcbiAgICAgICAgdGhpcy5fcmVzaXplQ2FudmFzKGRpbWVuc2lvbnNbMF0sIGRpbWVuc2lvbnNbMV0pO1xyXG5cclxuICAgICAgICBjb25zdCBjb250cm9sQ29udGFpbmVyID0gKHRoaXMuX2NvbnRyb2xDb250YWluZXIgPSBET00uY3JlYXRlKFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICBcIm1hcGJveGdsLWNvbnRyb2wtY29udGFpbmVyXCIsXHJcbiAgICAgICAgICAgIGNvbnRhaW5lclxyXG4gICAgICAgICkpO1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9ICh0aGlzLl9jb250cm9sUG9zaXRpb25zID0ge30pO1xyXG4gICAgICAgIFtcInRvcC1sZWZ0XCIsIFwidG9wLXJpZ2h0XCIsIFwiYm90dG9tLWxlZnRcIiwgXCJib3R0b20tcmlnaHRcIl0uZm9yRWFjaChcclxuICAgICAgICAgICAgKHBvc2l0aW9uTmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25zW3Bvc2l0aW9uTmFtZV0gPSBET00uY3JlYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgYG1hcGJveGdsLWN0cmwtJHtwb3NpdGlvbk5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICBjb250cm9sQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzaXplQ2FudmFzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgcGl4ZWxSYXRpbyA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xyXG5cclxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSByZXF1aXJlZCBjYW52YXMgc2l6ZSB0YWtpbmcgdGhlIHBpeGVscmF0aW8gaW50byBhY2NvdW50LlxyXG4gICAgICAgIHRoaXMuX2NhbnZhcy53aWR0aCA9IHBpeGVsUmF0aW8gKiB3aWR0aDtcclxuICAgICAgICB0aGlzLl9jYW52YXMuaGVpZ2h0ID0gcGl4ZWxSYXRpbyAqIGhlaWdodDtcclxuXHJcbiAgICAgICAgLy8gTWFpbnRhaW4gdGhlIHNhbWUgY2FudmFzIHNpemUsIHBvdGVudGlhbGx5IGRvd25zY2FsaW5nIGl0IGZvciBIaURQSSBkaXNwbGF5c1xyXG4gICAgICAgIHRoaXMuX2NhbnZhcy5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcclxuICAgICAgICB0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBfc2V0dXBQYWludGVyKCkge1xyXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBleHRlbmQoe30sIGlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMsIHtcclxuICAgICAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcclxuICAgICAgICAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXHJcbiAgICAgICAgICAgIGFudGlhbGlhczogdGhpcy5fYW50aWFsaWFzIHx8IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBnbCA9XHJcbiAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KFwid2ViZ2xcIiwgYXR0cmlidXRlcykgfHxcclxuICAgICAgICAgICAgdGhpcy5fY2FudmFzLmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIiwgYXR0cmlidXRlcyk7XHJcblxyXG4gICAgICAgIGlmICghZ2wpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMXCIpKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFpbnRlciA9IG5ldyBQYWludGVyKGdsLCB0aGlzLnRyYW5zZm9ybSk7XHJcblxyXG4gICAgICAgIHdlYnBTdXBwb3J0ZWQudGVzdFN1cHBvcnQoZ2wpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jb250ZXh0TG9zdChldmVudDogKikge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsIHsgb3JpZ2luYWxFdmVudDogZXZlbnQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jb250ZXh0UmVzdG9yZWQoZXZlbnQ6ICopIHtcclxuICAgICAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcclxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoXCJ3ZWJnbGNvbnRleHRyZXN0b3JlZFwiLCB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIGlzIGZ1bGx5IGxvYWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgdGhlIHN0eWxlIGlzIG5vdCB5ZXQgZnVsbHkgbG9hZGVkLFxyXG4gICAgICogb3IgaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgdG8gdGhlIHNvdXJjZXMgb3Igc3R5bGUgdGhhdFxyXG4gICAgICogaGFzIG5vdCB5ZXQgZnVsbHkgbG9hZGVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaXMgZnVsbHkgbG9hZGVkLlxyXG4gICAgICovXHJcbiAgICBsb2FkZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgIXRoaXMuX3N0eWxlRGlydHkgJiZcclxuICAgICAgICAgICAgIXRoaXMuX3NvdXJjZXNEaXJ0eSAmJlxyXG4gICAgICAgICAgICAhIXRoaXMuc3R5bGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkZWQoKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhpcyBtYXAncyBzdHlsZSBhbmQgc291cmNlcywgYW5kIHJlLXJlbmRlciB0aGUgbWFwLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXBkYXRlU3R5bGUgbWFyayB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHJlcHJvY2Vzc2luZyBhc1xyXG4gICAgICogd2VsbCBhcyBpdHMgc291cmNlc1xyXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX3VwZGF0ZSh1cGRhdGVTdHlsZT86IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdGhpcy5fc3R5bGVEaXJ0eSB8fCB1cGRhdGVTdHlsZTtcclxuICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIGdpdmVuIGNhbGxiYWNrIGJlIGV4ZWN1dGVkIGR1cmluZyB0aGUgbmV4dCByZW5kZXJcclxuICAgICAqIGZyYW1lLiAgU2NoZWR1bGUgYSByZW5kZXIgZnJhbWUgaWYgb25lIGlzIG5vdCBhbHJlYWR5IHNjaGVkdWxlZC5cclxuICAgICAqIEByZXR1cm5zIEFuIGlkIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBjYWxsYmFja1xyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX3JlcXVlc3RSZW5kZXJGcmFtZShjYWxsYmFjazogKCkgPT4gdm9pZCk6IFRhc2tJRCB7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5hZGQoY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIF9jYW5jZWxSZW5kZXJGcmFtZShpZDogVGFza0lEKSB7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFza1F1ZXVlLnJlbW92ZShpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsIHdoZW4gYSAocmUtKXJlbmRlciBvZiB0aGUgbWFwIGlzIHJlcXVpcmVkOlxyXG4gICAgICogLSBUaGUgc3R5bGUgaGFzIGNoYW5nZWQgKGBzZXRQYWludFByb3BlcnR5KClgLCBldGMuKVxyXG4gICAgICogLSBTb3VyY2UgZGF0YSBoYXMgY2hhbmdlZCAoZS5nLiB0aWxlcyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcpXHJcbiAgICAgKiAtIFRoZSBtYXAgaGFzIGlzIG1vdmluZyAob3IganVzdCBmaW5pc2hlZCBtb3ZpbmcpXHJcbiAgICAgKiAtIEEgdHJhbnNpdGlvbiBpcyBpbiBwcm9ncmVzc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWludFN0YXJ0VGltZVN0YW1wICBUaGUgdGltZSB3aGVuIHRoZSBhbmltYXRpb24gZnJhbWUgYmVnYW4gZXhlY3V0aW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtNYXB9IHRoaXNcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9yZW5kZXIocGFpbnRTdGFydFRpbWVTdGFtcDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGdwdVRpbWVyLFxyXG4gICAgICAgICAgICBmcmFtZVN0YXJ0VGltZSA9IDA7XHJcbiAgICAgICAgY29uc3QgZXh0VGltZXJRdWVyeSA9IHRoaXMucGFpbnRlci5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdGVucyhcImdwdS10aW1pbmctZnJhbWVcIikpIHtcclxuICAgICAgICAgICAgZ3B1VGltZXIgPSBleHRUaW1lclF1ZXJ5LmNyZWF0ZVF1ZXJ5RVhUKCk7XHJcbiAgICAgICAgICAgIGV4dFRpbWVyUXVlcnkuYmVnaW5RdWVyeUVYVChcclxuICAgICAgICAgICAgICAgIGV4dFRpbWVyUXVlcnkuVElNRV9FTEFQU0VEX0VYVCxcclxuICAgICAgICAgICAgICAgIGdwdVRpbWVyXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGZyYW1lU3RhcnRUaW1lID0gYnJvd3Nlci5ub3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEEgY3VzdG9tIGxheWVyIG1heSBoYXZlIHVzZWQgdGhlIGNvbnRleHQgYXN5bmNocm9ub3VzbHkuIE1hcmsgdGhlIHN0YXRlIGFzIGRpcnR5LlxyXG4gICAgICAgIHRoaXMucGFpbnRlci5jb250ZXh0LnNldERpcnR5KCk7XHJcbiAgICAgICAgdGhpcy5wYWludGVyLnNldEJhc2VTdGF0ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJUYXNrUXVldWUucnVuKHBhaW50U3RhcnRUaW1lU3RhbXApO1xyXG4gICAgICAgIC8vIEEgdGFzayBxdWV1ZSBjYWxsYmFjayBtYXkgaGF2ZSBmaXJlZCBhIHVzZXIgZXZlbnQgd2hpY2ggbWF5IGhhdmUgcmVtb3ZlZCB0aGUgbWFwXHJcbiAgICAgICAgaWYgKHRoaXMuX3JlbW92ZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNyb3NzRmFkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBoYXMgY2hhbmdlZCwgdGhlIG1hcCBpcyBiZWluZyB6b29tZWQsIG9yIGEgdHJhbnNpdGlvbiBvciBmYWRlIGlzIGluIHByb2dyZXNzOlxyXG4gICAgICAgIC8vICAtIEFwcGx5IHN0eWxlIGNoYW5nZXMgKGluIGEgYmF0Y2gpXHJcbiAgICAgICAgLy8gIC0gUmVjYWxjdWxhdGUgcGFpbnQgcHJvcGVydGllcy5cclxuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zdHlsZURpcnR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnRyYW5zZm9ybS56b29tO1xyXG4gICAgICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpO1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLnpvb21IaXN0b3J5LnVwZGF0ZSh6b29tLCBub3cpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh6b29tLCB7XHJcbiAgICAgICAgICAgICAgICBub3csXHJcbiAgICAgICAgICAgICAgICBmYWRlRHVyYXRpb246IHRoaXMuX2ZhZGVEdXJhdGlvbixcclxuICAgICAgICAgICAgICAgIHpvb21IaXN0b3J5OiB0aGlzLnN0eWxlLnpvb21IaXN0b3J5LFxyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5zdHlsZS5nZXRUcmFuc2l0aW9uKCksXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmFjdG9yID0gcGFyYW1ldGVycy5jcm9zc0ZhZGluZ0ZhY3RvcigpO1xyXG4gICAgICAgICAgICBpZiAoZmFjdG9yICE9PSAxIHx8IGZhY3RvciAhPT0gdGhpcy5fY3Jvc3NGYWRpbmdGYWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIGNyb3NzRmFkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yID0gZmFjdG9yO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLnVwZGF0ZShwYXJhbWV0ZXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBpbiBfcmVuZGVyIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gaW4tcHJvZ3Jlc3MgcGFpbnRcclxuICAgICAgICAvLyB0cmFuc2l0aW9uLCB1cGRhdGUgc291cmNlIGNhY2hlcyB0byBjaGVjayBmb3IgYW5kIGxvYWQgYW55IHRpbGVzIHdlXHJcbiAgICAgICAgLy8gbmVlZCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmb3JtXHJcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc291cmNlc0RpcnR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLl91cGRhdGVTb3VyY2VzKHRoaXMudHJhbnNmb3JtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BsYWNlbWVudERpcnR5ID1cclxuICAgICAgICAgICAgdGhpcy5zdHlsZSAmJlxyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLl91cGRhdGVQbGFjZW1lbnQoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50ZXIudHJhbnNmb3JtLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMsXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWRlRHVyYXRpb24sXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jcm9zc1NvdXJjZUNvbGxpc2lvbnNcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gQWN0dWFsbHkgZHJhd1xyXG4gICAgICAgIHRoaXMucGFpbnRlci5yZW5kZXIodGhpcy5zdHlsZSwge1xyXG4gICAgICAgICAgICBzaG93VGlsZUJvdW5kYXJpZXM6IHRoaXMuc2hvd1RpbGVCb3VuZGFyaWVzLFxyXG4gICAgICAgICAgICBzaG93T3ZlcmRyYXdJbnNwZWN0b3I6IHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcixcclxuICAgICAgICAgICAgcm90YXRpbmc6IHRoaXMuaXNSb3RhdGluZygpLFxyXG4gICAgICAgICAgICB6b29taW5nOiB0aGlzLmlzWm9vbWluZygpLFxyXG4gICAgICAgICAgICBtb3Zpbmc6IHRoaXMuaXNNb3ZpbmcoKSxcclxuICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiB0aGlzLl9mYWRlRHVyYXRpb24sXHJcbiAgICAgICAgICAgIHNob3dQYWRkaW5nOiB0aGlzLnNob3dQYWRkaW5nLFxyXG4gICAgICAgICAgICBncHVUaW1pbmc6ICEhdGhpcy5saXN0ZW5zKFwiZ3B1LXRpbWluZy1sYXllclwiKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudChcInJlbmRlclwiKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCgpICYmICF0aGlzLl9sb2FkZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5tYXJrKFBlcmZvcm1hbmNlTWFya2Vycy5sb2FkKTtcclxuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudChcImxvYWRcIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgKHRoaXMuc3R5bGUuaGFzVHJhbnNpdGlvbnMoKSB8fCBjcm9zc0ZhZGluZykpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3R5bGVEaXJ0eSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiAhdGhpcy5fcGxhY2VtZW50RGlydHkpIHtcclxuICAgICAgICAgICAgLy8gU2luY2Ugbm8gZmFkZSBvcGVyYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgd2UgY2FuIHJlbGVhc2VcclxuICAgICAgICAgICAgLy8gYWxsIHRpbGVzIGhlbGQgZm9yIGZhZGluZy4gSWYgd2UgZGlkbid0IGRvIHRoaXMsIHRoZSB0aWxlc1xyXG4gICAgICAgICAgICAvLyB3b3VsZCBqdXN0IHNpdCBpbiB0aGUgU291cmNlQ2FjaGVzIHVudGlsIHRoZSBuZXh0IHJlbmRlclxyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKFwiZ3B1LXRpbWluZy1mcmFtZVwiKSkge1xyXG4gICAgICAgICAgICBjb25zdCByZW5kZXJDUFVUaW1lID0gYnJvd3Nlci5ub3coKSAtIGZyYW1lU3RhcnRUaW1lO1xyXG4gICAgICAgICAgICBleHRUaW1lclF1ZXJ5LmVuZFF1ZXJ5RVhUKGV4dFRpbWVyUXVlcnkuVElNRV9FTEFQU0VEX0VYVCwgZ3B1VGltZXIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlckdQVVRpbWUgPVxyXG4gICAgICAgICAgICAgICAgICAgIGV4dFRpbWVyUXVlcnkuZ2V0UXVlcnlPYmplY3RFWFQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdwdVRpbWVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRUaW1lclF1ZXJ5LlFVRVJZX1JFU1VMVF9FWFRcclxuICAgICAgICAgICAgICAgICAgICApIC9cclxuICAgICAgICAgICAgICAgICAgICAoMTAwMCAqIDEwMDApO1xyXG4gICAgICAgICAgICAgICAgZXh0VGltZXJRdWVyeS5kZWxldGVRdWVyeUVYVChncHVUaW1lcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IEV2ZW50KFwiZ3B1LXRpbWluZy1mcmFtZVwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNwdVRpbWU6IHJlbmRlckNQVVRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdwdVRpbWU6IHJlbmRlckdQVVRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0sIDUwKTsgLy8gV2FpdCA1MG1zIHRvIGdpdmUgdGltZSBmb3IgYWxsIEdQVSBjYWxscyB0byBmaW5pc2ggYmVmb3JlIHF1ZXJ5aW5nXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKFwiZ3B1LXRpbWluZy1sYXllclwiKSkge1xyXG4gICAgICAgICAgICAvLyBSZXNldHRpbmcgdGhlIFBhaW50ZXIncyBwZXItbGF5ZXIgdGltaW5nIHF1ZXJpZXMgaGVyZSBhbGxvd3MgdXMgdG8gaXNvbGF0ZVxyXG4gICAgICAgICAgICAvLyB0aGUgcXVlcmllcyB0byBpbmRpdmlkdWFsIGZyYW1lcy5cclxuICAgICAgICAgICAgY29uc3QgZnJhbWVMYXllclF1ZXJpZXMgPSB0aGlzLnBhaW50ZXIuY29sbGVjdEdwdVRpbWVycygpO1xyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZExheWVyVGltZXMgPSB0aGlzLnBhaW50ZXIucXVlcnlHcHVUaW1lcnMoXHJcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVMYXllclF1ZXJpZXNcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBFdmVudChcImdwdS10aW1pbmctbGF5ZXJcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllclRpbWVzOiByZW5kZXJlZExheWVyVGltZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0sIDUwKTsgLy8gV2FpdCA1MG1zIHRvIGdpdmUgdGltZSBmb3IgYWxsIEdQVSBjYWxscyB0byBmaW5pc2ggYmVmb3JlIHF1ZXJ5aW5nXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTY2hlZHVsZSBhbm90aGVyIHJlbmRlciBmcmFtZSBpZiBpdCdzIG5lZWRlZC5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIGBfc3R5bGVEaXJ0eWAgYW5kIGBfc291cmNlc0RpcnR5YCBhcmUgcmVzZXQgaW4gdGhpc1xyXG4gICAgICAgIC8vIG1ldGhvZCwgc3luY2hyb25vdXMgZXZlbnRzIGZpcmVkIGR1cmluZyBTdHlsZSN1cGRhdGUgb3JcclxuICAgICAgICAvLyBTdHlsZSNfdXBkYXRlU291cmNlcyBjb3VsZCBoYXZlIGNhdXNlZCB0aGVtIHRvIGJlIHNldCBhZ2Fpbi5cclxuICAgICAgICBjb25zdCBzb21ldGhpbmdEaXJ0eSA9XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eSB8fCB0aGlzLl9zdHlsZURpcnR5IHx8IHRoaXMuX3BsYWNlbWVudERpcnR5O1xyXG4gICAgICAgIGlmIChzb21ldGhpbmdEaXJ0eSB8fCB0aGlzLl9yZXBhaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTW92aW5nKCkgJiYgdGhpcy5sb2FkZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KFwiaWRsZVwiKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fbG9hZGVkICYmICF0aGlzLl9mdWxseUxvYWRlZCAmJiAhc29tZXRoaW5nRGlydHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fZnVsbHlMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1hcmsoUGVyZm9ybWFuY2VNYXJrZXJzLmZ1bGxMb2FkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYW4gdXAgYW5kIHJlbGVhc2UgYWxsIGludGVybmFsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpbmNsdWRlcyBET00gZWxlbWVudHMsIGV2ZW50IGJpbmRpbmdzLCB3ZWIgd29ya2VycywgYW5kIFdlYkdMIHJlc291cmNlcy5cclxuICAgICAqXHJcbiAgICAgKiBVc2UgdGhpcyBtZXRob2Qgd2hlbiB5b3UgYXJlIGRvbmUgdXNpbmcgdGhlIG1hcCBhbmQgd2lzaCB0byBlbnN1cmUgdGhhdCBpdCBub1xyXG4gICAgICogbG9uZ2VyIGNvbnN1bWVzIGJyb3dzZXIgcmVzb3VyY2VzLiBBZnRlcndhcmRzLCB5b3UgbXVzdCBub3QgY2FsbCBhbnkgb3RoZXJcclxuICAgICAqIG1ldGhvZHMgb24gdGhlIG1hcC5cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9oYXNoKSB0aGlzLl9oYXNoLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5fY29udHJvbHMpIGNvbnRyb2wub25SZW1vdmUodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHMgPSBbXTtcclxuICAgICAgICB0aGlzLl9tYXJrZXJzQ2FjaGUgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMucGFpbnRlci5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVycy5kZXN0cm95KCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuaGFuZGxlcnM7XHJcbiAgICAgICAgdGhpcy5zZXRTdHlsZShudWxsKTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAgICAgICAgIFwib3JpZW50YXRpb25jaGFuZ2VcIixcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uV2luZG93UmVzaXplLFxyXG4gICAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5fb25XaW5kb3dPbmxpbmUsIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMucGFpbnRlci5jb250ZXh0LmdsLmdldEV4dGVuc2lvbihcclxuICAgICAgICAgICAgXCJXRUJHTF9sb3NlX2NvbnRleHRcIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGV4dGVuc2lvbikgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XHJcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9jYW52YXNDb250YWluZXIpO1xyXG4gICAgICAgIHJlbW92ZU5vZGUodGhpcy5fY29udHJvbENvbnRhaW5lcik7XHJcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5KTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLW1hcFwiKTtcclxuXHJcbiAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5jbGVhck1ldHJpY3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudChcInJlbW92ZVwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmlnZ2VyIHRoZSByZW5kZXJpbmcgb2YgYSBzaW5nbGUgZnJhbWUuIFVzZSB0aGlzIG1ldGhvZCB3aXRoIGN1c3RvbSBsYXllcnMgdG9cclxuICAgICAqIHJlcGFpbnQgdGhlIG1hcCB3aGVuIHRoZSBsYXllciBjaGFuZ2VzLiBDYWxsaW5nIHRoaXMgbXVsdGlwbGUgdGltZXMgYmVmb3JlIHRoZVxyXG4gICAgICogbmV4dCBmcmFtZSBpcyByZW5kZXJlZCB3aWxsIHN0aWxsIHJlc3VsdCBpbiBvbmx5IGEgc2luZ2xlIGZyYW1lIGJlaW5nIHJlbmRlcmVkLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcC50cmlnZ2VyUmVwYWludCgpO1xyXG4gICAgICogQHNlZSBbQWRkIGEgM0QgbW9kZWxdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC0zZC1tb2RlbC8pXHJcbiAgICAgKiBAc2VlIFtBZGQgYW4gYW5pbWF0ZWQgaWNvbiB0byB0aGUgbWFwXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UtYW5pbWF0ZWQvKVxyXG4gICAgICovXHJcbiAgICB0cmlnZ2VyUmVwYWludCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiAhdGhpcy5fZnJhbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBicm93c2VyLmZyYW1lKChwYWludFN0YXJ0VGltZVN0YW1wOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVXRpbHMuZnJhbWUocGFpbnRTdGFydFRpbWVTdGFtcCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIocGFpbnRTdGFydFRpbWVTdGFtcCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfb25XaW5kb3dPbmxpbmUoKSB7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX29uV2luZG93UmVzaXplKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90cmFja1Jlc2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH0pLl91cGRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsIHJlbmRlciBhbiBvdXRsaW5lXHJcbiAgICAgKiBhcm91bmQgZWFjaCB0aWxlIGFuZCB0aGUgdGlsZSBJRC4gVGhlc2UgdGlsZSBib3VuZGFyaWVzIGFyZSB1c2VmdWwgZm9yXHJcbiAgICAgKiBkZWJ1Z2dpbmcuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHVuY29tcHJlc3NlZCBmaWxlIHNpemUgb2YgdGhlIGZpcnN0IHZlY3RvciBzb3VyY2UgaXMgZHJhd24gaW4gdGhlIHRvcCBsZWZ0XHJcbiAgICAgKiBjb3JuZXIgb2YgZWFjaCB0aWxlLCBuZXh0IHRvIHRoZSB0aWxlIElELlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIHNob3dUaWxlQm91bmRhcmllc1xyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAaW5zdGFuY2VcclxuICAgICAqIEBtZW1iZXJvZiBNYXBcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBtYXAuc2hvd1RpbGVCb3VuZGFyaWVzID0gdHJ1ZTtcclxuICAgICAqL1xyXG4gICAgZ2V0IHNob3dUaWxlQm91bmRhcmllcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXM7XHJcbiAgICB9XHJcbiAgICBzZXQgc2hvd1RpbGVCb3VuZGFyaWVzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dUaWxlQm91bmRhcmllcyA9PT0gdmFsdWUpIHJldHVybjtcclxuICAgICAgICB0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHdpbGwgdmlzdWFsaXplXHJcbiAgICAgKiB0aGUgcGFkZGluZyBvZmZzZXRzLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIHNob3dQYWRkaW5nXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICogQG1lbWJlcm9mIE1hcFxyXG4gICAgICovXHJcbiAgICBnZXQgc2hvd1BhZGRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fc2hvd1BhZGRpbmc7XHJcbiAgICB9XHJcbiAgICBzZXQgc2hvd1BhZGRpbmcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fc2hvd1BhZGRpbmcgPT09IHZhbHVlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fc2hvd1BhZGRpbmcgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIHdpbGwgcmVuZGVyIGJveGVzXHJcbiAgICAgKiBhcm91bmQgYWxsIHN5bWJvbHMgaW4gdGhlIGRhdGEgc291cmNlLCByZXZlYWxpbmcgd2hpY2ggc3ltYm9sc1xyXG4gICAgICogd2VyZSByZW5kZXJlZCBvciB3aGljaCB3ZXJlIGhpZGRlbiBkdWUgdG8gY29sbGlzaW9ucy5cclxuICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQG5hbWUgc2hvd0NvbGxpc2lvbkJveGVzXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICogQG1lbWJlcm9mIE1hcFxyXG4gICAgICovXHJcbiAgICBnZXQgc2hvd0NvbGxpc2lvbkJveGVzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcztcclxuICAgIH1cclxuICAgIHNldCBzaG93Q29sbGlzaW9uQm94ZXModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID09PSB2YWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBXaGVuIHdlIHR1cm4gY29sbGlzaW9uIGJveGVzIG9uIHdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlbSBmb3IgZXhpc3RpbmcgdGlsZXNcclxuICAgICAgICAgICAgLy8gV2hlbiB3ZSB0dXJuIHRoZW0gb2ZmLCB0aGVyZSdzIG5vIGNvc3QgdG8gbGVhdmluZyBleGlzdGluZyBib3hlcyBpbiBwbGFjZVxyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9nZW5lcmF0ZUNvbGxpc2lvbkJveGVzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjYWxsIGFuIHVwZGF0ZSB0byByZW1vdmUgY29sbGlzaW9uIGJveGVzXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgc2hvdWxkIGNvbG9yLWNvZGVcclxuICAgICAqIGVhY2ggZnJhZ21lbnQgdG8gc2hvdyBob3cgbWFueSB0aW1lcyBpdCBoYXMgYmVlbiBzaGFkZWQuXHJcbiAgICAgKiBXaGl0ZSBmcmFnbWVudHMgaGF2ZSBiZWVuIHNoYWRlZCA4IG9yIG1vcmUgdGltZXMuXHJcbiAgICAgKiBCbGFjayBmcmFnbWVudHMgaGF2ZSBiZWVuIHNoYWRlZCAwIHRpbWVzLlxyXG4gICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSBzaG93T3ZlcmRyYXdcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQGluc3RhbmNlXHJcbiAgICAgKiBAbWVtYmVyb2YgTWFwXHJcbiAgICAgKi9cclxuICAgIGdldCBzaG93T3ZlcmRyYXdJbnNwZWN0b3IoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yO1xyXG4gICAgfVxyXG4gICAgc2V0IHNob3dPdmVyZHJhd0luc3BlY3Rvcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPT09IHZhbHVlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsXHJcbiAgICAgKiBjb250aW51b3VzbHkgcmVwYWludC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGFuYWx5emluZyBwZXJmb3JtYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAbmFtZSByZXBhaW50XHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICogQG1lbWJlcm9mIE1hcFxyXG4gICAgICovXHJcbiAgICBnZXQgcmVwYWludCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLl9yZXBhaW50O1xyXG4gICAgfVxyXG4gICAgc2V0IHJlcGFpbnQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVwYWludCAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVwYWludCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJSZXBhaW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gc2hvdyB2ZXJ0aWNlc1xyXG4gICAgZ2V0IHZlcnRpY2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMuX3ZlcnRpY2VzO1xyXG4gICAgfVxyXG4gICAgc2V0IHZlcnRpY2VzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fdmVydGljZXMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3IgY2FjaGUgYnJvd3NlciB0ZXN0c1xyXG4gICAgX3NldENhY2hlTGltaXRzKGxpbWl0OiBudW1iZXIsIGNoZWNrVGhyZXNob2xkOiBudW1iZXIpIHtcclxuICAgICAgICBzZXRDYWNoZUxpbWl0cyhsaW1pdCwgY2hlY2tUaHJlc2hvbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENSUyhjcnMpIHtcclxuICAgICAgICB0aGlzLmNycyA9IHRoaXMudG9DUlMoY3JzKTtcclxuICAgICAgICB0aGlzLmluaXRDUlModGhpcy5jcnMpO1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXM7XHJcbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlcykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGVzW2lkXS5fc291cmNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hcENSUyAmJiBcImdlb2pzb25cIiA9PSBzb3VyY2UudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNvdXJjZShpZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldEN1c3RvbXByaih0aGlzLmN1c3RvbUNvbnZlcnRQb2ludCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc291cmNlc0RpcnR5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9jYW52YXMgJiYgdGhpcy5yZXNpemUoKTtcclxuICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBpbml0Q1JTKGNycykge1xyXG4gICAgICAgIHRoaXMuX21hcENSUyA9IGNycztcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybS5zZXRDUlMoY3JzKTtcclxuICAgICAgICB0aGlzLl90aWxlRXh0ZW50ID0gY3JzLmdldEV4dGVudCgpO1xyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fdGlsZUV4dGVudFsyXSAtIHRoaXMuX3RpbGVFeHRlbnRbMF07XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5fdGlsZUV4dGVudFszXSAtIHRoaXMuX3RpbGVFeHRlbnRbMV07XHJcbiAgICAgICAgY29uc3QgY2VudGVyWCA9ICh0aGlzLl90aWxlRXh0ZW50WzJdICsgdGhpcy5fdGlsZUV4dGVudFswXSkgLyAyO1xyXG4gICAgICAgIGNvbnN0IGNlbnRlclkgPSAodGhpcy5fdGlsZUV4dGVudFszXSArIHRoaXMuX3RpbGVFeHRlbnRbMV0pIC8gMjtcclxuICAgICAgICBjb25zdCBvcmlnaW5YID0gdGhpcy5fdGlsZUV4dGVudFswXTtcclxuICAgICAgICBjb25zdCBvcmlnaW5ZID0gdGhpcy5fdGlsZUV4dGVudFszXTtcclxuICAgICAgICBGZWF0dXJlLnlMYXQgPSBmdW5jdGlvbiAoeSwgd29ybGRTaXplKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5ZIC0gKHkgKiBoZWlnaHQpIC8gd29ybGRTaXplO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgRmVhdHVyZS50b0xuZ0xhdCA9IGZ1bmN0aW9uICh4LCB5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcndhcmQgPSBjcnMudG9XR1M4NChbeCAqIHdpZHRoICsgb3JpZ2luWCwgb3JpZ2luWSAtICh5ICogaGVpZ2h0KV0pXHJcbiAgICAgICAgICAgIHJldHVybiBmb3J3YXJkO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5tZXJjYXRvclpmcm9tQWx0aXR1ZGUgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUcmFuc2Zvcm1CeUNSUyhcclxuICAgICAgICAgICAgY3JzLmdldFVuaXQoKSxcclxuICAgICAgICAgICAgb3JpZ2luWCxcclxuICAgICAgICAgICAgb3JpZ2luWSxcclxuICAgICAgICAgICAgY2VudGVyWCxcclxuICAgICAgICAgICAgY2VudGVyWSxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICB1cGRhdGVUcmFuc2Zvcm1CeUNSUyh1bml0cywgb3JpZ2luWCwgb3JpZ2luWSwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnVuaXRzID0gdW5pdHM7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tQ29udmVydFBvaW50T2JqID0ge1xyXG4gICAgICAgICAgICB0b0xuZ0xhdCh4LCB5LCBwcm9qNFByb2plY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmQgPSBwcm9qNFByb2plY3Rpb24uaW52ZXJzZShbeCAqIFwiX193aWR0aFwiICsgXCJfX29yaWdpblhcIiwgXCJfX29yaWdpbllcIiAtIHkgKiBcIl9faGVpZ2h0XCJdKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcndhcmQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHByb2plY3RYWSh4LCB5LCBwcm9qNFByb2plY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmQgPSBwcm9qNFByb2plY3Rpb24uZm9yd2FyZChbeCwgeV0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsoZm9yd2FyZFswXSAtIFwiX19vcmlnaW5YXCIpIC8gXCJfX3dpZHRoXCIsIChcIl9fb3JpZ2luWVwiIC0gZm9yd2FyZFsxXSkgLyBcIl9faGVpZ2h0XCJdO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcm9qZWN0WCh4KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHggLSBcIl9fY2VudGVyWFwiKSAvIFwiX193aWR0aFwiICsgMC41O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwcm9qZWN0WSh5KSB7XHJcbiAgICAgICAgICAgICAgICB5ID0gMC41IC0gKCh5IC0gXCJfX2NlbnRlcllcIikgLyBcIl9faGVpZ2h0XCIpOyByZXR1cm4geSA8IDAgPyAwIDogeSA+IDEgPyAxIDogeTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdG9ZKHkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoMC41IC0geSkgKiBcIl9faGVpZ2h0XCIgKyBcIl9fY2VudGVyWVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBmdW5jdGlvbiB0b1N0cmluZyhvYmosIG9iak5hbWUsIHBhcmFtKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gYCR7a2V5fToke2VsZW1lbnR9LGBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtLCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGAoJHtwYXJhbVtrZXldfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBcIiR7a2V5fVwiYCwgJ2cnKSwgZWxlbWVudClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYCR7b2JqTmFtZX09eyR7dmFsdWV9fWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nKGN1c3RvbUNvbnZlcnRQb2ludE9iaiwgJ2N1c3RvbUNvbnZlcnRQb2ludCcsIHsgX193aWR0aDp3aWR0aCwgX19oZWlnaHQ6aGVpZ2h0LCBfX2NlbnRlclg6Y2VudGVyWCwgX19jZW50ZXJZOmNlbnRlclksIF9fb3JpZ2luWTpvcmlnaW5ZLCBfX29yaWdpblg6b3JpZ2luWCB9KVxyXG4gICAgICAgIHRoaXMuY3VzdG9tQ29udmVydFBvaW50ID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoXHJcbiAgICAgICAgICAgIG5ldyBCbG9iKFxyXG4gICAgICAgICAgICAgICAgW3N0cl0sXHJcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIE1hcGJveCBHTCBKUyBpbiB1c2UgYXMgc3BlY2lmaWVkIGluIHBhY2thZ2UuanNvbiwgQ0hBTkdFTE9HLm1kLCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxyXG4gICAgICpcclxuICAgICAqIEBuYW1lIHZlcnNpb25cclxuICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICogQG1lbWJlcm9mIE1hcFxyXG4gICAgICogQHZhciB7c3RyaW5nfSB2ZXJzaW9uXHJcbiAgICAgKi9cclxuXHJcbiAgICBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNYXA7XHJcblxyXG5mdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcclxuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIGludGVyYWN0aXZlIGNvbnRyb2xzIGFkZGVkIHRvIHRoZSBtYXAuIFRoaXMgaXMgYVxyXG4gKiBzcGVjaWZpY2F0aW9uIGZvciBpbXBsZW1lbnRlcnMgdG8gbW9kZWw6IGl0IGlzIG5vdFxyXG4gKiBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXHJcbiAqXHJcbiAqIENvbnRyb2xzIG11c3QgaW1wbGVtZW50IGBvbkFkZGAgYW5kIGBvblJlbW92ZWAsIGFuZCBtdXN0IG93biBhblxyXG4gKiBlbGVtZW50LCB3aGljaCBpcyBvZnRlbiBhIGBkaXZgIGVsZW1lbnQuIFRvIHVzZSBNYXBib3ggR0wgSlMnc1xyXG4gKiBkZWZhdWx0IGNvbnRyb2wgc3R5bGluZywgYWRkIHRoZSBgbWFwYm94Z2wtY3RybGAgY2xhc3MgdG8geW91ciBjb250cm9sJ3NcclxuICogbm9kZS5cclxuICpcclxuICogQGludGVyZmFjZSBJQ29udHJvbFxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBDb250cm9sIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xyXG4gKiBjbGFzcyBIZWxsb1dvcmxkQ29udHJvbCB7XHJcbiAqICAgICBvbkFkZChtYXApIHtcclxuICogICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XHJcbiAqICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAqICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTmFtZSA9ICdtYXBib3hnbC1jdHJsJztcclxuICogICAgICAgICB0aGlzLl9jb250YWluZXIudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkJztcclxuICogICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG4gKiAgICAgfVxyXG4gKlxyXG4gKiAgICAgb25SZW1vdmUoKSB7XHJcbiAqICAgICAgICAgdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcclxuICogICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XHJcbiAqICAgICB9XHJcbiAqIH1cclxuICpcclxuICogLy8gQ29udHJvbCBpbXBsZW1lbnRlZCBhcyBFUzUgcHJvdG90eXBpY2FsIGNsYXNzXHJcbiAqIGZ1bmN0aW9uIEhlbGxvV29ybGRDb250cm9sKCkgeyB9XHJcbiAqXHJcbiAqIEhlbGxvV29ybGRDb250cm9sLnByb3RvdHlwZS5vbkFkZCA9IGZ1bmN0aW9uKG1hcCkge1xyXG4gKiAgICAgdGhpcy5fbWFwID0gbWFwO1xyXG4gKiAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAqICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xyXG4gKiAgICAgdGhpcy5fY29udGFpbmVyLnRleHRDb250ZW50ID0gJ0hlbGxvLCB3b3JsZCc7XHJcbiAqICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG4gKiB9O1xyXG4gKlxyXG4gKiBIZWxsb1dvcmxkQ29udHJvbC5wcm90b3R5cGUub25SZW1vdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAqICAgICAgdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcclxuICogICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XHJcbiAqIH07XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFJlZ2lzdGVyIGEgY29udHJvbCBvbiB0aGUgbWFwIGFuZCBnaXZlIGl0IGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVyc1xyXG4gKiBhbmQgcmVzb3VyY2VzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0BsaW5rIE1hcCNhZGRDb250cm9sfVxyXG4gKiBpbnRlcm5hbGx5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQG1lbWJlcm9mIElDb250cm9sXHJcbiAqIEBpbnN0YW5jZVxyXG4gKiBAbmFtZSBvbkFkZFxyXG4gKiBAcGFyYW0ge01hcH0gbWFwIHRoZSBNYXAgdGhpcyBjb250cm9sIHdpbGwgYmUgYWRkZWQgdG9cclxuICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgY29udHJvbCdzIGNvbnRhaW5lciBlbGVtZW50LiBUaGlzIHNob3VsZFxyXG4gKiBiZSBjcmVhdGVkIGJ5IHRoZSBjb250cm9sIGFuZCByZXR1cm5lZCBieSBvbkFkZCB3aXRob3V0IGJlaW5nIGF0dGFjaGVkXHJcbiAqIHRvIHRoZSBET006IHRoZSBtYXAgd2lsbCBpbnNlcnQgdGhlIGNvbnRyb2wncyBlbGVtZW50IGludG8gdGhlIERPTVxyXG4gKiBhcyBuZWNlc3NhcnkuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIFVucmVnaXN0ZXIgYSBjb250cm9sIG9uIHRoZSBtYXAgYW5kIGdpdmUgaXQgYSBjaGFuY2UgdG8gZGV0YWNoIGV2ZW50IGxpc3RlbmVyc1xyXG4gKiBhbmQgcmVzb3VyY2VzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0BsaW5rIE1hcCNyZW1vdmVDb250cm9sfVxyXG4gKiBpbnRlcm5hbGx5LlxyXG4gKlxyXG4gKiBAZnVuY3Rpb25cclxuICogQG1lbWJlcm9mIElDb250cm9sXHJcbiAqIEBpbnN0YW5jZVxyXG4gKiBAbmFtZSBvblJlbW92ZVxyXG4gKiBAcGFyYW0ge01hcH0gbWFwIHRoZSBNYXAgdGhpcyBjb250cm9sIHdpbGwgYmUgcmVtb3ZlZCBmcm9tXHJcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IHRoZXJlIGlzIG5vIHJlcXVpcmVkIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBtZXRob2RcclxuICovXHJcblxyXG4vKipcclxuICogT3B0aW9uYWxseSBwcm92aWRlIGEgZGVmYXVsdCBwb3NpdGlvbiBmb3IgdGhpcyBjb250cm9sLiBJZiB0aGlzIG1ldGhvZFxyXG4gKiBpcyBpbXBsZW1lbnRlZCBhbmQge0BsaW5rIE1hcCNhZGRDb250cm9sfSBpcyBjYWxsZWQgd2l0aG91dCB0aGUgYHBvc2l0aW9uYFxyXG4gKiBwYXJhbWV0ZXIsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBnZXREZWZhdWx0UG9zaXRpb24gd2lsbCBiZSB1c2VkIGFzIHRoZVxyXG4gKiBjb250cm9sJ3MgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBmdW5jdGlvblxyXG4gKiBAbWVtYmVyb2YgSUNvbnRyb2xcclxuICogQGluc3RhbmNlXHJcbiAqIEBuYW1lIGdldERlZmF1bHRQb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhIGNvbnRyb2wgcG9zaXRpb24sIG9uZSBvZiB0aGUgdmFsdWVzIHZhbGlkIGluIGFkZENvbnRyb2wuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEEgW2BQb2ludGAgZ2VvbWV0cnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9pbnQtZ2VvbWV0cnkpIG9iamVjdCwgd2hpY2ggaGFzXHJcbiAqIGB4YCBhbmQgYHlgIHByb3BlcnRpZXMgcmVwcmVzZW50aW5nIHNjcmVlbiBjb29yZGluYXRlcyBpbiBwaXhlbHMuXHJcbiAqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvaW50XHJcbiAqIEBleGFtcGxlXHJcbiAqIHZhciBwb2ludCA9IG5ldyBtYXBib3hnbC5Qb2ludCgtNzcsIDM4KTtcclxuICovXHJcblxyXG4vKipcclxuICogQSB7QGxpbmsgUG9pbnR9IG9yIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBgeGAgYW5kIGB5YCBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxyXG4gKlxyXG4gKiBAdHlwZWRlZiB7KFBvaW50IHwgQXJyYXk8bnVtYmVyPil9IFBvaW50TGlrZVxyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgcDEgPSBuZXcgbWFwYm94Z2wuUG9pbnQoLTc3LCAzOCk7IC8vIGEgUG9pbnRMaWtlIHdoaWNoIGlzIGEgUG9pbnRcclxuICogdmFyIHAyID0gWy03NywgMzhdOyAvLyBhIFBvaW50TGlrZSB3aGljaCBpcyBhbiBhcnJheSBvZiB0d28gbnVtYmVyc1xyXG4gKi9cclxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5pbXBvcnQge2V4dGVuZCwgYmluZEFsbH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB7TW91c2VSb3RhdGVIYW5kbGVyLCBNb3VzZVBpdGNoSGFuZGxlcn0gZnJvbSAnLi4vaGFuZGxlci9tb3VzZSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uLy4uL3V0aWwvd2luZG93JztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBzaG93Q29tcGFzcz86IGJvb2xlYW4sXG4gICAgc2hvd1pvb20/OiBib29sZWFuLFxuICAgIHZpc3VhbGl6ZVBpdGNoPzogYm9vbGVhblxufTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgc2hvd0NvbXBhc3M6IHRydWUsXG4gICAgc2hvd1pvb206IHRydWUsXG4gICAgdmlzdWFsaXplUGl0Y2g6IGZhbHNlXG59O1xuXG4vKipcbiAqIEEgYE5hdmlnYXRpb25Db250cm9sYCBjb250cm9sIGNvbnRhaW5zIHpvb20gYnV0dG9ucyBhbmQgYSBjb21wYXNzLlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hvd0NvbXBhc3M9dHJ1ZV0gSWYgYHRydWVgIHRoZSBjb21wYXNzIGJ1dHRvbiBpcyBpbmNsdWRlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hvd1pvb209dHJ1ZV0gSWYgYHRydWVgIHRoZSB6b29tLWluIGFuZCB6b29tLW91dCBidXR0b25zIGFyZSBpbmNsdWRlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudmlzdWFsaXplUGl0Y2g9ZmFsc2VdIElmIGB0cnVlYCB0aGUgcGl0Y2ggaXMgdmlzdWFsaXplZCBieSByb3RhdGluZyBYLWF4aXMgb2YgY29tcGFzcy5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKCk7XG4gKiBtYXAuYWRkQ29udHJvbChuYXYsICd0b3AtbGVmdCcpO1xuICogQHNlZSBbRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9uYXZpZ2F0aW9uLylcbiAqIEBzZWUgW0FkZCBhIHRoaXJkIHBhcnR5IHZlY3RvciB0aWxlIHNvdXJjZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90aGlyZC1wYXJ0eS8pXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25Db250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgb3B0aW9uczogT3B0aW9ucztcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfem9vbUluQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBfem9vbU91dEJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgX2NvbXBhc3M6IEhUTUxCdXR0b25FbGVtZW50O1xuICAgIF9jb21wYXNzSWNvbjogSFRNTEVsZW1lbnQ7XG4gICAgX2hhbmRsZXI6IE1vdXNlUm90YXRlV3JhcHBlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1ncm91cCcpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dab29tKSB7XG4gICAgICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICAgICAnX3NldEJ1dHRvblRpdGxlJyxcbiAgICAgICAgICAgICAgICAnX3VwZGF0ZVpvb21CdXR0b25zJ1xuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl96b29tSW5CdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oJ21hcGJveGdsLWN0cmwtem9vbS1pbicsIChlKSA9PiB0aGlzLl9tYXAuem9vbUluKHt9LCB7b3JpZ2luYWxFdmVudDogZX0pKTtcbiAgICAgICAgICAgIERPTS5jcmVhdGUoJ3NwYW4nLCBgbWFwYm94Z2wtY3RybC1pY29uYCwgdGhpcy5fem9vbUluQnV0dG9uKS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl96b29tT3V0QnV0dG9uID0gdGhpcy5fY3JlYXRlQnV0dG9uKCdtYXBib3hnbC1jdHJsLXpvb20tb3V0JywgKGUpID0+IHRoaXMuX21hcC56b29tT3V0KHt9LCB7b3JpZ2luYWxFdmVudDogZX0pKTtcbiAgICAgICAgICAgIERPTS5jcmVhdGUoJ3NwYW4nLCBgbWFwYm94Z2wtY3RybC1pY29uYCwgdGhpcy5fem9vbU91dEJ1dHRvbikuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgICAgICdfcm90YXRlQ29tcGFzc0Fycm93J1xuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9jb21wYXNzID0gdGhpcy5fY3JlYXRlQnV0dG9uKCdtYXBib3hnbC1jdHJsLWNvbXBhc3MnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlc2V0Tm9ydGhQaXRjaCh7fSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVzZXROb3J0aCh7fSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhc3NJY29uID0gRE9NLmNyZWF0ZSgnc3BhbicsICdtYXBib3hnbC1jdHJsLWljb24nLCB0aGlzLl9jb21wYXNzKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhc3NJY29uLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVab29tQnV0dG9ucygpIHtcbiAgICAgICAgY29uc3Qgem9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7XG4gICAgICAgIHRoaXMuX3pvb21JbkJ1dHRvbi5kaXNhYmxlZCA9IHpvb20gPT09IHRoaXMuX21hcC5nZXRNYXhab29tKCk7XG4gICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24uZGlzYWJsZWQgPSB6b29tID09PSB0aGlzLl9tYXAuZ2V0TWluWm9vbSgpO1xuICAgIH1cblxuICAgIF9yb3RhdGVDb21wYXNzQXJyb3coKSB7XG4gICAgICAgIGNvbnN0IHJvdGF0ZSA9IHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCA/XG4gICAgICAgICAgICBgcm90YXRlWCgke3RoaXMuX21hcC50cmFuc2Zvcm0ucGl0Y2h9ZGVnKSByb3RhdGVaKCR7dGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZSAqICgxODAgLyBNYXRoLlBJKX1kZWcpYCA6XG4gICAgICAgICAgICBgcm90YXRlKCR7dGhpcy5fbWFwLnRyYW5zZm9ybS5hbmdsZX1kZWcpYDtcblxuICAgICAgICB0aGlzLl9jb21wYXNzSWNvbi5zdHlsZS50cmFuc2Zvcm0gPSByb3RhdGU7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dab29tKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRCdXR0b25UaXRsZSh0aGlzLl96b29tSW5CdXR0b24sICdab29tSW4nKTtcbiAgICAgICAgICAgIHRoaXMuX3NldEJ1dHRvblRpdGxlKHRoaXMuX3pvb21PdXRCdXR0b24sICdab29tT3V0Jyk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ3pvb20nLCB0aGlzLl91cGRhdGVab29tQnV0dG9ucyk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVab29tQnV0dG9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEJ1dHRvblRpdGxlKHRoaXMuX2NvbXBhc3MsICdSZXNldEJlYXJpbmcnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub24oJ3BpdGNoJywgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5vbigncm90YXRlJywgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KTtcbiAgICAgICAgICAgIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdygpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlciA9IG5ldyBNb3VzZVJvdGF0ZVdyYXBwZXIodGhpcy5fbWFwLCB0aGlzLl9jb21wYXNzLCB0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Wm9vbSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignem9vbScsIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dDb21wYXNzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigncGl0Y2gnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigncm90YXRlJywgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIub2ZmKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5faGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tYXA7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUJ1dHRvbihjbGFzc05hbWU6IHN0cmluZywgZm46ICgpID0+IG1peGVkKSB7XG4gICAgICAgIGNvbnN0IGEgPSBET00uY3JlYXRlKCdidXR0b24nLCBjbGFzc05hbWUsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIGEudHlwZSA9ICdidXR0b24nO1xuICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZm4pO1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBfc2V0QnV0dG9uVGl0bGUoYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCwgdGl0bGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzdHIgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKGBOYXZpZ2F0aW9uQ29udHJvbC4ke3RpdGxlfWApO1xuICAgICAgICBidXR0b24udGl0bGUgPSBzdHI7XG4gICAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBzdHIpO1xuICAgIH1cbn1cblxuY2xhc3MgTW91c2VSb3RhdGVXcmFwcGVyIHtcblxuICAgIG1hcDogTWFwO1xuICAgIF9jbGlja1RvbGVyYW5jZTogbnVtYmVyO1xuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIG1vdXNlUm90YXRlOiBNb3VzZVJvdGF0ZUhhbmRsZXI7XG4gICAgbW91c2VQaXRjaDogTW91c2VQaXRjaEhhbmRsZXI7XG4gICAgX3N0YXJ0UG9zOiBQb2ludDtcbiAgICBfbGFzdFBvczogUG9pbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIHBpdGNoPzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gMTA7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubW91c2VSb3RhdGUgPSBuZXcgTW91c2VSb3RhdGVIYW5kbGVyKHtjbGlja1RvbGVyYW5jZTogbWFwLmRyYWdSb3RhdGUuX21vdXNlUm90YXRlLl9jbGlja1RvbGVyYW5jZX0pO1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgaWYgKHBpdGNoKSB0aGlzLm1vdXNlUGl0Y2ggPSBuZXcgTW91c2VQaXRjaEhhbmRsZXIoe2NsaWNrVG9sZXJhbmNlOiBtYXAuZHJhZ1JvdGF0ZS5fbW91c2VQaXRjaC5fY2xpY2tUb2xlcmFuY2V9KTtcblxuICAgICAgICBiaW5kQWxsKFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3Jlc2V0J10sIHRoaXMpO1xuICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCAnbW91c2Vkb3duJywgdGhpcy5tb3VzZWRvd24pO1xuICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCAndG91Y2hzdGFydCcsIHRoaXMudG91Y2hzdGFydCwge3Bhc3NpdmU6IGZhbHNlfSk7XG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLnRvdWNobW92ZSk7XG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsICd0b3VjaGVuZCcsIHRoaXMudG91Y2hlbmQpO1xuICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLnJlc2V0KTtcbiAgICB9XG5cbiAgICBkb3duKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICB0aGlzLm1vdXNlUm90YXRlLm1vdXNlZG93bihlLCBwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlUGl0Y2gpIHRoaXMubW91c2VQaXRjaC5tb3VzZWRvd24oZSwgcG9pbnQpO1xuICAgICAgICBET00uZGlzYWJsZURyYWcoKTtcbiAgICB9XG5cbiAgICBtb3ZlKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLm1hcDtcbiAgICAgICAgY29uc3QgciA9IHRoaXMubW91c2VSb3RhdGUubW91c2Vtb3ZlV2luZG93KGUsIHBvaW50KTtcbiAgICAgICAgaWYgKHIgJiYgci5iZWFyaW5nRGVsdGEpIG1hcC5zZXRCZWFyaW5nKG1hcC5nZXRCZWFyaW5nKCkgKyByLmJlYXJpbmdEZWx0YSk7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlUGl0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLm1vdXNlUGl0Y2gubW91c2Vtb3ZlV2luZG93KGUsIHBvaW50KTtcbiAgICAgICAgICAgIGlmIChwICYmIHAucGl0Y2hEZWx0YSkgbWFwLnNldFBpdGNoKG1hcC5nZXRQaXRjaCgpICsgcC5waXRjaERlbHRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9mZigpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgJ21vdXNlZG93bicsIHRoaXMubW91c2Vkb3duKTtcbiAgICAgICAgRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgJ3RvdWNoc3RhcnQnLCB0aGlzLnRvdWNoc3RhcnQsIHtwYXNzaXZlOiBmYWxzZX0pO1xuICAgICAgICBET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCAndG91Y2htb3ZlJywgdGhpcy50b3VjaG1vdmUpO1xuICAgICAgICBET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCAndG91Y2hlbmQnLCB0aGlzLnRvdWNoZW5kKTtcbiAgICAgICAgRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgJ3RvdWNoY2FuY2VsJywgdGhpcy5yZXNldCk7XG4gICAgICAgIHRoaXMub2ZmVGVtcCgpO1xuICAgIH1cblxuICAgIG9mZlRlbXAoKSB7XG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG4gICAgICAgIERPTS5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdywgJ21vdXNlbW92ZScsIHRoaXMubW91c2Vtb3ZlKTtcbiAgICAgICAgRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LCAnbW91c2V1cCcsIHRoaXMubW91c2V1cCk7XG4gICAgfVxuXG4gICAgbW91c2Vkb3duKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kb3duKGV4dGVuZCh7fSwgZSwge2N0cmxLZXk6IHRydWUsIHByZXZlbnREZWZhdWx0OiAoKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9KSwgRE9NLm1vdXNlUG9zKHRoaXMuZWxlbWVudCwgZSkpO1xuICAgICAgICBET00uYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlbW92ZSk7XG4gICAgICAgIERPTS5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ21vdXNldXAnLCB0aGlzLm1vdXNldXApO1xuICAgIH1cblxuICAgIG1vdXNlbW92ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMubW92ZShlLCBET00ubW91c2VQb3ModGhpcy5lbGVtZW50LCBlKSk7XG4gICAgfVxuXG4gICAgbW91c2V1cChlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMubW91c2VSb3RhdGUubW91c2V1cFdpbmRvdyhlKTtcbiAgICAgICAgaWYgKHRoaXMubW91c2VQaXRjaCkgdGhpcy5tb3VzZVBpdGNoLm1vdXNldXBXaW5kb3coZSk7XG4gICAgICAgIHRoaXMub2ZmVGVtcCgpO1xuICAgIH1cblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9sYXN0UG9zID0gRE9NLnRvdWNoUG9zKHRoaXMuZWxlbWVudCwgZS50YXJnZXRUb3VjaGVzKVswXTtcbiAgICAgICAgICAgIHRoaXMuZG93bigoKHt0eXBlOiAnbW91c2Vkb3duJywgYnV0dG9uOiAwLCBjdHJsS2V5OiB0cnVlLCBwcmV2ZW50RGVmYXVsdDogKCkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfTogYW55KTogTW91c2VFdmVudCksIHRoaXMuX3N0YXJ0UG9zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmIChlLnRhcmdldFRvdWNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0UG9zID0gRE9NLnRvdWNoUG9zKHRoaXMuZWxlbWVudCwgZS50YXJnZXRUb3VjaGVzKVswXTtcbiAgICAgICAgICAgIHRoaXMubW92ZSgoKHtwcmV2ZW50RGVmYXVsdDogKCkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfTogYW55KTogTW91c2VFdmVudCksIHRoaXMuX2xhc3RQb3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG91Y2hlbmQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3MgJiZcbiAgICAgICAgICAgIHRoaXMuX2xhc3RQb3MgJiZcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zLmRpc3QodGhpcy5fbGFzdFBvcykgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLm1vdXNlUm90YXRlLnJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlUGl0Y2gpIHRoaXMubW91c2VQaXRjaC5yZXNldCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0UG9zO1xuICAgICAgICB0aGlzLm9mZlRlbXAoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5hdmlnYXRpb25Db250cm9sO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdCc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0nO1xuXG4vKipcbiAqIEdpdmVuIGEgTG5nTGF0LCBwcmlvciBwcm9qZWN0ZWQgcG9zaXRpb24sIGFuZCBhIHRyYW5zZm9ybSwgcmV0dXJuIGEgbmV3IExuZ0xhdCBzaGlmdGVkXG4gKiBuIMOXIDM2MMKwIGVhc3Qgb3Igd2VzdCBmb3Igc29tZSBuIOKJpSAwIHN1Y2ggdGhhdDpcbiAqXG4gKiAqIHRoZSBwcm9qZWN0ZWQgbG9jYXRpb24gb2YgdGhlIHJlc3VsdCBpcyBvbiBzY3JlZW4sIGlmIHBvc3NpYmxlLCBhbmQgc2Vjb25kYXJpbHk6XG4gKiAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHByb2plY3RlZCBsb2NhdGlvbiBvZiB0aGUgcmVzdWx0IGFuZCB0aGUgcHJpb3IgcG9zaXRpb25cbiAqICAgaXMgbWluaW1pemVkLlxuICpcbiAqIFRoZSBvYmplY3QgaXMgdG8gcHJlc2VydmUgcGVyY2VpdmVkIG9iamVjdCBjb25zdGFuY3kgZm9yIFBvcHVwcyBhbmQgTWFya2VycyBhcyBtdWNoIGFzXG4gKiBwb3NzaWJsZTsgdGhleSBzaG91bGQgYXZvaWQgc2hpZnRpbmcgbGFyZ2UgZGlzdGFuY2VzIGFjcm9zcyB0aGUgc2NyZWVuLCBldmVuIHdoZW4gdGhlXG4gKiBtYXAgY2VudGVyIGNoYW5nZXMgYnkgwrEzNjDCsCBkdWUgdG8gYXV0b21hdGljIHdyYXBwaW5nLCBhbmQgd2hlbiBhYm91dCB0byBnbyBvZmYgc2NyZWVuLFxuICogc2hvdWxkIHdyYXAganVzdCBlbm91Z2ggdG8gYXZvaWQgZG9pbmcgc28uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG5nTGF0OiBMbmdMYXQsIHByaW9yUG9zOiA/UG9pbnQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogTG5nTGF0IHtcbiAgICBsbmdMYXQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcsIGxuZ0xhdC5sYXQpO1xuXG4gICAgLy8gRmlyc3QsIHRyeSBzaGlmdGluZyBvbmUgd29ybGQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYW5kIHNlZSBpZiBlaXRoZXIgaXMgY2xvc2VyIHRvIHRoZVxuICAgIC8vIHByaW9yIHBvc2l0aW9uLiBUaGlzIHByZXNlcnZlcyBvYmplY3QgY29uc3RhbmN5IHdoZW4gdGhlIG1hcCBjZW50ZXIgaXMgYXV0by13cmFwcGVkXG4gICAgLy8gZHVyaW5nIGFuaW1hdGlvbnMuXG4gICAgaWYgKHByaW9yUG9zKSB7XG4gICAgICAgIGNvbnN0IGxlZnQgID0gbmV3IExuZ0xhdChsbmdMYXQubG5nIC0gMzYwLCBsbmdMYXQubGF0KTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcgKyAzNjAsIGxuZ0xhdC5sYXQpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGxuZ0xhdCkuZGlzdFNxcihwcmlvclBvcyk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChsZWZ0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSBsZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHJpZ2h0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSByaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlY29uZCwgd3JhcCB0b3dhcmQgdGhlIGNlbnRlciB1bnRpbCB0aGUgbmV3IHBvc2l0aW9uIGlzIG9uIHNjcmVlbiwgb3Igd2UgY2FuJ3QgZ2V0XG4gICAgLy8gYW55IGNsb3Nlci5cbiAgICB3aGlsZSAoTWF0aC5hYnMobG5nTGF0LmxuZyAtIHRyYW5zZm9ybS5jZW50ZXIubG5nKSA+IDE4MCkge1xuICAgICAgICBjb25zdCBwb3MgPSB0cmFuc2Zvcm0ubG9jYXRpb25Qb2ludChsbmdMYXQpO1xuICAgICAgICBpZiAocG9zLnggPj0gMCAmJiBwb3MueSA+PSAwICYmIHBvcy54IDw9IHRyYW5zZm9ybS53aWR0aCAmJiBwb3MueSA8PSB0cmFuc2Zvcm0uaGVpZ2h0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobG5nTGF0LmxuZyA+IHRyYW5zZm9ybS5jZW50ZXIubG5nKSB7XG4gICAgICAgICAgICBsbmdMYXQubG5nIC09IDM2MDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxuZ0xhdC5sbmcgKz0gMzYwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxuZ0xhdDtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIEFuY2hvciA9XG4gICAgfCAnY2VudGVyJ1xuICAgIHwgJ3RvcCdcbiAgICB8ICdib3R0b20nXG4gICAgfCAnbGVmdCdcbiAgICB8ICdyaWdodCdcbiAgICB8ICd0b3AtbGVmdCdcbiAgICB8ICd0b3AtcmlnaHQnXG4gICAgfCAnYm90dG9tLWxlZnQnXG4gICAgfCAnYm90dG9tLXJpZ2h0JztcblxuZXhwb3J0IGNvbnN0IGFuY2hvclRyYW5zbGF0ZToge1tfOiBBbmNob3JdOiBzdHJpbmd9ID0ge1xuICAgICdjZW50ZXInOiAndHJhbnNsYXRlKC01MCUsLTUwJSknLFxuICAgICd0b3AnOiAndHJhbnNsYXRlKC01MCUsMCknLFxuICAgICd0b3AtbGVmdCc6ICd0cmFuc2xhdGUoMCwwKScsXG4gICAgJ3RvcC1yaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsMCknLFxuICAgICdib3R0b20nOiAndHJhbnNsYXRlKC01MCUsLTEwMCUpJyxcbiAgICAnYm90dG9tLWxlZnQnOiAndHJhbnNsYXRlKDAsLTEwMCUpJyxcbiAgICAnYm90dG9tLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtMTAwJSknLFxuICAgICdsZWZ0JzogJ3RyYW5zbGF0ZSgwLC01MCUpJyxcbiAgICAncmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLC01MCUpJ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QW5jaG9yQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGFuY2hvcjogQW5jaG9yLCBwcmVmaXg6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGFuY2hvclRyYW5zbGF0ZSkge1xuICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGBtYXBib3hnbC0ke3ByZWZpeH0tYW5jaG9yLSR7a2V5fWApO1xuICAgIH1cbiAgICBjbGFzc0xpc3QuYWRkKGBtYXBib3hnbC0ke3ByZWZpeH0tYW5jaG9yLSR7YW5jaG9yfWApO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi91dGlsL2RvbSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93JztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHNtYXJ0V3JhcCBmcm9tICcuLi91dGlsL3NtYXJ0X3dyYXAnO1xuaW1wb3J0IHtiaW5kQWxsLCBleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQge3R5cGUgQW5jaG9yLCBhbmNob3JUcmFuc2xhdGUsIGFwcGx5QW5jaG9yQ2xhc3N9IGZyb20gJy4vYW5jaG9yJztcbmltcG9ydCB7RXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHR5cGUgUG9wdXAgZnJvbSAnLi9wb3B1cCc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSBcIi4uL2dlby9sbmdfbGF0XCI7XG5pbXBvcnQgdHlwZSB7TWFwTW91c2VFdmVudCwgTWFwVG91Y2hFdmVudH0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnQsXG4gICAgb2Zmc2V0PzogUG9pbnRMaWtlLFxuICAgIGFuY2hvcj86IEFuY2hvcixcbiAgICBjb2xvcj86IHN0cmluZyxcbiAgICBzY2FsZT86IG51bWJlcixcbiAgICBkcmFnZ2FibGU/OiBib29sZWFuLFxuICAgIHJvdGF0aW9uPzogbnVtYmVyLFxuICAgIHJvdGF0aW9uQWxpZ25tZW50Pzogc3RyaW5nLFxuICAgIHBpdGNoQWxpZ25tZW50Pzogc3RyaW5nXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXJrZXIgY29tcG9uZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbb3B0aW9ucy5lbGVtZW50XSBET00gZWxlbWVudCB0byB1c2UgYXMgYSBtYXJrZXIuIFRoZSBkZWZhdWx0IGlzIGEgbGlnaHQgYmx1ZSwgZHJvcGxldC1zaGFwZWQgU1ZHIG1hcmtlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmNob3I9J2NlbnRlciddIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHBhcnQgb2YgdGhlIE1hcmtlciB0aGF0IHNob3VsZCBiZSBwb3NpdGlvbmVkIGNsb3Nlc3QgdG8gdGhlIGNvb3JkaW5hdGUgc2V0IHZpYSB7QGxpbmsgTWFya2VyI3NldExuZ0xhdH0uXG4gKiAgIE9wdGlvbnMgYXJlIGAnY2VudGVyJ2AsIGAndG9wJ2AsIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBgJ3JpZ2h0J2AsIGAndG9wLWxlZnQnYCwgYCd0b3AtcmlnaHQnYCwgYCdib3R0b20tbGVmdCdgLCBhbmQgYCdib3R0b20tcmlnaHQnYC5cbiAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXRdIFRoZSBvZmZzZXQgaW4gcGl4ZWxzIGFzIGEge0BsaW5rIFBvaW50TGlrZX0gb2JqZWN0IHRvIGFwcGx5IHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50J3MgY2VudGVyLiBOZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29sb3I9JyMzRkIxQ0UnXSBUaGUgY29sb3IgdG8gdXNlIGZvciB0aGUgZGVmYXVsdCBtYXJrZXIgaWYgb3B0aW9ucy5lbGVtZW50IGlzIG5vdCBwcm92aWRlZC4gVGhlIGRlZmF1bHQgaXMgbGlnaHQgYmx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zY2FsZT0xXSBUaGUgc2NhbGUgdG8gdXNlIGZvciB0aGUgZGVmYXVsdCBtYXJrZXIgaWYgb3B0aW9ucy5lbGVtZW50IGlzIG5vdCBwcm92aWRlZC4gVGhlIGRlZmF1bHQgc2NhbGUgY29ycmVzcG9uZHMgdG8gYSBoZWlnaHQgb2YgYDQxcHhgIGFuZCBhIHdpZHRoIG9mIGAyN3B4YC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJhZ2dhYmxlPWZhbHNlXSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhIG1hcmtlciBpcyBhYmxlIHRvIGJlIGRyYWdnZWQgdG8gYSBuZXcgcG9zaXRpb24gb24gdGhlIG1hcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yb3RhdGlvbj0wXSBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhlIG1hcmtlciBpbiBkZWdyZWVzLCByZWxhdGl2ZSB0byBpdHMgcmVzcGVjdGl2ZSBgcm90YXRpb25BbGlnbm1lbnRgIHNldHRpbmcuIEEgcG9zaXRpdmUgdmFsdWUgd2lsbCByb3RhdGUgdGhlIG1hcmtlciBjbG9ja3dpc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGl0Y2hBbGlnbm1lbnQ9J2F1dG8nXSBgbWFwYCBhbGlnbnMgdGhlIGBNYXJrZXJgIHRvIHRoZSBwbGFuZSBvZiB0aGUgbWFwLiBgdmlld3BvcnRgIGFsaWducyB0aGUgYE1hcmtlcmAgdG8gdGhlIHBsYW5lIG9mIHRoZSB2aWV3cG9ydC4gYGF1dG9gIGF1dG9tYXRpY2FsbHkgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgYHJvdGF0aW9uQWxpZ25tZW50YC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yb3RhdGlvbkFsaWdubWVudD0nYXV0byddIGBtYXBgIGFsaWducyB0aGUgYE1hcmtlcmAncyByb3RhdGlvbiByZWxhdGl2ZSB0byB0aGUgbWFwLCBtYWludGFpbmluZyBhIGJlYXJpbmcgYXMgdGhlIG1hcCByb3RhdGVzLiBgdmlld3BvcnRgIGFsaWducyB0aGUgYE1hcmtlcmAncyByb3RhdGlvbiByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQsIGFnbm9zdGljIHRvIG1hcCByb3RhdGlvbnMuIGBhdXRvYCBpcyBlcXVpdmFsZW50IHRvIGB2aWV3cG9ydGAuXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICogICAuc2V0TG5nTGF0KFszMC41LCA1MC41XSlcbiAqICAgLmFkZFRvKG1hcCk7XG4gKiBAc2VlIFtBZGQgY3VzdG9tIGljb25zIHdpdGggTWFya2Vyc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jdXN0b20tbWFya2VyLWljb25zLylcbiAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBNYXJrZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLW1hcmtlci8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcmtlciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfYW5jaG9yOiBBbmNob3I7XG4gICAgX29mZnNldDogUG9pbnQ7XG4gICAgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIF9wb3B1cDogP1BvcHVwO1xuICAgIF9sbmdMYXQ6IExuZ0xhdDtcbiAgICBfcG9zOiA/UG9pbnQ7XG4gICAgX2NvbG9yOiA/c3RyaW5nO1xuICAgIF9zY2FsZTogbnVtYmVyO1xuICAgIF9kZWZhdWx0TWFya2VyOiBib29sZWFuO1xuICAgIF9kcmFnZ2FibGU6IGJvb2xlYW47XG4gICAgX3N0YXRlOiAnaW5hY3RpdmUnIHwgJ3BlbmRpbmcnIHwgJ2FjdGl2ZSc7IC8vIHVzZWQgZm9yIGhhbmRsaW5nIGRyYWcgZXZlbnRzXG4gICAgX3Bvc2l0aW9uRGVsdGE6ID9udW1iZXI7XG4gICAgX3JvdGF0aW9uOiBudW1iZXI7XG4gICAgX3BpdGNoQWxpZ25tZW50OiBzdHJpbmc7XG4gICAgX3JvdGF0aW9uQWxpZ25tZW50OiBzdHJpbmc7XG4gICAgX29yaWdpbmFsVGFiSW5kZXg6ID9zdHJpbmc7IC8vIG9yaWdpbmFsIHRhYmluZGV4IG9mIF9lbGVtZW50XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogT3B0aW9ucywgbGVnYWN5T3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLS0gdGhlIGNvbnN0cnVjdG9yIHVzZWQgdG8gYWNjZXB0IHRoZSBlbGVtZW50IGFzIGFcbiAgICAgICAgLy8gcmVxdWlyZWQgZmlyc3QgYXJndW1lbnQsIGJlZm9yZSBpdCB3YXMgbWFkZSBvcHRpb25hbC5cbiAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQgfHwgbGVnYWN5T3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7ZWxlbWVudDogb3B0aW9uc30sIGxlZ2FjeU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX3VwZGF0ZScsXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uVXAnLFxuICAgICAgICAgICAgJ19hZGREcmFnSGFuZGxlcicsXG4gICAgICAgICAgICAnX29uTWFwQ2xpY2snLFxuICAgICAgICAgICAgJ19vbktleVByZXNzJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICB0aGlzLl9hbmNob3IgPSBvcHRpb25zICYmIG9wdGlvbnMuYW5jaG9yIHx8ICdjZW50ZXInO1xuICAgICAgICB0aGlzLl9jb2xvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb2xvciB8fCAnIzNGQjFDRSc7XG4gICAgICAgIHRoaXMuX3NjYWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLnNjYWxlIHx8IDE7XG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kcmFnZ2FibGUgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gJ2luYWN0aXZlJztcbiAgICAgICAgdGhpcy5fcm90YXRpb24gPSBvcHRpb25zICYmIG9wdGlvbnMucm90YXRpb24gfHwgMDtcbiAgICAgICAgdGhpcy5fcm90YXRpb25BbGlnbm1lbnQgPSBvcHRpb25zICYmIG9wdGlvbnMucm90YXRpb25BbGlnbm1lbnQgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9waXRjaEFsaWdubWVudCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5waXRjaEFsaWdubWVudCAmJiBvcHRpb25zLnBpdGNoQWxpZ25tZW50ICE9PSAnYXV0bycgPyAgb3B0aW9ucy5waXRjaEFsaWdubWVudCA6IHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50O1xuXG4gICAgICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9kZWZhdWx0TWFya2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ01hcCBtYXJrZXInKTtcblxuICAgICAgICAgICAgLy8gY3JlYXRlIGRlZmF1bHQgbWFwIG1hcmtlciBTVkdcbiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0SGVpZ2h0ID0gNDE7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSAyNztcbiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICdoZWlnaHQnLCBgJHtkZWZhdWx0SGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3dpZHRoJywgYCR7ZGVmYXVsdFdpZHRofXB4YCk7XG4gICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCBgMCAwICR7ZGVmYXVsdFdpZHRofSAke2RlZmF1bHRIZWlnaHR9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlckxhcmdlID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBtYXJrZXJMYXJnZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnc3Ryb2tlJywgJ25vbmUnKTtcbiAgICAgICAgICAgIG1hcmtlckxhcmdlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdzdHJva2Utd2lkdGgnLCAnMScpO1xuICAgICAgICAgICAgbWFya2VyTGFyZ2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnbm9uZScpO1xuICAgICAgICAgICAgbWFya2VyTGFyZ2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwtcnVsZScsICdldmVub2RkJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2UxID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBwYWdlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbC1ydWxlJywgJ25vbnplcm8nKTtcblxuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzaGFkb3cuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMy4wLCAyOS4wKScpO1xuICAgICAgICAgICAgc2hhZG93LnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMwMDAwMDAnKTtcblxuICAgICAgICAgICAgY29uc3QgZWxsaXBzZXMgPSBbXG4gICAgICAgICAgICAgICAgeydyeCc6ICcxMC41JywgJ3J5JzogJzUuMjUwMDIyNzMnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzEwLjUnLCAncnknOiAnNS4yNTAwMjI3Myd9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnOS41JywgJ3J5JzogJzQuNzcyNzUwMDcnfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzguNScsICdyeSc6ICc0LjI5NTQ5OTM2J30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc3LjUnLCAncnknOiAnMy44MTgyMjMwOCd9LFxuICAgICAgICAgICAgICAgIHsncngnOiAnNi41JywgJ3J5JzogJzMuMzQwOTQ2NzknfSxcbiAgICAgICAgICAgICAgICB7J3J4JzogJzUuNScsICdyeSc6ICcyLjg2MzY3MDUxJ30sXG4gICAgICAgICAgICAgICAgeydyeCc6ICc0LjUnLCAncnknOiAnMi4zODYzNjg2NCd9XG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgZWxsaXBzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGxpcHNlID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdlbGxpcHNlJyk7XG4gICAgICAgICAgICAgICAgZWxsaXBzZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnb3BhY2l0eScsICcwLjA0Jyk7XG4gICAgICAgICAgICAgICAgZWxsaXBzZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3gnLCAnMTAuNScpO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N5JywgJzUuODAwMjkwMDgnKTtcbiAgICAgICAgICAgICAgICBlbGxpcHNlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyeCcsIGRhdGFbJ3J4J10pO1xuICAgICAgICAgICAgICAgIGVsbGlwc2Uuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3J5JywgZGF0YVsncnknXSk7XG4gICAgICAgICAgICAgICAgc2hhZG93LmFwcGVuZENoaWxkKGVsbGlwc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5fY29sb3IpO1xuXG4gICAgICAgICAgICBjb25zdCBiZ1BhdGggPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIGJnUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMjcsMTMuNSBDMjcsMTkuMDc0NjQ0IDIwLjI1MDAwMSwyNy4wMDAwMDIgMTQuNzUsMzQuNTAwMDAyIEMxNC4wMTY2NjUsMzUuNTAwMDA0IDEyLjk4MzMzNSwzNS41MDAwMDQgMTIuMjUsMzQuNTAwMDAyIEM2Ljc0OTk5OTMsMjcuMDAwMDAyIDAsMTkuMjIyNTYyIDAsMTMuNSBDMCw2LjA0NDE1NTkgNi4wNDQxNTU5LDAgMTMuNSwwIEMyMC45NTU4NDQsMCAyNyw2LjA0NDE1NTkgMjcsMTMuNSBaJyk7XG5cbiAgICAgICAgICAgIGJhY2tncm91bmQuYXBwZW5kQ2hpbGQoYmdQYXRoKTtcblxuICAgICAgICAgICAgY29uc3QgYm9yZGVyID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBib3JkZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ29wYWNpdHknLCAnMC4yNScpO1xuICAgICAgICAgICAgYm9yZGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMwMDAwMDAnKTtcblxuICAgICAgICAgICAgY29uc3QgYm9yZGVyUGF0aCA9IERPTS5jcmVhdGVOUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgYm9yZGVyUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTMuNSwwIEM2LjA0NDE1NTksMCAwLDYuMDQ0MTU1OSAwLDEzLjUgQzAsMTkuMjIyNTYyIDYuNzQ5OTk5MywyNyAxMi4yNSwzNC41IEMxMywzNS41MjI3MjcgMTQuMDE2NjY0LDM1LjUwMDAwNCAxNC43NSwzNC41IEMyMC4yNTAwMDEsMjcgMjcsMTkuMDc0NjQ0IDI3LDEzLjUgQzI3LDYuMDQ0MTU1OSAyMC45NTU4NDQsMCAxMy41LDAgWiBNMTMuNSwxIEMyMC40MTU0MDQsMSAyNiw2LjU4NDU5NiAyNiwxMy41IEMyNiwxNS44OTg2NTcgMjQuNDk1NTg0LDE5LjE4MTQzMSAyMi4yMjA3MDMsMjIuNzM4MjgxIEMxOS45NDU4MjMsMjYuMjk1MTMyIDE2LjcwNTExOSwzMC4xNDIxNjcgMTMuOTQzMzU5LDMzLjkwODIwMyBDMTMuNzQzNDQ1LDM0LjE4MDgxNCAxMy42MTI3MTUsMzQuMzIyNzM4IDEzLjUsMzQuNDQxNDA2IEMxMy4zODcyODUsMzQuMzIyNzM4IDEzLjI1NjU1NSwzNC4xODA4MTQgMTMuMDU2NjQxLDMzLjkwODIwMyBDMTAuMjg0NDgxLDMwLjEyNzk4NSA3LjQxNDg2ODQsMjYuMzE0MTU5IDUuMDE1NjI1LDIyLjc3MzQzOCBDMi42MTYzODE2LDE5LjIzMjcxNSAxLDE1Ljk1MzUzOCAxLDEzLjUgQzEsNi41ODQ1OTYgNi41ODQ1OTYsMSAxMy41LDEgWicpO1xuXG4gICAgICAgICAgICBib3JkZXIuYXBwZW5kQ2hpbGQoYm9yZGVyUGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1ha2kgPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTtcbiAgICAgICAgICAgIG1ha2kuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoNi4wLCA3LjApJyk7XG4gICAgICAgICAgICBtYWtpLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyNGRkZGRkYnKTtcblxuICAgICAgICAgICAgY29uc3QgY2lyY2xlQ29udGFpbmVyID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBjaXJjbGVDb250YWluZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoOC4wLCA4LjApJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZTEgPSBET00uY3JlYXRlTlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2NpcmNsZScpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjMDAwMDAwJyk7XG4gICAgICAgICAgICBjaXJjbGUxLnNldEF0dHJpYnV0ZU5TKG51bGwsICdvcGFjaXR5JywgJzAuMjUnKTtcbiAgICAgICAgICAgIGNpcmNsZTEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N4JywgJzUuNScpO1xuICAgICAgICAgICAgY2lyY2xlMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3knLCAnNS41Jyk7XG4gICAgICAgICAgICBjaXJjbGUxLnNldEF0dHJpYnV0ZU5TKG51bGwsICdyJywgJzUuNDk5OTk2MicpO1xuXG4gICAgICAgICAgICBjb25zdCBjaXJjbGUyID0gRE9NLmNyZWF0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdjaXJjbGUnKTtcbiAgICAgICAgICAgIGNpcmNsZTIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnI0ZGRkZGRicpO1xuICAgICAgICAgICAgY2lyY2xlMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3gnLCAnNS41Jyk7XG4gICAgICAgICAgICBjaXJjbGUyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdjeScsICc1LjUnKTtcbiAgICAgICAgICAgIGNpcmNsZTIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3InLCAnNS40OTk5OTYyJyk7XG5cbiAgICAgICAgICAgIGNpcmNsZUNvbnRhaW5lci5hcHBlbmRDaGlsZChjaXJjbGUxKTtcbiAgICAgICAgICAgIGNpcmNsZUNvbnRhaW5lci5hcHBlbmRDaGlsZChjaXJjbGUyKTtcblxuICAgICAgICAgICAgcGFnZTEuYXBwZW5kQ2hpbGQoc2hhZG93KTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKGJhY2tncm91bmQpO1xuICAgICAgICAgICAgcGFnZTEuYXBwZW5kQ2hpbGQoYm9yZGVyKTtcbiAgICAgICAgICAgIHBhZ2UxLmFwcGVuZENoaWxkKG1ha2kpO1xuICAgICAgICAgICAgcGFnZTEuYXBwZW5kQ2hpbGQoY2lyY2xlQ29udGFpbmVyKTtcblxuICAgICAgICAgICAgc3ZnLmFwcGVuZENoaWxkKHBhZ2UxKTtcblxuICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICdoZWlnaHQnLCBgJHtkZWZhdWx0SGVpZ2h0ICogdGhpcy5fc2NhbGV9cHhgKTtcbiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnd2lkdGgnLCBgJHtkZWZhdWx0V2lkdGggKiB0aGlzLl9zY2FsZX1weGApO1xuXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHN2Zyk7XG5cbiAgICAgICAgICAgIC8vIGlmIG5vIGVsZW1lbnQgYW5kIG5vIG9mZnNldCBvcHRpb24gZ2l2ZW4gYXBwbHkgYW4gb2Zmc2V0IGZvciB0aGUgZGVmYXVsdCBtYXJrZXJcbiAgICAgICAgICAgIC8vIHRoZSAtMTQgYXMgdGhlIHkgdmFsdWUgb2YgdGhlIGRlZmF1bHQgbWFya2VyIG9mZnNldCB3YXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gdGhlIG1hcmtlciB0aXAgaXMgYXQgdGhlIGNlbnRlciBvZiB0aGUgc2hhZG93IGVsbGlwc2UgZnJvbSB0aGUgZGVmYXVsdCBzdmdcbiAgICAgICAgICAgIC8vIHRoZSB5IHZhbHVlIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHNoYWRvdyBlbGxpcHNlIHJlbGF0aXZlIHRvIHRoZSBzdmcgdG9wIGxlZnQgaXMgXCJzaGFkb3cgdHJhbnNmb3JtIHRyYW5zbGF0ZS15ICgyOS4wKSArIGVsbGlwc2UgY3kgKDUuODAwMjkwMDgpXCJcbiAgICAgICAgICAgIC8vIG9mZnNldCB0byB0aGUgc3ZnIGNlbnRlciBcImhlaWdodCAoNDEgLyAyKVwiIGdpdmVzICgyOS4wICsgNS44MDAyOTAwOCkgLSAoNDEgLyAyKSBhbmQgcm91bmRlZCBmb3IgYW4gaW50ZWdlciBwaXhlbCBvZmZzZXQgZ2l2ZXMgMTRcbiAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGlzIHVzZWQgdG8gbW92ZSB0aGUgbWFya2VyIHVwIGZyb20gdGhlIGNlbnRlciBzbyB0aGUgdGlwIGlzIGF0IHRoZSBNYXJrZXIgbG5nTGF0XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMgJiYgb3B0aW9ucy5vZmZzZXQgfHwgWzAsIC0xNF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucyAmJiBvcHRpb25zLm9mZnNldCB8fCBbMCwgMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXJrZXInKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBwcmV2ZW50IGZvY3VzaW5nIG9uIGNsaWNrXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gcmV2ZXJ0IHRoZSBkZWZhdWx0IHNjcm9sbGluZyBhY3Rpb24gb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICBlbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgZWwuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgIH0pO1xuICAgICAgICBhcHBseUFuY2hvckNsYXNzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX2FuY2hvciwgJ21hcmtlcicpO1xuXG4gICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyB0aGUgYE1hcmtlcmAgdG8gYSBgTWFwYCBvYmplY3QuXG4gICAgICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIG1hcmtlciB0by5cbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAgKiAgIC5zZXRMbmdMYXQoWzMwLjUsIDUwLjVdKVxuICAgICAqICAgLmFkZFRvKG1hcCk7IC8vIGFkZCB0aGUgbWFya2VyIHRvIHRoZSBtYXBcbiAgICAgKi9cbiAgICBhZGRUbyhtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIG1hcC5nZXRDYW52YXNDb250YWluZXIoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgdGhpcy5zZXREcmFnZ2FibGUodGhpcy5fZHJhZ2dhYmxlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgYXR0YWNoZWQgdGhlIGBjbGlja2AgbGlzdGVuZXIgdG8gdGhlIG1hcmtlciBlbGVtZW50LCB0aGUgcG9wdXBcbiAgICAgICAgLy8gd291bGQgY2xvc2Ugb25jZSB0aGUgZXZlbnQgcHJvcG9nYXRlZCB0byBgbWFwYCBkdWUgdG8gdGhlXG4gICAgICAgIC8vIGBQb3B1cCNfb25DbGlja0Nsb3NlYCBsaXN0ZW5lci5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX29uTWFwQ2xpY2spO1xuICAgICAgICBpZiAodGhpcy5fbWFwLl9tYXJrZXJzQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5fbWFya2Vyc0NhY2hlLnB1c2godGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBtYXJrZXIgZnJvbSBhIG1hcFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKS5hZGRUbyhtYXApO1xuICAgICAqIG1hcmtlci5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ2NsaWNrJywgdGhpcy5fb25NYXBDbGljayk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNldXAnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3RvdWNoZW5kJywgdGhpcy5fb25VcCk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgICAgIGNvbnN0IG0gPSB0aGlzLl9tYXAuX21hcmtlcnNDYWNoZS5pbmRleE9mKHRoaXMpO1xuICAgICAgICAgICAgaWYgKG0gPiAtMSkgdGhpcy5fbWFwLl9tYXJrZXJzQ2FjaGUuc3BsaWNlKG0sIDEpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICAgICAgfVxuICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHRoaXMuX3BvcHVwLnJlbW92ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhlIHJlc3VsdCBtYXkgZGlmZmVyIGJ5IGEgbXVsdGlwbGUgb2YgMzYwIGRlZ3JlZXMgZnJvbSB0aGUgbG9uZ2l0dWRlIHByZXZpb3VzbHlcbiAgICAgKiBzZXQgYnkgYHNldExuZ0xhdGAgYmVjYXVzZSBgTWFya2VyYCB3cmFwcyB0aGUgYW5jaG9yIGxvbmdpdHVkZSBhY3Jvc3MgY29waWVzIG9mIHRoZSB3b3JsZCB0byBrZWVwXG4gICAgICogdGhlIG1hcmtlciBvbiBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBBIHtAbGluayBMbmdMYXR9IGRlc2NyaWJpbmcgdGhlIG1hcmtlcidzIGxvY2F0aW9uLlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFN0b3JlIHRoZSBtYXJrZXIncyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGNvb3JkaW5hdGVzIGluIGEgdmFyaWFibGVcbiAgICAqIHZhciBsbmdMYXQgPSBtYXJrZXIuZ2V0TG5nTGF0KCk7XG4gICAgKiAvLyBQcmludCB0aGUgbWFya2VyJ3MgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSB2YWx1ZXMgaW4gdGhlIGNvbnNvbGVcbiAgICAqIGNvbnNvbGUubG9nKCdMb25naXR1ZGU6ICcgKyBsbmdMYXQubG5nICsgJywgTGF0aXR1ZGU6ICcgKyBsbmdMYXQubGF0IClcbiAgICAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBNYXJrZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1tYXJrZXIvKVxuICAgICovXG4gICAgZ2V0TG5nTGF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICogU2V0IHRoZSBtYXJrZXIncyBnZW9ncmFwaGljYWwgcG9zaXRpb24gYW5kIG1vdmUgaXQuXG4gICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0IEEge0BsaW5rIExuZ0xhdH0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWFya2VyIHNob3VsZCBiZSBsb2NhdGVkLlxuICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gQ3JlYXRlIGEgbmV3IG1hcmtlciwgc2V0IHRoZSBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLCBhbmQgYWRkIGl0IHRvIHRoZSBtYXBcbiAgICAqIG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICAgICogICAuc2V0TG5nTGF0KFstNjUuMDE3LCAtMTYuNDU3XSlcbiAgICAqICAgLmFkZFRvKG1hcCk7XG4gICAgKiBAc2VlIFtBZGQgY3VzdG9tIGljb25zIHdpdGggTWFya2Vyc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY3VzdG9tLW1hcmtlci1pY29ucy8pXG4gICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgTWFya2VyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtbWFya2VyLylcbiAgICAqIEBzZWUgW0FkZCBhIG1hcmtlciB1c2luZyBhIHBsYWNlIG5hbWVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21hcmtlci1mcm9tLWdlb2NvZGUvKVxuICAgICovXG4gICAgc2V0TG5nTGF0KGxuZ2xhdDogTG5nTGF0TGlrZSkge1xuICAgICAgICB0aGlzLl9sbmdMYXQgPSBMbmdMYXQuY29udmVydChsbmdsYXQpO1xuICAgICAgICB0aGlzLl9wb3MgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYE1hcmtlcmAncyBIVE1MIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZHMgYSB7QGxpbmsgUG9wdXB9IHRvIHRoZSB7QGxpbmsgTWFya2VyfS5cbiAgICAgKiBAcGFyYW0gcG9wdXAgQW4gaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBQb3B1cH0gY2xhc3MuIElmIHVuZGVmaW5lZCBvciBudWxsLCBhbnkgcG9wdXBcbiAgICAgKiBzZXQgb24gdGhpcyB7QGxpbmsgTWFya2VyfSBpbnN0YW5jZSBpcyB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAgKiAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogIC5zZXRQb3B1cChuZXcgbWFwYm94Z2wuUG9wdXAoKS5zZXRIVE1MKFwiPGgxPkhlbGxvIFdvcmxkITwvaDE+XCIpKSAvLyBhZGQgcG9wdXBcbiAgICAgKiAgLmFkZFRvKG1hcCk7XG4gICAgICogQHNlZSBbQXR0YWNoIGEgcG9wdXAgdG8gYSBtYXJrZXIgaW5zdGFuY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldC1wb3B1cC8pXG4gICAgICovXG4gICAgc2V0UG9wdXAocG9wdXA6ID9Qb3B1cCkge1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMuX29uS2V5UHJlc3MpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX29yaWdpbmFsVGFiSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3B1cCkge1xuICAgICAgICAgICAgaWYgKCEoJ29mZnNldCcgaW4gcG9wdXAub3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJIZWlnaHQgPSA0MSAtICg1LjggLyAyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJSYWRpdXMgPSAxMy41O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVhck9mZnNldCA9IE1hdGguc3FydChNYXRoLnBvdyhtYXJrZXJSYWRpdXMsIDIpIC8gMik7XG4gICAgICAgICAgICAgICAgcG9wdXAub3B0aW9ucy5vZmZzZXQgPSB0aGlzLl9kZWZhdWx0TWFya2VyID8ge1xuICAgICAgICAgICAgICAgICAgICAndG9wJzogWzAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAndG9wLWxlZnQnOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtcmlnaHQnOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgICdib3R0b20nOiBbMCwgLW1hcmtlckhlaWdodF0sXG4gICAgICAgICAgICAgICAgICAgICdib3R0b20tbGVmdCc6IFtsaW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogWy1saW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICAgICAgICAgICAgICAgICAgICAnbGVmdCc6IFttYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdLFxuICAgICAgICAgICAgICAgICAgICAncmlnaHQnOiBbLW1hcmtlclJhZGl1cywgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cykgKiAtMV1cbiAgICAgICAgICAgICAgICB9IDogdGhpcy5fb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBwb3B1cDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sbmdMYXQpIHRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpO1xuXG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hbFRhYkluZGV4ID0gdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX29yaWdpbmFsVGFiSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMuX29uS2V5UHJlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX29uS2V5UHJlc3MoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBjb2RlID0gZS5jb2RlO1xuICAgICAgICBjb25zdCBsZWdhY3lDb2RlID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGNvZGUgPT09ICdTcGFjZScpIHx8IChjb2RlID09PSAnRW50ZXInKSB8fFxuICAgICAgICAgICAgKGxlZ2FjeUNvZGUgPT09IDMyKSB8fCAobGVnYWN5Q29kZSA9PT0gMTMpIC8vIHNwYWNlIG9yIGVudGVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uTWFwQ2xpY2soZTogTWFwTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZS5vcmlnaW5hbEV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICh0YXJnZXRFbGVtZW50ID09PSBlbGVtZW50IHx8IGVsZW1lbnQuY29udGFpbnMoKHRhcmdldEVsZW1lbnQ6IGFueSkpKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFBvcHVwfSBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIHRoZSB7QGxpbmsgTWFya2VyfS5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IHBvcHVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbWFya2VyID0gbmV3IG1hcGJveGdsLk1hcmtlcigpXG4gICAgICogIC5zZXRMbmdMYXQoWzAsIDBdKVxuICAgICAqICAuc2V0UG9wdXAobmV3IG1hcGJveGdsLlBvcHVwKCkuc2V0SFRNTChcIjxoMT5IZWxsbyBXb3JsZCE8L2gxPlwiKSlcbiAgICAgKiAgLmFkZFRvKG1hcCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhtYXJrZXIuZ2V0UG9wdXAoKSk7IC8vIHJldHVybiB0aGUgcG9wdXAgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBnZXRQb3B1cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIG9yIGNsb3NlcyB0aGUge0BsaW5rIFBvcHVwfSBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIHRoZSB7QGxpbmsgTWFya2VyfSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB7QGxpbmsgUG9wdXB9LlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICAgICAqICAuc2V0TG5nTGF0KFswLCAwXSlcbiAgICAgKiAgLnNldFBvcHVwKG5ldyBtYXBib3hnbC5Qb3B1cCgpLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIikpXG4gICAgICogIC5hZGRUbyhtYXApO1xuICAgICAqXG4gICAgICogbWFya2VyLnRvZ2dsZVBvcHVwKCk7IC8vIHRvZ2dsZSBwb3B1cCBvcGVuIG9yIGNsb3NlZFxuICAgICAqL1xuICAgIHRvZ2dsZVBvcHVwKCkge1xuICAgICAgICBjb25zdCBwb3B1cCA9IHRoaXMuX3BvcHVwO1xuXG4gICAgICAgIGlmICghcG9wdXApIHJldHVybiB0aGlzO1xuICAgICAgICBlbHNlIGlmIChwb3B1cC5pc09wZW4oKSkgcG9wdXAucmVtb3ZlKCk7XG4gICAgICAgIGVsc2UgcG9wdXAuYWRkVG8odGhpcy5fbWFwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX3VwZGF0ZShlPzoge3R5cGU6ICdtb3ZlJyB8ICdtb3ZlZW5kJ30pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcykge1xuICAgICAgICAgICAgdGhpcy5fbG5nTGF0ID0gc21hcnRXcmFwKHRoaXMuX2xuZ0xhdCwgdGhpcy5fcG9zLCB0aGlzLl9tYXAudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BvcyA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCkuX2FkZCh0aGlzLl9vZmZzZXQpO1xuXG4gICAgICAgIGxldCByb3RhdGlvbiA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9PT0gXCJ2aWV3cG9ydFwiIHx8IHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgcm90YXRpb24gPSBgcm90YXRlWigke3RoaXMuX3JvdGF0aW9ufWRlZylgO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID09PSBcIm1hcFwiKSB7XG4gICAgICAgICAgICByb3RhdGlvbiA9IGByb3RhdGVaKCR7dGhpcy5fcm90YXRpb24gLSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpfWRlZylgO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBpdGNoID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoQWxpZ25tZW50ID09PSBcInZpZXdwb3J0XCIgfHwgdGhpcy5fcGl0Y2hBbGlnbm1lbnQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICBwaXRjaCA9IFwicm90YXRlWCgwZGVnKVwiO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3BpdGNoQWxpZ25tZW50ID09PSBcIm1hcFwiKSB7XG4gICAgICAgICAgICBwaXRjaCA9IGByb3RhdGVYKCR7dGhpcy5fbWFwLmdldFBpdGNoKCl9ZGVnKWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWNhdXNlIHJvdW5kaW5nIHRoZSBjb29yZGluYXRlcyBhdCBldmVyeSBgbW92ZWAgZXZlbnQgY2F1c2VzIHN0dXR0ZXJlZCB6b29taW5nXG4gICAgICAgIC8vIHdlIG9ubHkgcm91bmQgdGhlbSB3aGVuIF91cGRhdGUgaXMgY2FsbGVkIHdpdGggYG1vdmVlbmRgIG9yIHdoZW4gaXRzIGNhbGxlZCB3aXRoXG4gICAgICAgIC8vIG5vIGFyZ3VtZW50cyAod2hlbiB0aGUgTWFya2VyIGlzIGluaXRpYWxpemVkIG9yIE1hcmtlciNzZXRMbmdMYXQgaXMgaW52b2tlZCkuXG4gICAgICAgIGlmICghZSB8fCBlLnR5cGUgPT09IFwibW92ZWVuZFwiKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3MgPSB0aGlzLl9wb3Mucm91bmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fZWxlbWVudCwgYCR7YW5jaG9yVHJhbnNsYXRlW3RoaXMuX2FuY2hvcl19IHRyYW5zbGF0ZSgke3RoaXMuX3Bvcy54fXB4LCAke3RoaXMuX3Bvcy55fXB4KSAke3BpdGNofSAke3JvdGF0aW9ufWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWFya2VyJ3Mgb2Zmc2V0LlxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gVGhlIG1hcmtlcidzIHNjcmVlbiBjb29yZGluYXRlcyBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgZ2V0T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG9mZnNldCBvZiB0aGUgbWFya2VyXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IG9mZnNldCBUaGUgb2Zmc2V0IGluIHBpeGVscyBhcyBhIHtAbGluayBQb2ludExpa2V9IG9iamVjdCB0byBhcHBseSByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCdzIGNlbnRlci4gTmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE9mZnNldChvZmZzZXQ6IFBvaW50TGlrZSkge1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9mZnNldCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfb25Nb3ZlKGU6IE1hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3BvcyA9IGUucG9pbnQuc3ViKHRoaXMuX3Bvc2l0aW9uRGVsdGEpO1xuICAgICAgICB0aGlzLl9sbmdMYXQgPSB0aGlzLl9tYXAudW5wcm9qZWN0KHRoaXMuX3Bvcyk7XG4gICAgICAgIHRoaXMuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCk7XG4gICAgICAgIC8vIHN1cHByZXNzIGNsaWNrIGV2ZW50IHNvIHRoYXQgcG9wdXBzIGRvbid0IHRvZ2dsZSBvbiBkcmFnXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcblxuICAgICAgICAvLyBtYWtlIHN1cmUgZHJhZ3N0YXJ0IG9ubHkgZmlyZXMgb24gdGhlIGZpcnN0IG1vdmUgZXZlbnQgYWZ0ZXIgbW91c2Vkb3duLlxuICAgICAgICAvLyB0aGlzIGNhbid0IGJlIG9uIG1vdXNlZG93biBiZWNhdXNlIHRoYXQgZXZlbnQgZG9lc24ndCBuZWNlc3NhcmlseVxuICAgICAgICAvLyBpbXBseSB0aGF0IGEgZHJhZyBpcyBhYm91dCB0byBoYXBwZW4uXG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdhY3RpdmUnO1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZpcmVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IGRyYWdzdGFydFxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE1hcmtlclxuICAgICAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtNYXJrZXJ9IG1hcmtlciBvYmplY3QgdGhhdCBpcyBiZWluZyBkcmFnZ2VkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RyYWdzdGFydCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaXJlZCB3aGlsZSBkcmFnZ2luZ1xuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgZHJhZ1xuICAgICAgICAgKiBAbWVtYmVyb2YgTWFya2VyXG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge01hcmtlcn0gbWFya2VyIG9iamVjdCB0aGF0IGlzIGJlaW5nIGRyYWdnZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RyYWcnKSk7XG4gICAgfVxuXG4gICAgX29uVXAoKSB7XG4gICAgICAgIC8vIHJldmVydCB0byBub3JtYWwgcG9pbnRlciBldmVudCBoYW5kbGluZ1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uRGVsdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuXG4gICAgICAgIC8vIG9ubHkgZmlyZSBkcmFnZW5kIGlmIGl0IHdhcyBwcmVjZWRlZCBieSBhdCBsZWFzdCBvbmUgZHJhZyBldmVudFxuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgbWFya2VyIGlzIGZpbmlzaGVkIGJlaW5nIGRyYWdnZWRcbiAgICAgICAgICAgICpcbiAgICAgICAgICAgICogQGV2ZW50IGRyYWdlbmRcbiAgICAgICAgICAgICogQG1lbWJlcm9mIE1hcmtlclxuICAgICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICAgICogQHByb3BlcnR5IHtNYXJrZXJ9IG1hcmtlciBvYmplY3QgdGhhdCB3YXMgZHJhZ2dlZFxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RyYWdlbmQnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdpbmFjdGl2ZSc7XG4gICAgfVxuXG4gICAgX2FkZERyYWdIYW5kbGVyKGU6IE1hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50LmNvbnRhaW5zKChlLm9yaWdpbmFsRXZlbnQudGFyZ2V0OiBhbnkpKSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcGl4ZWwgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY2xpY2sgcG9pbnRcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgbWFya2VyIHBvc2l0aW9uLCB3aXRoIHRoZSBvZmZzZXQgYWNjb3VudGVkIGZvci4gVGhlbiB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN1YnRyYWN0IHRoaXMgZGlzdGFuY2UgZnJvbSB0aGUgbW91c2Vtb3ZlIGV2ZW50J3MgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IG1hcmtlciBwb3NpdGlvbi5cbiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZSBtYXJrZXIgJ2p1bXBzJyB0byB0aGUgY2xpY2sgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIGNyZWF0aW5nIGEgamFycmluZyBVWCBlZmZlY3QuXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkRlbHRhID0gZS5wb2ludC5zdWIodGhpcy5fcG9zKS5hZGQodGhpcy5fb2Zmc2V0KTtcblxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAncGVuZGluZyc7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub25jZSgnbW91c2V1cCcsIHRoaXMuX29uVXApO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uY2UoJ3RvdWNoZW5kJywgdGhpcy5fb25VcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgZHJhZ2dhYmxlYCBwcm9wZXJ0eSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbWFya2VyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkQmVEcmFnZ2FibGU9ZmFsc2VdIFR1cm5zIGRyYWcgZnVuY3Rpb25hbGl0eSBvbi9vZmZcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXREcmFnZ2FibGUoc2hvdWxkQmVEcmFnZ2FibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlID0gISFzaG91bGRCZURyYWdnYWJsZTsgLy8gY29udmVydCBwb3NzaWJsZSB1bmRlZmluZWQgdmFsdWUgdG8gZmFsc2VcblxuICAgICAgICAvLyBoYW5kbGUgY2FzZSB3aGVyZSBtYXAgbWF5IG5vdCBleGlzdCB5ZXRcbiAgICAgICAgLy8gZS5nLiB3aGVuIHNldERyYWdnYWJsZSBpcyBjYWxsZWQgYmVmb3JlIGFkZFRvXG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRCZURyYWdnYWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcmtlciBjYW4gYmUgZHJhZ2dlZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXJrZXIgaXMgZHJhZ2dhYmxlLlxuICAgICAqL1xuICAgIGlzRHJhZ2dhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ2dhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGByb3RhdGlvbmAgcHJvcGVydHkgb2YgdGhlIG1hcmtlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JvdGF0aW9uPTBdIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgbWFya2VyIChjbG9ja3dpc2UsIGluIGRlZ3JlZXMpLCByZWxhdGl2ZSB0byBpdHMgcmVzcGVjdGl2ZSB7QGxpbmsgTWFya2VyI3NldFJvdGF0aW9uQWxpZ25tZW50fSBzZXR0aW5nLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFJvdGF0aW9uKHJvdGF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb24gPSByb3RhdGlvbiB8fCAwO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCByb3RhdGlvbiBhbmdsZSBvZiB0aGUgbWFya2VyIChpbiBkZWdyZWVzKS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY3VycmVudCByb3RhdGlvbiBhbmdsZSBvZiB0aGUgbWFya2VyLlxuICAgICAqL1xuICAgIGdldFJvdGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHJvdGF0aW9uQWxpZ25tZW50YCBwcm9wZXJ0eSBvZiB0aGUgbWFya2VyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpZ25tZW50PSdhdXRvJ10gU2V0cyB0aGUgYHJvdGF0aW9uQWxpZ25tZW50YCBwcm9wZXJ0eSBvZiB0aGUgbWFya2VyLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFJvdGF0aW9uQWxpZ25tZW50KGFsaWdubWVudDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID0gYWxpZ25tZW50IHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYHJvdGF0aW9uQWxpZ25tZW50YCBwcm9wZXJ0eSBvZiB0aGUgbWFya2VyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50IHJvdGF0aW9uYWwgYWxpZ25tZW50IG9mIHRoZSBtYXJrZXIuXG4gICAgICovXG4gICAgZ2V0Um90YXRpb25BbGlnbm1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbkFsaWdubWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgcGl0Y2hBbGlnbm1lbnRgIHByb3BlcnR5IG9mIHRoZSBtYXJrZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlnbm1lbnRdIFNldHMgdGhlIGBwaXRjaEFsaWdubWVudGAgcHJvcGVydHkgb2YgdGhlIG1hcmtlci4gSWYgYWxpZ25tZW50IGlzICdhdXRvJywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IG1hdGNoIGByb3RhdGlvbkFsaWdubWVudGAuXG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0UGl0Y2hBbGlnbm1lbnQoYWxpZ25tZW50OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fcGl0Y2hBbGlnbm1lbnQgPSBhbGlnbm1lbnQgJiYgYWxpZ25tZW50ICE9PSAnYXV0bycgPyBhbGlnbm1lbnQgOiB0aGlzLl9yb3RhdGlvbkFsaWdubWVudDtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYHBpdGNoQWxpZ25tZW50YCBwcm9wZXJ0eSBvZiB0aGUgbWFya2VyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50IHBpdGNoIGFsaWdubWVudCBvZiB0aGUgbWFya2VyIGluIGRlZ3JlZXMuXG4gICAgICovXG4gICAgZ2V0UGl0Y2hBbGlnbm1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waXRjaEFsaWdubWVudDtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQnO1xuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uLy4uL3V0aWwvd2luZG93JztcbmltcG9ydCB7ZXh0ZW5kLCBiaW5kQWxsLCB3YXJuT25jZX0gZnJvbSAnLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IE1hcmtlciBmcm9tICcuLi9tYXJrZXInO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwJztcbmltcG9ydCB0eXBlIHtBbmltYXRpb25PcHRpb25zLCBDYW1lcmFPcHRpb25zfSBmcm9tICcuLi9jYW1lcmEnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgcG9zaXRpb25PcHRpb25zPzogUG9zaXRpb25PcHRpb25zLFxuICAgIGZpdEJvdW5kc09wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zICYgQ2FtZXJhT3B0aW9ucyxcbiAgICB0cmFja1VzZXJMb2NhdGlvbj86IGJvb2xlYW4sXG4gICAgc2hvd0FjY3VyYWN5Q2lyY2xlPzogYm9vbGVhbixcbiAgICBzaG93VXNlckxvY2F0aW9uPzogYm9vbGVhblxufTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgcG9zaXRpb25PcHRpb25zOiB7XG4gICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogZmFsc2UsXG4gICAgICAgIG1heGltdW1BZ2U6IDAsXG4gICAgICAgIHRpbWVvdXQ6IDYwMDAgLyogNiBzZWMgKi9cbiAgICB9LFxuICAgIGZpdEJvdW5kc09wdGlvbnM6IHtcbiAgICAgICAgbWF4Wm9vbTogMTVcbiAgICB9LFxuICAgIHRyYWNrVXNlckxvY2F0aW9uOiBmYWxzZSxcbiAgICBzaG93QWNjdXJhY3lDaXJjbGU6IHRydWUsXG4gICAgc2hvd1VzZXJMb2NhdGlvbjogdHJ1ZVxufTtcblxubGV0IHN1cHBvcnRzR2VvbG9jYXRpb247XG5cbmZ1bmN0aW9uIGNoZWNrR2VvbG9jYXRpb25TdXBwb3J0KGNhbGxiYWNrKSB7XG4gICAgaWYgKHN1cHBvcnRzR2VvbG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWxsYmFjayhzdXBwb3J0c0dlb2xvY2F0aW9uKTtcblxuICAgIH0gZWxzZSBpZiAod2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIG5hdmlnYXRvci5wZXJtaXNzaW9ucyBoYXMgaW5jb21wbGV0ZSBicm93c2VyIHN1cHBvcnRcbiAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNmZWF0PXBlcm1pc3Npb25zLWFwaVxuICAgICAgICAvLyBUZXN0IGZvciB0aGUgY2FzZSB3aGVyZSBhIGJyb3dzZXIgZGlzYWJsZXMgR2VvbG9jYXRpb24gYmVjYXVzZSBvZiBhblxuICAgICAgICAvLyBpbnNlY3VyZSBvcmlnaW5cbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7bmFtZTogJ2dlb2xvY2F0aW9uJ30pLnRoZW4oKHApID0+IHtcbiAgICAgICAgICAgIHN1cHBvcnRzR2VvbG9jYXRpb24gPSBwLnN0YXRlICE9PSAnZGVuaWVkJztcbiAgICAgICAgICAgIGNhbGxiYWNrKHN1cHBvcnRzR2VvbG9jYXRpb24pO1xuICAgICAgICB9KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cHBvcnRzR2VvbG9jYXRpb24gPSAhIXdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb247XG4gICAgICAgIGNhbGxiYWNrKHN1cHBvcnRzR2VvbG9jYXRpb24pO1xuICAgIH1cbn1cblxubGV0IG51bWJlck9mV2F0Y2hlcyA9IDA7XG5sZXQgbm9UaW1lb3V0ID0gZmFsc2U7XG5cbi8qKlxuICogQSBgR2VvbG9jYXRlQ29udHJvbGAgY29udHJvbCBwcm92aWRlcyBhIGJ1dHRvbiB0aGF0IHVzZXMgdGhlIGJyb3dzZXIncyBnZW9sb2NhdGlvblxuICogQVBJIHRvIGxvY2F0ZSB0aGUgdXNlciBvbiB0aGUgbWFwLlxuICpcbiAqIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBnZW9sb2NhdGlvbixcbiAqIGFuZCBzb21lIHVzZXJzIG1heSBkaXNhYmxlIHRoZSBmZWF0dXJlLiBHZW9sb2NhdGlvbiBzdXBwb3J0IGZvciBtb2Rlcm5cbiAqIGJyb3dzZXJzIGluY2x1ZGluZyBDaHJvbWUgcmVxdWlyZXMgc2l0ZXMgdG8gYmUgc2VydmVkIG92ZXIgSFRUUFMuIElmXG4gKiBnZW9sb2NhdGlvbiBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBHZW9sb2NhdGVDb250cm9sIHdpbGwgc2hvd1xuICogYXMgZGlzYWJsZWQuXG4gKlxuICogVGhlIHpvb20gbGV2ZWwgYXBwbGllZCB3aWxsIGRlcGVuZCBvbiB0aGUgYWNjdXJhY3kgb2YgdGhlIGdlb2xvY2F0aW9uIHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UuXG4gKlxuICogVGhlIEdlb2xvY2F0ZUNvbnRyb2wgaGFzIHR3byBtb2Rlcy4gSWYgYHRyYWNrVXNlckxvY2F0aW9uYCBpcyBgZmFsc2VgIChkZWZhdWx0KSB0aGUgY29udHJvbCBhY3RzIGFzIGEgYnV0dG9uLCB3aGljaCB3aGVuIHByZXNzZWQgd2lsbCBzZXQgdGhlIG1hcCdzIGNhbWVyYSB0byB0YXJnZXQgdGhlIHVzZXIgbG9jYXRpb24uIElmIHRoZSB1c2VyIG1vdmVzLCB0aGUgbWFwIHdvbid0IHVwZGF0ZS4gVGhpcyBpcyBtb3N0IHN1aXRlZCBmb3IgdGhlIGRlc2t0b3AuIElmIGB0cmFja1VzZXJMb2NhdGlvbmAgaXMgYHRydWVgIHRoZSBjb250cm9sIGFjdHMgYXMgYSB0b2dnbGUgYnV0dG9uIHRoYXQgd2hlbiBhY3RpdmUgdGhlIHVzZXIncyBsb2NhdGlvbiBpcyBhY3RpdmVseSBtb25pdG9yZWQgZm9yIGNoYW5nZXMuIEluIHRoaXMgbW9kZSB0aGUgR2VvbG9jYXRlQ29udHJvbCBoYXMgdGhyZWUgaW50ZXJhY3Rpb24gc3RhdGVzOlxuICogKiBhY3RpdmUgLSB0aGUgbWFwJ3MgY2FtZXJhIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBhcyB0aGUgdXNlcidzIGxvY2F0aW9uIGNoYW5nZXMsIGtlZXBpbmcgdGhlIGxvY2F0aW9uIGRvdCBpbiB0aGUgY2VudGVyLiBJbml0aWFsIHN0YXRlIGFuZCB1cG9uIGNsaWNraW5nIHRoZSBgR2VvbG9jYXRlQ29udHJvbGAgYnV0dG9uLlxuICogKiBwYXNzaXZlIC0gdGhlIHVzZXIncyBsb2NhdGlvbiBkb3QgYXV0b21hdGljYWxseSB1cGRhdGVzLCBidXQgdGhlIG1hcCdzIGNhbWVyYSBkb2VzIG5vdC4gT2NjdXJzIHVwb24gdGhlIHVzZXIgaW5pdGlhdGluZyBhIG1hcCBtb3ZlbWVudC5cbiAqICogZGlzYWJsZWQgLSBvY2N1cnMgaWYgR2VvbG9jYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgZGlzYWJsZWQgb3IgZGVuaWVkLlxuICpcbiAqIFRoZXNlIGludGVyYWN0aW9uIHN0YXRlcyBjYW4ndCBiZSBjb250cm9sbGVkIHByb2dyYW1tYXRpY2FsbHksIHJhdGhlciB0aGV5IGFyZSBzZXQgYmFzZWQgb24gdXNlciBpbnRlcmFjdGlvbnMuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnBvc2l0aW9uT3B0aW9ucz17ZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSwgdGltZW91dDogNjAwMH1dIEEgR2VvbG9jYXRpb24gQVBJIFtQb3NpdGlvbk9wdGlvbnNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbk9wdGlvbnMpIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maXRCb3VuZHNPcHRpb25zPXttYXhab29tOiAxNX1dIEEge0BsaW5rIE1hcCNmaXRCb3VuZHN9IG9wdGlvbnMgb2JqZWN0IHRvIHVzZSB3aGVuIHRoZSBtYXAgaXMgcGFubmVkIGFuZCB6b29tZWQgdG8gdGhlIHVzZXIncyBsb2NhdGlvbi4gVGhlIGRlZmF1bHQgaXMgdG8gdXNlIGEgYG1heFpvb21gIG9mIDE1IHRvIGxpbWl0IGhvdyBmYXIgdGhlIG1hcCB3aWxsIHpvb20gaW4gZm9yIHZlcnkgYWNjdXJhdGUgbG9jYXRpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uPWZhbHNlXSBJZiBgdHJ1ZWAgdGhlIEdlb2xvY2F0ZSBDb250cm9sIGJlY29tZXMgYSB0b2dnbGUgYnV0dG9uIGFuZCB3aGVuIGFjdGl2ZSB0aGUgbWFwIHdpbGwgcmVjZWl2ZSB1cGRhdGVzIHRvIHRoZSB1c2VyJ3MgbG9jYXRpb24gYXMgaXQgY2hhbmdlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zaG93QWNjdXJhY3lDaXJjbGU9dHJ1ZV0gQnkgZGVmYXVsdCwgaWYgc2hvd1VzZXJMb2NhdGlvbiBpcyBgdHJ1ZWAsIGEgdHJhbnNwYXJlbnQgY2lyY2xlIHdpbGwgYmUgZHJhd24gYXJvdW5kIHRoZSB1c2VyIGxvY2F0aW9uIGluZGljYXRpbmcgdGhlIGFjY3VyYWN5ICg5NSUgY29uZmlkZW5jZSBsZXZlbCkgb2YgdGhlIHVzZXIncyBsb2NhdGlvbi4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZS4gQWx3YXlzIGRpc2FibGVkIHdoZW4gc2hvd1VzZXJMb2NhdGlvbiBpcyBgZmFsc2VgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnNob3dVc2VyTG9jYXRpb249dHJ1ZV0gQnkgZGVmYXVsdCBhIGRvdCB3aWxsIGJlIHNob3duIG9uIHRoZSBtYXAgYXQgdGhlIHVzZXIncyBsb2NhdGlvbi4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZENvbnRyb2wobmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2woe1xuICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgICB9LFxuICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gKiB9KSk7XG4gKiBAc2VlIFtMb2NhdGUgdGhlIHVzZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbG9jYXRlLXVzZXIvKVxuICovXG5jbGFzcyBHZW9sb2NhdGVDb250cm9sIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX21hcDogTWFwO1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2RvdEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIF9jaXJjbGVFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBfZ2VvbG9jYXRlQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBfZ2VvbG9jYXRpb25XYXRjaElEOiBudW1iZXI7XG4gICAgX3RpbWVvdXRJZDogP1RpbWVvdXRJRDtcbiAgICBfd2F0Y2hTdGF0ZTogJ09GRicgfCAnQUNUSVZFX0xPQ0snIHwgJ1dBSVRJTkdfQUNUSVZFJyB8ICdBQ1RJVkVfRVJST1InIHwgJ0JBQ0tHUk9VTkQnIHwgJ0JBQ0tHUk9VTkRfRVJST1InO1xuICAgIF9sYXN0S25vd25Qb3NpdGlvbjogYW55O1xuICAgIF91c2VyTG9jYXRpb25Eb3RNYXJrZXI6IE1hcmtlcjtcbiAgICBfYWNjdXJhY3lDaXJjbGVNYXJrZXI6IE1hcmtlcjtcbiAgICBfYWNjdXJhY3k6IG51bWJlcjtcbiAgICBfc2V0dXA6IGJvb2xlYW47IC8vIHNldCB0byB0cnVlIG9uY2UgdGhlIGNvbnRyb2wgaGFzIGJlZW4gc2V0dXBcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uU3VjY2VzcycsXG4gICAgICAgICAgICAnX29uRXJyb3InLFxuICAgICAgICAgICAgJ19vblpvb20nLFxuICAgICAgICAgICAgJ19maW5pc2gnLFxuICAgICAgICAgICAgJ19zZXR1cFVJJyxcbiAgICAgICAgICAgICdfdXBkYXRlQ2FtZXJhJyxcbiAgICAgICAgICAgICdfdXBkYXRlTWFya2VyJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsIGBtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtZ3JvdXBgKTtcbiAgICAgICAgY2hlY2tHZW9sb2NhdGlvblN1cHBvcnQodGhpcy5fc2V0dXBVSSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIC8vIGNsZWFyIHRoZSBnZW9sb2NhdGlvbiB3YXRjaCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciB0aGUgbWFya2VycyBmcm9tIHRoZSBtYXBcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlICYmIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignem9vbScsIHRoaXMuX29uWm9vbSk7XG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIG51bWJlck9mV2F0Y2hlcyA9IDA7XG4gICAgICAgIG5vVGltZW91dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb24gaXMgb3V0c2lkZSB0aGUgbWFwJ3MgbWF4Ym91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb24gdGhlIEdlb2xvY2F0aW9uIEFQSSBQb3NpdGlvblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBtYXAncyBtYXhib3VuZHMsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNPdXRPZk1hcE1heEJvdW5kcyhwb3NpdGlvbjogUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5fbWFwLmdldE1heEJvdW5kcygpO1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IHBvc2l0aW9uLmNvb3JkcztcblxuICAgICAgICByZXR1cm4gYm91bmRzICYmIChcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxvbmdpdHVkZSA8IGJvdW5kcy5nZXRXZXN0KCkgfHxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxvbmdpdHVkZSA+IGJvdW5kcy5nZXRFYXN0KCkgfHxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxhdGl0dWRlIDwgYm91bmRzLmdldFNvdXRoKCkgfHxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxhdGl0dWRlID4gYm91bmRzLmdldE5vcnRoKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfc2V0RXJyb3JTdGF0ZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0VSUk9SJztcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdBQ1RJVkVfTE9DSyc6XG4gICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9FUlJPUic7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgLy8gdHVybiBtYXJrZXIgZ3JleVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkQnOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdCQUNLR1JPVU5EX0VSUk9SJztcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgIC8vIHR1cm4gbWFya2VyIGdyZXlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgR2VvbG9jYXRpb24gQVBJIHJldHVybnMgYSBuZXcgbG9jYXRpb24sIHVwZGF0ZSB0aGUgR2VvbG9jYXRlQ29udHJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vblN1Y2Nlc3MocG9zaXRpb246IFBvc2l0aW9uKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAvLyBjb250cm9sIGhhcyBzaW5jZSBiZWVuIHJlbW92ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc091dE9mTWFwTWF4Qm91bmRzKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0RXJyb3JTdGF0ZSgpO1xuXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdvdXRvZm1heGJvdW5kcycsIHBvc2l0aW9uKSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXJrZXIoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyBrZWVwIGEgcmVjb3JkIG9mIHRoZSBwb3NpdGlvbiBzbyB0aGF0IGlmIHRoZSBzdGF0ZSBpcyBCQUNLR1JPVU5EIGFuZCB0aGUgdXNlclxuICAgICAgICAgICAgLy8gY2xpY2tzIHRoZSBidXR0b24sIHdlIGNhbiBtb3ZlIHRvIEFDVElWRV9MT0NLIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgIC8vIHdhdGNoUG9zaXRpb24gdG8gdHJpZ2dlciBfb25TdWNjZXNzXG4gICAgICAgICAgICB0aGlzLl9sYXN0S25vd25Qb3NpdGlvbiA9IHBvc2l0aW9uO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdBQ1RJVkVfTE9DSyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EX0VSUk9SJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0JBQ0tHUk9VTkQnO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2hvd1VzZXJMb2NhdGlvbiBhbmQgdGhlIHdhdGNoIHN0YXRlIGlzbid0IG9mZiB0aGVuIHVwZGF0ZSB0aGUgbWFya2VyIGxvY2F0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl93YXRjaFN0YXRlICE9PSAnT0ZGJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWFya2VyKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGluIG5vcm1hbCBtb2RlIChub3Qgd2F0Y2ggbW9kZSksIG9yIGlmIGluIHdhdGNoIG1vZGUgYW5kIHRoZSBzdGF0ZSBpcyBhY3RpdmUgd2F0Y2hcbiAgICAgICAgLy8gdGhlbiB1cGRhdGUgdGhlIGNhbWVyYVxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiB8fCB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmEocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXVzZXItbG9jYXRpb24tZG90LXN0YWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdnZW9sb2NhdGUnLCBwb3NpdGlvbikpO1xuICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGNhbWVyYSBsb2NhdGlvbiB0byBjZW50ZXIgb24gdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91cGRhdGVDYW1lcmEocG9zaXRpb246IFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBMbmdMYXQocG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlKTtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gcG9zaXRpb24uY29vcmRzLmFjY3VyYWN5O1xuICAgICAgICBjb25zdCBiZWFyaW5nID0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV4dGVuZCh7YmVhcmluZ30sIHRoaXMub3B0aW9ucy5maXRCb3VuZHNPcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9tYXAuZml0Qm91bmRzKGNlbnRlci50b0JvdW5kcyhyYWRpdXMpLCBvcHRpb25zLCB7XG4gICAgICAgICAgICBnZW9sb2NhdGVTb3VyY2U6IHRydWUgLy8gdGFnIHRoaXMgY2FtZXJhIGNoYW5nZSBzbyBpdCB3b24ndCBjYXVzZSB0aGUgY29udHJvbCB0byBjaGFuZ2UgdG8gYmFja2dyb3VuZCBzdGF0ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHVzZXIgbG9jYXRpb24gZG90IE1hcmtlciB0byB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gW3Bvc2l0aW9uXSB0aGUgR2VvbG9jYXRpb24gQVBJIFBvc2l0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlTWFya2VyKHBvc2l0aW9uOiA/UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgTG5nTGF0KHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSk7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5zZXRMbmdMYXQoY2VudGVyKS5hZGRUbyh0aGlzLl9tYXApO1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnNldExuZ0xhdChjZW50ZXIpLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeSA9IHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2lyY2xlUmFkaXVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVDaXJjbGVSYWRpdXMoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLl9jaXJjbGVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX21hcC5fY29udGFpbmVyLmNsaWVudEhlaWdodCAvIDI7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLl9tYXAudW5wcm9qZWN0KFswLCB5XSk7XG4gICAgICAgIGNvbnN0IGIgPSB0aGlzLl9tYXAudW5wcm9qZWN0KFsxLCB5XSk7XG4gICAgICAgIGNvbnN0IG1ldGVyc1BlclBpeGVsID0gYS5kaXN0YW5jZVRvKGIpO1xuICAgICAgICBjb25zdCBjaXJjbGVEaWFtZXRlciA9IE1hdGguY2VpbCgyLjAgKiB0aGlzLl9hY2N1cmFjeSAvIG1ldGVyc1BlclBpeGVsKTtcbiAgICAgICAgdGhpcy5fY2lyY2xlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke2NpcmNsZURpYW1ldGVyfXB4YDtcbiAgICAgICAgdGhpcy5fY2lyY2xlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtjaXJjbGVEaWFtZXRlcn1weGA7XG4gICAgfVxuXG4gICAgX29uWm9vbSgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMub3B0aW9ucy5zaG93QWNjdXJhY3lDaXJjbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNpcmNsZVJhZGl1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uRXJyb3IoZXJyb3I6IFBvc2l0aW9uRXJyb3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIC8vIGNvbnRyb2wgaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBQRVJNSVNTSU9OX0RFTklFRFxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRpdGxlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhcldhdGNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5jb2RlID09PSAzICYmIG5vVGltZW91dCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyBhIGZvcmNlZCBlcnJvciBzdGF0ZVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCB0byBmb3JjZSBpbW1lZGlhdGUgZ2VvbG9jYXRpb24gd2hlbiBhIHdhdGNoIGlzIGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvODIxNFxuICAgICAgICAgICAgICAgIC8vIGFuZCBodHRwczovL3czYy5naXRodWIuaW8vZ2VvbG9jYXRpb24tYXBpLyNleGFtcGxlLTUtZm9yY2luZy10aGUtdXNlci1hZ2VudC10by1yZXR1cm4tYS1mcmVzaC1jYWNoZWQtcG9zaXRpb25cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldEVycm9yU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl93YXRjaFN0YXRlICE9PSAnT0ZGJyAmJiB0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIF9maW5pc2goKSB7XG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0SWQpIHsgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7IH1cbiAgICAgICAgdGhpcy5fdGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIF9zZXR1cFVJKHN1cHBvcnRlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZTogTW91c2VFdmVudCkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgYG1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlYCwgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgRE9NLmNyZWF0ZSgnc3BhbicsIGBtYXBib3hnbC1jdHJsLWljb25gLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24pLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcblxuICAgICAgICBpZiAoc3VwcG9ydGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0dlb2xvY2F0aW9uIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSBzbyB0aGUgR2VvbG9jYXRlQ29udHJvbCB3aWxsIGJlIGRpc2FibGVkLicpO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGl0bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdHZW9sb2NhdGVDb250cm9sLkZpbmRNeUxvY2F0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udGl0bGUgPSB0aXRsZTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gc2hvd1VzZXJMb2NhdGlvbiBpcyBlbmFibGVkLCBrZWVwIHRoZSBHZW9sb2NhdGUgYnV0dG9uIGRpc2FibGVkIHVudGlsIHRoZSBkZXZpY2UgbG9jYXRpb24gbWFya2VyIGlzIHNldHVwIG9uIHRoZSBtYXBcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXVzZXItbG9jYXRpb24tZG90Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlciA9IG5ldyBNYXJrZXIodGhpcy5fZG90RWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NpcmNsZUVsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1hY2N1cmFjeS1jaXJjbGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyID0gbmV3IE1hcmtlcih7ZWxlbWVudDogdGhpcy5fY2lyY2xlRWxlbWVudCwgcGl0Y2hBbGlnbm1lbnQ6ICdtYXAnfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcblxuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCd6b29tJywgdGhpcy5fb25ab29tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5fc2V0dXAgPSB0cnVlO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGNhbWVyYSBpcyBjaGFuZ2VkIChhbmQgaXQncyBub3QgYXMgYSByZXN1bHQgb2YgdGhlIEdlb2xvY2F0aW9uIENvbnRyb2wpIGNoYW5nZVxuICAgICAgICAvLyB0aGUgd2F0Y2ggbW9kZSB0byBiYWNrZ3JvdW5kIHdhdGNoLCBzbyB0aGF0IHRoZSBtYXJrZXIgaXMgdXBkYXRlZCBidXQgbm90IHRoZSBjYW1lcmEuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW92ZXN0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVJlc2l6ZSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgZXZlbnQub3JpZ2luYWxFdmVudC50eXBlID09PSAncmVzaXplJztcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50Lmdlb2xvY2F0ZVNvdXJjZSAmJiB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snICYmICFmcm9tUmVzaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQkFDS0dST1VORCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbmVuZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogUHJvZ3JhbW1hdGljYWxseSByZXF1ZXN0IGFuZCBtb3ZlIHRoZSBtYXAgdG8gdGhlIHVzZXIncyBsb2NhdGlvbi5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgIGlmIGNhbGxlZCBiZWZvcmUgY29udHJvbCB3YXMgYWRkZWQgdG8gYSBtYXAsIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYC5cbiAgICAqIEBleGFtcGxlXG4gICAgKiAvLyBJbml0aWFsaXplIHRoZSBnZW9sb2NhdGUgY29udHJvbC5cbiAgICAqIHZhciBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gICAgKiAgcG9zaXRpb25PcHRpb25zOiB7XG4gICAgKiAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAgICAqICB9LFxuICAgICogIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gICAgKiB9KTtcbiAgICAqIC8vIEFkZCB0aGUgY29udHJvbCB0byB0aGUgbWFwLlxuICAgICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAgICAqIG1hcC5vbignbG9hZCcsIGZ1bmN0aW9uKCkge1xuICAgICogICBnZW9sb2NhdGUudHJpZ2dlcigpO1xuICAgICogfSk7XG4gICAgKi9cbiAgICB0cmlnZ2VyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHVwKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnR2VvbG9jYXRlIGNvbnRyb2wgdHJpZ2dlcmVkIGJlZm9yZSBhZGRlZCB0byBhIG1hcCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB3YXRjaFN0YXRlIGFuZCBkbyBhbnkgb3V0Z29pbmcgc3RhdGUgY2xlYW51cFxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdPRkYnOlxuICAgICAgICAgICAgICAgIC8vIHR1cm4gb24gdGhlIEdlb2xvY2F0ZSBDb250cm9sXG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdXQUlUSU5HX0FDVElWRSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbnN0YXJ0JykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0xPQ0snOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIC8vIHR1cm4gb2ZmIHRoZSBHZW9sb2NhdGUgQ29udHJvbFxuICAgICAgICAgICAgICAgIG51bWJlck9mV2F0Y2hlcy0tO1xuICAgICAgICAgICAgICAgIG5vVGltZW91dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgndHJhY2t1c2VybG9jYXRpb25lbmQnKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9MT0NLJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIC8vIHNldCBjYW1lcmEgdG8gbGFzdCBrbm93biBsb2NhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sYXN0S25vd25Qb3NpdGlvbikgdGhpcy5fdXBkYXRlQ2FtZXJhKHRoaXMuX2xhc3RLbm93blBvc2l0aW9uKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3RyYWNrdXNlcmxvY2F0aW9uc3RhcnQnKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluY29taW5nIHN0YXRlIHNldHVwXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ09GRic6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hbmFnZSBnZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uIC8gZ2VvbG9jYXRpb24uY2xlYXJXYXRjaFxuICAgICAgICAgICAgaWYgKHRoaXMuX3dhdGNoU3RhdGUgPT09ICdPRkYnICYmIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xlYXIgd2F0Y2hQb3NpdGlvbiBhcyB3ZSd2ZSBjaGFuZ2VkIHRvIGFuIE9GRiBzdGF0ZVxuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyV2F0Y2goKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlbmFibGUgd2F0Y2hQb3NpdGlvbiBzaW5jZSB3YXRjaFN0YXRlIGlzIG5vdCBPRkYgYW5kIHRoZXJlIGlzIG5vIHdhdGNoUG9zaXRpb24gYWxyZWFkeSBydW5uaW5nXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgICAgICBudW1iZXJPZldhdGNoZXMrKztcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb25PcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJPZldhdGNoZXMgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT3B0aW9ucyA9IHttYXhpbXVtQWdlOjYwMDAwMCwgdGltZW91dDowfTtcbiAgICAgICAgICAgICAgICAgICAgbm9UaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9wdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25PcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICBub1RpbWVvdXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgcG9zaXRpb25PcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgIHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgdGhpcy5vcHRpb25zLnBvc2l0aW9uT3B0aW9ucyk7XG5cbiAgICAgICAgICAgIC8vIFRoaXMgdGltZW91dCBlbnN1cmVzIHRoYXQgd2Ugc3RpbGwgY2FsbCBmaW5pc2goKSBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkZWNsaW5lcyB0byBzaGFyZSB0aGVpciBsb2NhdGlvbiBpbiBGaXJlZm94XG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0SWQgPSBzZXRUaW1lb3V0KHRoaXMuX2ZpbmlzaCwgMTAwMDAgLyogMTBzZWMgKi8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX2NsZWFyV2F0Y2goKSB7XG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpO1xuXG4gICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWFya2VyKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBHZW9sb2NhdGVDb250cm9sO1xuXG4vKiBHZW9sb2NhdGUgQ29udHJvbCBXYXRjaCBTdGF0ZXNcbiAqIFRoaXMgaXMgdGhlIHByaXZhdGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wuXG4gKlxuICogT0ZGXG4gKiAgICBvZmYvaW5hY3RpdmVcbiAqIFdBSVRJTkdfQUNUSVZFXG4gKiAgICBHZW9sb2NhdGUgQ29udHJvbCB3YXMgY2xpY2tlZCBidXQgc3RpbGwgd2FpdGluZyBmb3IgR2VvbG9jYXRpb24gQVBJIHJlc3BvbnNlIHdpdGggdXNlciBsb2NhdGlvblxuICogQUNUSVZFX0xPQ0tcbiAqICAgIFNob3dpbmcgdGhlIHVzZXIgbG9jYXRpb24gYXMgYSBkb3QgQU5EIHRyYWNraW5nIHRoZSBjYW1lcmEgdG8gYmUgZml4ZWQgdG8gdGhlaXIgbG9jYXRpb24uIElmIHRoZWlyIGxvY2F0aW9uIGNoYW5nZXMgdGhlIG1hcCBtb3ZlcyB0byBmb2xsb3cuXG4gKiBBQ1RJVkVfRVJST1JcbiAqICAgIFRoZXJlIHdhcyBlbiBlcnJvciBmcm9tIHRoZSBHZW9sb2NhdGlvbiBBUEkgd2hpbGUgdHJ5aW5nIHRvIHNob3cgYW5kIHRyYWNrIHRoZSB1c2VyIGxvY2F0aW9uLlxuICogQkFDS0dST1VORFxuICogICAgU2hvd2luZyB0aGUgdXNlciBsb2NhdGlvbiBhcyBhIGRvdCBidXQgdGhlIGNhbWVyYSBkb2Vzbid0IGZvbGxvdyB0aGVpciBsb2NhdGlvbiBhcyBpdCBjaGFuZ2VzLlxuICogQkFDS0dST1VORF9FUlJPUlxuICogICAgVGhlcmUgd2FzIGFuIGVycm9yIGZyb20gdGhlIEdlb2xvY2F0aW9uIEFQSSB3aGlsZSB0cnlpbmcgdG8gc2hvdyAoYnV0IG5vdCB0cmFjaykgdGhlIHVzZXIgbG9jYXRpb24uXG4gKi9cblxuLyoqXG4gKiBGaXJlZCBvbiBlYWNoIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiB1cGRhdGUgd2hpY2ggcmV0dXJuZWQgYXMgc3VjY2Vzcy5cbiAqXG4gKiBAZXZlbnQgZ2VvbG9jYXRlXG4gKiBAbWVtYmVyb2YgR2VvbG9jYXRlQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbikgb2JqZWN0IGZyb20gdGhlIGNhbGxiYWNrIGluIFtHZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL2dldEN1cnJlbnRQb3NpdGlvbikgb3IgW0dlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL3dhdGNoUG9zaXRpb24pLlxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIGdlb2xvY2F0ZSBjb250cm9sLlxuICogdmFyIGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgfSxcbiAqICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYSBnZW9sb2NhdGUgZXZlbnQgb2NjdXJzLlxuICogZ2VvbG9jYXRlLm9uKCdnZW9sb2NhdGUnLCBmdW5jdGlvbigpIHtcbiAqICAgY29uc29sZS5sb2coJ0EgZ2VvbG9jYXRlIGV2ZW50IGhhcyBvY2N1cnJlZC4nKVxuICogfSk7XG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgb24gZWFjaCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gdXBkYXRlIHdoaWNoIHJldHVybmVkIGFzIGFuIGVycm9yLlxuICpcbiAqIEBldmVudCBlcnJvclxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbkVycm9yfSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25FcnJvcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uRXJyb3IpIG9iamVjdCBmcm9tIHRoZSBjYWxsYmFjayBpbiBbR2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi9nZXRDdXJyZW50UG9zaXRpb24pIG9yIFtHZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi93YXRjaFBvc2l0aW9uKS5cbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIHRoZSBnZW9sb2NhdGUgY29udHJvbC5cbiAqIHZhciBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gKiAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gKiAgIH0sXG4gKiAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gKiB9KTtcbiAqIC8vIEFkZCB0aGUgY29udHJvbCB0byB0aGUgbWFwLlxuICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gKiAvLyB3aGVuIGFuIGVycm9yIGV2ZW50IG9jY3Vycy5cbiAqIGdlb2xvY2F0ZS5vbignZXJyb3InLCBmdW5jdGlvbigpIHtcbiAqICAgY29uc29sZS5sb2coJ0FuIGVycm9yIGV2ZW50IGhhcyBvY2N1cnJlZC4nKVxuICogfSk7XG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgb24gZWFjaCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gdXBkYXRlIHdoaWNoIHJldHVybmVkIGFzIHN1Y2Nlc3MgYnV0IHVzZXIgcG9zaXRpb24gaXMgb3V0IG9mIG1hcCBtYXhCb3VuZHMuXG4gKlxuICogQGV2ZW50IG91dG9mbWF4Ym91bmRzXG4gKiBAbWVtYmVyb2YgR2VvbG9jYXRlQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbikgb2JqZWN0IGZyb20gdGhlIGNhbGxiYWNrIGluIFtHZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL2dldEN1cnJlbnRQb3NpdGlvbikgb3IgW0dlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL3dhdGNoUG9zaXRpb24pLlxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIGdlb2xvY2F0ZSBjb250cm9sLlxuICogdmFyIGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgfSxcbiAqICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYW4gb3V0b2ZtYXhib3VuZHMgZXZlbnQgb2NjdXJzLlxuICogZ2VvbG9jYXRlLm9uKCdvdXRvZm1heGJvdW5kcycsIGZ1bmN0aW9uKCkge1xuICogICBjb25zb2xlLmxvZygnQW4gb3V0b2ZtYXhib3VuZHMgZXZlbnQgaGFzIG9jY3VycmVkLicpXG4gKiB9KTtcbiAqXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBHZW9sb2NhdGUgQ29udHJvbCBjaGFuZ2VzIHRvIHRoZSBhY3RpdmUgbG9jayBzdGF0ZSwgd2hpY2ggaGFwcGVucyBlaXRoZXIgdXBvbiBmaXJzdCBvYnRhaW5pbmcgYSBzdWNjZXNzZnVsIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiBmb3IgdGhlIHVzZXIgKGEgZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93KSwgb3IgdGhlIHVzZXIgY2xpY2tzIHRoZSBnZW9sb2NhdGUgYnV0dG9uIHdoZW4gaW4gdGhlIGJhY2tncm91bmQgc3RhdGUgd2hpY2ggdXNlcyB0aGUgbGFzdCBrbm93biBwb3NpdGlvbiB0byByZWNlbnRlciB0aGUgbWFwIGFuZCBlbnRlciBhY3RpdmUgbG9jayBzdGF0ZSAobm8gZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93IHVubGVzcyB0aGUgdXNlcnMncyBsb2NhdGlvbiBjaGFuZ2VzKS5cbiAqXG4gKiBAZXZlbnQgdHJhY2t1c2VybG9jYXRpb25zdGFydFxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIGdlb2xvY2F0ZSBjb250cm9sLlxuICogdmFyIGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgfSxcbiAqICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYSB0cmFja3VzZXJsb2NhdGlvbnN0YXJ0IGV2ZW50IG9jY3Vycy5cbiAqIGdlb2xvY2F0ZS5vbigndHJhY2t1c2VybG9jYXRpb25zdGFydCcsIGZ1bmN0aW9uKCkge1xuICogICBjb25zb2xlLmxvZygnQSB0cmFja3VzZXJsb2NhdGlvbnN0YXJ0IGV2ZW50IGhhcyBvY2N1cnJlZC4nKVxuICogfSk7XG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgR2VvbG9jYXRlIENvbnRyb2wgY2hhbmdlcyB0byB0aGUgYmFja2dyb3VuZCBzdGF0ZSwgd2hpY2ggaGFwcGVucyB3aGVuIGEgdXNlciBjaGFuZ2VzIHRoZSBjYW1lcmEgZHVyaW5nIGFuIGFjdGl2ZSBwb3NpdGlvbiBsb2NrLiBUaGlzIG9ubHkgYXBwbGllcyB3aGVuIHRyYWNrVXNlckxvY2F0aW9uIGlzIHRydWUuIEluIHRoZSBiYWNrZ3JvdW5kIHN0YXRlLCB0aGUgZG90IG9uIHRoZSBtYXAgd2lsbCB1cGRhdGUgd2l0aCBsb2NhdGlvbiB1cGRhdGVzIGJ1dCB0aGUgY2FtZXJhIHdpbGwgbm90LlxuICpcbiAqIEBldmVudCB0cmFja3VzZXJsb2NhdGlvbmVuZFxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIGdlb2xvY2F0ZSBjb250cm9sLlxuICogdmFyIGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgfSxcbiAqICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYSB0cmFja3VzZXJsb2NhdGlvbmVuZCBldmVudCBvY2N1cnMuXG4gKiBnZW9sb2NhdGUub24oJ3RyYWNrdXNlcmxvY2F0aW9uZW5kJywgZnVuY3Rpb24oKSB7XG4gKiAgIGNvbnNvbGUubG9nKCdBIHRyYWNrdXNlcmxvY2F0aW9uZW5kIGV2ZW50IGhhcyBvY2N1cnJlZC4nKVxuICogfSk7XG4gKlxuICovXG4iLCIvLyBAZmxvd1xyXG5cclxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbSc7XHJcbmltcG9ydCB7ZXh0ZW5kLCBiaW5kQWxsfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xyXG5cclxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcCc7XHJcblxyXG50eXBlIFVuaXQgPSAnaW1wZXJpYWwnIHwgJ21ldHJpYycgfCAnbmF1dGljYWwnO1xyXG5cclxudHlwZSBPcHRpb25zID0ge1xyXG4gICAgbWF4V2lkdGg/OiBudW1iZXIsXHJcbiAgICB1bml0PzogVW5pdDtcclxufTtcclxuXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xyXG4gICAgbWF4V2lkdGg6IDEwMCxcclxuICAgIHVuaXQ6ICdtZXRyaWMnXHJcbn07XHJcblxyXG4vKipcclxuICogQSBgU2NhbGVDb250cm9sYCBjb250cm9sIGRpc3BsYXlzIHRoZSByYXRpbyBvZiBhIGRpc3RhbmNlIG9uIHRoZSBtYXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlzdGFuY2Ugb24gdGhlIGdyb3VuZC5cclxuICpcclxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXaWR0aD0nMTAwJ10gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzY2FsZSBjb250cm9sIGluIHBpeGVscy5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnVuaXQ9J21ldHJpYyddIFVuaXQgb2YgdGhlIGRpc3RhbmNlIChgJ2ltcGVyaWFsJ2AsIGAnbWV0cmljJ2Agb3IgYCduYXV0aWNhbCdgKS5cclxuICogQGV4YW1wbGVcclxuICogdmFyIHNjYWxlID0gbmV3IG1hcGJveGdsLlNjYWxlQ29udHJvbCh7XHJcbiAqICAgICBtYXhXaWR0aDogODAsXHJcbiAqICAgICB1bml0OiAnaW1wZXJpYWwnXHJcbiAqIH0pO1xyXG4gKiBtYXAuYWRkQ29udHJvbChzY2FsZSk7XHJcbiAqXHJcbiAqIHNjYWxlLnNldFVuaXQoJ21ldHJpYycpO1xyXG4gKi9cclxuY2xhc3MgU2NhbGVDb250cm9sIHtcclxuICAgIF9tYXA6IE1hcDtcclxuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgb3B0aW9uczogT3B0aW9ucztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGJpbmRBbGwoW1xyXG4gICAgICAgICAgICAnX29uTW92ZScsXHJcbiAgICAgICAgICAgICdzZXRVbml0J1xyXG4gICAgICAgIF0sIHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gJ2JvdHRvbS1sZWZ0JztcclxuICAgIH1cclxuXHJcbiAgICBfb25Nb3ZlKCkge1xyXG4gICAgICAgIHVwZGF0ZVNjYWxlKHRoaXMuX21hcCwgdGhpcy5fY29udGFpbmVyLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWRkKG1hcDogTWFwKSB7XHJcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtc2NhbGUnLCBtYXAuZ2V0Q29udGFpbmVyKCkpO1xyXG5cclxuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl9vbk1vdmUpO1xyXG4gICAgICAgIHRoaXMuX29uTW92ZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmVtb3ZlKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fb25Nb3ZlKTtcclxuICAgICAgICB0aGlzLl9tYXAgPSAodW5kZWZpbmVkOiBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzY2FsZSdzIHVuaXQgb2YgdGhlIGRpc3RhbmNlXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHVuaXQgVW5pdCBvZiB0aGUgZGlzdGFuY2UgKGAnaW1wZXJpYWwnYCwgYCdtZXRyaWMnYCBvciBgJ25hdXRpY2FsJ2ApLlxyXG4gICAgICovXHJcbiAgICBzZXRVbml0KHVuaXQ6IFVuaXQpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMudW5pdCA9IHVuaXQ7XHJcbiAgICAgICAgdXBkYXRlU2NhbGUodGhpcy5fbWFwLCB0aGlzLl9jb250YWluZXIsIHRoaXMub3B0aW9ucyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNjYWxlQ29udHJvbDtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVNjYWxlKG1hcCwgY29udGFpbmVyLCBvcHRpb25zKSB7XHJcbiAgICAvLyBBIGhvcml6b250YWwgc2NhbGUgaXMgaW1hZ2luZWQgdG8gYmUgcHJlc2VudCBhdCBjZW50ZXIgb2YgdGhlIG1hcFxyXG4gICAgLy8gY29udGFpbmVyIHdpdGggbWF4aW11bSBsZW5ndGggKERlZmF1bHQpIGFzIDEwMHB4LlxyXG4gICAgLy8gVXNpbmcgc3BoZXJpY2FsIGxhdyBvZiBjb3NpbmVzIGFwcHJveGltYXRpb24sIHRoZSByZWFsIGRpc3RhbmNlIGlzXHJcbiAgICAvLyBmb3VuZCBiZXR3ZWVuIHRoZSB0d28gY29vcmRpbmF0ZXMuXHJcbiAgICBjb25zdCBtYXhXaWR0aCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhXaWR0aCB8fCAxMDA7XHJcblxyXG4gICAgY29uc3QgY2VudGVyUG9pbnQgPSBtYXAucHJvamVjdChtYXAuY3JzLmdldExuZ0xhdENlbnRlcigpKTtcclxuICAgIGNvbnN0IGxlZnQgPSBtYXAudW5wcm9qZWN0KFtjZW50ZXJQb2ludC54LCBjZW50ZXJQb2ludC55XSk7XHJcbiAgICBsZXQgcmlnaHQgPSBtYXAudW5wcm9qZWN0KFtjZW50ZXJQb2ludC54ICsgbWF4V2lkdGgsIGNlbnRlclBvaW50LnldKTtcclxuICAgIGlmIChyaWdodC5sbmcgPT09IGxlZnQubG5nKSB7XHJcbiAgICAgICAgcmlnaHQgPSBtYXAudW5wcm9qZWN0KFtjZW50ZXJQb2ludC54IC0gbWF4V2lkdGgsIGNlbnRlclBvaW50LnldKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1heE1ldGVycyA9IGxlZnQuZGlzdGFuY2VUbyhyaWdodCk7XHJcbiAgICAvLyBUaGUgcmVhbCBkaXN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIDEwMHB4IHNjYWxlIGxlbmd0aCBpcyByb3VuZGVkIG9mZiB0b1xyXG4gICAgLy8gbmVhciBwcmV0dHkgbnVtYmVyIGFuZCB0aGUgc2NhbGUgbGVuZ3RoIGZvciB0aGUgc2FtZSBpcyBmb3VuZCBvdXQuXHJcbiAgICAvLyBEZWZhdWx0IHVuaXQgb2YgdGhlIHNjYWxlIGlzIGJhc2VkIG9uIFVzZXIncyBsb2NhbGUuXHJcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVuaXQgPT09ICdpbXBlcmlhbCcpIHtcclxuICAgICAgICBjb25zdCBtYXhGZWV0ID0gMy4yODA4ICogbWF4TWV0ZXJzO1xyXG4gICAgICAgIGlmIChtYXhGZWV0ID4gNTI4MCkge1xyXG4gICAgICAgICAgICBjb25zdCBtYXhNaWxlcyA9IG1heEZlZXQgLyA1MjgwO1xyXG4gICAgICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhNaWxlcywgbWFwLl9nZXRVSVN0cmluZygnU2NhbGVDb250cm9sLk1pbGVzJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heEZlZXQsIG1hcC5fZ2V0VUlTdHJpbmcoJ1NjYWxlQ29udHJvbC5GZWV0JykpO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVuaXQgPT09ICduYXV0aWNhbCcpIHtcclxuICAgICAgICBjb25zdCBtYXhOYXV0aWNhbHMgPSBtYXhNZXRlcnMgLyAxODUyO1xyXG4gICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE5hdXRpY2FscywgbWFwLl9nZXRVSVN0cmluZygnU2NhbGVDb250cm9sLk5hdXRpY2FsTWlsZXMnKSk7XHJcbiAgICB9IGVsc2UgaWYgKG1heE1ldGVycyA+PSAxMDAwKSB7XHJcbiAgICAgICAgc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4TWV0ZXJzIC8gMTAwMCwgbWFwLl9nZXRVSVN0cmluZygnU2NhbGVDb250cm9sLktpbG9tZXRlcnMnKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1ldGVycywgbWFwLl9nZXRVSVN0cmluZygnU2NhbGVDb250cm9sLk1ldGVycycpKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4RGlzdGFuY2UsIHVuaXQpIHtcclxuICAgIGNvbnN0IGRpc3RhbmNlID0gZ2V0Um91bmROdW0obWF4RGlzdGFuY2UpO1xyXG4gICAgY29uc3QgcmF0aW8gPSBkaXN0YW5jZSAvIG1heERpc3RhbmNlO1xyXG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7bWF4V2lkdGggKiByYXRpb31weGA7XHJcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYCR7ZGlzdGFuY2V9Jm5ic3A7JHt1bml0fWA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldERlY2ltYWxSb3VuZE51bShkKSB7XHJcbiAgICBjb25zdCBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIE1hdGguY2VpbCgtTWF0aC5sb2coZCkgLyBNYXRoLkxOMTApKTtcclxuICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtdWx0aXBsaWVyKSAvIG11bHRpcGxpZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFJvdW5kTnVtKG51bSkge1xyXG4gICAgY29uc3QgcG93MTAgPSBNYXRoLnBvdygxMCwgKGAke01hdGguZmxvb3IobnVtKX1gKS5sZW5ndGggLSAxKTtcclxuICAgIGxldCBkID0gbnVtIC8gcG93MTA7XHJcblxyXG4gICAgZCA9IGQgPj0gMTAgPyAxMCA6XHJcbiAgICAgICAgZCA+PSA1ID8gNSA6XHJcbiAgICAgICAgZCA+PSAzID8gMyA6XHJcbiAgICAgICAgZCA+PSAyID8gMiA6XHJcbiAgICAgICAgZCA+PSAxID8gMSA6IGdldERlY2ltYWxSb3VuZE51bShkKTtcclxuXHJcbiAgICByZXR1cm4gcG93MTAgKiBkO1xyXG59XHJcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20nO1xuXG5pbXBvcnQge2JpbmRBbGwsIHdhcm5PbmNlfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgY29udGFpbmVyPzogSFRNTEVsZW1lbnRcbn07XG5cbi8qKlxuICogQSBgRnVsbHNjcmVlbkNvbnRyb2xgIGNvbnRyb2wgY29udGFpbnMgYSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBtYXAgaW4gYW5kIG91dCBvZiBmdWxsc2NyZWVuIG1vZGUuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW29wdGlvbnMuY29udGFpbmVyXSBgY29udGFpbmVyYCBpcyB0aGUgW2NvbXBhdGlibGUgRE9NIGVsZW1lbnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlcXVlc3RGdWxsU2NyZWVuI0NvbXBhdGlibGVfZWxlbWVudHMpIHdoaWNoIHNob3VsZCBiZSBtYWRlIGZ1bGwgc2NyZWVuLiBCeSBkZWZhdWx0LCB0aGUgbWFwIGNvbnRhaW5lciBlbGVtZW50IHdpbGwgYmUgbWFkZSBmdWxsIHNjcmVlbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZENvbnRyb2wobmV3IG1hcGJveGdsLkZ1bGxzY3JlZW5Db250cm9sKHtjb250YWluZXI6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKX0pKTtcbiAqIEBzZWUgW1ZpZXcgYSBmdWxsc2NyZWVuIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mdWxsc2NyZWVuLylcbiAqL1xuXG5jbGFzcyBGdWxsc2NyZWVuQ29udHJvbCB7XG4gICAgX21hcDogTWFwO1xuICAgIF9jb250cm9sQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfZnVsbHNjcmVlbjogYm9vbGVhbjtcbiAgICBfZnVsbHNjcmVlbmNoYW5nZTogc3RyaW5nO1xuICAgIF9mdWxsc2NyZWVuQnV0dG9uOiBIVE1MRWxlbWVudDtcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fZnVsbHNjcmVlbiA9IGZhbHNlO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGFpbmVyIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdGdWxsIHNjcmVlbiBjb250cm9sIFxcJ2NvbnRhaW5lclxcJyBtdXN0IGJlIGEgRE9NIGVsZW1lbnQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uQ2xpY2tGdWxsc2NyZWVuJyxcbiAgICAgICAgICAgICdfY2hhbmdlSWNvbidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgIGlmICgnb25mdWxsc2NyZWVuY2hhbmdlJyBpbiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSAnZnVsbHNjcmVlbmNoYW5nZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoJ29ubW96ZnVsbHNjcmVlbmNoYW5nZScgaW4gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gJ21vemZ1bGxzY3JlZW5jaGFuZ2UnO1xuICAgICAgICB9IGVsc2UgaWYgKCdvbndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJztcbiAgICAgICAgfSBlbHNlIGlmICgnb25tc2Z1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICdNU0Z1bGxzY3JlZW5DaGFuZ2UnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikgdGhpcy5fY29udGFpbmVyID0gdGhpcy5fbWFwLmdldENvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jb250cm9sQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgYG1hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1ncm91cGApO1xuICAgICAgICBpZiAodGhpcy5fY2hlY2tGdWxsc2NyZWVuU3VwcG9ydCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR1cFVJKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB3YXJuT25jZSgnVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBmdWxsc2NyZWVuIG1vZGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xDb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udHJvbENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX21hcCA9IChudWxsOiBhbnkpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsc2NyZWVuY2hhbmdlLCB0aGlzLl9jaGFuZ2VJY29uKTtcbiAgICB9XG5cbiAgICBfY2hlY2tGdWxsc2NyZWVuU3VwcG9ydCgpIHtcbiAgICAgICAgcmV0dXJuICEhKFxuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkIHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1vekZ1bGxTY3JlZW5FbmFibGVkIHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1zRnVsbHNjcmVlbkVuYWJsZWQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkud2Via2l0RnVsbHNjcmVlbkVuYWJsZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfc2V0dXBVSSgpIHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsIChgbWFwYm94Z2wtY3RybC1mdWxsc2NyZWVuYCksIHRoaXMuX2NvbnRyb2xDb250YWluZXIpO1xuICAgICAgICBET00uY3JlYXRlKCdzcGFuJywgYG1hcGJveGdsLWN0cmwtaWNvbmAsIGJ1dHRvbikuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuICAgICAgICBidXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLl91cGRhdGVUaXRsZSgpO1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGlja0Z1bGxzY3JlZW4pO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsc2NyZWVuY2hhbmdlLCB0aGlzLl9jaGFuZ2VJY29uKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlVGl0bGUoKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fZ2V0VGl0bGUoKTtcbiAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi50aXRsZSA9IHRpdGxlO1xuICAgIH1cblxuICAgIF9nZXRUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcodGhpcy5faXNGdWxsc2NyZWVuKCkgPyAnRnVsbHNjcmVlbkNvbnRyb2wuRXhpdCcgOiAnRnVsbHNjcmVlbkNvbnRyb2wuRW50ZXInKTtcbiAgICB9XG5cbiAgICBfaXNGdWxsc2NyZWVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnVsbHNjcmVlbjtcbiAgICB9XG5cbiAgICBfY2hhbmdlSWNvbigpIHtcbiAgICAgICAgY29uc3QgZnVsbHNjcmVlbkVsZW1lbnQgPVxuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1zRnVsbHNjcmVlbkVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKChmdWxsc2NyZWVuRWxlbWVudCA9PT0gdGhpcy5fY29udGFpbmVyKSAhPT0gdGhpcy5fZnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbiA9ICF0aGlzLl9mdWxsc2NyZWVuO1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKGBtYXBib3hnbC1jdHJsLXNocmlua2ApO1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKGBtYXBib3hnbC1jdHJsLWZ1bGxzY3JlZW5gKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRpdGxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25DbGlja0Z1bGxzY3JlZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Z1bGxzY3JlZW4oKSkge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLl9jb250YWluZXI6IGFueSkubW96UmVxdWVzdEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICh0aGlzLl9jb250YWluZXI6IGFueSkubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5fY29udGFpbmVyOiBhbnkpLm1zUmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICh0aGlzLl9jb250YWluZXI6IGFueSkubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLl9jb250YWluZXI6IGFueSkud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICh0aGlzLl9jb250YWluZXI6IGFueSkud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRnVsbHNjcmVlbkNvbnRyb2w7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2V4dGVuZCwgYmluZEFsbH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7RXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZCc7XG5pbXBvcnQge01hcE1vdXNlRXZlbnR9IGZyb20gJy4uL3VpL2V2ZW50cyc7XG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdyc7XG5pbXBvcnQgc21hcnRXcmFwIGZyb20gJy4uL3V0aWwvc21hcnRfd3JhcCc7XG5pbXBvcnQge3R5cGUgQW5jaG9yLCBhbmNob3JUcmFuc2xhdGUsIGFwcGx5QW5jaG9yQ2xhc3N9IGZyb20gJy4vYW5jaG9yJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwJztcbmltcG9ydCB0eXBlIHtMbmdMYXRMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdCc7XG5pbXBvcnQgdHlwZSB7UG9pbnRMaWtlfSBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgY2xvc2VCdXR0b246IHRydWUsXG4gICAgY2xvc2VPbkNsaWNrOiB0cnVlLFxuICAgIGNsYXNzTmFtZTogJycsXG4gICAgbWF4V2lkdGg6IFwiMjQwcHhcIixcbiAgICBzaG93QXJyb3c6IHRydWUsXG4gICAgY29udGVudENsYXNzOiBudWxsXG59O1xuXG5leHBvcnQgdHlwZSBPZmZzZXQgPSBudW1iZXIgfCBQb2ludExpa2UgfCB7W186IEFuY2hvcl06IFBvaW50TGlrZX07XG5cbmV4cG9ydCB0eXBlIFBvcHVwT3B0aW9ucyA9IHtcbiAgICBjbG9zZUJ1dHRvbj86IGJvb2xlYW4sXG4gICAgY2xvc2VPbkNsaWNrPzogYm9vbGVhbixcbiAgICBjbG9zZU9uTW92ZT86IGJvb2xlYW4sXG4gICAgYW5jaG9yPzogQW5jaG9yLFxuICAgIG9mZnNldD86IE9mZnNldCxcbiAgICBjbGFzc05hbWU/OiBzdHJpbmcsXG4gICAgbWF4V2lkdGg/OiBzdHJpbmdcbn07XG5cbi8qKlxuICogQSBwb3B1cCBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jbG9zZUJ1dHRvbj10cnVlXSBJZiBgdHJ1ZWAsIGEgY2xvc2UgYnV0dG9uIHdpbGwgYXBwZWFyIGluIHRoZVxuICogICB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBwb3B1cC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2xvc2VPbkNsaWNrPXRydWVdIElmIGB0cnVlYCwgdGhlIHBvcHVwIHdpbGwgY2xvc2VkIHdoZW4gdGhlXG4gKiAgIG1hcCBpcyBjbGlja2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jbG9zZU9uTW92ZT1mYWxzZV0gSWYgYHRydWVgLCB0aGUgcG9wdXAgd2lsbCBjbG9zZWQgd2hlbiB0aGVcbiAqICAgbWFwIG1vdmVzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFuY2hvcl0gLSBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBwYXJ0IG9mIHRoZSBQb3B1cCB0aGF0IHNob3VsZFxuICogICBiZSBwb3NpdGlvbmVkIGNsb3Nlc3QgdG8gdGhlIGNvb3JkaW5hdGUgc2V0IHZpYSB7QGxpbmsgUG9wdXAjc2V0TG5nTGF0fS5cbiAqICAgT3B0aW9ucyBhcmUgYCdjZW50ZXInYCwgYCd0b3AnYCwgYCdib3R0b20nYCwgYCdsZWZ0J2AsIGAncmlnaHQnYCwgYCd0b3AtbGVmdCdgLFxuICogICBgJ3RvcC1yaWdodCdgLCBgJ2JvdHRvbS1sZWZ0J2AsIGFuZCBgJ2JvdHRvbS1yaWdodCdgLiBJZiB1bnNldCB0aGUgYW5jaG9yIHdpbGwgYmVcbiAqICAgZHluYW1pY2FsbHkgc2V0IHRvIGVuc3VyZSB0aGUgcG9wdXAgZmFsbHMgd2l0aGluIHRoZSBtYXAgY29udGFpbmVyIHdpdGggYSBwcmVmZXJlbmNlXG4gKiAgIGZvciBgJ2JvdHRvbSdgLlxuICogQHBhcmFtIHtudW1iZXJ8UG9pbnRMaWtlfE9iamVjdH0gW29wdGlvbnMub2Zmc2V0XSAtXG4gKiAgQSBwaXhlbCBvZmZzZXQgYXBwbGllZCB0byB0aGUgcG9wdXAncyBsb2NhdGlvbiBzcGVjaWZpZWQgYXM6XG4gKiAgIC0gYSBzaW5nbGUgbnVtYmVyIHNwZWNpZnlpbmcgYSBkaXN0YW5jZSBmcm9tIHRoZSBwb3B1cCdzIGxvY2F0aW9uXG4gKiAgIC0gYSB7QGxpbmsgUG9pbnRMaWtlfSBzcGVjaWZ5aW5nIGEgY29uc3RhbnQgb2Zmc2V0XG4gKiAgIC0gYW4gb2JqZWN0IG9mIHtAbGluayBQb2ludH1zIHNwZWNpZmluZyBhbiBvZmZzZXQgZm9yIGVhY2ggYW5jaG9yIHBvc2l0aW9uXG4gKiAgTmVnYXRpdmUgb2Zmc2V0cyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jbGFzc05hbWVdIFNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3MgbmFtZXMgdG8gYWRkIHRvIHBvcHVwIGNvbnRhaW5lclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1heFdpZHRoPScyNDBweCddIC1cbiAqICBBIHN0cmluZyB0aGF0IHNldHMgdGhlIENTUyBwcm9wZXJ0eSBvZiB0aGUgcG9wdXAncyBtYXhpbXVtIHdpZHRoLCBlZyBgJzMwMHB4J2AuXG4gKiAgVG8gZW5zdXJlIHRoZSBwb3B1cCByZXNpemVzIHRvIGZpdCBpdHMgY29udGVudCwgc2V0IHRoaXMgcHJvcGVydHkgdG8gYCdub25lJ2AuXG4gKiAgQXZhaWxhYmxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL21heC13aWR0aFxuICogQGV4YW1wbGVcbiAqIHZhciBtYXJrZXJIZWlnaHQgPSA1MCwgbWFya2VyUmFkaXVzID0gMTAsIGxpbmVhck9mZnNldCA9IDI1O1xuICogdmFyIHBvcHVwT2Zmc2V0cyA9IHtcbiAqICAndG9wJzogWzAsIDBdLFxuICogICd0b3AtbGVmdCc6IFswLDBdLFxuICogICd0b3AtcmlnaHQnOiBbMCwwXSxcbiAqICAnYm90dG9tJzogWzAsIC1tYXJrZXJIZWlnaHRdLFxuICogICdib3R0b20tbGVmdCc6IFtsaW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICogICdib3R0b20tcmlnaHQnOiBbLWxpbmVhck9mZnNldCwgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cyArIGxpbmVhck9mZnNldCkgKiAtMV0sXG4gKiAgJ2xlZnQnOiBbbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXSxcbiAqICAncmlnaHQnOiBbLW1hcmtlclJhZGl1cywgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cykgKiAtMV1cbiAqICB9O1xuICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKHtvZmZzZXQ6IHBvcHVwT2Zmc2V0cywgY2xhc3NOYW1lOiAnbXktY2xhc3MnfSlcbiAqICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAqICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAqICAgLnNldE1heFdpZHRoKFwiMzAwcHhcIilcbiAqICAgLmFkZFRvKG1hcCk7XG4gKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAvKVxuICogQHNlZSBbRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBjbGlja10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1jbGljay8pXG4gKiBAc2VlIFtBdHRhY2ggYSBwb3B1cCB0byBhIG1hcmtlciBpbnN0YW5jZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zZXQtcG9wdXAvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb3B1cCBleHRlbmRzIEV2ZW50ZWQge1xuICAgIF9tYXA6IE1hcDtcbiAgICBvcHRpb25zOiBQb3B1cE9wdGlvbnM7XG4gICAgX2NvbnRlbnQ6IEhUTUxFbGVtZW50O1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9jbG9zZUJ1dHRvbjogSFRNTEVsZW1lbnQ7XG4gICAgX3RpcDogSFRNTEVsZW1lbnQ7XG4gICAgX2xuZ0xhdDogTG5nTGF0O1xuICAgIF90cmFja1BvaW50ZXI6IGJvb2xlYW47XG4gICAgX3BvczogP1BvaW50O1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUG9wdXBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyk7XG4gICAgICAgIGJpbmRBbGwoWydfdXBkYXRlJywgJ19vbkNsb3NlJywgJ3JlbW92ZScsICdfb25Nb3VzZU1vdmUnLCAnX29uTW91c2VVcCcsICdfb25EcmFnJ10sIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHBvcHVwIHRvIGEgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIHBvcHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogICAuc2V0SFRNTChcIjxoMT5OdWxsIElzbGFuZDwvaDE+XCIpXG4gICAgICogICAuYWRkVG8obWFwKTtcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLylcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAgICAgKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAgICAgKiBAc2VlIFtTaG93IHBvbHlnb24gaW5mb3JtYXRpb24gb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvbHlnb24tcG9wdXAtb24tY2xpY2svKVxuICAgICAqL1xuICAgIGFkZFRvKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXApIHRoaXMucmVtb3ZlKCk7XG5cbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlT25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdjbGljaycsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uTW92ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlJywgdGhpcy5fb25DbG9zZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tYXAub24oJ3JlbW92ZScsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrUG9pbnRlcikge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXApO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1wb3B1cC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9tYXAuX2NhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHBvcHVwIGlzIG9wZW5lZCBtYW51YWxseSBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBvcGVuXG4gICAgICAgICAqIEBtZW1iZXJvZiBQb3B1cFxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtQb3B1cH0gcG9wdXAgb2JqZWN0IHRoYXQgd2FzIG9wZW5lZFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAvLyBDcmVhdGUgYSBwb3B1cFxuICAgICAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKTtcbiAgICAgICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBmaXJlXG4gICAgICAgICAqIC8vIGFueSB0aW1lIHRoZSBwb3B1cCBpcyBvcGVuZWRcbiAgICAgICAgICogcG9wdXAub24oJ29wZW4nLCBmdW5jdGlvbigpe1xuICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdwb3B1cCB3YXMgb3BlbmVkJyk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnb3BlbicpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBwb3B1cCBpcyBvcGVuLCBgZmFsc2VgIGlmIGl0IGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBpc09wZW4oKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX21hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwb3B1cCBmcm9tIHRoZSBtYXAgaXQgaGFzIGJlZW4gYWRkZWQgdG8uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpLmFkZFRvKG1hcCk7XG4gICAgICogcG9wdXAucmVtb3ZlKCk7XG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICAgICAgICBET00ucmVtb3ZlKHRoaXMuX2NvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZScsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbkNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3JlbW92ZScsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignZHJhZycsIHRoaXMuX29uRHJhZyk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHBvcHVwIGlzIGNsb3NlZCBtYW51YWxseSBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBjbG9zZVxuICAgICAgICAgKiBAbWVtYmVyb2YgUG9wdXBcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UG9wdXB9IHBvcHVwIG9iamVjdCB0aGF0IHdhcyBjbG9zZWRcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogLy8gQ3JlYXRlIGEgcG9wdXBcbiAgICAgICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCk7XG4gICAgICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgZmlyZVxuICAgICAgICAgKiAvLyBhbnkgdGltZSB0aGUgcG9wdXAgaXMgY2xvc2VkXG4gICAgICAgICAqIHBvcHVwLm9uKCdjbG9zZScsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coJ3BvcHVwIHdhcyBjbG9zZWQnKTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdjbG9zZScpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gb2YgdGhlIHBvcHVwJ3MgYW5jaG9yLlxuICAgICAqXG4gICAgICogVGhlIGxvbmdpdHVkZSBvZiB0aGUgcmVzdWx0IG1heSBkaWZmZXIgYnkgYSBtdWx0aXBsZSBvZiAzNjAgZGVncmVlcyBmcm9tIHRoZSBsb25naXR1ZGUgcHJldmlvdXNseVxuICAgICAqIHNldCBieSBgc2V0TG5nTGF0YCBiZWNhdXNlIGBQb3B1cGAgd3JhcHMgdGhlIGFuY2hvciBsb25naXR1ZGUgYWNyb3NzIGNvcGllcyBvZiB0aGUgd29ybGQgdG8ga2VlcFxuICAgICAqIHRoZSBwb3B1cCBvbiBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKi9cbiAgICBnZXRMbmdMYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvciwgYW5kIG1vdmVzIHRoZSBwb3B1cCB0byBpdC4gUmVwbGFjZXMgdHJhY2tQb2ludGVyKCkgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gdG8gc2V0IGFzIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldExuZ0xhdChsbmdsYXQ6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fbG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcbiAgICAgICAgdGhpcy5fcG9zID0gbnVsbDtcblxuICAgICAgICB0aGlzLl90cmFja1BvaW50ZXIgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1wb3B1cC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9tYXAuX2NhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFja3MgdGhlIHBvcHVwIGFuY2hvciB0byB0aGUgY3Vyc29yIHBvc2l0aW9uIG9uIHNjcmVlbnMgd2l0aCBhIHBvaW50ZXIgZGV2aWNlIChpdCB3aWxsIGJlIGhpZGRlbiBvbiB0b3VjaHNjcmVlbnMpLiBSZXBsYWNlcyB0aGUgYHNldExuZ0xhdGAgYmVoYXZpb3IuXG4gICAgICogRm9yIG1vc3QgdXNlIGNhc2VzLCBzZXQgYGNsb3NlT25DbGlja2AgYW5kIGBjbG9zZUJ1dHRvbmAgdG8gYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCh7IGNsb3NlT25DbGljazogZmFsc2UsIGNsb3NlQnV0dG9uOiBmYWxzZSB9KVxuICAgICAqICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAgICAgKiAgIC50cmFja1BvaW50ZXIoKVxuICAgICAqICAgLmFkZFRvKG1hcCk7XG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICB0cmFja1BvaW50ZXIoKSB7XG4gICAgICAgIHRoaXMuX3RyYWNrUG9pbnRlciA9IHRydWU7XG4gICAgICAgIHRoaXMuX3BvcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtcG9wdXAtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWFwLl9jYW52YXNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgUG9wdXBgJ3MgSFRNTCBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQ2hhbmdlIHRoZSBgUG9wdXBgIGVsZW1lbnQncyBmb250IHNpemVcbiAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgLnNldExuZ0xhdChbLTk2LCAzNy44XSlcbiAgICAgKiAgIC5zZXRIVE1MKFwiPHA+SGVsbG8gV29ybGQhPC9wPlwiKVxuICAgICAqICAgLmFkZFRvKG1hcCk7XG4gICAgICogdmFyIHBvcHVwRWxlbSA9IHBvcHVwLmdldEVsZW1lbnQoKTtcbiAgICAgKiBwb3B1cEVsZW0uc3R5bGUuZm9udFNpemUgPSBcIjI1cHhcIjtcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byBhIHN0cmluZyBvZiB0ZXh0LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgW1RleHRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UZXh0KSBub2RlIGluIHRoZSBET00sXG4gICAgICogc28gaXQgY2Fubm90IGluc2VydCByYXcgSFRNTC4gVXNlIHRoaXMgbWV0aG9kIGZvciBzZWN1cml0eSBhZ2FpbnN0IFhTU1xuICAgICAqIGlmIHRoZSBwb3B1cCBjb250ZW50IGlzIHVzZXItcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGV4dCBUZXh0dWFsIGNvbnRlbnQgZm9yIHRoZSBwb3B1cC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAuc2V0VGV4dCgnSGVsbG8sIHdvcmxkIScpXG4gICAgICogICAuYWRkVG8obWFwKTtcbiAgICAgKi9cbiAgICBzZXRUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRET01Db250ZW50KHdpbmRvdy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBjb250ZW50IHRvIHRoZSBIVE1MIHByb3ZpZGVkIGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBIVE1MIGZpbHRlcmluZyBvciBzYW5pdGl6YXRpb24sIGFuZCBtdXN0IGJlXG4gICAgICogdXNlZCBvbmx5IHdpdGggdHJ1c3RlZCBjb250ZW50LiBDb25zaWRlciB7QGxpbmsgUG9wdXAjc2V0VGV4dH0gaWZcbiAgICAgKiB0aGUgY29udGVudCBpcyBhbiB1bnRydXN0ZWQgdGV4dCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaHRtbCBBIHN0cmluZyByZXByZXNlbnRpbmcgSFRNTCBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICAgICAqICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAgICAgKiAgIC5hZGRUbyhtYXApO1xuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAvKVxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBjbGlja10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24tY2xpY2svKVxuICAgICAqIEBzZWUgW0F0dGFjaCBhIHBvcHVwIHRvIGEgbWFya2VyIGluc3RhbmNlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zZXQtcG9wdXAvKVxuICAgICAqL1xuICAgIHNldEhUTUwoaHRtbDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZyYWcgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICBjb25zdCB0ZW1wID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTtcbiAgICAgICAgbGV0IGNoaWxkO1xuICAgICAgICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjaGlsZCA9IHRlbXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmICghY2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zZXRET01Db250ZW50KGZyYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBvcHVwJ3MgbWF4aW11bSB3aWR0aC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBwb3B1cC5cbiAgICAgKi9cbiAgICBnZXRNYXhXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lciAmJiB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBtYXhpbXVtIHdpZHRoLiBUaGlzIGlzIHNldHRpbmcgdGhlIENTUyBwcm9wZXJ0eSBgbWF4LXdpZHRoYC5cbiAgICAgKiBBdmFpbGFibGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvbWF4LXdpZHRoXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWF4V2lkdGggQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBmb3IgdGhlIG1heGltdW0gd2lkdGguXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRNYXhXaWR0aChtYXhXaWR0aDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhXaWR0aCA9IG1heFdpZHRoO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBjb250ZW50IHRvIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFzIGEgRE9NIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaHRtbE5vZGUgQSBET00gbm9kZSB0byBiZSB1c2VkIGFzIGNvbnRlbnQgZm9yIHRoZSBwb3B1cC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gY3JlYXRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgcG9wdXAgY29udGVudFxuICAgICAqIHZhciBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICogZGl2LmlubmVySFRNTCA9ICdIZWxsbywgd29ybGQhJztcbiAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgIC5zZXRET01Db250ZW50KGRpdilcbiAgICAgKiAgIC5hZGRUbyhtYXApO1xuICAgICAqL1xuICAgIHNldERPTUNvbnRlbnQoaHRtbE5vZGU6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlQ29udGVudCgpO1xuICAgICAgICB0aGlzLl9jb250ZW50LmFwcGVuZENoaWxkKGh0bWxOb2RlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gdGhlIHBvcHVwIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBOb24tZW1wdHkgc3RyaW5nIHdpdGggQ1NTIGNsYXNzIG5hbWUgdG8gYWRkIHRvIHBvcHVwIGNvbnRhaW5lclxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqIHBvcHVwLmFkZENsYXNzTmFtZSgnc29tZS1jbGFzcycpXG4gICAgICovXG4gICAgYWRkQ2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgQ1NTIGNsYXNzIGZyb20gdGhlIHBvcHVwIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBOb24tZW1wdHkgc3RyaW5nIHdpdGggQ1NTIGNsYXNzIG5hbWUgdG8gcmVtb3ZlIGZyb20gcG9wdXAgY29udGFpbmVyXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogcG9wdXAucmVtb3ZlQ2xhc3NOYW1lKCdzb21lLWNsYXNzJylcbiAgICAgKi9cbiAgICByZW1vdmVDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBvciByZW1vdmUgdGhlIGdpdmVuIENTUyBjbGFzcyBvbiB0aGUgcG9wdXAgY29udGFpbmVyLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29udGFpbmVyIGN1cnJlbnRseSBoYXMgdGhhdCBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgTm9uLWVtcHR5IHN0cmluZyB3aXRoIENTUyBjbGFzcyBuYW1lIHRvIGFkZC9yZW1vdmVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBpZiB0aGUgY2xhc3Mgd2FzIHJlbW92ZWQgcmV0dXJuIGZhbHNlLCBpZiBjbGFzcyB3YXMgYWRkZWQsIHRoZW4gcmV0dXJuIHRydWVcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiBwb3B1cC50b2dnbGVDbGFzc05hbWUoJ3RvZ2dsZUNsYXNzJylcbiAgICAgKi9cbiAgICB0b2dnbGVDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY3JlYXRlQ29udGVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgICAgICAgIERPTS5yZW1vdmUodGhpcy5fY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdCA9IHRoaXMub3B0aW9ucy5jb250ZW50Q2xhc3MgPyBcIiBcIiArIHRoaXMub3B0aW9ucy5jb250ZW50Q2xhc3MgOiBcIlwiO1xuXG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAtY29udGVudCcrIHQsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzLl9jb250ZW50ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLWNvbnRlbnQnLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsICdtYXBib3hnbC1wb3B1cC1jbG9zZS1idXR0b24nLCB0aGlzLl9jb250ZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZSBwb3B1cCcpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gJyYjMjE1Oyc7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBfb25Nb3VzZVVwKGV2ZW50OiBNYXBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZShldmVudC5wb2ludCk7XG4gICAgfVxuXG4gICAgX29uTW91c2VNb3ZlKGV2ZW50OiBNYXBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZShldmVudC5wb2ludCk7XG4gICAgfVxuXG4gICAgX29uRHJhZyhldmVudDogTWFwTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoZXZlbnQucG9pbnQpO1xuICAgIH1cblxuICAgIF91cGRhdGUoY3Vyc29yOiBQb2ludExpa2UpIHtcbiAgICAgICAgY29uc3QgaGFzUG9zaXRpb24gPSB0aGlzLl9sbmdMYXQgfHwgdGhpcy5fdHJhY2tQb2ludGVyO1xuXG4gICAgICAgIGlmICghdGhpcy5fbWFwIHx8ICFoYXNQb3NpdGlvbiB8fCAhdGhpcy5fY29udGVudCkgeyByZXR1cm47IH1cblxuICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwJywgdGhpcy5fbWFwLmdldENvbnRhaW5lcigpKTtcbiAgICAgICAgICAgIHRoaXMuX3RpcCAgICAgICA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cC10aXAnLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY2xhc3NOYW1lLnNwbGl0KCcgJykuZm9yRWFjaChuYW1lID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKG5hbWUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYWNrUG9pbnRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1wb3B1cC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heFdpZHRoICYmIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCAhPT0gdGhpcy5vcHRpb25zLm1heFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGggPSB0aGlzLm9wdGlvbnMubWF4V2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcyAmJiAhdGhpcy5fdHJhY2tQb2ludGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9sbmdMYXQgPSBzbWFydFdyYXAodGhpcy5fbG5nTGF0LCB0aGlzLl9wb3MsIHRoaXMuX21hcC50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrUG9pbnRlciAmJiAhY3Vyc29yKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zID0gdGhpcy5fdHJhY2tQb2ludGVyICYmIGN1cnNvciA/IGN1cnNvciA6IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCk7XG5cbiAgICAgICAgbGV0IGFuY2hvcjogP0FuY2hvciA9IHRoaXMub3B0aW9ucy5hbmNob3I7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IG5vcm1hbGl6ZU9mZnNldCh0aGlzLm9wdGlvbnMub2Zmc2V0KTtcblxuICAgICAgICBpZiAoIWFuY2hvcikge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgbGV0IGFuY2hvckNvbXBvbmVudHM7XG5cbiAgICAgICAgICAgIGlmIChwb3MueSArIG9mZnNldC5ib3R0b20ueSA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMgPSBbJ3RvcCddO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MueSA+IHRoaXMuX21hcC50cmFuc2Zvcm0uaGVpZ2h0IC0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yQ29tcG9uZW50cyA9IFsnYm90dG9tJ107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvcy54IDwgd2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yQ29tcG9uZW50cy5wdXNoKCdsZWZ0Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvcy54ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS53aWR0aCAtIHdpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMucHVzaCgncmlnaHQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFuY2hvckNvbXBvbmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gJ2JvdHRvbSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IChhbmNob3JDb21wb25lbnRzLmpvaW4oJy0nKTogYW55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9mZnNldGVkUG9zID0gcG9zLmFkZChvZmZzZXRbYW5jaG9yXSkucm91bmQoKTtcbiAgICAgICAgRE9NLnNldFRyYW5zZm9ybSh0aGlzLl9jb250YWluZXIsIGAke2FuY2hvclRyYW5zbGF0ZVthbmNob3JdfSB0cmFuc2xhdGUoJHtvZmZzZXRlZFBvcy54fXB4LCR7b2Zmc2V0ZWRQb3MueX1weClgKTtcbiAgICAgICAgYXBwbHlBbmNob3JDbGFzcyh0aGlzLl9jb250YWluZXIsIGFuY2hvciwgJ3BvcHVwJyk7XG4gICAgfVxuXG4gICAgX29uQ2xvc2UoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPZmZzZXQob2Zmc2V0OiA/T2Zmc2V0KSB7XG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU9mZnNldChuZXcgUG9pbnQoMCwgMCkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBpbnB1dCBzcGVjaWZpZXMgYSByYWRpdXMgZnJvbSB3aGljaCB0byBjYWxjdWxhdGUgb2Zmc2V0cyBhdCBhbGwgcG9zaXRpb25zXG4gICAgICAgIGNvbnN0IGNvcm5lck9mZnNldCA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KDAuNSAqIE1hdGgucG93KG9mZnNldCwgMikpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjZW50ZXInOiBuZXcgUG9pbnQoMCwgMCksXG4gICAgICAgICAgICAndG9wJzogbmV3IFBvaW50KDAsIG9mZnNldCksXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBuZXcgUG9pbnQoY29ybmVyT2Zmc2V0LCBjb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IG5ldyBQb2ludCgtY29ybmVyT2Zmc2V0LCBjb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ2JvdHRvbSc6IG5ldyBQb2ludCgwLCAtb2Zmc2V0KSxcbiAgICAgICAgICAgICdib3R0b20tbGVmdCc6IG5ldyBQb2ludChjb3JuZXJPZmZzZXQsIC1jb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6IG5ldyBQb2ludCgtY29ybmVyT2Zmc2V0LCAtY29ybmVyT2Zmc2V0KSxcbiAgICAgICAgICAgICdsZWZ0JzogbmV3IFBvaW50KG9mZnNldCwgMCksXG4gICAgICAgICAgICAncmlnaHQnOiBuZXcgUG9pbnQoLW9mZnNldCwgMClcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSBpZiAob2Zmc2V0IGluc3RhbmNlb2YgUG9pbnQgfHwgQXJyYXkuaXNBcnJheShvZmZzZXQpKSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhIHNpbmdsZSBvZmZzZXQgdG8gYmUgYXBwbGllZCB0byBhbGwgcG9zaXRpb25zXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZE9mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjZW50ZXInOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wJzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20nOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ2xlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAncmlnaHQnOiBjb252ZXJ0ZWRPZmZzZXRcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhbiBvZmZzZXQgcGVyIHBvc2l0aW9uXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnY2VudGVyJzogUG9pbnQuY29udmVydChvZmZzZXRbJ2NlbnRlciddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wJzogUG9pbnQuY29udmVydChvZmZzZXRbJ3RvcCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsndG9wLWxlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wyd0b3AtcmlnaHQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbSc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wydib3R0b20nXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ2JvdHRvbS1sZWZ0J10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnYm90dG9tLXJpZ2h0J10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICdsZWZ0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ2xlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ3JpZ2h0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ3JpZ2h0J10gfHwgWzAsIDBdKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XHJcblxyXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XHJcbmltcG9ydCBzdXBwb3J0ZWQgZnJvbSAnQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkJztcclxuXHJcbmltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcclxuaW1wb3J0IE1hcCBmcm9tICcuL3VpL21hcCc7XHJcbmltcG9ydCBOYXZpZ2F0aW9uQ29udHJvbCBmcm9tICcuL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sJztcclxuaW1wb3J0IEdlb2xvY2F0ZUNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2dlb2xvY2F0ZV9jb250cm9sJztcclxuaW1wb3J0IEF0dHJpYnV0aW9uQ29udHJvbCBmcm9tICcuL3VpL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbCc7XHJcbmltcG9ydCBTY2FsZUNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL3NjYWxlX2NvbnRyb2wnO1xyXG5pbXBvcnQgRnVsbHNjcmVlbkNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2Z1bGxzY3JlZW5fY29udHJvbCc7XHJcbmltcG9ydCBQb3B1cCBmcm9tICcuL3VpL3BvcHVwJztcclxuaW1wb3J0IE1hcmtlciBmcm9tICcuL3VpL21hcmtlcic7XHJcbmltcG9ydCBTdHlsZSBmcm9tICcuL3N0eWxlL3N0eWxlJztcclxuaW1wb3J0IExuZ0xhdCBmcm9tICcuL2dlby9sbmdfbGF0JztcclxuaW1wb3J0IENSUyBmcm9tICcuL2dlby9jcnMnO1xyXG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vZ2VvL2xuZ19sYXRfYm91bmRzJztcclxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xyXG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUnO1xyXG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4vdXRpbC9ldmVudGVkJztcclxuaW1wb3J0IGNvbmZpZyBmcm9tICcuL3V0aWwvY29uZmlnJztcclxuaW1wb3J0IHtEZWJ1Z30gZnJvbSAnLi91dGlsL2RlYnVnJztcclxuaW1wb3J0IHtpc1NhZmFyaX0gZnJvbSAnLi91dGlsL3V0aWwnO1xyXG5pbXBvcnQge3NldFJUTFRleHRQbHVnaW4sIGdldFJUTFRleHRQbHVnaW5TdGF0dXN9IGZyb20gJy4vc291cmNlL3J0bF90ZXh0X3BsdWdpbic7XHJcbmltcG9ydCBXb3JrZXJQb29sIGZyb20gJy4vdXRpbC93b3JrZXJfcG9vbCc7XHJcbmltcG9ydCB7cHJld2FybSwgY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXN9IGZyb20gJy4vdXRpbC9nbG9iYWxfd29ya2VyX3Bvb2wnO1xyXG5pbXBvcnQge2NsZWFyVGlsZUNhY2hlfSBmcm9tICcuL3V0aWwvdGlsZV9yZXF1ZXN0X2NhY2hlJztcclxuaW1wb3J0IHtQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuL3V0aWwvcGVyZm9ybWFuY2UnO1xyXG5pbXBvcnQgcHJvajQgZnJvbSAncHJvajQnO1xyXG5cclxuY29uc3QgZXhwb3J0ZWQgPSB7XHJcbiAgICBwcm9qNCxcclxuICAgIHZlcnNpb24sXHJcbiAgICBzdXBwb3J0ZWQsXHJcbiAgICBzZXRSVExUZXh0UGx1Z2luLFxyXG4gICAgZ2V0UlRMVGV4dFBsdWdpblN0YXR1cyxcclxuICAgIE1hcCxcclxuICAgIE5hdmlnYXRpb25Db250cm9sLFxyXG4gICAgR2VvbG9jYXRlQ29udHJvbCxcclxuICAgIEF0dHJpYnV0aW9uQ29udHJvbCxcclxuICAgIFNjYWxlQ29udHJvbCxcclxuICAgIEZ1bGxzY3JlZW5Db250cm9sLFxyXG4gICAgUG9wdXAsXHJcbiAgICBNYXJrZXIsXHJcbiAgICBTdHlsZSxcclxuICAgIENSUyxcclxuICAgIExuZ0xhdCxcclxuICAgIExuZ0xhdEJvdW5kcyxcclxuICAgIFBvaW50LFxyXG4gICAgTWVyY2F0b3JDb29yZGluYXRlLFxyXG4gICAgRXZlbnRlZCxcclxuICAgIGNvbmZpZyxcclxuICAgIC8qKlxyXG4gICAgICogSW5pdGlhbGl6ZXMgcmVzb3VyY2VzIGxpa2UgV2ViV29ya2VycyB0aGF0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIG1hcHMgdG8gbG93ZXIgbG9hZFxyXG4gICAgICogdGltZXMgaW4gc29tZSBzaXR1YXRpb25zLiBgbWFwYm94Z2wud29ya2VyVXJsYCBhbmQgYG1hcGJveGdsLndvcmtlckNvdW50YCwgaWYgYmVpbmdcclxuICAgICAqIHVzZWQsIG11c3QgYmUgc2V0IGJlZm9yZSBgcHJld2FybSgpYCBpcyBjYWxsZWQgdG8gaGF2ZSBhbiBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGxpZmVjeWNsZSBvZiB0aGVzZSByZXNvdXJjZXMgaXMgbWFuYWdlZCBhdXRvbWF0aWNhbGx5LCBhbmQgdGhleSBhcmVcclxuICAgICAqIGxhemlseSBpbml0aWFsaXplZCB3aGVuIGEgTWFwIGlzIGZpcnN0IGNyZWF0ZWQuIEJ5IGludm9raW5nIGBwcmV3YXJtKClgLCB0aGVzZVxyXG4gICAgICogcmVzb3VyY2VzIHdpbGwgYmUgY3JlYXRlZCBhaGVhZCBvZiB0aW1lLCBhbmQgd2lsbCBub3QgYmUgY2xlYXJlZCB3aGVuIHRoZSBsYXN0IE1hcFxyXG4gICAgICogaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLiBUaGlzIGFsbG93cyB0aGVtIHRvIGJlIHJlLXVzZWQgYnkgbmV3IE1hcCBpbnN0YW5jZXMgdGhhdFxyXG4gICAgICogYXJlIGNyZWF0ZWQgbGF0ZXIuIFRoZXkgY2FuIGJlIG1hbnVhbGx5IGNsZWFyZWQgYnkgY2FsbGluZ1xyXG4gICAgICogYG1hcGJveGdsLmNsZWFyUHJld2FybWVkUmVzb3VyY2VzKClgLiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdXIgd2ViIHBhZ2UgcmVtYWluc1xyXG4gICAgICogYWN0aXZlIGJ1dCBzdG9wcyB1c2luZyBtYXBzIGFsdG9nZXRoZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIHdoZW4gdXNpbmcgR0wtSlMgbWFwcyBpbiBhIHNpbmdsZSBwYWdlIGFwcCwgd2hlcmVpbiBhIHVzZXJcclxuICAgICAqIHdvdWxkIG5hdmlnYXRlIGJldHdlZW4gdmFyaW91cyB2aWV3cyB0aGF0IGNhbiBjYXVzZSBNYXAgaW5zdGFuY2VzIHRvIGNvbnN0YW50bHkgYmVcclxuICAgICAqIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZC5cclxuICAgICAqXHJcbiAgICAgKiBAZnVuY3Rpb24gcHJld2FybVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcGJveGdsLnByZXdhcm0oKVxyXG4gICAgICovXHJcbiAgICBwcmV3YXJtLFxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdXAgcmVzb3VyY2VzIHRoYXQgaGF2ZSBwcmV2aW91c2x5IGJlZW4gY3JlYXRlZCBieSBgbWFwYm94Z2wucHJld2FybSgpYC5cclxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHR5cGljYWxseSBub3QgbmVjZXNzYXJ5LiBZb3Ugc2hvdWxkIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uXHJcbiAgICAgKiBpZiB5b3UgZXhwZWN0IHRoZSB1c2VyIG9mIHlvdXIgYXBwIHRvIG5vdCByZXR1cm4gdG8gYSBNYXAgdmlldyBhdCBhbnkgcG9pbnRcclxuICAgICAqIGluIHlvdXIgYXBwbGljYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIGNsZWFyUHJld2FybWVkUmVzb3VyY2VzXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbWFwYm94Z2wuY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXMoKVxyXG4gICAgICovXHJcbiAgICBjbGVhclByZXdhcm1lZFJlc291cmNlcyxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYW5kIHNldHMgdGhlIG1hcCdzIFthY2Nlc3MgdG9rZW5dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9kZWZpbmUtYWNjZXNzLXRva2VuLykuXHJcbiAgICAgKlxyXG4gICAgICogQHZhciB7c3RyaW5nfSBhY2Nlc3NUb2tlblxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnRseSBzZXQgYWNjZXNzIHRva2VuLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gbXlBY2Nlc3NUb2tlbjtcclxuICAgICAqIEBzZWUgW0Rpc3BsYXkgYSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGVzLylcclxuICAgICAqL1xyXG4gICAgZ2V0IGFjY2Vzc1Rva2VuKCk6ID9zdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuQUNDRVNTX1RPS0VOO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXQgYWNjZXNzVG9rZW4odG9rZW46IHN0cmluZykge1xyXG4gICAgICAgIGNvbmZpZy5BQ0NFU1NfVE9LRU4gPSB0b2tlbjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXAncyBkZWZhdWx0IEFQSSBVUkwgZm9yIHJlcXVlc3RpbmcgdGlsZXMsIHN0eWxlcywgc3ByaXRlcywgYW5kIGdseXBoc1xyXG4gICAgICpcclxuICAgICAqIEB2YXIge3N0cmluZ30gYmFzZUFwaVVybFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgYmFzZSBBUEkgVVJMLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcGJveGdsLmJhc2VBcGlVcmwgPSAnaHR0cHM6Ly9hcGkubWFwYm94LmNvbSc7XHJcbiAgICAgKi9cclxuICAgIGdldCBiYXNlQXBpVXJsKCk6ID9zdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuQVBJX1VSTDtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0IGJhc2VBcGlVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25maWcuQVBJX1VSTCA9IHVybDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBudW1iZXIgb2Ygd2ViIHdvcmtlcnMgaW5zdGFudGlhdGVkIG9uIGEgcGFnZSB3aXRoIEdMIEpTIG1hcHMuXHJcbiAgICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzZXQgdG8gaGFsZiB0aGUgbnVtYmVyIG9mIENQVSBjb3JlcyAoY2FwcGVkIGF0IDYpLlxyXG4gICAgICogTWFrZSBzdXJlIHRvIHNldCB0aGlzIHByb3BlcnR5IGJlZm9yZSBjcmVhdGluZyBhbnkgbWFwIGluc3RhbmNlcyBmb3IgaXQgdG8gaGF2ZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHZhciB7c3RyaW5nfSB3b3JrZXJDb3VudFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIHdvcmtlcnMgY3VycmVudGx5IGNvbmZpZ3VyZWQuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbWFwYm94Z2wud29ya2VyQ291bnQgPSAyO1xyXG4gICAgICovXHJcbiAgICBnZXQgd29ya2VyQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gV29ya2VyUG9vbC53b3JrZXJDb3VudDtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0IHdvcmtlckNvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgICAgICBXb3JrZXJQb29sLndvcmtlckNvdW50ID0gY291bnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW1hZ2VzIChyYXN0ZXIgdGlsZXMsIHNwcml0ZXMsIGljb25zKSB0byBsb2FkIGluIHBhcmFsbGVsLFxyXG4gICAgICogd2hpY2ggYWZmZWN0cyBwZXJmb3JtYW5jZSBpbiByYXN0ZXItaGVhdnkgbWFwcy4gMTYgYnkgZGVmYXVsdC5cclxuICAgICAqXHJcbiAgICAgKiBAdmFyIHtzdHJpbmd9IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0c1xyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIHBhcmFsbGVsIHJlcXVlc3RzIGN1cnJlbnRseSBjb25maWd1cmVkLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIG1hcGJveGdsLm1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cyA9IDEwO1xyXG4gICAgICovXHJcbiAgICBnZXQgbWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldCBtYXhQYXJhbGxlbEltYWdlUmVxdWVzdHMobnVtUmVxdWVzdHM6IG51bWJlcikge1xyXG4gICAgICAgIGNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMgPSBudW1SZXF1ZXN0cztcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgYnJvd3NlciBzdG9yYWdlIHVzZWQgYnkgdGhpcyBsaWJyYXJ5LiBVc2luZyB0aGlzIG1ldGhvZCBmbHVzaGVzIHRoZSBNYXBib3ggdGlsZVxyXG4gICAgICogY2FjaGUgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgbGlicmFyeS4gVGlsZXMgbWF5IHN0aWxsIGJlIGNhY2hlZCBieSB0aGUgYnJvd3NlclxyXG4gICAgICogaW4gc29tZSBjYXNlcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIEFQSSBpcyBzdXBwb3J0ZWQgb24gYnJvd3NlcnMgd2hlcmUgdGhlIFtgQ2FjaGVgIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhY2hlKVxyXG4gICAgICogaXMgc3VwcG9ydGVkIGFuZCBlbmFibGVkLiBUaGlzIGluY2x1ZGVzIGFsbCBtYWpvciBicm93c2VycyB3aGVuIHBhZ2VzIGFyZSBzZXJ2ZWQgb3ZlclxyXG4gICAgICogYGh0dHBzOi8vYCwgZXhjZXB0IEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIE1vYmlsZS5cclxuICAgICAqXHJcbiAgICAgKiBXaGVuIGNhbGxlZCBpbiB1bnN1cHBvcnRlZCBicm93c2VycyBvciBlbnZpcm9ubWVudHMgKHByaXZhdGUgb3IgaW5jb2duaXRvIG1vZGUpLCB0aGVcclxuICAgICAqIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQGZ1bmN0aW9uIGNsZWFyU3RvcmFnZVxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbWFwYm94Z2wuY2xlYXJTdG9yYWdlKCk7XHJcbiAgICAgKi9cclxuICAgIGNsZWFyU3RvcmFnZShjYWxsYmFjaz86IChlcnI6ID9FcnJvcikgPT4gdm9pZCkge1xyXG4gICAgICAgIGNsZWFyVGlsZUNhY2hlKGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgd29ya2VyVXJsOiAnJ1xyXG59O1xyXG5cclxuLy9UaGlzIGdldHMgYXV0b21hdGljYWxseSBzdHJpcHBlZCBvdXQgaW4gcHJvZHVjdGlvbiBidWlsZHMuXHJcbkRlYnVnLmV4dGVuZChleHBvcnRlZCwge2lzU2FmYXJpLCBnZXRQZXJmb3JtYW5jZU1ldHJpY3M6IFBlcmZvcm1hbmNlVXRpbHMuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzfSk7XHJcblxyXG4vKipcclxuICogVGhlIHZlcnNpb24gb2YgTWFwYm94IEdMIEpTIGluIHVzZSBhcyBzcGVjaWZpZWQgaW4gYHBhY2thZ2UuanNvbmAsXHJcbiAqIGBDSEFOR0VMT0cubWRgLCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxyXG4gKlxyXG4gKiBAdmFyIHtzdHJpbmd9IHZlcnNpb25cclxuICovXHJcblxyXG4vKipcclxuICogVGVzdCB3aGV0aGVyIHRoZSBicm93c2VyIFtzdXBwb3J0cyBNYXBib3ggR0wgSlNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9tYXBib3gtYnJvd3Nlci1zdXBwb3J0LyNtYXBib3gtZ2wtanMpLlxyXG4gKlxyXG4gKiBAZnVuY3Rpb24gc3VwcG9ydGVkXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsXHJcbiAqICAgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGBmYWxzZWAgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveCBHTCBKUyB3b3VsZFxyXG4gKiAgIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuIGV4cGVjdGVkIChlLmcuIGEgc29mdHdhcmUgV2ViR0wgcmVuZGVyZXIgd291bGQgYmUgdXNlZCkuXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAqIEBleGFtcGxlXHJcbiAqIG1hcGJveGdsLnN1cHBvcnRlZCgpIC8vID0gdHJ1ZVxyXG4gKiBAc2VlIFtDaGVjayBmb3IgYnJvd3NlciBzdXBwb3J0XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NoZWNrLWZvci1zdXBwb3J0LylcclxuICovXHJcblxyXG4vKipcclxuICogU2V0cyB0aGUgbWFwJ3MgW1JUTCB0ZXh0IHBsdWdpbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy8jbWFwYm94LWdsLXJ0bC10ZXh0KS5cclxuICogTmVjZXNzYXJ5IGZvciBzdXBwb3J0aW5nIHRoZSBBcmFiaWMgYW5kIEhlYnJldyBsYW5ndWFnZXMsIHdoaWNoIGFyZSB3cml0dGVuIHJpZ2h0LXRvLWxlZnQuIE1hcGJveCBTdHVkaW8gbG9hZHMgdGhpcyBwbHVnaW4gYnkgZGVmYXVsdC5cclxuICpcclxuICogQGZ1bmN0aW9uIHNldFJUTFRleHRQbHVnaW5cclxuICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpblVSTCBVUkwgcG9pbnRpbmcgdG8gdGhlIE1hcGJveCBSVEwgdGV4dCBwbHVnaW4gc291cmNlLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cclxuICogQHBhcmFtIHtib29sZWFufSBsYXp5IElmIHNldCB0byBgdHJ1ZWAsIG1hcGJveGdsIHdpbGwgZGVmZXIgbG9hZGluZyB0aGUgcGx1Z2luIHVudGlsIHJ0bCB0ZXh0IGlzIGVuY291bnRlcmVkLFxyXG4gKiAgICBydGwgdGV4dCB3aWxsIHRoZW4gYmUgcmVuZGVyZWQgb25seSBhZnRlciB0aGUgcGx1Z2luIGZpbmlzaGVzIGxvYWRpbmcuXHJcbiAqIEBleGFtcGxlXHJcbiAqIG1hcGJveGdsLnNldFJUTFRleHRQbHVnaW4oJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3BsdWdpbnMvbWFwYm94LWdsLXJ0bC10ZXh0L3YwLjIuMC9tYXBib3gtZ2wtcnRsLXRleHQuanMnKTtcclxuICogQHNlZSBbQWRkIHN1cHBvcnQgZm9yIHJpZ2h0LXRvLWxlZnQgc2NyaXB0c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tYXBib3gtZ2wtcnRsLXRleHQvKVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gICogR2V0cyB0aGUgbWFwJ3MgW1JUTCB0ZXh0IHBsdWdpbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy8jbWFwYm94LWdsLXJ0bC10ZXh0KSBzdGF0dXMuXHJcbiAgKiBUaGUgc3RhdHVzIGNhbiBiZSBgdW5hdmFpbGFibGVgIChpLmUuIG5vdCByZXF1ZXN0ZWQgb3IgcmVtb3ZlZCksIGBsb2FkaW5nYCwgYGxvYWRlZGAgb3IgYGVycm9yYC5cclxuICAqIElmIHRoZSBzdGF0dXMgaXMgYGxvYWRlZGAgYW5kIHRoZSBwbHVnaW4gaXMgcmVxdWVzdGVkIGFnYWluLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cclxuICAqXHJcbiAgKiBAZnVuY3Rpb24gZ2V0UlRMVGV4dFBsdWdpblN0YXR1c1xyXG4gICogQGV4YW1wbGVcclxuICAqIGNvbnN0IHBsdWdpblN0YXR1cyA9IG1hcGJveGdsLmdldFJUTFRleHRQbHVnaW5TdGF0dXMoKTtcclxuICAqL1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZXhwb3J0ZWQ7XHJcblxyXG4vLyBjYW5hcnkgYXNzZXJ0OiB1c2VkIHRvIGNvbmZpcm0gdGhhdCBhc3NlcnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gcHJvZHVjdGlvbiBidWlsZFxyXG5hc3NlcnQodHJ1ZSwgJ2NhbmFyeSBhc3NlcnQnKTtcclxuIiwiLy9cclxuLy8gT3VyIGN1c3RvbSBpbnRybyBwcm92aWRlcyBhIHNwZWNpYWxpemVkIFwiZGVmaW5lKClcIiBmdW5jdGlvbiwgY2FsbGVkIGJ5IHRoZVxyXG4vLyBBTUQgbW9kdWxlcyBiZWxvdywgdGhhdCBzZXRzIHVwIHRoZSB3b3JrZXIgYmxvYiBVUkwgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlXHJcbi8vIG1haW4gbW9kdWxlLCBzdG9yaW5nIGl0cyBleHBvcnRlZCB2YWx1ZSBhcyAnbWFwYm94Z2wnXHJcblxyXG4vLyBUaGUgdGhyZWUgXCJjaHVua3NcIiBpbXBvcnRlZCBoZXJlIGFyZSBwcm9kdWNlZCBieSBhIGZpcnN0IFJvbGx1cCBwYXNzLFxyXG4vLyB3aGljaCBvdXRwdXRzIHRoZW0gYXMgQU1EIG1vZHVsZXMuXHJcblxyXG4vLyBTaGFyZWQgZGVwZW5kZW5jaWVzLCBpLmUuOlxyXG4vKlxyXG5kZWZpbmUoWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7XHJcbiAgICAvLyBDb2RlIGZvciBhbGwgY29tbW9uIGRlcGVuZGVuY2llc1xyXG4gICAgLy8gRWFjaCBtb2R1bGUncyBleHBvcnRzIGFyZSBhdHRhY2hlZCBhdHRhY2hlZCB0byAnZXhwb3J0cycgKHdpdGhcclxuICAgIC8vIG5hbWVzIHJld3JpdHRlbiB0byBhdm9pZCBjb2xsaXNpb25zLCBldGMuKVxyXG59KVxyXG4qL1xyXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvc2hhcmVkJztcclxuXHJcbi8vIFdvcmtlciBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMsIGkuZS46XHJcbi8qXHJcbmRlZmluZShbJy4vc2hhcmVkLmpzJ10sIGZ1bmN0aW9uIChfX3NoYXJlZF9fanMpIHtcclxuICAgIC8vICBDb2RlIGZvciB3b3JrZXIgc2NyaXB0IGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcy5cclxuICAgIC8vICBFeHBlY3RzIHRoZSBvdXRwdXQgb2YgJ3NoYXJlZCcgbW9kdWxlIHRvIGJlIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCxcclxuICAgIC8vICBzaW5jZSBhbGwgcmVmZXJlbmNlcyB0byBjb21tb24gZGVwcyBsb29rIGxpa2UsIGUuZy4sXHJcbiAgICAvLyAgX19zaGFyZWRfX2pzLnNoYXBlVGV4dCgpLlxyXG59KTtcclxuKi9cclxuLy8gV2hlbiB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIG91ciBjdXN0b20gZGVmaW5lKCkgYWJvdmUsXHJcbi8vIGl0IGdldHMgc3RyaW5naWZpZWQsIHRvZ2V0aGVyIHdpdGggdGhlIHNoYXJlZCB3cmFwcGVyICh1c2luZ1xyXG4vLyBGdW5jdGlvbi50b1N0cmluZygpKSwgYW5kIHRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIGNvZGUgaXMgbWFkZSBpbnRvIGFcclxuLy8gQmxvYiBVUkwgdGhhdCBnZXRzIHVzZWQgYnkgdGhlIG1haW4gbW9kdWxlIHRvIGNyZWF0ZSB0aGUgd2ViIHdvcmtlcnMuXHJcbmltcG9ydCAnLi9idWlsZC9tYXBib3hnbC93b3JrZXInO1xyXG5cclxuLy8gTWFpbiBtb2R1bGUgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzXHJcbi8qXHJcbmRlZmluZShbJy4vc2hhcmVkLmpzJ10sIGZ1bmN0aW9uIChfX3NoYXJlZF9fanMpIHtcclxuICAgIC8vICBDb2RlIGZvciBtYWluIEdMIEpTIG1vZHVsZSBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMuXHJcbiAgICAvLyAgRXhwZWN0cyB0aGUgb3V0cHV0IG9mICdzaGFyZWQnIG1vZHVsZSB0byBiZSBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQsXHJcbiAgICAvLyAgc2luY2UgYWxsIHJlZmVyZW5jZXMgdG8gY29tbW9uIGRlcHMgbG9vayBsaWtlLCBlLmcuLFxyXG4gICAgLy8gIF9fc2hhcmVkX19qcy5zaGFwZVRleHQoKS5cclxuICAgIC8vXHJcbiAgICAvLyAgUmV0dXJucyB0aGUgYWN0dWFsIG1hcGJveGdsIChpLmUuIHNyYy9pbmRleC5qcylcclxufSk7XHJcbiovXHJcbmltcG9ydCAnLi9idWlsZC9tYXBib3hnbC9pbmRleCc7XHJcblxyXG5pZiAod2luZG93KSB7XHJcbiAgICB3aW5kb3cubWFwYm94Z2wgPW1hcGJveGdsO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBtYXBib3hnbDtcclxuIl0sIm5hbWVzIjpbImFyZ3VtZW50cyIsInJlcXVpcmUkJDAiLCJyZXF1aXJlJCQxIiwibGV0IiwiY29uc3QiLCJVbml0QmV6aWVyIiwid2luZG93IiwiZXhwb3J0ZWQiLCJleHBvcnRzIiwiUHJpbWVNZXJpZGlhbiIsIkQyUiIsInBhcnNlciIsInBhcnNlUHJvaiIsImluaXQiLCJuYW1lcyIsIkVsbGlwc29pZCIsInBhcnNlQ29kZSIsIkRhdHVtIiwiZGNfc3BoZXJlIiwiZGNfZWNjZW50cmljaXR5IiwiZXh0ZW5kIiwidG9Qb2ludCIsInByb2oiLCJmb3J3YXJkIiwiaW52ZXJzZSIsIlBvaW50IiwiTUFYX0lURVIiLCJQcm9qIiwiYnJvd3NlciIsIndlYnBTdXBwb3J0ZWQiLCJzZGtWZXJzaW9uIiwidGhpcyIsInN1cGVyIiwiYXNzZXJ0IiwicGFyc2VDU1NDb2xvciIsInRvU3RyaW5nIiwidHlwZSIsInR5cGVzIiwiYXJnIiwidmFsdWVUb1N0cmluZyIsImkiLCJleHBlY3RlZCIsInBhcnNlZCIsImxpbmUiLCJwIiwidGlsZVBvaW50cyIsInBvaW50IiwidGlsZUxpbmVzIiwiZXJyb3IiLCJhcnJheSIsImludGVycG9sYXRlTnVtYmVyIiwib3V0cHV0SW5kZXgiLCJsdCIsInJ0IiwiZ2V0IiwidHlwZVRvU3RyaW5nIiwic3RvcCIsImludGVycG9sYXRpb25UeXBlIiwiZGVmaW5pdGlvbnMiLCJpc0NvbnN0YW50LmlzU3RhdGVDb25zdGFudCIsImlzRmVhdHVyZUNvbnN0YW50IiwiaXNDb25zdGFudC5pc0ZlYXR1cmVDb25zdGFudCIsImlzQ29uc3RhbnQuaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50IiwiR3JpZCIsIm5hbWUiLCJsaXN0ZW5lciIsInZhbGlkYXRlU3BlYyIsImVsZW1lbnRTcGVjS2V5Iiwia2V5IiwibGF0ZXN0U3R5bGVTcGVjIiwidmFsaWRhdGVTb3VyY2UiLCJ2YWxpZGF0ZUxpZ2h0IiwidmFsaWRhdGVGaWx0ZXIiLCJ2YWxpZGF0ZVBhaW50UHJvcGVydHkiLCJ2YWxpZGF0ZUxheW91dFByb3BlcnR5IiwiaXNDaGFyIiwicnRsVGV4dFBsdWdpbiIsInByb3BlcnR5Iiwic3R5bGVTcGVjIiwibGF5b3V0IiwibXVybXVyMyIsIm11cm11cjIiLCJNQVhfU0FGRV9JTlRFR0VSIiwiU3RydWN0QXJyYXlMYXlvdXQiLCJQYXR0ZXJuTGF5b3V0QXJyYXkiLCJFWFRFTlQiLCJDaXJjbGVMYXlvdXRBcnJheSIsIlRyaWFuZ2xlSW5kZXhBcnJheSIsImJ1Y2tldEZlYXR1cmUiLCJmZWF0dXJlIiwiaW5kZXgiLCJzb3VyY2VMYXllckluZGV4IiwibGF5b3V0QXR0cmlidXRlcyIsInBhaW50IiwiZ2xNYXRyaXguQVJSQVlfVFlQRSIsImNsb25lIiwiaWRlbnRpdHkiLCJhZGQiLCJlcXVhbHMiLCJnbE1hdHJpeC5FUFNJTE9OIiwiY3JlYXRlIiwiY29weSIsImZyb21WYWx1ZXMiLCJzZXQiLCJpbnZlcnQiLCJkZXRlcm1pbmFudCIsIm11bHRpcGx5Iiwicm90YXRlIiwic2NhbGUiLCJ0cmFuc2xhdGUiLCJmcm9tUm90YXRpb24iLCJmcm9tU2NhbGluZyIsInN0ciIsImZyb2IiLCJzdWJ0cmFjdCIsIm11bHRpcGx5U2NhbGFyIiwibXVsdGlwbHlTY2FsYXJBbmRBZGQiLCJleGFjdEVxdWFscyIsIm11bCIsInN1YiIsInRyYW5zcG9zZSIsImFkam9pbnQiLCJmcm9tVHJhbnNsYXRpb24iLCJmcm9tUXVhdCIsIm9ydGhvIiwiYmV6aWVyIiwiZ2xNYXRyaXguUkFORE9NIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwiZGl2aWRlIiwiY2VpbCIsImZsb29yIiwibWluIiwibWF4Iiwicm91bmQiLCJzY2FsZUFuZEFkZCIsImRpc3RhbmNlIiwic3F1YXJlZERpc3RhbmNlIiwibGVuZ3RoIiwic3F1YXJlZExlbmd0aCIsIm5lZ2F0ZSIsIm5vcm1hbGl6ZSIsImRvdCIsImNyb3NzIiwibGVycCIsInJhbmRvbSIsInRyYW5zZm9ybU1hdDQiLCJ0cmFuc2Zvcm1RdWF0IiwiemVybyIsImRpdiIsImRpc3QiLCJzcXJEaXN0IiwibGVuIiwic3FyTGVuIiwiZm9yRWFjaCIsInZlYzQuY2xvbmUiLCJ2ZWM0LmZyb21WYWx1ZXMiLCJ2ZWM0LmNvcHkiLCJ2ZWM0LnNldCIsInZlYzQuYWRkIiwidmVjNC5zY2FsZSIsInZlYzQuZG90IiwidmVjNC5sZXJwIiwidmVjNC5sZW5ndGgiLCJ2ZWM0LnNxdWFyZWRMZW5ndGgiLCJ2ZWM0Lm5vcm1hbGl6ZSIsInZlYzQuZXhhY3RFcXVhbHMiLCJ2ZWM0LmVxdWFscyIsInZlYzMuY3JlYXRlIiwidmVjMy5mcm9tVmFsdWVzIiwidmVjMy5kb3QiLCJ2ZWMzLmNyb3NzIiwidmVjMy5sZW4iLCJ2ZWMzLm5vcm1hbGl6ZSIsIm1hdDMuY3JlYXRlIiwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24iLCJmcm9tTWF0NCIsInF1YXQuY3JlYXRlIiwibWF0NC5nZXRSb3RhdGlvbiIsIm1hdDQuZ2V0VHJhbnNsYXRpb24iLCJxdWF0LmNvcHkiLCJnZXRUcmFuc2xhdGlvbiIsInF1YXQucm90YXRlWCIsInF1YXQucm90YXRlWSIsInF1YXQucm90YXRlWiIsInF1YXQuZG90IiwiY29uanVnYXRlIiwicXVhdC5sZW5ndGgiLCJxdWF0LnNxdWFyZWRMZW5ndGgiLCJ0cmFuc2Zvcm1NYXQzIiwiYW5nbGUiLCJ2ZWM0LnRyYW5zZm9ybU1hdDQiLCJqIiwicHJvZ3Jlc3MiLCJwcm9wZXJ0aWVzIiwic2lnbiIsInN3YXAiLCJGaWxsTGF5b3V0QXJyYXkiLCJMaW5lSW5kZXhBcnJheSIsInJpbmciLCJlYXJjdXQiLCJjbGFzc2lmeVJpbmdzIiwic2lnbmVkQXJlYSIsIlZlY3RvclRpbGVGZWF0dXJlIiwiVmVjdG9yVGlsZUxheWVyIiwicmVxdWlyZSQkMiIsIm12dCIsIkVBUkNVVF9NQVhfUklOR1MiLCJGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkiLCJwcm9qZWN0UXVlcnlHZW9tZXRyeSIsInZlY3RvclRpbGVGZWF0dXJlVHlwZXMiLCJMaW5lTGF5b3V0QXJyYXkiLCJMaW5lRXh0TGF5b3V0QXJyYXkiLCJsYXlvdXRBdHRyaWJ1dGVzRXh0Iiwib2Zmc2V0IiwiUHJvdG9idWYiLCJib3giLCJpZCIsInNyYyIsImJpbiIsInciLCJoIiwid2hpdGVzcGFjZSIsInRhZ2dlZExpbmUiLCJhbGlnbiIsImludGVycG9sYXRlIiwiYm9yZGVyIiwiY29sbGlzaW9uUGFkZGluZyIsImRlZmF1bHRDb21wYXJlIiwiUXVldWUiLCJtaW5ab29tIiwibWF4Wm9vbSIsInNoYXBpbmciLCJhbmNob3IiLCJhZGRWZXJ0ZXgiLCJTeW1ib2xMYXlvdXRBcnJheSIsIlN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSIsIlN5bWJvbE9wYWNpdHlBcnJheSIsInVwbG9hZCIsIkNvbGxpc2lvblZlcnRleEFycmF5IiwibWF0NC5pZGVudGl0eSIsImdsb2JhbFJUTFRleHRQbHVnaW4iLCJ0cmFuc2Zvcm1UZXh0IiwicmVzb2x2ZWRUb2tlbnMiLCJDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSIsImsiLCJjaXJjbGUiLCJoZWF0bWFwIiwiaGlsbHNoYWRlIiwiZmlsbCIsImZpbGxFeHRydXNpb24iLCJzeW1ib2wiLCJiYWNrZ3JvdW5kIiwicmFzdGVyIiwiSW1hZ2VEYXRhIiwiSW1hZ2VCaXRtYXAiLCJjYWxsYmFjayIsIm1lcmNhdG9yWGZyb21MbmciLCJtZXJjYXRvcllmcm9tTGF0IiwiZGVzZXJpYWxpemUiLCJwcm90b3R5cGVBY2Nlc3NvcnMiLCJzb3VyY2VMYXllciIsImxheWVyU3RhdGVzIiwidnQiLCJmZWF0dXJlRmlsdGVyIiwiR2VvSlNPTkZlYXR1cmUiLCJkZXNlcmlhbGl6ZUJ1Y2tldCIsImJ1Y2tldCIsInJlZlByb3BlcnRpZXMiLCJjcmVhdGVTdHlsZUxheWVyIiwidmFsdWVzIiwibGF5ZXJDb25maWdzIiwibGF5ZXIiLCJwb3RwYWNrIiwiQWxwaGFJbWFnZSIsInN0YWNrIiwiZ2x5cGhzIiwicmVnaXN0ZXIiLCJPdmVyc2NhbGVkVGlsZUlEIiwiQ29sbGlzaW9uQm94QXJyYXkiLCJEaWN0aW9uYXJ5Q29kZXIiLCJGZWF0dXJlSW5kZXgiLCJ3YXJuT25jZSIsIm1hcE9iamVjdCIsIkltYWdlQXRsYXMiLCJTeW1ib2xCdWNrZXQiLCJwZXJmb3JtU3ltYm9sTGF5b3V0IiwiTGluZUJ1Y2tldCIsIkZpbGxCdWNrZXQiLCJGaWxsRXh0cnVzaW9uQnVja2V0IiwiRXZhbHVhdGlvblBhcmFtZXRlcnMiLCJnZXRBcnJheUJ1ZmZlciIsIlJlcXVlc3RQZXJmb3JtYW5jZSIsIkRFTURhdGEiLCJSR0JBSW1hZ2UiLCJnZW9tZXRyeSIsIkdlb0pTT05XcmFwcGVyIiwiRmVhdHVyZVdyYXBwZXIiLCJQYmYiLCJzb3J0IiwibmVpZ2hib3JJZCIsImIiLCJ5TGF0IiwicmV3aW5kIiwidHJhbnNmb3JtIiwidnRwYmYiLCJjcmVhdGVFeHByZXNzaW9uIiwiZ2V0SlNPTiIsIkFjdG9yIiwicHJvajQiLCJlbmZvcmNlQ2FjaGVTaXplTGltaXQiLCJvcHRpb25zIiwiUmVzb3VyY2VUeXBlIiwiZ2V0SW1hZ2UiLCJFcnJvckV2ZW50IiwiRXZlbnQiLCJJbWFnZVBvc2l0aW9uIiwiVGV4dHVyZSIsIkV2ZW50ZWQiLCJwYXJzZUdseXBoUEJGIiwiYXN5bmNBbGwiLCJUaW55U0RGIiwic3BoZXJpY2FsVG9DYXJ0ZXNpYW4iLCJQcm9wZXJ0aWVzIiwiRGF0YUNvbnN0YW50UHJvcGVydHkiLCJUcmFuc2l0aW9uYWJsZSIsImVuZHNXaXRoIiwiZW1pdFZhbGlkYXRpb25FcnJvcnMiLCJ2YWxpZGF0ZVN0eWxlIiwidW5pcXVlSWQiLCJwaWNrIiwiTG5nTGF0Qm91bmRzIiwicG9zdFR1cm5zdGlsZUV2ZW50IiwicG9zdE1hcExvYWRFdmVudCIsImNhY2hlRW50cnlQb3NzaWJseUFkZGVkIiwib2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwiY3JlYXRlTGF5b3V0IiwiUmFzdGVyQm91bmRzQXJyYXkiLCJTZWdtZW50VmVjdG9yIiwiQ2Fub25pY2FsVGlsZUlEIiwiZ2V0VmlkZW8iLCJWYWxpZGF0aW9uRXJyb3IiLCJ2ZWN0b3IiLCJyYXN0ZXJEZW0iLCJnZW9qc29uIiwidmlkZW8iLCJpbWFnZSIsImNhbnZhcyIsImJpbmRBbGwiLCJtYXQ0LnRyYW5zbGF0ZSIsIm1hdDQuc2NhbGUiLCJtYXQ0Lm11bHRpcGx5IiwiQ29sb3IiLCJBTFdBWVMiLCJkZWVwRXF1YWwiLCJjcmVhdGVTb3VyY2UiLCJTb3VyY2VGZWF0dXJlU3RhdGUiLCJ0aWxlIiwia2V5c0RpZmZlcmVuY2UiLCJ0aWxlSUQiLCJUaWxlIiwiTWVyY2F0b3JDb29yZGluYXRlIiwibWFwYm94Z2wiLCJsYXRlc3QiLCJpc0VxdWFsIiwiY2xhbXAiLCJtYXQ0LmNyZWF0ZSIsIm1hdDQucm90YXRlWiIsIm1hdDQuY2xvbmUiLCJzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvclpvb20iLCJXcml0aW5nTW9kZSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSIsIm9yaWVudGF0aW9uQ2hhbmdlIiwiYWRkRHluYW1pY0F0dHJpYnV0ZXMiLCJwcm9qZWN0aW9uLnByb2plY3QiLCJwcm9qZWN0aW9uLmdldFBlcnNwZWN0aXZlUmF0aW8iLCJPTkVfRU0iLCJwcm9qZWN0aW9uLnBsYWNlRmlyc3RBbmRMYXN0R2x5cGgiLCJjbGlwTGluZSIsImludGVyc2VjdGlvblRlc3RzLnBvbHlnb25JbnRlcnNlY3RzUG9seWdvbiIsInByb2plY3Rpb24ueHlUcmFuc2Zvcm1NYXQ0IiwiZ2V0QW5jaG9yQWxpZ25tZW50IiwiZXZhbHVhdGVWYXJpYWJsZU9mZnNldCIsInByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeCIsInByb2plY3Rpb24uZ2V0R2xDb29yZE1hdHJpeCIsInBsYWNlSG9yaXpvbnRhbCIsInBsYWNlVmVydGljYWwiLCJtYXQ0LmludmVydCIsImdldEFuY2hvckp1c3RpZmljYXRpb24iLCJjcm9zc1RpbGVJRCIsInByZXZPcGFjaXR5IiwicGFja2VkT3BhY2l0eSIsImhvcml6b250YWxPcGFjaXR5IiwidmVydGljYWxPcGFjaXR5IiwicyIsInN5bWJvbEluc3RhbmNlIiwiX2VtaXRWYWxpZGF0aW9uRXJyb3JzIiwiZGlmZk9wZXJhdGlvbnMiLCJnZXRXb3JrZXJQb29sIiwiWm9vbUhpc3RvcnkiLCJnZXRSZWZlcnJlciIsInRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnQiLCJpc01hcGJveFVSTCIsImRlcmVmIiwiX3Nwcml0ZVJlcXVlc3QiLCJ2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIiLCJmaWx0ZXJPYmplY3QiLCJsIiwibGF5ZXJJZCIsInNvdXJjZVJlc3VsdCIsImxheWVyRmVhdHVyZXMiLCJmZWF0dXJlV3JhcHBlciIsInJ0bFRleHRQbHVnaW5FdmVudGVkIiwibGF5ZXJJRCIsInN0eWxlTGF5ZXIiLCJtYWtlUmVxdWVzdCIsImdldFNvdXJjZVR5cGUiLCJzZXRTb3VyY2VUeXBlIiwicmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSIsInZlcnRleEJ1ZmZlciIsIlByb2dyYW0iLCJ1bmlmb3JtIiwiVW5pZm9ybU1hdHJpeDRmIiwiVW5pZm9ybTNmIiwiVW5pZm9ybTFmIiwiVW5pZm9ybTFpIiwiVW5pZm9ybTJmIiwibWF0My5mcm9tUm90YXRpb24iLCJ2ZWMzLnRyYW5zZm9ybU1hdDMiLCJVbmlmb3JtQ29sb3IiLCJtYXQ0Lm9ydGhvIiwiVW5pZm9ybTRmIiwibWF0NC5tdWwiLCJDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSIsImNvbGxpc2lvbkNpcmNsZUxheW91dCIsImJhdGNoIiwiUXVhZFRyaWFuZ2xlQXJyYXkiLCJzeW1ib2xQcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgiLCJzeW1ib2xTaXplIiwic3ltYm9sUHJvamVjdGlvbi5oaWRlR2x5cGhzIiwic3ltYm9sUHJvamVjdGlvbi5wcm9qZWN0Iiwic3ltYm9sUHJvamVjdGlvbi5nZXRQZXJzcGVjdGl2ZVJhdGlvIiwic2hpZnQiLCJnIiwic3ltYm9sUHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4Iiwic3ltYm9sUHJvamVjdGlvbi51cGRhdGVMaW5lTGFiZWxzIiwic3RhdGUiLCJ1bmlmb3JtVmFsdWVzIiwicHJvZ3JhbSIsImxheW91dFZlcnRleEJ1ZmZlciIsImluZGV4QnVmZmVyIiwicHJvZ3JhbUNvbmZpZ3VyYXRpb24iLCJuZXh0UG93ZXJPZlR3byIsInJlbmRlckNvbG9yUmFtcCIsImRlcHRoTW9kZSIsImRyYXciLCJkZWJ1ZyIsImN1c3RvbSIsIlBvc0FycmF5IiwiTGluZVN0cmlwSW5kZXhBcnJheSIsInNvdXJjZUNhY2hlIiwiY29vcmRzIiwidmVjMy5zdWIiLCJ2ZWMzLnNjYWxlIiwidmVjMy5hZGQiLCJ2ZWMzLmNsb25lIiwibnVtYmVyIiwiTG5nTGF0Iiwid3JhcCIsIm1hdDIuY3JlYXRlIiwibWF0Mi5yb3RhdGUiLCJVbndyYXBwZWRUaWxlSUQiLCJ2ZWMyLnNxckxlbiIsIm1hdDQucGVyc3BlY3RpdmUiLCJtYXQ0LnJvdGF0ZVgiLCJyZXN1bHQiLCJfZWFzZSIsImV2ZW50TmFtZSIsIm9yaWdpbmFsRXZlbnQiLCJkZWZhdWx0RWFzaW5nIiwiY29uZmlnIiwidG1lcmMiLCJldG1lcmMiLCJ1dG0iLCJzdGVyZWEiLCJzdGVyZSIsInNvbWVyYyIsIm9tZXJjIiwibGNjIiwia3JvdmFrIiwiY2FzcyIsImxhZWEiLCJhZWEiLCJnbm9tIiwiY2VhIiwiZXFjIiwicG9seSIsIm56bWciLCJtaWxsIiwic2ludSIsIm1vbGwiLCJlcWRjIiwidmFuZGciLCJhZXFkIiwicXNjIiwicm9iaW4iLCJnZW9jZW50IiwidHBlcnMiLCJnZW9zIiwiZGVmYXVsdE9wdGlvbnMiLCJQZXJmb3JtYW5jZVV0aWxzIiwiUGVyZm9ybWFuY2VNYXJrZXJzIiwiUmVxdWVzdE1hbmFnZXIiLCJtb3VzZWluIiwibW91c2Vtb3ZlIiwibW91c2VvdXQiLCJ3aWR0aCIsImhlaWdodCIsImRhdGEiLCJpc1N1cHBvcnRlZCIsInNldENhY2hlTGltaXRzIiwiRmVhdHVyZSIsIm1lcmNhdG9yWmZyb21BbHRpdHVkZSIsImVsZW1lbnQiLCJ2ZXJzaW9uIiwidGl0bGUiLCJzdXBwb3J0ZWQiLCJzZXRSVExUZXh0UGx1Z2luIiwiZ2V0UlRMVGV4dFBsdWdpblN0YXR1cyIsImNsZWFyVGlsZUNhY2hlIiwiaXNTYWZhcmkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksQ0FBQztBQUNiO0FBQ0EsSUFBSSxxQkFBcUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUM7QUFDekQsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7QUFDckQsSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDO0FBQzdEO0FBQ0EsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO0FBQ3ZCLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7QUFDeEMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7QUFDL0UsRUFBRTtBQUNGO0FBQ0EsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGVBQWUsR0FBRztBQUMzQixDQUFDLElBQUk7QUFDTCxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQ3RCLEdBQUcsT0FBTyxLQUFLLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbEIsRUFBRSxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDcEQsR0FBRyxPQUFP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TUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssSUFBSSxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxFQUFFLFdBQVc7QUFDcEIsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxFQUFFLFNBQVMsS0FBSyxFQUFFO0FBQzVCLFFBQVEsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLGVBQWUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN6QixRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxFQUFFLFdBQVc7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3pCLFFBQVEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDM0IsUUFBUSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLO0FBQ3pCLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ25DLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUMxQixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDOUIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUM3QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLE9BQU8sSUFB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QzFCLEtBQUs7QUFDTCxJQUFJLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN2QixNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixLQUFLO0FBQ0wsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsTUFBTSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsS0FBSztBQUNMLElBQUksTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3hCLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxJQUFJLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN2QixNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMzQixLQUFLO0FBQ0wsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDM0IsS0FBSztBQUNMLElBQUksS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3ZCLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxJQUFJLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN2QixNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN2QyxLQUFLO0FBQ0wsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELEtBQUs7QUFDTCxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMzQixLQUFLO0FBQ0wsSUFBSSxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDckIsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDckIsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDckIsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDbkIsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDbkIsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixLQUFLO0FBQ0wsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDbkIsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixLQUFLO0FBQ0wsSUFBSSxHQUFHLEVBQUUsV0FBVztBQUNwQixNQUFNLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLEtBQUs7QUFDTCxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsQyxLQUFLO0FBQ0wsSUFBSSxLQUFLLEVBQUUsV0FBVztBQUN0QixNQUFNLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQzNCLEtBQUs7QUFDTCxJQUFJLE9BQU8sRUFB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R0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0IsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQzdCLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM3QyxLQUFLO0FBQ0wsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBLFNBQVMsR0FBRyxDQUFDLEtBQUssRUFBRTtBQUNwQixFQUFFLE9BQU8sS0FBSyxHQUFHQSxLQUFHLENBQUM7QUFDckIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO0FBQ3ZCLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUM3QixJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQzdCLEdBQUcsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO0FBQ3RDLElBQUksR0FBRyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFDOUIsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQixHQUFHLE1BQU07QUFDVCxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRTtBQUM1QyxNQUFNLEdBQUcsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsS0FBSyxNQUFNO0FBQ1gsTUFBTSxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7QUFDcEMsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtBQUNoQixJQUFJLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUN2QixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZELE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUM5RSxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEVBQUU7QUFDOUcsUUFBUSxTQUFTLElBQUksR0FBRyxDQUFDO0FBQ3pCLE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxFQUFFO0FBQ3JILFFBQVEsU0FBUyxJQUFJLEdBQUcsQ0FBQztBQUN6QixPQUFPLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsRUFBRTtBQUNuSCxRQUFRLFNBQVMsSUFBSSxHQUFHLENBQUM7QUFDekIsT0FBTyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEVBQUU7QUFDbkgsUUFBUSxTQUFTLElBQUksR0FBRyxDQUFDO0FBQ3pCLE9BQU87QUFDUCxLQUFLO0FBQ0wsSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ2hDLE1BQU0sU0FBUyxJQUFJLEdBQUcsQ0FBQztBQUN2QixLQUFLO0FBQ0wsSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ2hDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7QUFDM0IsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtBQUNoQixJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDNUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFO0FBQy9CLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDMUIsS0FBSztBQUNMLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDakMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7QUFDN0MsVUFBVSxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMvRCxTQUFTO0FBQ1QsT0FBTyxNQUFNO0FBQ2IsUUFBUSxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3hDLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUMxQixFQUFFLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDN0IsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLEdBQUc7QUFDSCxFQUFFLElBQUksTUFBTSxFQUFFO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFDdEIsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ3RELEtBQUssTUFBTTtBQUNYLE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2hELEtBQUs7QUFDTCxJQUFJLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUM1QyxNQUFNLEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsS0FBSztBQUNMLElBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLGlDQUFpQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssa0JBQWtCLEVBQUU7QUFDckcsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUMvQixLQUFLO0FBQ0wsSUFBSSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssNEJBQTRCLEVBQUU7QUFDeEYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssMkJBQTJCLEVBQUU7QUFDMUQsUUFBUSxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUMxQixPQUFPO0FBQ1AsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO0FBQzlDLE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRCxLQUFLO0FBQ0wsSUFBSSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ2hELE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRCxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDekMsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztBQUM5QixLQUFLO0FBQ0wsSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7QUFDL0MsTUFBTSxHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDakcsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxlQUFlLEVBQUU7QUFDcEUsUUFBUSxHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUMzQixPQUFPO0FBQ1A7QUFDQSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO0FBQzlDLE1BQU0sR0FBRyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUM5QyxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDN0MsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUMvQixLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDN0MsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUMvQixLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3RDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO0FBQzNELE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7QUFDOUIsS0FBSztBQUNMLElBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtBQUNyQyxNQUFNLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFD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SUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztBQUNqQyxHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0FBQy9CLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxZQUFZLEVBQUU7QUFDcEIsSUFBSSxHQUFHLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdGLE1BQU0sR0FBRyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDbEMsS0FBSztBQUNMLElBQUksSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzVILFFBQVEsR0FBRyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDcEMsUUFBUSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUMxQyxRQUFRLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQzFDLFFBQVEsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDMUMsUUFBUSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FB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QUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDbkssR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7QUFDL0MsSUFBSSxRQUFRLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMvVyxHQUFHLE1BQU07QUFDVCxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLG9CQUFvQixDQUFDLENBQUMsRUFBRSxFQUFF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QUNYLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUM5QixNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDOUIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzlCLEtBQUssQ0FBQztBQUNOLEdBQUcsTUFBTSxJQUFJLFVBQVUsS0FBSyxVQUFVLEVBQUU7QUFDeEMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsSUFBSSxJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsSUFBSSxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0I7QUFDQTtBQUNBLElBQUksT0FBTztBQUNYLE1BQU0sQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSztBQUN6RCxNQUFNLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUs7QUFDekQsTUFBTSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FB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QUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNWLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDekMsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLEdBQUc7QUFDSCxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3pDLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixHQUFHO0FBQ0gsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDekUsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7O0FDL0xjLHFCQUFTLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQzVDLEVBQUUsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDakIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFCLElBQUksSUFBSSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUNwRCxNQUFNLFNBQVM7QUFDZixLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDakIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2QsTUFBTSxJQUFJLElBQUksQ0FBQyxP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SztBQUNMLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUU7QUFDMUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLFVBQVUsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUM7QUFDQTtBQUNBLEVBQUUsYUFBYSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN2QztBQUNBLEVBQUUsZUFBZSxHQUFHLENBQUMsVUFBVSxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNwRDtBQUNBLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDMUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUQsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUM7QUFDbkQ7QUFDQSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQy9iO0FBQ0EsRUFBRSxJQUFJLFVBQVUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsZUFBZSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDaEs7QUFDQSxFQUFFLElBQUksV0FBVyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdB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QUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxSDtBQUNBLEVBQUUsT0FBTyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hNO0FBQ0E7QUFDQSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzdFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QyxFQUFFLEVBQUUsR0FBRyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxlQUFlLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNuUSxFQUFFLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEI7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLGVBQWUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlLLEVBQUUsR0FBRyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkM7QUFDQSxFQUFFLElBQUksTUFBTSxDQUFDO0FBQ2IsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7QUFDcEIsSUFBSSxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7QUFDM0IsTUFBTSxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUTtBQUMzQyxNQUFNLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRO0FBQ3pDLE1BQU0sVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO0FBQ2hDLE1BQU0sVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO0FBQ2hDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxNQUFNLEdBQUc7QUFDYixNQUFNLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztBQUN2QixNQUFNLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRztBQUN6QixNQUFNLE1BQU0sRUFBRSxHQUFHO0FBQ2pCLE1BQU0sSUFBSSxFQUFFLEdBQUc7QUFDZixLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0gsT0FBTztBQUNQLElBQUksTUFBTSxHQUFHO0FBQ2IsTUFBTSxHQUFHLEVBQUUsR0FBRztBQUNkLE1BQU0sR0FBRyxFQUFFLEdBQUc7QUFDZCxLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0gsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUU7QUFDbEM7QUFDQTtBQUNBLEVBQUUsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDN0I7QUFDQSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRTtBQUNsQyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDdEMsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsR0FBRztBQUNILE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQ3RDLElBQUksZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEdBQUc7QUFDSCxPQUFPLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRTtBQUN0QyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDdEMsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsR0FBRztBQUNILE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFO0FBQ3RDLElBQUksZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEdBQUc7QUFDSCxPQUFPLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRTtBQUN0QyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDdEMsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsR0FBRztBQUNILE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ3JDLElBQUksZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEdBQUc7QUFDSCxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNwQyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNyQyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZDLElBQUksZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEdBQUc7QUFDSCxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDeEMsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsR0FBRztBQUNILE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3hDLElBQUksZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEdBQUc7QUFDSCxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDeEMsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsR0FBRztBQUNILE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3hDLElBQUksZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEdBQUc7QUFDSCxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDeEMsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsR0FBRztBQUNILE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QyxJQUFJLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUMzQixHQUFHO0FBQ0gsRUFBRSxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUU7QUFDL0I7QUFDQSxFQUFFLElBQUksUUFBUSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTztBQUN0QyxJQUFJLFNBQVMsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUN2QztBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BNLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbEQsRUFBRSxJQUFJLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM5QyxFQUFFLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQy9DLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xELEVBQUUsT0FBTyxlQUFlLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQztBQUNsQyxFQUFFLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtBQUNyQixJQUFJLE9BQU8sR0FBRyxhQUFhLENBQUM7QUFDNUIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQzVDO0FBQ0EsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxTQUFTLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlELEVBQUUsSUFBSSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNEO0FBQ0E7QUFDQSxFQUFFLElBQUksTUFBTSxHQUFHLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsSUFBSSxNQUFNLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUMvQixFQUFFLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN2QjtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ2xCLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLE1BQU0sS0FBSyxDQUFDLEtBQUssU0FBUyxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUU7QUFDcEcsSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUNiLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEtBQUssQ0FBQyxLQUFLLFNBQVMsR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFO0FBQ3BHLElBQUksTUFBTSxFQUFFLENBQUM7QUFDYjtBQUNBLElBQUksSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3RCLE1BQU0sTUFBTSxFQUFFLENBQUM7QUFDZixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDbEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ2xCLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDcEIsR0FBRztBQUNILE9BQU87QUFDUCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDckIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUU7QUFDaEgsSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUNiLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFO0FBQ2hILElBQUksTUFBTSxFQUFFLENBQUM7QUFDYjtBQUNBLElBQUksSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3RCLE1BQU0sTUFBTSxFQUFFLENBQUM7QUFDZixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDbEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVFLEVBQUUsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsTUFBTSxDQUFDLFVBQVUsRUFBRTtBQUM1QjtBQUNBLEVBQUUsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDN0MsSUFBSSxPQUFPLGtDQUFrQyxFQUFFO0FBQy9DLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztBQUNqQztBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxJQUFJLFFBQVEsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1o7QUFDQTtBQUNBLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzNELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2hCLE1BQU0sT0FBTyxpQ0FBaUMsR0FBRyxVQUFVLEVBQUU7QUFDN0QsS0FBSztBQUNMLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQztBQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ1IsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUU7QUFDakM7QUFDQTtBQUNBLElBQUksT0FBTyxpQ0FBaUMsR0FBRyxVQUFVLEVBQUU7QUFDM0QsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUM7QUFDQTtBQUNBLEVBQUUsSUFBSSxVQUFVLElBQUksR0FBRyxJQUFJLFVBQVUsS0FBSyxHQUFHLElBQUksVUFBVSxLQUFLLEdBQUcsSUFBSSxVQUFVLElBQUksR0FBRyxJQUFJLFVBQVUsS0FBSyxHQUFHLElBQUksVUFBVSxLQUFLLEdBQUcsRUFBRTtBQUN0SSxJQUFJLE9BQU8sd0JBQXdCLEdBQUcsVUFBVSxHQUFHLGdCQUFnQixHQUFHLFVBQVUsRUFBRTtBQUNsRixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDekM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsRUFBRSxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELEVBQUUsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLFNBQVMsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDakQsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDO0FBQ3pCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxJQUFJLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzdCO0FBQ0EsRUFBRSxJQUFJLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzNCLElBQUksT0FBTyxtS0FBbUssR0FBRyxVQUFVLEVBQUU7QUFDN0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQzFCO0FBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFDdkIsRUFBRSxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDeEIsRUFBRSxJQUFJLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDO0FBQzVFLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ2YsSUFBSSxhQUFhLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELElBQUksZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3hELElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLGFBQWEsQ0FBQztBQUM5RCxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELElBQUksV0FBVyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGFBQWEsQ0FBQztBQUNoRSxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxVQUFVLEdBQUcsUUFBUSxDQUFDO0FBQ2xDLEVBQUUsUUFBUSxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUM7QUFDckM7QUFDQSxFQUFFLE9BQU87QUFDVCxJQUFJLE9BQU8sRUFBRSxPQUFPO0FBQ3BCLElBQUksUUFBUSxFQUFFLFFBQVE7QUFDdEIsSUFBSSxVQUFVLEVBQUUsVUFBVTtBQUMxQixJQUFJLFVBQVUsRUFBRSxVQUFVO0FBQzFCLElBQUksUUFBUSxFQUFFLGFBQWE7QUFDM0IsR0FBRyxDQUFDO0FBQ0osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGtCQUFrQixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDcEM7QUFDQTtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUM5QixFQUFFLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUMzQjtBQUNBLEVBQUUsT0FBTyxNQUFNLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO0FBQ2IsSUFBSSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDdEIsTUFBTSxNQUFNLEVBQUUsQ0FBQztBQUNmLEtBQUs7QUFDTCxJQUFJLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN0QixNQUFNLE1BQU0sRUFBRSxDQUFDO0FBQ2YsS0FBSztBQUNMLElBQUksSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3BCLE1BQU0sSUFBSSxZQUFZLEVBQUU7QUFDeEIsUUFBUSxPQUFPLGlCQUFpQixHQUFHLENBQUMsRUFBRTtBQUN0QyxPQUFPO0FBQ1AsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixLQUFLO0FBQ0wsSUFBSSxZQUFZLElBQUksUUFBUSxDQUFDO0FBQzdCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFtQixDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckM7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtBQUNmLElBQUksT0FBTyxtQ0FBbUMsR0FBRyxDQUFDLEVBQUU7QUFDcEQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxFQUFFLElBQUksYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUMzQjtBQUNBLEVBQUUsT0FBTyxNQUFNLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO0FBQ2IsSUFBSSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDdEIsTUFBTSxNQUFNLEVBQUUsQ0FBQztBQUNmLEtBQUs7QUFDTCxJQUFJLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtBQUN0QixNQUFNLE1BQU0sRUFBRSxDQUFDO0FBQ2YsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNwQixNQUFNLElBQUksWUFBWSxFQUFFO0FBQ3hCLFFBQVEsT0FBTyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7QUFDdEMsT0FBTztBQUNQLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNqQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUIsS0FBSztBQUNMLElBQUksYUFBYSxJQUFJLFFBQVEsQ0FBQztBQUM5QixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxjQUFjLENBQUMsVUFBVSxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxRQUFRLENBQUM7QUFDZixFQUFFLFFBQVEsVUFBVTtBQUNwQixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUN6QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUNuQixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUN4QixJQUFJLE1BQU07QUFDVixFQUFFLEtBQUssR0FBRztBQUNWLElBQUksUUFBUSxHQUFHLFNB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N0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsSUFBSSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQ25DLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDMUIsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN2RCxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2Q7QUFDQSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHO0FBQzFDLE1BQU0sT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDdkMsTUFBTSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUN4QyxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQzFELE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDVixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1Y7QUFDQSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUMzQixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUNmLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QztBQUNBLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDaEIsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDdkMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDZixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNqQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNoQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDZCxLQUFLO0FBQ0wsU0FBUztBQUNULE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsS0FBSztBQUNMLEdBQUc7QUFDSCxPQUFPO0FBQ1AsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNqQyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdDO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFFO0FBQ2pDLE1BQU0sSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsRSxNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUMsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QixNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0MsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzNDLE1BQU0sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztBQUMxQjtBQUNBLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN2RCxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO0FBQ3JELFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQy9ELFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkU7QUFDQSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztBQUMzQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMvQixRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMzRCxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDM0UsS0FBSztBQUNMLFNBQVM7QUFDVCxNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNk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LENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWDs7QUNEZSxxQkFBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUMxQyxFQUFFLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEMsRUFBRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLEVBQUUsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO0FBQ3RDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNWLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDVjtBQUNBLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDbkIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2QsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2QsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2IsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEMsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUM3QixFQUFFLENBQUMsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO0FBQzdCO0FBQ0EsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUM7O0FDL0JEO0FBQ0E7QUFXQSxTQUFnQkQsTUFBSSxHQUFHO0FBQ3ZCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ3hELElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxvSUFBb0ksQ0FBQyxDQUFDO0FBQzFKLEdBQUc7QUFDSCxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNuQjtBQUNBLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDakMsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoRCxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDekQsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNoQixFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDaEIsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNoQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakQsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2I7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RztBQUNBLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JHO0FBQ0EsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEY7QUFDQSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFO0FBQ0EsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekQ7QUFDQSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDdkM7QUFDQSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUU7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNySCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakg7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlHO0FBQ0EsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pHO0FBQ0EsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GO0FBQ0EsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMvRCxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDaEU7QUFDQSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUM3QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUM3QztBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFDRDtBQUNPLFNBQVNVLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2Y7QUFDQSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUI7QUFDQSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDM0MsRUFBRSxFQUFFLEdBQUcsSUFBSSxD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RSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNJLENBQUM7QUFDRDtBQUNPLFNBQVNVLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUNySSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDckIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRDtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDdEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBR0UsVUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDckMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUN0RixJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRTtBQUN2QyxNQUFNLE1BQU07QUFDWixLQUFLO0FBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNWLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNILEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDWixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ1osRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRDtBQUNPLElBQUlaLE9BQUssR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLFlBQWU7QUFDZixFQUFFLElBQUksRUFBRUQsTUFBSTtBQUNaLEVBQUUsT0FBTyxFQUFFVSxTQUFPO0FBQ2xCLEVBQUUsT0FBTyxFQUFFQyxTQUFPO0FBQ2xCLEVBQUUsS0FBSyxFQUFFVixPQUFLO0FBQ2QsQ0FBQyxDQUFDOztBQ2hESyxTQUFTRCxNQUFJLEdBQUc7QUFDdkIsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ2hCLElBQUksT0FBTztBQUNYLEdBQUc7QUFDSCxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxtQ0FBbUMsQ0FBQztBQUNyRCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ08sU0FBU1UsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUMzQixFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMzRCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDL0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQy9CLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQ0Q7QUFDTyxTQUFTQyxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ2hDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pDO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakIsRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztBQUNoRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FB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LENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtBQUN6QjtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyQixPQUFPO0FBQ1AsV0FBVztBQUNYO0FBQ0E7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEIsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0YsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDakYsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN4SyxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pELElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDbkYsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQyxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDTyxTQUFTVSxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDL0IsRUFBRSxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQztBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDckc7QUFDQTtBQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2QsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLEdBQUc7QUFDSCxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNuQjtBQUNBLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDM0YsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDekQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2xHLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixHQUFHO0FBQ0gsT0FBTztBQUNQLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDakUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDekMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUM1RCxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ2pELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pFO0FBQ0EsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUNmLEtBQUs7QUFDTCxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxFQUFFO0FBQzdDO0FBQ0E7QUFDQSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdB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QUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzNELEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBQ0Q7QUFDTyxTQUFTVSxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0M7QUFDQTtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckQ7QUFDQTtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QztBQUNBO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRztBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hHO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNyRixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNEO0FBQ08sU0FBU0MsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUMzQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN4QjtBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUM3QztBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1osRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxTQUFTLEVBQUU7QUFDOUMsSUFBSSxJQUFJLEVBQUUsU0FBUyxHQUFHLEVBQUUsRUFBRTtBQUMxQjtBQUNBLE1BQU0sT0FBTztBQUNiLEtBQUs7QUFDTDtBQUNBLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FB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SUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFCO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRTtBQUNuQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQzdCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUMvRCxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqQjtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLEtBQUssTUFBTTtBQUNYLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO0FBQ3pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2YsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLEdBQUcsTUFBTTtBQUNULElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3JCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUNsQixJQUFJLElBQUksR0FBRyxFQUFFO0FBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hELE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNoQixRQUFRLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDeEIsT0FBTztBQUNQLEtBQUssTUFBTTtBQUNYLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNyQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDaEQsS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoRixHQUFHLE1BQU07QUFDVCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdEI7QUFDQSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN4QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFDcEIsS0FBSyxNQUFNLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDOUIsTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDO0FBQ3JCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNySCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUYsSUFBSSxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN0RCxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQztBQUNBLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzlCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkI7QUFDQSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNuQixJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEdBQUcsTUFBTTtBQUNULElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEY7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7QUFDdkIsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM1QixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztBQUNuQixFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNV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LElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEdBQUcsTUFBTTtBQUNULElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ3pELEdBQUc7QUFDSDtBQUNBLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNsRDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFO0FBQzFDLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsSUFBSSxNQUFN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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQztBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsRUFBRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQyxFQUFFLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QyxFQUFFLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0M7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxRDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRTtBQUMvQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEQsR0FBRztBQUNILE9BQU87QUFDUCxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25CLEdBQUc7QUFDSCxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0QixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25CLEdBQUc7QUFDSCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckQsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEQsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcseUJBQXlCLENBQUM7QUFDM0MsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQjtBQUNBO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUN0RCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM1QyxHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUM5QyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQztBQUNkLEVBQUUsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUFFO0FBQ25CLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuRCxHQUFHO0FBQ0gsT0FBTztBQUNQLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3hCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO0FBQ2xCLE1BQU0sT0FBTyxJQUFJLENBQUM7QUFDbEIsS0FBSztBQUNMLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNaLEdBQUc7QUFDSCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzlEO0FBQ0EsRUFBRSxPQUFPLENB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LENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekYsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFnQixDQUFDO0FBQzdCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ILEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlHLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUYsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLGdCQUFnQixDQUFDO0FBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1UsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUMzQixFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQztBQUNBLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDMUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRyxFQUFFLE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ2xDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUN0RyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BILEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQjtBQUNBLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2QsR0FBRztBQUNILEVBQUUsUUFBUSxDQUFDLEVBQUU7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNaLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2QsR0FBRztBQUNILEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakcsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3hDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNWLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNULEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHO0FBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbE4sSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUU7QUFDNUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsS0FBSztBQUNMLElBQUksR0FBRyxHQUFH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QyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUUsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ1gsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQztBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ25CLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hFLEdBQUc7QUFDSCxPQUFPO0FBQ1A7QUFDQSxJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLElBQUksSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN0QixJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwRTtBQUNBLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUMxRjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDZjtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ25CLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDM0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hELEdBQUc7QUFDSCxPQUFPO0FBQ1A7QUFDQSxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM5RCxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3BCLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ2pCLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNsQixPQUFPO0FBQ1AsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUNmLEtBQUs7QUFDTCxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRSxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QixJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDN0YsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZGO0FBQ0EsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsSUFBV1YsT0FBSyxHQUFHLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFELFdBQWU7QUFDZixFQUFFLElBQUksRUFBRUQsTUFBSTtBQUNaLEVBQUUsT0FBTyxFQUFFVSxTQUFPO0FBQ2xCLEVBQUUsT0FBTyxFQUFFQyxTQUFPO0FBQ2xCLEVBQUUsS0FBSyxFQUFFVixPQUFLO0FBQ2QsQ0FBQyxDQUFDOztBQzNHYSxlQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDeEMsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNWLEVBQUUsSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFO0FBQ3ZCLElBQUksR0FBRyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDMUIsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLEtBQUssTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDbkgsR0FBRztBQUNILE9BQU87QUFDUCxJQUFJLFFBQVEsQ0FBQyxHQUFHLE1BQU0sRUFBRTtBQUN4QixHQUFHO0FBQ0g7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCO0FBQ08sSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFNBQWdCRCxNQUFJLEdBQUc7QUFDdkIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsS0FBSyxFQUFFO0FBQ3JDLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDMUQsR0FBRztBQUNILE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRTtBQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUMzQixHQUFHO0FBQ0gsT0FBTztBQUNQLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQzNCLEdBQUc7QUFDSCxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDbkIsSUFBSSxJQUFJLE1BQU0sQ0FBQztBQUNmO0FBQ0EsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQyxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUk7QUFDckIsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNO0FBQ3BCLE1BQU0sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEIsTUFBTSxNQUFNO0FBQ1osSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNO0FBQ3BCLE1BQU0sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEIsTUFBTSxNQUFNO0FBQ1osSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLO0FBQ25CLE1BQU0sSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekMsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzVCLE1BQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDbkIsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQy9CLE1BQU0sTUFBTTtBQUNaLElBQUksS0FBSyxJQUFJLENBQUMsS0FBSztBQUNuQixNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ25ELE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRCxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEcsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDaEQsTUFBTSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDMUIsTUFBTSxNQUFNO0FBQ1osS0FBSztBQUNMLEdBQUc7QUFDSCxPQUFPO0FBQ1AsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNsQyxNQUFNLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsTUFBTSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNPLFNBQVNVLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUM3RCxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsRUFBRSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDbkIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDOUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN0SCxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLE9BQU87QUFDUCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN0RyxLQUFLO0FBQ0wsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDckUsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNyQyxRQUFRLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUN6QixPQUFPO0FBQ1AsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUU7QUFDN0MsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixPQUFPO0FBQ1AsTUFBTSxDQUFDLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FB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LElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RCxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDO0FBQ0EsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QztBQUNBLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QztBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRTtBQUMvQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25GLEdBQUc7QUFDSCxPQUFPO0FBQ1AsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDeEIsR0FBRztBQUNILEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ3JELEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ3hFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQjtBQUNBLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDbEUsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUMxQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwRDtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDVixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRDtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3BDO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2hDLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRTtBQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxD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QUNPLFNBQVNVLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0I7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQyxFQUFFLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUMzQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRDtBQUNBLElBQVdWLE9BQUssR0FBRyxDQUFDLGlCQUFpQixFQUFFLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pFLFVBQWU7QUFDZixFQUFFLElBQUksRUFBRUQsTUFBSTtBQUNaLEVBQUUsT0FBTyxFQUFFVSxTQUFPO0FBQ2xCLEVBQUUsT0FBTyxFQUFFQyxTQUFPO0FBQ2xCLEVBQUUsS0FBSyxFQUFFVixPQUFLO0FBQ2QsQ0FBQyxDQUFDOztBQ3JDRixJQUFJWSxVQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ2xCO0FBQ0EsU0FBZ0JiLE1BQUksR0FBRztBQUN2QjtBQUNBO0FBQ0EsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ2YsRUFBRSxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNuQixJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDaEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ2xDLEtBQUs7QUFDTCxTQUFTO0FBQ1QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RixLQUFLO0FBQ0wsR0FBRztBQUNILE9BQU87QUFDUCxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDaEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUN4QixLQUFLO0FBQ0wsU0FBUztBQUNULE1BQU0sSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEcsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNILEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDcEIsRUFBRSxPQUFPLENB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LElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDZixNQUFNLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQzVCLE1BQU0sSUFBSSxHQUFHLENBQUM7QUFDZCxNQUFNLEtBQUssQ0FBQyxHQUFHQSxVQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JFLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0gsUUFBUSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUIsUUFBUSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDeE0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDO0FBQ3BCLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUNyQyxVQUFVLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDcEIsVUFBVSxNQUFNO0FBQ2hCLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvRSxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFB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QUMsVUFBVSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztBQUM1QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7QUFDNUI7QUFDQSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDakIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUM5QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztBQUM5QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUM3QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQzdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDNUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUM1QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDM0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxH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O0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLE9BQU8sQ0FBQztBQUNkLEVBQUUsSUFBSSxPQUFPLENBQUM7QUFDZDtBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0IsSUFBSSxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQzVDLElBQUksT0FBTyxHQUFHLE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQztBQUM1QyxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDckIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3JCLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNsRSxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDbEUsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVDLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUks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aEI7QUFDQTtBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BGO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDVixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakI7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFFO0FBQ0EsRUFB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QUNYLEdBQUc7QUFDSCxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3JDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCO0FBQ0EsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQztBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNyRCxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pFO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFO0FBQy9DLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzFCLEdBQUc7QUFDSCxPQUFPO0FBQ1AsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkQsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuRSxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUQsR0FBRztBQUNILEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNWO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ25CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNsQyxHQUFHO0FBQ0gsT0FBTztBQUNQLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLEdBQUc7QUFDSCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckQsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDVixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoQyxFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNwQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDWixHQUFHO0FBQ0gsT0FBTztBQUNQLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsSUFBSSxHQUFHLEdBQUcs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QUMsQ0FBQztBQUNqRCxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDakYsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNoQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtBQUNsQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM3RCxLQUFLO0FBQ0wsU0FBUztBQUNULE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDOUQsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNILEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUI7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ25JLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO0FBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ2YsR0FBRztBQUNILEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3BCO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ25HLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO0FBQ2hCO0FBQ0EsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEIsR0FBRztBQUNILE9BQU87QUFDUDtBQUNBLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLEdBQUc7QUFDSCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUMzQixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUM5QixFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1QsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNULEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDVixFQUFFLElBQUksR0FBRyxDQUFDO0FBQ1YsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNSO0FBQ0E7QUFDQTtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN6QixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDMUIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNqQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDcEYsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNwQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUN6QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtBQUNsQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDZCxLQUFLO0FBQ0wsU0FBUztBQUNULE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2YsS0FBSztBQUNMLEdBQUc7QUFDSCxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdB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Q0FBQyxJQUFJLEtBQUssRUFBRTtBQUM3QztBQUNBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDOUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEQsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUNmLEtBQUs7QUFDTCxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUNsRDtBQUNBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDOUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEQsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUNmLEtBQUs7QUFDTCxTQUFTO0FBQ1Q7QUFDQSxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQy9CLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzdGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEcsTUFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDcEIsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkYsT0FBTztBQUNQLFdBQVcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUMxRCxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLE9BQU87QUFDUCxXQUFXO0FBQ1gsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLE9BQU87QUFDUCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4RSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsQixNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3pKLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sT0FBTyxDQUFDLENBQUM7QUFDZixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDTyxTQUFTQyxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUNoSCxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNuQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3JDLE1BQU0sT0FBTztBQUNiLEtBQUs7QUFDTCxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwQjtBQUNBLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QjtBQUNBLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDckIsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFO0FBQy9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDdEIsS0FBSztBQUNMLFNBQVM7QUFDVCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMs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QUM7QUFDaEIsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUNmLEtBQUs7QUFDTCxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtBQUNsRDtBQUNBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ25CO0FBQ0EsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsTUFBTSxPQUFPLENBQUMsQ0FBQztBQUNmLEtBQUs7QUFDTCxTQUFTO0FBQ1Q7QUFDQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN4RixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFH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QzdELEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNWLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtBQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzFGLEdBQUc7QUFDSCxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQ0Q7QUFDTyxTQUFTQyxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDVCxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ1IsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNWLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ2Y7QUFDQTtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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R0FBRyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDcEMsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDakcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0SDtBQUNBO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUN2QyxJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUM7QUFDbEIsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFO0FBQzlDLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUM5QyxJQUFJLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDakMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pDO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUMzQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztBQUMzQixFQUFFLElBQUksUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDUixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0E7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQztBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNsQyxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ2pELElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ2xDLElBQUksRUFBRSxJQUFJLE9BQU8sQ0FBQztBQUNsQixHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDakQsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDbEMsSUFBSSxFQUFFLElBQUks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QUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0IsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2IsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFO0FBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2IsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEtBQUssRUFBRTtBQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLElBQUksRUFBRTtBQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2IsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQzdDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMs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QUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUM7QUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDcEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDcEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDcEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNwRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDO0FBQ3BELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0FBQ3BELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUNqRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7QUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0FBQ25ELENBQUMsQ0FBQztBQUNGO0FBQ0EsSUFBSSxPQUFPLEdBQUc7QUFDZCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDL0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsV0FBVyxDQUFDO0FBQy9DLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUNsRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7QUFDL0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO0FBQ2xELElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNsRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNsRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQztBQUNsRCxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQztBQUNqRCxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQztBQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFF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QUFDdEMsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN0QyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDeEIsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFDRDtBQUNPLFNBQVNVLFNBQU8sQ0FBQyxDQUFDLEVBQUU7QUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDcEIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMs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QUNoQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM3QjtBQUNBO0FBQ0EsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ2pCLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDM0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDcEM7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUU7QUFDNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsR0FBRyxNQUFNO0FBQ1QsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUM7QUFDbkIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNwQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0QyxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUk7QUFDckIsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLO0FBQ3JCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDNUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3hELFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNsQyxRQUFRLE1BQU07QUFDZCxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUs7QUFDckIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDekMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDeEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNwQixRQUFRLE1BQU07QUFDZCxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07QUFDdEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixRQUFRLE1BQU07QUFDZCxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07QUFDdEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixRQUFRLE1BQU07QUFDZCxLQUFLO0FBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN6QixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQ0Q7QUFDQSxJQUFXVixPQUFLLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRCxZQUFlO0FBQ2YsRUFBRSxJQUFJLEVBQUVELE1BQUk7QUFDWixFQUFFLE9BQU8sRUFBRVUsU0FBTztBQUNsQixFQUFFLE9BQU8sRUFBRUMsU0FBTztBQUNsQixFQUFFLEtBQUssRUFBRVYsT0FBSztBQUNkLENBQUMsQ0FBQzs7QUN0S0ssU0FBU0QsTUFBSSxHQUFHO0FBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN0QztBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksRUFBRTtBQUN4RCxRQUFRLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUMxQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDMUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDakQ7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxHQUFHLEVBQUU7QUFDekIsUUFBUSxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNuQyxRQUFRLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDakM7QUFDQSxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7QUFDckM7QUFDQSxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQy9CLEtBQUssTUFBTTtBQUNYLFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDNUIsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3JCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyw4QkFBOEIsQ0FBQztBQUNwRCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBU1UsU0FBTyxDQUFDLENBQUMsRUFBRTtBQUNwQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDM0IsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDM0I7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDbEMsUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEY7QUFDQSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEM7QUFDQSxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsSUFBSSxHQUFHLEVBQUU7QUFDOUYsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDN0IsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDN0IsWUFBWSxPQUFPLENBQUMsQ0FBQztBQUNyQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUM1QixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckUsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekQsU0FBUyxNQUFNO0FBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekQsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLFNBQVM7QUFDVCxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUN4QyxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUIsUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUM1QixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckUsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekQsU0FBUyxNQUFNO0FBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekQsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQSxTQUFTQyxTQUFPLENBQUMsQ0FBQyxFQUFFO0FBQ3BCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDbkIsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNyQjtBQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2QjtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUNsQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUM1QixZQUFZLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2xELFlBQVksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwRSxTQUFTLE1BQU07QUFDZixZQUFZLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVB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QyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BD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QUM7QUFDeEQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlELEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxFQUFFLGtCQUFrQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRSxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFD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QyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGdCQUFnQixDQUFDLEdBQUcsVUFBVTtBQUN2QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUM3QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGdCQUFnQixDQUFDLEdBQUcsVUFBVTtBQUN2QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDakcsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLENBQUMsS0FBSyxRQUFRLEtBQUssUUFBUTtBQUNoRCxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUMzQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUMzQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUMzQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUMzQyxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBLFNBQVMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLFNBQVMsbUJBQW1CO0FBQzNELElBQUlBLElBQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLElBQUlBLElBQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLElBQUlBLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDL0IsSUFBSUEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixJQUFJQSxJQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLElBQUlBLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSUEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixJQUFJLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNqQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0SCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUMxQyxJQUFJRCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDdkIsSUFBSSxLQUFLQSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0RCxRQUFRQyxJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBUSxLQUFLRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDL0QsWUFBWSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUN0RSxZQUFZLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFFLE1BQU0sR0FBRyxDQUFDLE1BQU0sR0FBQztBQUM1RSxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO0FBQzlDLElBQUksS0FBS0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlDLFFBQVEsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsT0FBTyxJQUFJLEdBQUM7QUFDaEUsS0FBSztBQUNMLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN0QixJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzNDLENBQUM7QUFDRDtBQUNBO0FBQ0EsVUFBVSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ25DO0FBQ0EsSUFBSUMsSUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixJQUFJQSxJQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUlBLElBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSUEsSUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixJQUFJQSxJQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUlBLElBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSUEsSUFBTSxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDckMsSUFBSUEsSUFBTSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdEMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFFLE9BQU8sSUFBSSxHQUFDO0FBQ3RFLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsSUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUN4QyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQzNDLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDM0M7QUFDQSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ2xFLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN0RSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ2hFLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDaEUsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNuRSxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0tEO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsSUFBTSxlQUFlLEdBS2hDLHdCQUFXLENBQUMsR0FBRyxPQUFXLEtBQUsscUJBQXlCLE9BQU8sTUFBVSxVQUFVLE9BQVc7QUFDbEcsSUFBUSxJ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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUM7O0FDcFRGO0FBQ0E7QUFLTyxTQUFTLHlCQUF5QixDQUFDLEtBQUssVUFBVTtBQUN6RCxJQUFJLHVCQUFtQiw4QkFBSyxFQUFFO0FBQzlCLFFBRFNBLElBQU07O1FBQ1AsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUM3RSxLQUFLO0FBQ0wsSUFBSSxPQUFPLElBQUksQ0FB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LFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakI7OztFQWhDeUMsY0FpQ3hDO0FBQ0Q7QUFDQSwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMxRCxRQUFRLENB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VUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVU7QUFDMU8sUUFBUUEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRQSxJQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVFBLElBQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FB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SSw0QkFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVO0FBQ3pYLFFBQVFBLElBQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUUEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxN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RUFBRSxDQUFDLEtBQUssVUFBVSxDQUFDO0FBQ3JGO0FBQ0EsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1gsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUN0QyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLEtBQUssVUFBVSxDQUFDO0FBQ3BGLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRixFQUFFO0FBQ0Y7QUFDQSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDUjtBQUNBLENBQUMsUUFBUSxTQUFTO0FBQ2xCLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDcEQsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMzQztBQUNBLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE1B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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEY7QUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ1IsR0FBRztBQUNIO0FBQ0EsRUFBRSxRQUFRLENBQUM7QUFDWCxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDcEQsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ25ELEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDMUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNGLEdBQUc7QUFDSDtBQUNBLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDaEIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25GLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDaEI7QUFD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SyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQzNDLElBQUksT0FBTyxJQUFJLEdBQUcsS0FBSyxFQUFFO0FBQ3pCLFFBQVE1RSxJQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9DLFFBQVFELElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUUEsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUMxQjtBQUNBLFFBQVEsT0FBTyxJQUFJLEVBQUU7QUFDckIsWUFBWSxLQUFHLENBQUMsRUFBRSxHQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRTtBQUMzQyxZQUFZLEtBQUcsQ0FBQyxFQUFFLEdBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFO0FBQzNDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFFLFFBQU07QUFDOUIsWUFBWSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUMsWUFBWSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsWUFBWSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcs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QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUlELFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxVQUFRLENBQUMsR0FBRyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQixVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQy9DLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUYsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEM7QUFDQTtBQUNBLEVB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JHLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxVixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVcsR0FBRyxHQUFHLFFBQVE7O0FDOWF6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCQyxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJTixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLENBQUMsRUFBRTtBQUN6QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUlELFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU08sTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNMLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTTSxZQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDL0MsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJUixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxF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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNwQyxFQUFF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QUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDckcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLENBQUMsRUFBRTtBQUN4QixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JoQixLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQmlCLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCQyxnQkFBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNuQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQyxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BnQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUltQixLQUFHLEdBQUdaLFVBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBV2EsS0FBRyxHQUFHTCxVQUFROztBQ3BlekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCZCxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJTixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUQsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTTyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCQyxZQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEUsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJUixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQlMsS0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN0RSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1AsVUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTd0IsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNqQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2hCLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzlDO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQzFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3pDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNpQixTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2hCLGFBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkcsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENB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LENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTWixjQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN2QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGFBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDdkMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xGO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQy9DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5SSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ3hCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCaEIsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JpQixVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsZ0JBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTbkIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNud0IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJbUIsS0FBRyxH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Q0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNPLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsWUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMzRyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlSLFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1MsS0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNQLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3dCLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDakIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNoQixRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEY7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2lCLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0csRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUcsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNoQixhQUFXLENBQUMsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDO0FBQ0EsRUFBRSxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQy9FLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCRyxXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JELE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkQsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtBQUMxQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUNwQixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDcEI7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHUixPQUFnQixFQUFFO0FBQzlCLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDWCxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNkO0FBQ0EsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEI7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM5QyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM5QztBQUNBLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQ2pCO0FBQ0EsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEI7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQjtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEI7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQjtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakI7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQjtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3VCLGlCQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFF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LElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1o7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEI7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsdUJBQXVCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkQ7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxJQUFJLFdBQVcsR0FBRyxJQUFJTCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEQ7QUFDQSxFQUFFLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtBQUNyQixJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM3RSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM3RSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM3RSxHQUFHLE1BQU07QUFDVCxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRSxHQUFHO0FBQ0g7QUFDQSxFQUFFLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDL0MsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN0QyxFQUFFLElBQUksT0FBTyxHQUFHLElBQUlBLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWjtBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO0FBQ2pCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLEdBQUcsTUFBTSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksRUFBRTtBQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLEdBQUcsTUFBTSxJQUFJLElBQUksR0FBRyxJQUFJLEVBQUU7QUFDMUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixHQUFHLE1BQU07QUFDVCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsNEJBQTRCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzNEO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsa0NBQWtDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwRTtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNsQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM1RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDN0QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNkIsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQ2xFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUMxRCxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxFQUFFLENBQUM7QUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO0FBQ3ZDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbEMsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FB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Q2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQixNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO0FBQzdDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7QUFDOUMsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUI7QUFDQSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUd6QixPQUFnQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHQSxPQUFnQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHQSxPQUFnQixFQUFFO0FBQ2pKLElBQUksT0FBT0gsVUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEdBQUc7QUFDSDtBQUNBLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7QUFDdEIsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUN0QixFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbkMsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ1osRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ1osRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUMzQixFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDM0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9CO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDekIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0I7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDWCxHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQixRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO0FBQy9DLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4QztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQzlCLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDOUIsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQy9CLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3BDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2dCLEtBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3RQLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUgsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCaEIsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQmlCLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNsQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsUyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNuQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5MkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFXbUIsS0FBRyxHQUFHWixXQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFXYSxLQUFHLEdBQUdMLFVBQVE7O0FDcHhEekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCZCxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJTixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixH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QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JpQixVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQlIsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JFLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FB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QUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUMsRUFBRSxJQUFJLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsRUFBRSxJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzdFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0UsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcUcsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzNDLEVBQUUsSUFBSSxhQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLElBQUkscUJBQXFCLEdBQUcsYUFBYSxHQUFHLGFBQWEsQ0FBQztBQUM1RCxFQUFFLElBQUksWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLE9BQU8sR0FBRyxxQkFBcUIsR0FBRyxhQUFhLENBQUM7QUFDdEQsRUFBRSxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO0FBQzlDLEVBQUUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLFlBQVksR0FBRyxhQUFhLENBQUM7QUFDakQsRUFBRSxJQUFJLE9BQU8sR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0UsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzdFLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDbkMsRUFBRSxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHQyxNQUFlLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHQSxNQUFlLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQixhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6RCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN6QztBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFD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QUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2I7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM1QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSTtBQUN2QixNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEMsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FB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QUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQk4sS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQmlCLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JSLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0J3QixRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IzQixPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0I0QixhQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQzlDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGlCQUFlLENB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RyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUNuQyxFQUFFLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDckIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsR0FBRztBQUNMLElBQUksRUFBRSxHQUFHcEIsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDM0IsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDcEI7QUFDQSxFQUFFLEdBQUc7QUFDTCxJQUFJLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDM0IsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDcEI7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCcUIsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCQyxlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3BELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDcEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTckMsS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUI7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHRyxPQUFnQixFQUFFO0FBQzVCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEdBQUcsTUFBTTtBQUNUO0FBQ0EsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksVUFBVSxHQUFHNEMsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JyQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcs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QUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFH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QUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUytDLFFBQU0sQ0FBQyxHQUFHLEVBQUU7QUFDNUI7QUFDQTtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUdwQixNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUs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Q25DLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkMsR0FBRyxNQUFNO0FBQ1Q7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLENBQUMsR0FBRyxDQUFDLEdBQUM7QUFDM0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFDO0FBQ25DLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN4RSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDeEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkQsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLElBQUksU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUN4QyxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDakIsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1EsS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDeEUsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJakIsT0FBSyxHQUFHNkQsT0FBVSxDQUFDO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJdEQsWUFBVSxHQUFHdUQsWUFBZSxDQUFDO0FB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Q0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJRCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1EsWUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDM0QsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJUixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsNkJBQTZCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDcEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JrRix5QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuRCxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO0FBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3RELGlCQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMs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LEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JPLEtBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSSxPQUFPLEdBQUc4RSxNQUFTLENBQUM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUksT0FBTyxHQUFHQSxNQUFTLENBQUM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN2QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQnpFLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25ELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JrQixTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsRUFBRXdELFNBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQnZELFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsRCxFQUFFd0QsU0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCdkQsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELEVBQUV3RCxTQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0Isa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDOUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNwRDtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHdEYsT0FBZ0IsRUFBRTtBQUN4QyxJQUFJLE9BQU9FLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JKLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQlMsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdB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QUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3ZDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxLQUFLLEdBQUdvQyxlQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN4QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUytDLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWhELFFBQU0sR0FBR2lELFFBQVcsQ0FBQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSW5DLEtBQUcsR0FBR2QsUUFBTSxDQUFDO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJQyxlQUFhLEdBQUdpRCxlQUFrQixDQUFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJbkMsUUFBTSxHQUFHZCxlQUFhLENBQUM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxJQUFJLFNBQVMsR0FBR0YsZUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DO0FBQ0EsRUFBRSxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUU7QUFDckIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzlCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLFNBQVMsQ0FBQztBQUM3QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLFNBQVMsQ0FBQztBQUM3QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLFNBQVMsQ0FBQztBQUM3QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxJQUFJLFNBQVMsQ0FBQztBQUM3QyxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzVCLEtBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakksQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlJLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU25CLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQyxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlxQjs7QUNqMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkMsUUFBTSxHQUFHO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSU4sVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QztBQUNBLEVBQUUsSUFBSUEsVUFBbUIsSUFBSSxZQUFZLEVBQUU7QUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJRCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1EsWUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJUixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNPLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQkUsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JOLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQmlCLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQlIsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCd0IsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0JDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBZ0IzQixPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQjRCLGFBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDOUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGlCQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxlQUFhLENBQUMsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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LENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQWdCM0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFnQnhDLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDdkM7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sSUFBSSxH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QUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUU7QUFDQTtBQUNBLElBQUksSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7QUFDeEQsUUFBUSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RDtBQUNBLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUs7QUFDckIsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUN0QjtBQUNBO0FBQ0EsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDakQsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSTtBQUM1QyxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUN2RCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3BCO0FBQ0EsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSTtBQUM1QyxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBRSxPQUFPLEtBQUssR0FBQztBQUN2RCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTtBQUM3QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJO0FBQzVDLFlBQVksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMs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QUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVNBLFFBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3hCLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3BDLElBQUksSUFBSSxFQUFFLEdBQUdrRyxNQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHQSxNQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHQSxNQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHQSxNQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQztBQUNBLElBQUksSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUUsT0FBTyxJQUFJLEdBQUM7QUFDNUM7QUFDQSxJQUFJLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBRSxPQUFPLElBQUksR0FBQztBQUN2RCxJQUFJLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBRSxPQUFPLElBQUksR0FBQztBQUN2RCxJQUFJLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBRSxPQUFPLElBQUksR0FBQztBQUN2RCxJQUFJLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBRSxPQUFPLElBQUksR0FBQztBQUN2RDtBQUNBLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM1QixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVILENBQUM7QUFDRDtBQUNBLFNBQVNBLE1BQUksQ0FBQyxHQUFHLEVBQUU7QUFDbkIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxHQUFHO0FBQ1AsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM5RSxnQkFBZ0IsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBRSxPQUFPLElBQUksR0FBQztBQUN6RCxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ25CLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3RCO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDMUQsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzVCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUNiLFFBQVEsTUFBTSxHQUFHLEtBQUs7QUFDdEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM1QixRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0IsSUFBSSxHQUFHO0FBQ1AsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoRSxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFD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Q0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDcEUsd0JBQTRCQSxJQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELHdCQUE0QixJQUFJLFlBQVksR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFFLFlBQVksR0FBRyxDQUFDLEdBQUM7QUFDOUU7QUFDQSx3QkFBNEIsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDOUcsd0JBQTRCLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzlHO0FBQ0Esd0JBQTRCLFlBQVksSUFBSSxJQUFJLENBQUM7QUFDakQ7QUFDQSx3QkFBNEIsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDOUcsd0JBQTRCLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzlHO0FBQ0Esd0JBQTRCQSxJ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RUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLElBQUksRUFBRSxHQUFHO0FBQ2IsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLENBQUMsQ0FBQztBQUNGO0FBQ2UsU0FBUyxzQkFBc0IsQ0FB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SSxFQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0FBQ2xFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFDO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUM7QUFDdkIsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQztBQUM3RDtBQUNBLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQzFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBQztBQUM1QixJQUFJLENBQUMsR0FBRyxLQUFJO0FBQ1osR0FBRyxNQUFNO0FBQ1QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUM7QUFDOUMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMzQyxNQUFNLENBQUMsR0FBRTtBQUNULE1BQU0sQ0FBQyxJQUFJLEVBQUM7QUFDWixLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsR0FB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RyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQztBQUN0QztBQUNBLFFBQVEsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUM7QUFDckU7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3hCLEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQzlCLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLEVBQUUsU0FBUyxHQUFHLEVBQUU7QUFDL0IsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFVB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QUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBQztBQUNqRixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFDO0FBQ2pGLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUM7QUFDakYsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBQztBQUNqRixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFDO0FB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LEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDdkQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLENBQUM7QUFDRDtBQUNBLFNBQVMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUN2QyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDakM7QUFDQSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFFLFNBQU87QUFDdEYsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUUsU0FBTztBQUN0RixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBRSxTQUFPO0FBQ3RGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFFLFNBQU87QUFDdEYsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUUsU0FBTztBQUN0RixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN0QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3BELElBQUksSUFBSSxRQUFRO0FBQ2hCLFFBQVEsR0FBRyxJQUFJLE1BQU0sR0FBRyxDQUFDO0FBQ3pCLFFBQVEsR0FBRyxJQUFJLFFBQVEsR0FBRyxDQUFDO0FBQzNCLFFBQVEsR0FBRyxJQUFJLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRTtBQUNBO0FBQ0EsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUM7QUFDckYsQ0FBQztBQUNEO0FBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRztBQUMxRyxTQUFTLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEtBQUs7QUFDMUcsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxJQUFJO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRztBQUMxRyxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEdBQUc7QUFDMUcsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxFQUFFO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUMsR0FBRztBQUMxRyxTQUFTLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEVBQUU7QUFDMUc7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM5QixJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDckIsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVCLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNuQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM3QixJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDckIsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVCLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqQyxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNqQixJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQjtBQUNBLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFO0FBQ3BCLFFBQVEsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLFFBQVEsSUFBSSxnQkFBZ0I7QUFDNUIsWUFBWSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekIsWUFBWSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekIsWUFBWSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUI7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLGdCQUFnQixHQUFHLEdBQUcsSUFBRSxRQUFNO0FBQzlDO0FBQ0EsUUFBUSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3ZCO0FBQ0EsUUFBUSxJQUFJLGdCQUFnQixLQUFLLENBQUMsRUFBRTtBQUNwQyxZQUFZLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtBQUMzQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QixhQUFhO0FBQ2IsU0FBUyxNQUFNLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO0FBQzNDLFlBQVksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUIsWUFBWSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksTUFBTSxJQUFJLEVBQUU7QUFDdEMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNyRCxnQkFBZ0IsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO0FBQy9CLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzdCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUyxNQUFNLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO0FBQzNDLFlBQVksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUIsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQzlELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN6RSxnQkFBZ0IsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFO0FBQ2hFLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzdCLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUyxNQUFNLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO0FBQzNDLFlBQVksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUIsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFlBQVksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxNQUFNLElBQUksRUFBRTtBQUN0RixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMvRixnQkFBZ0IsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxRQUFRLEVBQUU7QUFDbEQsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0IsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtBQUN4QixZQUFZLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdkIsWUFBWSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDakM7QUFDQSxTQUFTLE1BQU0sSUFBSSxDQUFDLEdBQUcsTUFBTSxFQUFFO0FBQy9CLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQztBQUN6QixZQUFZLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ2xFLFlBQVksQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ25DLFNBQVM7QUFDVDtBQUNBLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsUUFBUSxDQUFDLElBQUksZ0JBQWdCLENBQUM7QUFDOUIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFDRDtBQUNBLFNBQVMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDNUMsSUFBSSxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNsQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbEQsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QjtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUU7QUFDdEMsWUFBWSxJQUFJLElBQUksRUFBRTtBQUN0QixnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsTUFBTSxFQUFFO0FBQ2hDLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdEMsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0QyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLG9CQUFvQixTQUFTO0FBQzdCLGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxHQUFHLE1BQU0sSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDbkUsb0JBQW9CLElBQUksR0FBRyxJQUFJLENBQUM7QUFDaEMsaUJBQWlCO0FBQ2pCLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzFELG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdEMsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0QyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLGlCQUFpQjtBQUNqQixnQkFBZ0IsU0FBUztBQUN6QixhQUFhO0FBQ2IsU0FBUyxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRTtBQUN0QixZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixTQUFTLE1BQU07QUFDZixZQUFZLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRTtBQUMzQixnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDN0MsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUU7QUFDakMsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ2pELGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztBQUNsRCxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3hELGlCQUFpQjtBQUNqQixnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3BELGFBQWE7QUFDYixZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmOztBQ2pvQkE7QUFLQUEsSUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVMsY0FBYyxDQUFDLEdBQUcsVUFBVSxNQUFNLHFCQUFxQixHQUFHLFlBQVk7QUFDL0UsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDbkIsUUFBUSxHQUFHLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvQyxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxhQUFhLENBQUMsR0FBRyxVQUFVLE1BQU0scUJBQXFCLEdBQUcsWUFBWTtBQUM5RSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNuQixlQUE2RCxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUU7UUFBOUU7UUFBSTtRQUFRO1FBQU87UUFBUTtRQUFNO1FBQUssMEJBQTBDO0FBQy9GLFFBQVEsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNwQixnQkFBWSxFQUFFO0FBQ2QsWUFBWSxNQUFNLEVBQUUsSUFBSSxVQUFVLENBQUM7QUFDbkMsZ0JBQWdCLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxHQUFHLE1BQU07QUFDekMsZ0JBQWdCLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU07QUFDM0MsYUFBYSxFQUFFLE1BQU0sQ0FBQztBQUN0QixZQUFZLE9BQU8sRUFBRSxRQUFDLEtBQUssVUFBRSxNQUFNLFFBQUUsSUFBSSxPQUFFLEdBQUcsV0FBRSxPQUFPLENBQUM7QUFDeEQsU0FBUyxDQUFDLENBQUM7QUFDWCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxVQUFVLEtBQUssVUFBVSxHQUFHLFlBQVk7QUFDOUQsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUM7QUFDL0MsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUM7QUFDdkQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUM7QUFDdkQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUM7QUFDeEQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUM7QUFDdkQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUM7QUFDdEQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUM7QUFDekQsQ0FBQztBQUNEO0FBQ0Esd0JBQXlCLElBQUksK0NBQStDO0FBQzVFLElBQUksT0FBTyxJQUFJb04sR0FBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUNEO0FBQ09wTixJQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQzs7QUMxQ3hCLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUN2QztBQUNBO0FBQ0EsSUFBSUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLElBQUlBLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUNyQjtBQUNBLElBQUkseUJBQWtCLGtDQUFLLEVBQUU7QUFDN0IsUUFEU0MsSUFBTTs7UUFDUCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksS0FBSyxDQUFDLElBQUksV0FBRSxDQUFDLEVBQUUsQ0FBQyxXQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLElBQUlBLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzdFO0FBQ0E7QUFDQSxJQUFJQSxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDOUQ7QUFDQSxJQUFJRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSUEsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ25CO0FBQ0EsSUFBSSwyQkFBa0Isb0NBQUssRUFBRTtBQUM3QjtBQUNBLFFBRlNDLElBQU1xTjs7UUFFUCxLQUFLdE4sSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyRCxZQUFZQyxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQTtBQUNBLFlBQVksSUFBSXFOLEtBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSUEsS0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFFLFdBQVM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZQSxLQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUIsWUFBWUEsS0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVCO0FBQ0EsWUFBWSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUVBLEtBQUcsQ0FBQyxDQUFDLEdBQUdBLEtBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxZQUFZLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRUEsS0FBRyxDQUFDLENBQUMsR0FBR0EsS0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsWUFBWSxJQUFJQSxLQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLElBQUlBLEtBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtBQUN4RDtBQUNBLGdCQUFnQnJOLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFDO0FBQ3hEO0FBQ0EsYUFBYSxNQUFNLElBQUlxTixLQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsS0FBSyxDQUFDLENBQUMsSUFBSUEsS0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxnQkFBZ0IsS0FBSyxDQUFDLENBQUMsSUFBSUEsS0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQztBQUNBLGFBQWEsTUFBTSxJQUFJQSxLQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLElBQUlBLEtBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakMsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDLElBQUlBLEtBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakM7QUFDQSxhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDNUIsb0JBQW9CLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHQSxLQUFHLENBQUMsQ0FBQztBQUN0QyxvQkFBb0IsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlCLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBR0EsS0FBRyxDQUFDLENBQUM7QUFDdEMsb0JBQW9CLENBQUMsRUFBRUEsS0FBRyxDQUFDLENBQUM7QUFDNUIsaUJBQWlCLENBQUMsQ0FBQztBQUNuQixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsSUFBSUEsS0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxnQkFBZ0IsS0FBSyxDQUFDLENBQUMsSUFBSUEsS0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQyxhQUFhO0FBQ2IsWUFBWSxNQUFNO0FBQ2xCLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU87QUFDWCxRQUFRLENBQUMsRUFBRSxLQUFLO0FBQ2hCLFFBQVEsQ0FBQyxFQUFFLE1BQU07QUFDakIsUUFBUSxJQUFJLEVBQUUsQ0FBQyxJQUFJLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDNUMsS0FBSyxDQUFDO0FBQ04sQ0FBQzs7QUM3RkQ7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FyTixJQUFNLGFBQWEsV0FBVyxDQUFDLENBQUM7QUFDaEM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQWEsYUFBYSxHQVF0QixzQkFBVyxDQUFDLFVBQVUsU0FBMEQsWUFBYztzQ0FBbkQ7Z0NBQVM7a0NBQVU7a0NBQVU7O0FBQXVCO0FBQ25HLE1BQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDckMsTUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUNyQyxNQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ2pDLE1BQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFDakMsTUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMvQixNQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQy9COztvSkFBSTtBQUNKO0FBQ0EsRUFBSSxtQkFBSSxxQ0FBdUI7QUFDL0IsTUFBUSxPQUFPO0FBQ2YsVUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxhQUFhO0FBQzdDLFVBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsYUFBYTtBQUM3QyxPQUFTLENBQUM7QUFDVixHQUFJO0FBQ0o7QUFDQSxFQUFJLG1CQUFJLHFDQUF1QjtBQUMvQixNQUFRLE9BQU87QUFDZixVQUFZLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLGFBQWE7QUFDakUsVUFBWSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxhQUFhO0FBQ2pFLE9BQVMsQ0FBQztBQUNWLEdBQUk7QUFDSjtBQUNBLEVBQUksbUJBQUksb0NBQXNCO0FBQzlCLE1BQVEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsR0FBSTtBQUNKO0FBQ0EsRUFBSSxtQkFBSSw4Q0FBZ0M7QUFDeEMsTUFBUSxPQUFPO0FBQ2YsVUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLGFBQWEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVU7QUFDckUsVUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLGFBQWEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVU7QUFDckUsT0FBUyxDQUFDO0FBQ1Y7O3VFQUNDO0FBQ0Q7QUFDZSxJQUFNLFVBQVUsR0FPM0IsbUJBQVcsQ0FBQyxLQUFLLDJCQUE2QixRQUFRLDJCQUE2QjtBQUN2RixNQUFRQSxJQUFNLGFBQWEsR0FBRyxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQ3hELE1BQVEsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUN0QztBQUNBLE1BQVFBLElBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN4QjtBQUNBLE1BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25ELE1BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekQ7QUFDQSxhQUFvQixHQUFHLE9BQU8sQ0FBQyxJQUFJO01BQXBCO01BQUcsY0FBbUI7QUFDckMsTUFBUUEsSUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckU7QUFDQSxNQUFRLEtBQUtBLElBQU0sRUFBRSxJQUFJLEtBQUssRUFBRTtBQUNoQyxVQUFZQSxJQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsVUFBWUEsSUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNyRCxVQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUgsTUFBUTtBQUNSO0FBQ0EsTUFBUSxLQUFLQSxJQUFNc04sSUFBRSxJQUFJLFFBQVEsRUFBRTtBQUNuQyxVQUFZdE4sSUFBTXVOLEtBQUcsR0FBRyxRQUFRLENBQUNELElBQUUsQ0FBQyxDQUFDO0FBQ3JDLFVBQVl0TixJQUFNd04sS0FBRyxHQUFHLGdCQUFnQixDQUFDRixJQUFFLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDeEQsVUFBWXROLElBQU0sQ0FBQyxHQUFHd04sS0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhO0FBQzNDLGNBQWdCLENBQUMsR0FBR0EsS0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhO0FBQ3pDLGNBQWdCQyxHQUFDLEdBQUdGLEtBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSztBQUNsQyxjQUFnQkcsR0FBQyxHQUFHSCxLQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNwQztBQUNBLFVBQVksU0FBUyxDQUFDLElBQUksQ0FBQ0EsS0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFDLENBQUMsS0FBRSxDQUFDLENBQUMsRUFBRUEsS0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUNBLEtBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUVHLEdBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHQSxHQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRUQsR0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLFVBQVksU0FBUyxDQUFDLElBQUksQ0FBQ0YsS0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFRSxHQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsVUFBWSxTQUFTLENBQUMsSUFBSSxDQUFDRixLQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRUUsR0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHQSxHQUFDLEtBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRUMsR0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRyxVQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUNILEtBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFRyxHQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hHO0FBQ0E7QUFDQSxVQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUNILEtBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25HLFVBQVksU0FBUyxDQUFDLElBQUksQ0FBQ0EsS0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUVFLEdBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBR0EsR0FBQyxFQUFFLENBQUMs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LElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM5QjtBQUNBLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQztBQUNBLElBQUksSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEQsUUFBUSxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RDtBQUNBLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLFFBQVEsTUFBTSxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxHQUFHLEdB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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFlBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFDLFVBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFDLFVBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJO0FBQzNQLEVBQUM7QUFDTDswQkFDSSwwQ0FBZ0I7QUFDcEIsSUFBUUEsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLElBQVEscUNBQ0ksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFDLGdCQUVwRCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUMsK0JBRTNELElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBQyxpQkFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFDLFNBQUs7QUFDdkUsRUFDSDtB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R0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RTtBQUNBLFFBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFO0FBQ0EsUUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxLQUFTO0FBQ1Q7QUFDQSxJQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLElBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxJQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekUsSUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsRUFBQztBQUNMO2tCQUNJLG9CQUFJLENBQUMsTUFBVSxDQUFDLE1BQVU7QUFDOUIsSUFBUUMsSUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4RCxJQUFRQSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsSUFBUUEsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDbEcsSUFBUSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsRUFBQztBQUNMO2tCQUNJLDhDQUFrQjtBQUN0QixJQUFRLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM3RyxFQUFDO0FBQ0w7a0JBQ0ksc0JBQUssQ0FBQyxNQUFVLENBQUMsTUFBVTtBQUMvQixJQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsOENBQThDLENBQUMsR0FBQztBQUM5SSxJQUFRLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUM7QUFDTDtrQkFDSSx3Q0FBYyxDQUFDLE1BQVUsQ0FBQyxNQUFVLENBQUMsTUFBVTtBQUNuRDtBQUNBO0FBQ0EsSUFBUSxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRTtBQUM5RCxFQUFDO0FBQ0w7a0JBQ0ksOENBQWlCLENBQUMsTUFBVSxDQUFDLE1BQVUsQ0FBQyxNQUFVO0FBQ3REO0FBQ0E7QUFDQSxJQUFRLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUMvQyxFQUFDO0FBQ0w7a0JBQ0ksa0NBQVk7QUFDaEIsSUFBUSxPQUFPLElBQUksU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdEcsRUFBQztBQUNMO2tCQUNJLDBDQUFlLFVBQVUsT0FBVyxFQUFFLE1BQVUsRUFBRSxNQUFVO0FBQ2hFLElBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFVBQVUsQ0FBQyxHQUFHLElBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxHQUFDO0FBQ25GO0FBQ0EsSUFBUUQsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHO0FBQ2hDLFFBQVksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHO0FBQzNDLFFBQVksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRztBQUNoQyxRQUFZLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzVDO0FBQ0EsSUFBUSxRQUFRLEVBQUU7QUFDbEIsSUFBUSxLQUFLLENBQUMsQ0FBQztBQUNmLFFBQVksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDNUIsUUFBWSxNQUFNO0FBQ2xCLElBQVEsS0FBSyxDQUFDO0FBQ2QsUUFBWSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUM1QixRQUFZLE1BQU07QUFDbEIsS0FBUztBQUNUO0FBQ0EsSUFBUSxRQUFRLEVBQUU7QUFDbEIsSUFBUSxLQUFLLENBQUMsQ0FBQztBQUNmLFFBQVksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDNUIsUUFBWSxNQUFNO0FBQ2xCLElBQVEsS0FBSyxDQUFDO0FBQ2QsUUFBWSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUM1QixRQUFZLE1BQU07QUFDbEIsS0FBUztBQUNUO0FBQ0EsSUFBUUMsSUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUNsQyxJQUFRQSxJQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ2xDLElBQVEsS0FBS0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsUUFBWSxLQUFLQSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxZQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEYsU0FBYTtBQUNiLEtBQVM7QUFDTDtBQUVKO0FBQ0EsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUM1SDdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2lRLGFBQVcsQ0FBQyxLQUFLLGlCQUFpQixLQUFLLGdDQUFnQztBQUN2RixJQUFJaFEsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLEtBQUssSUFBRSxPQUFPLE1BQU0sR0FBQztBQUM5QjtBQUNBLDJCQUFnQztBQUNoQyxRQURTQSxJQUFNOztPQUNQQSxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUTtBQUN0QyxhQUFhLEdBQUcsV0FBRSxFQUFFLFdBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUMsQ0FBQztBQUM1QyxhQUFhLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QjtBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUNqQyxZQUFZLE9BQVM7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVEsQ0FBQyxNQUFNLE9BQU8sTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxNQUFNLE9BQU8sc0JBQXNCLEVBQUU7QUFDbEQsWUFBWSxDQUFDLE1BQU0sT0FBTyxvQkFBb0IsR0FBRyxDQUFDLE1BQU0sT0FBTyxzQkFBc0IsQ0FBQyxHQUFHLFdBQUUsR0FBRyxXQUFLLE1BQU0sQ0FBQyxNQUFNLFdBQUUsQ0FBQyxXQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssTUFBRyxDQUFDLENBQUMsQ0FBQyxJQUFDLENBQUMsQ0FBQztBQUMxSSxTQUFTO0FBQ1QsUUFBUSx1QkFBb0IsK0JBQU0sRUFBRTtBQUNwQyxZQURhQSxJQUFNOztXQUNQLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3RDLFNBQVM7QUFDVDs7SUFsQkksMkJBQXFCLG9DQUFLLFNBa0J6QjtBQUNMO0FBQ0EsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDOztBQzFIRDtBQUNBO0FBR0EsSUFBTSxlQUFlLEdBSWpCLHdCQUFXLENBQUMsT0FBTyxhQUFpQjtBQUN4QyxJQUFRLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLElBQVEsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDbEMsSUFBUSxLQUFLRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDakQsUUFBWUMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLFFBQVksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsUUFBWSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUM3QyxLQUFTO0FBQ0wsRUFBQztBQUNMOzBCQUNJLDBCQUFPLE1BQU0sTUFBVTtBQUMzQixJQUFRNkIsUUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDL0MsSUFBUSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEMsRUFBQztBQUNMOzBCQUNJLDBCQUFPLENBQUMsTUFBVTtBQUN0QixJQUFRQSxRQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsSUFBUSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsRUFDSDs7QUMzQkQ7QUFDQTtBQUNBO0FBQ0EsSUFBTSxPQUFPLEdBUVQsZ0JBQVcsQ0FBQyxpQkFBaUIsaUJBQXFCLENBQUMsTUFBVSxDQUFDLE1BQVUsQ0FBQyxNQUFVLEVBQUUsc0JBQTBCO0FBQ25ILElBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7QUFDOUI7QUFDQSxJQUFRLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxJQUFRLENBQUMsaUJBQWlCLEdBQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN4QyxJQUFRLENBQUMsaUJBQWlCLEdBQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN4QyxJQUFRLENBQUMsaUJBQWlCLEdBQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN4QztBQUNBLElBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7QUFDdkQsSUFBUSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqQjs7Z0VBQUM7QUFDTDtBQUNJb08scUJBQUkseUNBQTZCO0FBQ3JDLElBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtBQUMxQyxRQUFZLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVM7QUFDOUQsWUFBZ0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQU8sRUFBRTtBQUNqRCxZQUFnQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBTyxFQUFFO0FBQ2pELFlBQWdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQzlFLEtBQVM7QUFDVCxJQUFRLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUMxQixFQUFDO0FBQ0w7QUFDSUEscUJBQUkseUJBQVMsQ0FBQyxnQkFBb0I7QUFDdEMsSUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN2QixFQUFDO0FBQ0w7a0JBQ0ksNEJBQVM7QUFDYixJQUFRalEsSUFBTSxJQUFJLEdBQUc7QUFDckIsUUFBWSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7QUFDbkMsS0FBUyxDQUFDO0FBQ1YsSUFBUSxLQUFLQSxJQUFNLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDOUIsUUFBWSxJQUFJLENBQUMsS0FBSyxXQUFXLElBQUksQ0FBQyxLQUFLLG9CQUFvQixJQUFFLFdBQVM7QUFDMUUsUUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQU8sQ0FBQyxDQUFDLENBQUM7QUFDckMsS0FBUztBQUNULElBQVEsT0FBTyxJQUFJLENBQUM7QUFDaEI7O21FQUNIOztBQy9DRDtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNLGtCQUFrQixHQUtwQiwyQkFBVyxHQUFHO0FBQ2xCLElBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDeEIsSUFBUSxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMvQixJQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQzVCLEVBQUM7QUFDTDs2QkFDSSxvQ0FBWSxXQUFXLE1BQVUsU0FBUyxlQUFtQixRQUFRLE1BQVU7QUFDbkYsSUFBUUEsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFDLElBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM5RSxJQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDaEcsSUFBUSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNsRTtBQUNBLElBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUN0RCxRQUFZLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pELFFBQVksS0FBS0EsSUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRTtBQUN0RCxZQUFnQixJQUFJLEVBQUUsS0FBSyxPQUFPLElBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUM7QUFDL0UsU0FBYTtBQUNiLEtBQVMsTUFBTTtBQUNmLFFBQVlBLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQztBQUMvSCxRQUFZLElBQUkscUJBQXFCLEVBQUU7QUFDdkMsWUFBZ0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDOUQsWUFBZ0IsS0FBS0EsSUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNyRSxnQkFBb0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksR0FBQztBQUMvRixhQUFpQjtBQUNqQixTQUFhLE1BQU07QUFDbkIsWUFBZ0IsS0FBS0EsSUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO0FBQzVDLGdCQUFvQkEsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ2xMLGdCQUFvQixJQUFJLGVBQWUsSUFBRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUM7QUFDOUYsYUFBaUI7QUFDakIsU0FBYTtBQUNiLEtBQVM7QUFDTCxFQUFDO0FBQ0w7NkJBQ0ksa0RBQW1CLFdBQVcsTUFBVSxTQUFTLGdCQUFvQixHQUFHLE9BQVc7QUFDdkYsSUFBUUEsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUM1RSxJQUFRLElBQUksa0JBQWtCLElBQUUsU0FBTztBQUN2QztBQUNBLElBQVFBLElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMxQztBQUNBLElBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNoRjtBQUNBLElBQVEsSUFBSSxHQUFHLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtBQUM1QyxRQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDbkUsWUFBZ0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMxRyxZQUFnQixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyRSxTQUFhO0FBQ2IsS0FBUyxNQUFNLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtBQUM1QyxRQUFZQSxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDNUcsUUFBWSxJQUFJLGFBQWEsRUFBRTtBQUMvQixZQUFnQixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM5RCxZQUFnQixLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFDO0FBQzFIO0FBQ0EsU0FBYSxNQUFNO0FBQ25CLFlBQWdCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hFLFNBQWE7QUFDYixLQUFTLE1BQU07QUFDZixRQUFZLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ25ELEtBQVM7QUFDVDtBQUNJLEVBQUM7QUFDTDs2QkFDSSw4QkFBUyxXQUFXLE1BQVUsU0FBUyxlQUFtQjtBQUM5RCxJQUFRQSxJQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUMsSUFBUUEsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkQsSUFBUUEsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDN0Q7QUFDQSxJQUFRQSxJQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM1RTtBQUNBO0FBQ0EsSUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxJQUFFLE9BQU8sRUFBRSxHQUFDO0FBQ2hFLFNBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFO0FBQ2xELFFBQVlBLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNoRixRQUFZLElBQUksZ0JBQWdCLEtBQUssSUFBSSxJQUFFLE9BQU8sRUFBRSxHQUFDO0FBQ3JELFFBQVksS0FBS0EsSUFBTSxJQUFJLElBQUksZ0JBQWdCLElBQUUsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUM7QUFDOUUsS0FBUztBQUNULElBQVEsT0FBTyxlQUFlLENBQUM7QUFDM0IsRUFBQztBQUNMOzZCQUNJLG9EQUFvQixJQUFJLElBQVEsT0FBTyxHQUFPO0FBQ2xELElBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLEVBQUM7QUFDTDs2QkFDSSw0Q0FBZ0IsS0FBSyxnQkFBb0IsT0FBTyxHQUFPO0FBQzNEO0FBQ0EsSUFBUUEsSUFBTSxlQUFlLG1CQUF1QixFQUFFLENBQUM7QUFDdkQ7QUFDQSxJQUFRLEtBQUtBLElBQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDckQsUUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3JFLFFBQVlBLElBQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUNuQyxRQUFZLEtBQUtBLElBQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDbEUsWUFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUM7QUFDN0YsWUFBZ0IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2xHLFlBQWdCLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hFLFNBQWE7QUFDYixRQUFZLGVBQWUsQ0FBQyxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDdkQsS0FBUztBQUNUO0FBQ0EsSUFBUSxLQUFLQSxJQUFNa1EsYUFBVyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDdEQsUUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDQSxhQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDQSxhQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckUsUUFBWWxRLElBQU1tUSxhQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ25DO0FBQ0EsUUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUNELGFBQVcsQ0FBQyxLQUFLLElBQUksRUFBRTtBQUMxRCxZQUFnQixLQUFLbFEsSUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQ2tRLGFBQVcsQ0FBQyxFQUFFO0FBQzFELGdCQUFvQkMsYUFBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QyxnQkFBb0IsSUFBSSxDQUFDLEtBQUssQ0FBQ0QsYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JELGFBQWlCO0FBQ2pCLFNBQWEsTUFBTTtBQUNuQixZQUFnQixLQUFLbFEsSUFBTXFGLFNBQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDNkssYUFBVyxDQUFDLEVBQUU7QUFDdkUsZ0JBQW9CbFEsSUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDa1EsYUFBVyxDQUFDLENBQUM3SyxTQUFPLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDdEcsZ0JBQW9CLElBQUksdUJBQXVCLElBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQzZLLGFBQVcsQ0FBQyxDQUFDN0ssU0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFDO0FBQ3ZGLHFCQUF5QjtBQUN6QixvQkFBd0IsdUJBQWtCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzZLLGFBQVcsQ0FBQyxDQUFDN0ssU0FBTyxDQUFDLDBCQUFDLEVBQUU7QUFDakcsd0JBRDZCckYsSUFBTTs7NEJBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDa1EsYUFBVyxDQUFDLENBQUM3SyxTQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RSxxQkFBeUI7QUFDekIsaUJBQXFCO0FBQ3JCLGdCQUFvQjhLLGFBQVcsQ0FBQzlLLFNBQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM2SyxhQUFXLENBQUMsQ0FBQzdLLFNBQU8sQ0FBQyxDQUFDO0FBQzVFLGFBQWlCO0FBQ2pCLFNBQWE7QUFDYjtBQUNBLFFBQVksZUFBZSxDQUFDNkssYUFBVyxDQUFDLEdBQUcsZUFBZSxDQUFDQSxhQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDOUUsUUFBWSxNQUFNLENBQUMsZUFBZSxDQUFDQSxhQUFXLENBQUMsRUFBRUMsYUFBVyxDQUFDLENBQUM7QUFDOUQsS0FBUztBQUNUO0FBQ0EsSUFBUSxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMvQixJQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ2hDO0FBQ0EsSUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBRSxTQUFPO0FBQzlEO0FBQ0EsSUFBUSxLQUFLblEsSUFBTSxFQUFFLElBQUksS0FBSyxFQUFFO0FBQ2hDLFFBQVlBLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQyxRQUFZLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELEtBQVM7QUFDTCxFQUNIOztBQzVKRDtBQUNBO0FBMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU0sWUFBWSxHQWdCZCxxQkFBVyxDQUFDLE1BQU0sZ0JBQW9CLFNBQVMsd0JBQTRCO0FBQy9FLElBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDN0IsSUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLElBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsSUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUkyRCxTQUFJLENBQUNzQixRQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVDLElBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJdEIsU0FBSSxDQUFDc0IsUUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QyxJQUFRLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7QUFDekQsSUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUMvQixFQUFDO0FBQ0w7dUJBQ0ksMEJBQU8sT0FBTyxpQkFBcUIsUUFBUSxtQkFBdUIsWUFBWSxNQUFVLGdCQUFnQixNQUFVLFdBQVcsTUFBVSxJQUFJLFFBQVk7QUFDM0osSUFBUWpGLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7QUFDbEQsSUFBUSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN4RjtBQUNBLElBQVFBLElBQU0sSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDcEQ7QUFDQSxJQUFRLEtBQUtELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRCxRQUFZQyxJQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckM7QUFDQSxRQUFZQSxJQUFNLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRSxRQUFZLEtBQUtELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRCxZQUFnQkMsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFlBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsWUFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxZQUFnQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELFlBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsU0FBYTtBQUNiO0FBQ0EsUUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBR2lGLFFBQU07QUFDaEMsWUFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHQSxRQUFNO0FBQ2hDLFlBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzVCLFlBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDOUIsWUFBZ0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckUsU0FBYTtBQUNiLEtBQVM7QUFDTCxFQUFDO0FBQ0w7dUJBQ0ksb0VBQStDO0FBQ25ELElBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFDNUIsUUFBWSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUltTCxVQUFFLENBQUMsVUFBVSxDQUFDLElBQUloRCxHQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3JGLFFBQVksSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7QUFDbkksS0FBUztBQUNULElBQVEsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ3pCLEVBQUM7QUFDTDtBQUNJO3VCQUNBLHdCQUFNLElBQUksZUFBbUIsV0FBVyx5QkFBNkIsZ0JBQWdCLHFCQUF5QixrQkFBa0IsdUZBQStGOztBQUFDO0FBQ3BPLElBQVEsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzVCO0FBQ0EsSUFBUXBOLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRTtBQUN4QyxRQUFZLGlCQUFpQixHQUFHaUYsUUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUs7QUFDbkUsUUFBWSxNQUFNLEdBQUdvTCxZQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xEO0FBQ0EsSUFBUXJRLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDakQsSUFBUUEsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztBQUNuRTtBQUNBLElBQVFBLElBQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNoRCxJQUFRQSxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQ3pKO0FBQ0EsSUFBUUEsSUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2pFLElBQVFBLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztBQUM1QyxZQUFnQixZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksRUFBRSxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVk7QUFDdEosc0JBQWlCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBSztBQUN4QyxnQkFBb0IsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxHQUFHLFlBQVksRUFBRSxHQUFHLEdBQUcsWUFBWSxFQUFFLEdBQUcsR0FBRyxZQUFZLEVBQUUsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQzFKLGFBQWlCLENBQUMsQ0FBQztBQUNuQjtBQUNBLElBQVEsdUJBQWtCLG1DQUFVLEVBQUU7QUFDdEMsUUFEYUEsSUFBTTs7WUFDUCxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLEtBQVM7QUFDVDtBQUNBLElBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ2hEO0FBQ0EsSUFBUUEsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQzFCLElBQVFELElBQUksYUFBYSxDQUFDO0FBQzFCLDhCQUFrRDtBQUNsRCxRQUFZQyxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEM7QUFDQTtBQUNBLFFBQVksSUFBSSxLQUFLLEtBQUssYUFBYSxJQUFFLFNBQVM7QUFDbEQsUUFBWSxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBQ2xDO0FBQ0EsUUFBWUEsSUFBTSxLQUFLLEdBQUcyQixNQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVELFFBQVk1QixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDdkMsUUFBWTRCLE1BQUksQ0FBQyxtQkFBbUI7QUFDcEMsWUFBZ0IsTUFBTTtBQUN0QixZQUFnQixLQUFLLENBQUMsV0FBVztBQUNqQyxZQUFnQixLQUFLLENBQUMsZ0JBQWdCO0FBQ3RDLFlBQWdCLEtBQUssQ0FBQyxZQUFZO0FBQ2xDLFlBQWdCLE1BQU07QUFDdEIsWUFBZ0IsTUFBTSxDQUFDLE1BQU07QUFDN0IsWUFBZ0IsTUFBTSxDQUFDLGVBQWU7QUFDdEMsWUFBZ0IsV0FBVztBQUMzQixZQUFnQixnQkFBZ0I7QUFDaEMsWUFBZ0Isa0JBQWtCO0FBQ2xDLHNCQUFpQixPQUFPLGlCQUFxQixVQUFVLFVBQWMsWUFBWSxNQUFhO0FBQzlGLGdCQUFvQixJQUFJLENBQUMsZUFBZSxFQUFFO0FBQzFDLG9CQUF3QixlQUFlLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLGlCQUFxQjtBQUNyQjtBQUNBLGdCQUFvQixPQUFPLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUVBLE1BQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEwsYUFBaUI7QUFDakIsU0FBYSxDQUFDO0FBQ2Q7O1FBNUJRLEtBQUs1QixJQUFJbVAsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsWUE0QnZDO0FBQ1Q7QUFDQSxJQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLEVBQUM7QUFDTDt1QkFDSTtBQUNKLElBQVEsTUFBTTtBQUNkLElBQVEsV0FBVztBQUNuQixJQUFRLGdCQUFnQjtBQUN4QixJQUFRLFlBQVk7QUFDcEIsSUFBUSxNQUFNO0FBQ2QsSUFBUSxjQUFjO0FBQ3RCLElBQVEsZUFBZTtBQUN2QixJQUFRLFdBQVc7QUFDbkIsSUFBUSxnQkFBZ0I7QUFDeEIsSUFBUSxrQkFBa0I7QUFDMUIsSUFBUSxnQkFBZ0IsMkhBQStIO0FBQ3ZKO0FBQ0EsSUFBUWxQLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUQsSUFBUSxJQUFJLGNBQWMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDO0FBQ3hFLFVBQVksU0FBTztBQUNuQjtBQUNBLElBQVFBLElBQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMvRSxJQUFRQSxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzNELElBQVFBLElBQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDMUQ7QUFDQSxJQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUM7QUFDdEYsVUFBWSxTQUFPO0FBQ25CO0FBQ0EsSUFBUUEsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDeEQ7QUFDQSxJQUFRLEtBQUtELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRCxRQUFZQyxJQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEM7QUFDQSxRQUFZLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3ZFLFlBQWdCLFNBQVM7QUFDekIsU0FBYTtBQUNiO0FBQ0EsUUFBWUEsSUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BEO0FBQ0EsUUFBWSxJQUFJLENBQUMsVUFBVSxJQUFFLFdBQVM7QUFDdEM7QUFDQSxRQUFZRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBWSxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksa0JBQWtCLEVBQUU7QUFDeEQ7QUFDQSxZQUFnQixZQUFZLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUksbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDOUcsU0FBYTtBQUNiO0FBQ0EsUUFBWUMsSUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUQ7QUFDQSxRQUFZLGVBQWUsQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDeEksUUFBWSxlQUFlLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzNJO0FBQ0EsUUFBWUEsSUFBTSxhQUFhLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzNHLFFBQVksSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUNoQztBQUNBLFlBQWdCLFNBQVM7QUFDekIsU0FBYTtBQUNiO0FBQ0EsUUFBWUEsSUFBTSxjQUFjLEdBQUcsSUFBSXNRLE9BQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDM0YsUUFBWSxDQUFDLGNBQWMsR0FBTyxLQUFLLEdBQUcsZUFBZSxDQUFDO0FBQzFELFFBQVl2USxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUMsUUFBWSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7QUFDM0MsWUFBZ0IsV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkQsU0FBYTtBQUNiLFFBQVksV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsY0FBYyxpQkFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLEtBQVM7QUFDTCxFQUFDO0FBQ0w7QUFDSTtBQUNBO3VCQUNBLHNEQUFxQixvQkFBb0I7QUFDN0MscUJBQXlCLGdCQUFnQjtBQUN6QyxxQkFBeUIsV0FBVztBQUNwQyxxQkFBeUIsZ0JBQWdCO0FBQ3pDLHFCQUF5QixVQUFVO0FBQ25DLHFCQUF5QixjQUFjO0FBQ3ZDLHFCQUF5QixlQUFlO0FBQ3hDLHFCQUF5QixXQUFXLHlCQUE2QjtBQUNqRSxJQUFRQyxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDMUIsSUFBUSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDNUI7QUFDQSxJQUFRQSxJQUFNLE1BQU0sR0FBR3FRLFlBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNqRDtBQUNBLElBQVEsdUJBQWlDLDZDQUFvQixFQUFFO0FBQy9ELFFBRGFyUSxJQUFNOztZQUNQLElBQUksQ0FBQyxtQkFBbUI7QUFDcEMsWUFBZ0IsTUFBTTtBQUN0QixZQUFnQixXQUFXO0FBQzNCLFlBQWdCLGdCQUFnQjtBQUNoQyxZQUFnQixrQkFBa0I7QUFDbEMsWUFBZ0IsTUFBTTtBQUN0QixZQUFnQixjQUFjO0FBQzlCLFlBQWdCLGVBQWU7QUFDL0IsWUFBZ0IsV0FBVztBQUMzQixZQUFnQixnQkFBZ0I7QUFDaEMsU0FBYSxDQUFDO0FBQ2Q7QUFDQSxLQUFTO0FBQ1QsSUFBUSxPQUFPLE1BQU0sQ0FBQztBQUNsQixFQUFDO0FBQ0w7dUJBQ0ksOEJBQVMsRUFBRSxNQUFVO0FBQ3pCLElBQVEsMkJBQXVCLElBQUksQ0FBQyw2Q0FBYyxFQUFFO0FBQ3BELFFBRGFBLElBQU07O1lBQ1AsdUJBQXNCLGlDQUFRLEVBQUU7QUFDNUMsWUFEaUJBLElBQU07O2dCQUNQLElBQUksRUFBRSxLQUFLLE9BQU8sSUFBRSxPQUFPLElBQUksR0FBQztBQUNoRCxTQUFhO0FBQ2IsS0FBUztBQUNUO0FBQ0EsSUFBUSxPQUFPLEtBQUssQ0FBQztBQUNqQixFQUFDO0FBQ0w7dUJBQ0ksd0JBQU0sT0FBTyxpQkFBcUIsYUFBYSwwQkFBa0M7QUFDckYsSUFBUUQsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUM1QixJQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUM1QixRQUFZQyxJQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNqSCxRQUFZLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzlDLFFBQVksSUFBSSxPQUFPLEVBQUUsS0FBSyxTQUFTLElBQUUsRUFBRSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBQztBQUMxRCxLQUFTO0FBQ1QsSUFBUSxPQUFPLEVBQUUsQ0FBQztBQUNkLEVBQ0g7QUFDRDtBQUNBLFFBQVE7QUFDUixJQUFJLGNBQWM7QUFDbEIsSUFBSSxZQUFZO0FBQ2hCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFDRjtBQUdBLFNBQVMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUU7QUFDaEgsSUFBSSxPQUFPLFNBQVMsQ0FBQyxvQkFBb0IsWUFBRyxRQUFRLEVBQUUsR0FBRyxFQUFLO0FBQzlELFFBQVFBLElBQU0sSUFBSSxHQUFHLG9CQUFvQixZQUFZLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUcsUUFBUSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDcEcsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxRQUFRLGdCQUFnQjtBQUMzQyxJQUFJRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7QUFDeEIsSUFBSUEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0FBQ3hCLElBQUlBLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDO0FBQ3pCLElBQUlBLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDO0FBQ3pCLElBQUksdUJBQWdCLGlDQUFRLEVBQUU7QUFDOUIsUUFEU0MsSUFBTTs7UUFDUCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxRQUFRLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsUUFBUSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLEtBQUs7QUFDTCxJQUFJLE9BQU8sT0FBQyxJQUFJLFFBQUUsSUFBSSxRQUFFLElBQUksUUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDeEMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsQ0FBQzs7QUMxVEQ7QUFDQTtBQWNBQSxJQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTSxJQUFJLEdBK0NOLGFBQVcsQ0FBQyxNQUFNLGdCQUFvQixJQUFJLE1BQVU7QUFDeEQsSUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM3QixJQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUM7QUFDOUIsSUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQzdCLElBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDMUIsSUFBUSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUNuQyxJQUFRLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLElBQVEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUN0QyxJQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLElBQVEsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVEsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUNyQztBQUNBLElBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7QUFDM0IsRUFBQztBQUNMO2VBQ0ksc0RBQXFCLFFBQVEsTUFBVTtBQUMzQyxJQUFRQSxJQUFNLFdBQVcsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUN0RCxJQUFRLElBQUksV0FBVyxHQUFHd0IsUUFBTyxDQUFDLEdBQUcsRUFBRSxJQUFFLFNBQU87QUFDaEQsSUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUUsU0FBTztBQUN2RTtBQUNBLElBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDbkMsRUFBQztBQUNMO2VBQ0ksd0NBQWU7QUFDbkIsSUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDO0FBQzdGLEVBQUM7QUFDTDtBQUNJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO2VBQ0ksMENBQWUsSUFBSSxnQkFBb0IsT0FBTyxHQUFPLFlBQVksUUFBWTtBQUNqRixJQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQzVCLFFBQVksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7QUFDcEMsS0FBUztBQUNUO0FBQ0EsSUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUM5QjtBQUNBO0FBQ0EsSUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ25CLFFBQVksSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztBQUM3RCxRQUFZLE9BQU87QUFDbkIsS0FBUztBQUNUO0FBQ0EsSUFBUSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDL0IsUUFBWSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztBQUN4RCxRQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUNsQztBQUNBO0FBQ0EsWUFBZ0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7QUFDMUQsWUFBZ0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQ3ZFLFNBQWEsTUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtBQUMvQztBQUNBO0FBQ0EsWUFBZ0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7QUFDN0UsU0FBYTtBQUNiLEtBQVM7QUFDVCxJQUFRLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7QUFDeEQsSUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHK08sYUFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0RTtBQUNBLElBQVEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUN0QyxJQUFRLEtBQUt2USxJQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ3ZDLFFBQVlBLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUMsUUFBWSxJQUFJLE1BQU0sWUFBWSxZQUFZLEVBQUU7QUFDaEQsWUFBZ0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUM3QyxZQUFnQixJQUFJLFlBQVksRUFBRTtBQUNsQyxnQkFBb0IsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDL0MsYUFBaUIsTUFBTTtBQUN2QixnQkFBb0IsTUFBTTtBQUMxQixhQUFpQjtBQUNqQixTQUFhO0FBQ2IsS0FBUztBQUNUO0FBQ0EsSUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztBQUNoQyxJQUFRLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO0FBQ25DLFFBQVksS0FBS0EsSUFBTXNOLElBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzNDLFlBQWdCdE4sSUFBTXdRLFFBQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDbEQsSUFBRSxDQUFDLENBQUM7QUFDaEQsWUFBZ0IsSUFBSWtELFFBQU0sWUFBWSxZQUFZLEVBQUU7QUFDcEQsZ0JBQW9CLElBQUlBLFFBQU0sQ0FBQyxVQUFVLEVBQUU7QUFDM0Msb0JBQXdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQy9DLG9CQUF3QixxQkFBcUIsRUFBRSxDQUFDO0FBQ2hELG9CQUF3QixNQUFNO0FBQzlCLGlCQUFxQjtBQUNyQixhQUFpQjtBQUNqQixTQUFhO0FBQ2IsS0FBUztBQUNUO0FBQ0EsSUFBUSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztBQUM5QixJQUFRLEtBQUt4USxJQUFNc04sSUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDdkMsUUFBWXROLElBQU13USxRQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQ2xELElBQUUsQ0FBQyxDQUFDO0FBQzVDLFFBQVksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUNBLElBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQ2tELFFBQU0sQ0FBQyxDQUFDLENBQUM7QUFDNUcsS0FBUztBQUNUO0FBQ0EsSUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDN0IsUUFBWSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDOUMsS0FBUztBQUNULElBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO0FBQ2xDLFFBQVksSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO0FBQ3hELEtBQVM7QUFDTCxFQUFDO0FBQ0w7QUFDSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO2VBQ0ksZ0RBQW1CO0FBQ3ZCLElBQVEsS0FBS3hRLElBQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDdkMsUUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3ZDLEtBQVM7QUFDVCxJQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzFCO0FBQ0EsSUFBUSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtBQUNwQyxRQUFZLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM3QyxLQUFTO0FBQ1Q7QUFDQSxJQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUM3QixRQUFZLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ25DLEtBQVM7QUFDVDtBQUNBLElBQVEsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7QUFDcEMsUUFBWSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDN0MsS0FBUztBQUNUO0FBQ0EsSUFBUSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLElBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7QUFDNUIsRUFBQztBQUNMO2VBQ0ksZ0NBQVUsS0FBSyxVQUFjO0FBQ2pDLElBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxFQUFDO0FBQ0w7ZUFDSSwwQkFBTyxPQUFPLE9BQVc7QUFDN0IsSUFBUSxLQUFLQSxJQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ3ZDLFFBQVlBLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUMsUUFBWSxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRTtBQUN4QyxZQUFnQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLFNBQWE7QUFDYixLQUFTO0FBQ1Q7QUFDQSxJQUFRQSxJQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzlCLElBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7QUFDMUQsUUFBWSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRixRQUFZLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztBQUM1QyxLQUFTO0FBQ1Q7QUFDQSxJQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtBQUNsQyxRQUFZLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUYsUUFBWSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztBQUN4QyxLQUFTO0FBQ0wsRUFBQztBQUNMO2VBQ0ksNEJBQVEsWUFBWSxZQUFnQjtBQUN4QyxJQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUM3QixRQUFZLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3JGLEtBQVM7QUFDTCxFQUFDO0FBQ0w7QUFDSTtBQUNBO2VBQ0Esd0RBQXNCLE1BQU07QUFDaEMsc0JBQTBCLGdCQUFnQjtBQUMxQyxzQkFBMEIsa0JBQWtCO0FBQzVDLHNCQUEwQixhQUFhO0FBQ3ZDLHNCQUEwQixtQkFBbUI7QUFDN0Msc0JBQTBCLEtBQUs7QUFDL0Isc0JBQTBCLE1BQU07QUFDaEMsc0JBQTBCLFNBQVM7QUFDbkMsc0JBQTBCLG1CQUFtQjtBQUM3QyxzQkFBMEIsY0FBYyxpRkFBeUY7QUFDakksSUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVc7QUFDNUUsVUFBWSxPQUFPLEVBQUUsR0FBQztBQUN0QjtBQUNBLElBQVEsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO0FBQzdDLHVCQUFZLGFBQWE7QUFDekIsNkJBQVksbUJBQW1CO0FBQy9CLGVBQVksS0FBSztBQUNqQixRQUFZLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtBQUNuQyx3QkFBWSxjQUFjO0FBQzFCLG1CQUFZLFNBQVM7QUFDckIsZ0JBQVksTUFBTTtBQUNsQixRQUFZLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLG1CQUFtQjtBQUNqRSxLQUFTLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDckQsRUFBQztBQUNMO2VBQ0ksb0RBQW9CLE1BQU0scUJBQXlCLE1BQU0sR0FBTztBQUNwRSxJQUFRQSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7QUFDckQsSUFBUSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsSUFBRSxTQUFPO0FBQy9EO0FBQ0EsSUFBUUEsSUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3JEO0FBQ0EsSUFBUUEsSUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQzdELElBQVFBLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUU7QUFDQSxJQUFRLElBQUksQ0FBQyxLQUFLLElBQUUsU0FBTztBQUMzQjtBQUNBLElBQVFBLElBQU0sTUFBTSxHQUFHcVEsWUFBYSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUQsV0FBdUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQXZCO1FBQUc7UUFBRyxjQUEyQjtBQUNoRCxJQUFRclEsSUFBTSxLQUFLLEdBQUcsSUFBQyxDQUFDLEtBQUUsQ0FBQyxLQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hDO0FBQ0EsSUFBUSxLQUFLRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDL0MsUUFBWUMsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxRQUFZLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDM0YsWUFBZ0JBLElBQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3BFLFlBQWdCQSxJQUFNLGNBQWMsR0FBRyxJQUFJc1EsT0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNoRixZQUFnQixDQUFDLGNBQWMsR0FBTyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ25ELFlBQWdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDNUMsU0FBYTtBQUNiLEtBQVM7QUFDTCxFQUFDO0FBQ0w7ZUFDSSw4QkFBVTtBQUNkLElBQVEsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQztBQUM3RixFQUFDO0FBQ0w7ZUFDSSw0Q0FBaUI7QUFDckIsSUFBUSxPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNyRixFQUFDO0FBQ0w7ZUFDSSx3Q0FBYyxJQUFJLEdBQU87QUFDN0IsSUFBUXRRLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7QUFDMUM7QUFDQSxJQUFRLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtBQUMvQixRQUFZQSxJQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbEUsUUFBWSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxHQUFDO0FBQ25HLEtBQVMsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDakMsUUFBWSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNuRSxLQUFTO0FBQ1Q7QUFDQSxJQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUNqQyxRQUFZQSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkMsUUFBWUQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBQ2xDO0FBQ0EsUUFBWSxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxFQUFFO0FBQzNDLFlBQWdCLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDbEMsU0FBYSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDL0IsWUFBZ0IsU0FBUyxHQUFHLElBQUksQ0FBQztBQUNqQyxTQUFhLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssRUFBRTtBQUNwRDtBQUNBO0FBQ0EsWUFBZ0IsU0FBUyxHQUFHLElBQUksQ0FBQztBQUNqQztBQUNBLFNBQWEsTUFBTTtBQUNuQixZQUFnQkMsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDMUQ7QUFDQSxZQUFnQixJQUFJLENBQUMsS0FBSyxFQUFFO0FBQzVCO0FBQ0E7QUFDQSxnQkFBb0IsU0FBUyxHQUFHLElBQUksQ0FBQztBQUNyQztBQUNBLGFBQWlCLE1BQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0EsZ0JBQW9CLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFDMUY7QUFDQSxhQUFpQjtBQUNqQixTQUFhO0FBQ2I7QUFDQSxRQUFZLElBQUksU0FBUyxFQUFFO0FBQzNCLFlBQWdCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0FBQzNDLFlBQWdCLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQ3ZDLFNBQWEsTUFBTTtBQUNuQixZQUFnQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLFNBQWE7QUFDYixLQUFTO0FBQ0wsRUFBQztBQUNMO2VBQ0ksZ0RBQW1CO0FBQ3ZCLElBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO0FBQ2pDLFFBQVksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7QUFDMUMsWUFBZ0IsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLFNBQWEsTUFBTTtBQUNuQjtBQUNBLFlBQWdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakcsU0FBYTtBQUNiLEtBQVM7QUFDTCxFQUFDO0FBQ0w7ZUFDSSw0Q0FBZ0IsTUFBTSxrQkFBc0IsT0FBTyxHQUFPO0FBQzlELElBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0I7QUFDcEMsUUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXO0FBQ2hELFFBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQzlDLFFBQVksT0FBTztBQUNuQixLQUFTO0FBQ1Q7QUFDQSxJQUFRQSxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDaEU7QUFDQSxJQUFRLEtBQUtBLElBQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDdkMsUUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUUsV0FBUztBQUN0RDtBQUNBLFFBQVlBLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUM7QUFDQSxRQUFZQSxJQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLG1CQUFtQixDQUFDO0FBQ3pGLFFBQVlBLElBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN4RCxRQUFZQSxJQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM1RCxRQUFZLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBRSxXQUFTO0FBQzVHO0FBQ0EsUUFBWSxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUM7QUFDckgsUUFBWUEsSUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakYsUUFBWSxJQUFJLEtBQUssRUFBRTtBQUN2QixZQUFnQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDM0YsU0FBYTtBQUNiLEtBQVM7QUFDTCxFQUFDO0FBQ0w7ZUFDSSxpREFBMEI7QUFDOUIsSUFBUSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLENBQUM7QUFDbEQsRUFBQztBQUNMO2VBQ0kseURBQThCO0FBQ2xDLElBQVEsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUd3QixRQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakYsRUFBQztBQUNMO2VBQ0ksMENBQWdCO0FBQ3BCLElBQVEsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztBQUN6QyxFQUFDO0FBQ0w7ZUFDSSw0Q0FBZ0IsUUFBUSxNQUFVO0FBQ3RDLElBQVEsSUFBSSxDQUFDLG1CQUFtQixHQUFHQSxRQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDO0FBQ3hELEVBQUM7QUFDTDtlQUNJLDRDQUFnQixTQUFTLE1BQVUsWUFBWSxhQUFpQjtBQUNwRSxJQUFReEIsSUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLElBQVEsdUJBQWtCLHFDQUFZLEVBQUU7QUFDeEMsUUFEYUEsSUFBTTs7WUFDUCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlCLEtBQVM7QUFDVCxJQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pDLEVBQUM7QUFDTDtlQUNJLHdDQUFjLFVBQVUsYUFBaUIsSUFBSSxhQUFpQjtBQUNsRSxJQUFRLDJCQUF3Qix5Q0FBVSxFQUFFO0FBQzVDLFFBRGFBLElBQU07O1lBQ1BBLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDOUQsUUFBWSxJQUFJLFlBQVksRUFBRTtBQUM5QixZQUFnQix1QkFBa0IsNkJBQUksRUFBRTtBQUN4QyxnQkFEcUJBLElBQU07O29CQUNQLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQzNDLG9CQUF3QixPQUFPLElBQUksQ0FBQztBQUNwQyxpQkFBcUI7QUFDckIsYUFBaUI7QUFDakIsU0FBYTtBQUNiLEtBQVM7QUFDVCxJQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLEVBQ0g7O0FDamNELG9CQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7O0FDRDVGO0FBQ0E7QUFHQTtBQUNBQSxJQUFNLFdBQVcsR0FBR0UsUUFBTSxDQUFDLFdBQVcsQ0FBQztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBYSxrQkFBa0IsR0FBRztBQUNsQyxJQUFJLE1BQU0sRUFBRSxRQUFRO0FBQ3BCLElBQUksSUFBSSxFQUFFLE1BQU07QUFDaEIsSUFBSSxRQUFRLEVBQUUsVUFBVTtBQUN4QixDQUFDLENBQUM7QUFDRjtBQUNBSCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDekJBLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUNwQjtBQUNBQyxJQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QkEsSUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0FBQ2xEO0FBQ0EsSUFBYSxnQkFBZ0IsR0FBRztBQUNoQyxJQUFJLG1CQUFJLENBQUMsTUFBTSxvQ0FBb0M7QUFDbkQsUUFBUSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLEtBQUs7QUFDTCxJQUFJLHFCQUFLLENBQUMsU0FBUyxVQUFVO0FBQzdCLFFBQVFBLElBQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUN4QyxRQUFRLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtBQUNuQyxZQUFZQSxJQUFNLFNBQVMsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQzVELFlBQVksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2QyxTQUFTO0FBQ1QsUUFBUSxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ3RDLEtBQUs7QUFDTCxJQUFJLG1DQUFZLEdBQUc7QUFDbkIsUUFBUSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFFBQVEsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUN4QixRQUFRLFdBQVcsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDOUMsUUFBUSxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ2xEO0FBQ0EsUUFBUSxLQUFLQSxJQUFNLE1BQU0sSUFBSSxrQkFBa0IsRUFBRTtBQUNqRCxZQUFZLFdBQVcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvRCxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUkscURBQXFCLHVCQUF1QjtBQUNoRCxRQUFRQSxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3RILFFBQVFBLElBQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDbEksUUFBUUEsSUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztBQUM5QztBQUNBLFFBQVFBLElBQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLFdBQUUsSUFBSSxFQUFFLElBQUksV0FBSyxJQUFJLEdBQUcsT0FBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDcEcsUUFBUUEsSUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUNyQztBQUNBO0FBQ0EsUUFBUUEsSUFBTSxhQUFhLEdBQUcsVUFBVTtBQUN4QyxhQUFhLE1BQU0sV0FBRSxTQUFTLFdBQUssU0FBUyxHQUFHLGtCQUFlLENBQUM7QUFDL0QsYUFBYSxNQUFNLFdBQUUsR0FBRyxFQUFFLElBQUksRUFBSztBQUNuQyxnQkFBZ0IsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQztBQUN6RSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUUEsSUFBTSxvQkFBb0IsR0FBRyxDQUFDLGFBQWEsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQzNGO0FBQ0EsUUFBUSxPQUFPO0FBQ2Ysc0JBQVksUUFBUTtBQUNwQiwwQkFBWSxZQUFZO0FBQ3hCLGlCQUFZLEdBQUc7QUFDZixrQ0FBWSxvQkFBb0I7QUFDaEMsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBYSxrQkFBa0IsR0FHM0IsMkJBQVcsRUFBRSxPQUFPLGlCQUFxQjtBQUM3QyxJQUFRLElBQUksQ0FBQyxNQUFNLEdBQUc7QUFDdEIsUUFBWSxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDbkQsUUFBWSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDL0MsUUFBWSxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7QUFDM0MsS0FBUyxDQUFDO0FBQ1Y7QUFDQSxJQUFRLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxFQUFDO0FBQ0w7NkJBQ0ksNEJBQVM7QUFDYixJQUFRLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxJQUFRRCxJQUFJLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25GO0FBQ0E7QUFDQSxJQUFRLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUM3QyxRQUFZLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RixRQUFZLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25GO0FBQ0E7QUFDQSxRQUFZLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0RCxRQUFZLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxRQUFZLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzRCxLQUFTO0FBQ1Q7QUFDQSxJQUFRLE9BQU8sa0JBQWtCLENBQUM7QUFDOUIsRUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxR0QsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFO0FBQ3hCLElBQUlDLElBQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDO0FBQzVCLElBQUksSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJO0FBQ3pHLFVBQVEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFDO0FBQ25DO0FBQ0EsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDNUIsUUFBUUQsSUFBSTZHLEtBQUcsR0FBRyxHQUFHLENBQUM7QUFDdEIsUUFBUSx5QkFBa0IsZ0NBQUcsRUFBRTtBQUMvQixZQURhNUcsSUFBTTs7WUFDUDRHLEtBQUcsS0FBTyxTQUFTLENBQUMsR0FBRyxRQUFJLENBQUM7QUFDeEMsU0FBUztBQUNULFFBQVEsUUFBVUEsS0FBRyxRQUFJO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLElBQUk1RyxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3pDO0FBQ0EsSUFBSUQsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLElBQUksS0FBS0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLFFBQVEsR0FBRyxLQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBRyxDQUFDO0FBQ3hFLEtBQUs7QUFDTCxJQUFJLFFBQVUsR0FBRyxRQUFJO0FBQ3JCLENBQUM7QUFDRDtBQUNBLFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUN2QixJQUFJQSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDakIsSUFBSSx1QkFBZ0IwUSxrREFBYSxFQUFFO0FBQ25DLFFBRFN6USxJQUFNOztRQUNQLEdBQUcsSUFBSSxPQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUcsQ0FBQztBQUN6QyxLQUFLO0FBQ0wsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7QUFDM0MsSUFBSUEsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3RCO0FBQ0EsSUFBSSxLQUFLRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUM7QUFDQSxRQUFRQyxJQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRjtBQUNBLFFBQVEsSUFBSSxVQUFVO0FBQ3RCLGNBQVksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUM7QUFDekM7QUFDQSxRQUFRRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3BCLFlBQVksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkMsU0FBUztBQUNULFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQSxJQUFJQyxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDdEI7QUFDQSxJQUFJLEtBQUtBLElBQU1rUCxHQUFDLElBQUksTUFBTSxFQUFFO0FBQzVCLFFBQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUNBLEdBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQjs7QUMxRUE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU0sZUFBZSxHQU9qQix3QkFBVyxDQUFDLFlBQVksMEJBQThCO0FBQzFELElBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDM0IsSUFBUSxJQUFJLFlBQVksRUFBRTtBQUMxQixRQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdkMsS0FBUztBQUNMLEVBQUM7QUFDTDswQkFDSSw0QkFBUSxZQUFZLHlCQUE2QjtBQUNyRCxJQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLElBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDMUIsSUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsQyxFQUFDO0FBQ0w7MEJBQ0ksMEJBQU8sWUFBWSx5QkFBNkIsVUFBVSxhQUFpQjs7QUFBQztBQUNoRixJQUFRLHVCQUEwQixxQ0FBWSxFQUFFO0FBQ2hELFFBRGFsUCxJQUFNOztZQUNQLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztBQUM3RDtBQUNBLFFBQVlBLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHMFEsNEJBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdkYsUUFBWSxLQUFLLENBQUMsY0FBYyxHQUFHTCx5QkFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxRQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0FBQzdDLGNBQWdCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUM7QUFDckQsS0FBUztBQUNULElBQVEsMkJBQWlCLHlDQUFVLEVBQUU7QUFDckMsUUFEYXJRLElBQU07O1lBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLFFBQVksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLFFBQVksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLEtBQVM7QUFDVDtBQUNBLElBQVEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUNuQztBQUNBLElBQVFBLElBQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQzJRLGtCQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoRjtBQUNBLElBQVEsMkJBQTJCLHFDQUFNLEVBQUU7QUFDM0MsUUFEYTNRLElBQU00UTs7WUFDUDVRLElBQU0sTUFBTSxHQUFHNFEsY0FBWSxDQUFDLEdBQUcsV0FBRSxXQUFXLFdBQUtqUCxNQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUMsQ0FBQyxDQUFDO0FBQzNGO0FBQ0EsUUFBWTNCLElBQU02USxPQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVksSUFBSUEsT0FBSyxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUU7QUFDN0MsWUFBZ0IsU0FBUztBQUN6QixTQUFhO0FBQ2I7QUFDQSxRQUFZN1EsSUFBTSxRQUFRLEdBQUc2USxPQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNoRCxRQUFZOVEsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzlELFFBQVksSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUM5QixZQUFnQixXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuRSxTQUFhO0FBQ2I7QUFDQSxRQUFZQyxJQUFNLGFBQWEsR0FBRzZRLE9BQUssQ0FBQyxXQUFXLElBQUksbUJBQW1CLENBQUM7QUFDM0UsUUFBWTlRLElBQUksbUJBQW1CLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2pFLFFBQVksSUFBSSxDQUFDLG1CQUFtQixFQUFFO0FBQ3RDLFlBQWdCLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDdEUsU0FBYTtBQUNiO0FBQ0EsUUFBWSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0MsS0FBUztBQUNMLEVBQ0g7O0FDN0VEO0FBQ0E7QUFLQTtBQUNBO0FBQ0FDLElBQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxJQUFNLFVBQVUsR0FJM0IsbUJBQVcsQ0FBQyxNQUFNLDZDQUErQztBQUNyRSxNQUFRQSxJQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBUUEsSUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3hCO0FBQ0EsTUFBUSxLQUFLQSxJQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDcEMsVUFBWUEsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLFVBQVlBLElBQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekQ7QUFDQSxVQUFZLEtBQUtBLElBQU0sRUFBRSxJQUFJLE1BQU0sRUFBRTtBQUNyQyxjQUFnQkEsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsY0FBZ0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFFLFdBQVM7QUFDeEY7QUFDQSxjQUFnQkEsSUFBTSxHQUFHLEdBQUc7QUFDNUIsa0JBQW9CLENBQUMsRUFBRSxDQUFDO0FBQ3hCLGtCQUFvQixDQUFDLEVBQUUsQ0FBQztBQUN4QixrQkFBb0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxPQUFPO0FBQ3JELGtCQUFvQixDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE9BQU87QUFDdEQsZUFBaUIsQ0FBQztBQUNsQixjQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLGNBQWdCLGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2RSxXQUFhO0FBQ2IsT0FBUztBQUNUO0FBQ0EsYUFBb0IsR0FBRzhRLG1CQUFPLENBQUMsSUFBSTtNQUFwQjtNQUFHLGNBQW1CO0FBQ3JDLE1BQVE5USxJQUFNLEtBQUssR0FBRyxJQUFJK1Esc0JBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RTtBQUNBLE1BQVEsS0FBSy9RLElBQU1nUixPQUFLLElBQUksTUFBTSxFQUFFO0FBQ3BDLFVBQVloUixJQUFNaVIsUUFBTSxHQUFHLE1BQU0sQ0FBQ0QsT0FBSyxDQUFDLENBQUM7QUFDekM7QUFDQSxVQUFZLEtBQUtoUixJQUFNc04sSUFBRSxJQUFJMkQsUUFBTSxFQUFFO0FBQ3JDLGNBQWdCalIsSUFBTXVOLEtBQUcsR0FBRzBELFFBQU0sQ0FBQyxDQUFDM0QsSUFBRSxDQUFDLENBQUM7QUFDeEMsY0FBZ0IsSUFBSSxDQUFDQyxLQUFHLElBQUlBLEtBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSUEsS0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFFLFdBQVM7QUFDeEYsY0FBZ0J2TixJQUFNd04sS0FBRyxHQUFHLFNBQVMsQ0FBQ3dELE9BQUssQ0FBQyxDQUFDMUQsSUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3RELGNBQWdCeUQsc0JBQVUsQ0FBQyxJQUFJLENBQUN4RCxLQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFQyxLQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUVBLEtBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUVELEtBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN2SCxXQUFhO0FBQ2IsT0FBUztBQUNUO0FBQ0EsTUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixNQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQ25DO0FBRUE7QUFDQTJELG9CQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDOztBQ3RFbkM7QUFDQTtBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNLFVBQVUsR0FxQlosbUJBQVcsQ0FBQyxNQUFNLG9CQUF3QjtBQUM5QyxJQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSUMsNEJBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDaE4sSUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDOUIsSUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDaEMsSUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFDNUMsSUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDeEMsSUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDcEMsSUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDekQsSUFBUSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0FBQzVELElBQVEsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7QUFDcEUsSUFBUSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztBQUM5RCxJQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUN0QyxFQUFDO0FBQ0w7cUJBQ0ksd0JBQU0sSUFBSSxVQUFjLFVBQVUsZUFBbUIsZUFBZSxhQUFpQixLQUFLLEtBQVMsUUFBUSxrQkFBc0I7O0FBQUM7QUFDdEksSUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUNoQyxJQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pCO0FBQ0EsSUFBUSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSUMsNkJBQWlCLEVBQUUsQ0FBQztBQUN6RCxJQUFRcFIsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJcVIsMkJBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGO0FBQ0EsSUFBUXJSLElBQU0sWUFBWSxHQUFHLElBQUlzUix3QkFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzNFLElBQVEsWUFBWSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDekM7QUFDQSxJQUFRdFIsSUFBTSxPQUFPLHNCQUEwQixFQUFFLENBQUM7QUFDbEQ7QUFDQSxJQUFRQSxJQUFNLE9BQU8sR0FBRztBQUN4QixzQkFBWSxZQUFZO0FBQ3hCLFFBQVksZ0JBQWdCLEVBQUUsRUFBRTtBQUNoQyxRQUFZLG1CQUFtQixFQUFFLEVBQUU7QUFDbkMsUUFBWSxpQkFBaUIsRUFBRSxFQUFFO0FBQ2pDLHlCQUFZLGVBQWU7QUFDM0IsS0FBUyxDQUFDO0FBQ1Y7QUFDQSxJQUFRQSxJQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZFLElBQVEsS0FBS0EsSUFBTSxhQUFhLElBQUksYUFBYSxFQUFFO0FBQ25ELFFBQVlBLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDM0QsUUFBWSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQzlCLFlBQWdCLFNBQVM7QUFDekIsU0FBYTtBQUNiO0FBQ0EsUUFBWSxJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQzNDLFlBQWdCdVIsb0JBQVEsQ0FBQywyQkFBdUIsSUFBSSxDQUFDLE9BQU0sbUJBQVksYUFBYSxRQUFJO0FBQ3hGLGdCQUFvQixnRkFBZ0YsQ0FBQyxDQUFDO0FBQ3RHLFNBQWE7QUFDYjtBQUNBLFFBQVl2UixJQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM1RSxRQUFZQSxJQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBWSxLQUFLRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7QUFDckUsWUFBZ0JDLElBQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0QsWUFBZ0JBLElBQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3RFLFlBQWdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQyxPQUFPLE1BQUUsRUFBRSxTQUFFLEtBQUssb0JBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLFNBQWE7QUFDYjtBQUNBLFFBQVksdUJBQXFCLGFBQWEsQ0FBQyxhQUFhLDBCQUFDLEVBQUU7QUFDL0QsWUFEaUJBLElBQU07O2dCQUNQQSxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEM7QUFDQSxZQUFnQjZCLGtCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDckQsWUFBZ0IsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUUsV0FBUztBQUNyRixZQUFnQixJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFFLFdBQVM7QUFDMUUsWUFBZ0IsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLE1BQU0sSUFBRSxXQUFTO0FBQzFEO0FBQ0EsWUFBZ0IsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDdEU7QUFDQSxZQUFnQjdCLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztBQUN0RSxnQkFBb0IsS0FBSyxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTTtBQUM3RCxnQkFBb0IsTUFBTSxFQUFFLE1BQU07QUFDbEMsZ0JBQW9CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtBQUNuQyxnQkFBb0IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO0FBQy9DLGdCQUFvQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7QUFDakQsZ0JBQW9CLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7QUFDN0Qsa0NBQW9CLGdCQUFnQjtBQUNwQyxnQkFBb0IsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQ3pDLGFBQWlCLENBQUMsQ0FBQztBQUNuQjtBQUNBLFlBQWdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFFLFlBQWdCLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFdBQUUsQ0FBQyxXQUFLLENBQUMsQ0FBQyxLQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFFLFNBQWE7QUFDYixLQUFTO0FBQ1Q7QUFDQSxJQUFRRCxJQUFJLEtBQUssS0FBUztBQUMxQixJQUFRQSxJQUFJLFFBQVEseUNBQTZDO0FBQ2pFLElBQVFBLElBQUksT0FBTyx5QkFBNkI7QUFDaEQsSUFBUUEsSUFBSSxVQUFVLHlCQUE2QjtBQUNuRDtBQUNBLElBQVFDLElBQU0sTUFBTSxHQUFHd1IscUJBQVMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLFlBQUcsTUFBTSxXQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBQyxDQUFDLENBQUM7QUFDekcsSUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQ3hDLFFBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsVUFBRSxNQUFNLENBQUMsWUFBRyxHQUFHLEVBQUUsTUFBTSxFQUFLO0FBQzlFLFlBQWdCLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDNUIsZ0JBQW9CLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDaEMsZ0JBQW9CLFFBQVEsR0FBRyxNQUFNLENBQUM7QUFDdEMsZ0JBQW9CLFlBQVksQ0FBQyxJQUFJLENBQUM3UCxNQUFJLENBQUMsQ0FBQztBQUM1QyxhQUFpQjtBQUNqQixTQUFhLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuQyxLQUFTLE1BQU07QUFDZixRQUFZLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDMUIsS0FBUztBQUNUO0FBQ0EsSUFBUTNCLElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDNUQsSUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDMUIsUUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQUcsR0FBRyxFQUFFLE1BQU0sRUFBSztBQUN2SCxZQUFnQixJQUFJLENBQUMsS0FBSyxFQUFFO0FBQzVCLGdCQUFvQixLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLGdCQUFvQixPQUFPLEdBQUcsTUFBTSxDQUFDO0FBQ3JDLGdCQUFvQixZQUFZLENBQUMsSUFBSSxDQUFDMkIsTUFBSSxDQUFDLENBQUM7QUFDNUMsYUFBaUI7QUFDakIsU0FBYSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEMsS0FBUyxNQUFNO0FBQ2YsUUFBWSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEtBQVM7QUFDVDtBQUNBLElBQVEzQixJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2xFLElBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFO0FBQzdCLFFBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsWUFBRyxHQUFHLEVBQUUsTUFBTSxFQUFLO0FBQ3BJLFlBQWdCLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDNUIsZ0JBQW9CLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDaEMsZ0JBQW9CLFVBQVUsR0FBRyxNQUFNLENBQUM7QUFDeEMsZ0JBQW9CLFlBQVksQ0FBQyxJQUFJLENBQUMyQixNQUFJLENBQUMsQ0FBQztBQUM1QyxhQUFpQjtBQUNqQixTQUFhLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwQyxLQUFTLE1BQU07QUFDZixRQUFZLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDNUIsS0FBUztBQUNUO0FBQ0EsSUFBUSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDO0FBQ0EsSUFBUSxTQUFTLFlBQVksR0FBRztBQUNoQyxRQUFZLElBQUksS0FBSyxFQUFFO0FBQ3ZCLFlBQWdCLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLFNBQWEsTUFBTSxJQUFJLFFBQVEsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFO0FBQzFELFlBQWdCM0IsSUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDNUQsWUFBZ0JBLElBQU0sVUFBVSxHQUFHLElBQUl5UixzQkFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RTtBQUNBLFlBQWdCLEtBQUt6UixJQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUU7QUFDM0MsZ0JBQW9CQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsZ0JBQW9CLElBQUksTUFBTSxZQUFZMFIsd0JBQVksRUFBRTtBQUN4RCxvQkFBd0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3JGLG9CQUF3QkMsK0JBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZLLGlCQUFxQixNQUFNLElBQUksTUFBTSxDQUFDLFVBQVU7QUFDaEQscUJBQXlCLE1BQU0sWUFBWUMsc0JBQVU7QUFDckQscUJBQXlCLE1BQU0sWUFBWUMsc0JBQVU7QUFDckQscUJBQXlCLE1BQU0sWUFBWUMsK0JBQW1CLENBQUMsRUFBRTtBQUNqRSxvQkFBd0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3JGLG9CQUF3QixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN4RyxpQkFBcUI7QUFDckIsYUFBaUI7QUFDakI7QUFDQSxZQUFnQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNyQyxZQUFnQixRQUFRLENBQUMsSUFBSSxFQUFFO0FBQy9CLGdCQUFvQixPQUFPLEVBQUVuQixrQkFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sV0FBQyxZQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBRSxDQUFDO0FBQ3RFLDhCQUFvQixZQUFZO0FBQ2hDLGdCQUFvQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO0FBQzdELGdCQUFvQixlQUFlLEVBQUUsVUFBVSxDQUFDLEtBQUs7QUFDckQsNEJBQW9CLFVBQVU7QUFDOUI7QUFDQSxnQkFBb0IsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsSUFBSTtBQUN2RSxnQkFBb0IsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLEdBQUcsSUFBSTtBQUNyRSxnQkFBb0IsY0FBYyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLElBQUk7QUFDekYsYUFBaUIsQ0FBQyxDQUFDO0FBQ25CLFNBQWE7QUFDYixLQUFTO0FBQ0wsRUFDSDtBQUNEO0FBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLDhCQUE4QixJQUFJLFVBQVUsZUFBZSxpQkFBaUI7QUFDN0c7QUFDQSxJQUFJM1EsSUFBTSxVQUFVLEdBQUcsSUFBSStSLGdDQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELElBQUksdUJBQW9CLCtCQUFNLEVBQUU7QUFDaEMsUUFEUy9SLElBQU07O1FBQ1AsS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDdkQsS0FBSztBQUNMLENBQUM7O0FDN05EO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGNBQWMsQ0FBQyxNQUFNLHdCQUF3QixRQUFRLDBCQUEwQjtBQUN4RixJQUFJQSxJQUFNLE9BQU8sR0FBR2dTLDBCQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sWUFBRyxHQUFHLFVBQVUsSUFBSSxnQkFBZ0IsWUFBWSxXQUFXLE9BQU8sV0FBYztBQUNqSSxRQUFRLElBQUksR0FBRyxFQUFFO0FBQ2pCLFlBQVksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLFNBQVMsTUFBTSxJQUFJLElBQUksRUFBRTtBQUN6QixZQUFZLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFDM0IsZ0JBQWdCLFVBQVUsRUFBRSxJQUFJNUIsZUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJaEQsZUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pFLGdCQUFnQixPQUFPLEVBQUUsSUFBSTtBQUM3Qiw4QkFBZ0IsWUFBWTtBQUM1Qix5QkFBZ0IsT0FBTztBQUN2QixhQUFhLENBQUMsQ0FBQztBQUNmLFNBQVM7QUFDVCxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksbUJBQWE7QUFDakIsUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDekIsUUFBUSxRQUFRLEVBQUUsQ0FBQztBQUNuQixLQUFLLENBQUM7QUFDTixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNLHNCQUFzQixHQWV4QiwrQkFBVyxDQUFDLEtBQUssT0FBUyxVQUFVLGlCQUFtQixlQUFlLGVBQWlCLGNBQWMsaUJBQW1CO0FBQzVILE1BQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsTUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUNyQyxNQUFRLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0FBQy9DLE1BQVEsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLElBQUksY0FBYyxDQUFDO0FBQy9ELE1BQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN6QixJQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBSSw4QkFBUyxNQUFNLHNCQUF3QixRQUFRLG9CQUFzQjs7QUFBQztBQUMxRSxNQUFRcE4sSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUMvQjtBQUNBLE1BQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO0FBQ3pCLFlBQVksSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLEdBQUM7QUFDOUI7QUFDQSxNQUFRQSxJQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCO0FBQ3RGLFVBQVksSUFBSWlTLDhCQUFrQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDM0Q7QUFDQSxNQUFRalMsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RSxNQUFRLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLFlBQUcsR0FBRyxFQUFFLFFBQVEsRUFBSztBQUMxRSxVQUFZLE9BQU8yQixNQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsVUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUNsQyxjQUFnQixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUMzQyxjQUFnQkEsTUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDOUMsY0FBZ0IsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckMsV0FBYTtBQUNiO0FBQ0EsVUFBWTNCLElBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDakQsVUFBWUEsSUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3BDLFVBQVksSUFBSSxRQUFRLENBQUMsT0FBTyxJQUFFLFlBQVksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sR0FBQztBQUMxRSxVQUFZLElBQUksUUFBUSxDQUFDLFlBQVksSUFBRSxZQUFZLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEdBQUM7QUFDekY7QUFDQSxVQUFZQSxJQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDdEMsVUFBWSxJQUFJLElBQUksRUFBRTtBQUN0QixjQUFnQkEsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDekQ7QUFDQTtBQUNBLGNBQWdCLElBQUksa0JBQWtCO0FBQ3RDLG9CQUFvQixjQUFjLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUM7QUFDbkcsV0FBYTtBQUNiO0FBQ0EsVUFBWSxVQUFVLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDeEQsVUFBWSxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUyQixNQUFJLENBQUMsVUFBVSxFQUFFQSxNQUFJLENBQUMsZUFBZSxFQUFFQSxNQUFJLENBQUMsS0FBSyxZQUFHLEdBQUcsRUFBRSxNQUFNLEVBQUs7QUFDdEgsY0FBZ0IsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUM7QUFDekQ7QUFDQTtBQUNBLGNBQWdCLFFBQVEsQ0FBQyxJQUFJLEVBQUVYLGtCQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUNsSCxXQUFhLENBQUMsQ0FBQztBQUNmO0FBQ0EsVUFBWVcsTUFBSSxDQUFDLE1BQU0sR0FBR0EsTUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDNUMsVUFBWUEsTUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDMUMsT0FBUyxDQUFDLENBQUM7QUFDWCxJQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFJLGtDQUFXLE1BQU0sc0JBQXdCLFFBQVEsb0JBQXNCOztBQUFDO0FBQzVFLE1BQVEzQixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTtBQUNsQyxVQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRztBQUM1QixVQUFZLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDNUIsTUFBUSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDbkMsVUFBWUEsSUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLFVBQVksVUFBVSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztBQUN0RTtBQUNBLFVBQVlBLElBQU0sSUFBSSxhQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUs7QUFDeEMsY0FBZ0JBLElBQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUM7QUFDakUsY0FBZ0IsSUFBSSxjQUFjLEVBQUU7QUFDcEMsa0JBQW9CLE9BQU8sVUFBVSxDQUFDLGNBQWMsQ0FBQztBQUNyRCxrQkFBb0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUyQixNQUFJLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDdkksZUFBaUI7QUFDakIsY0FBZ0IsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwQyxXQUFhLENBQUM7QUFDZDtBQUNBLFVBQVksSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtBQUNqRCxjQUFnQixVQUFVLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUNqRCxXQUFhLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtBQUNyRDtBQUNBLGNBQWdCLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRTtBQUMzQyxrQkFBb0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JILGVBQWlCLE1BQU07QUFDdkIsa0JBQW9CLElBQUksRUFBRSxDQUFDO0FBQzNCLGVBQWlCO0FBQ2pCLFdBQWE7QUFDYixPQUFTO0FBQ1QsSUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBSSxnQ0FBVSxNQUFNLGdCQUFrQixRQUFRLG9CQUFzQjtBQUNwRSxNQUFRM0IsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU87QUFDcEMsVUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUM3QixNQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFO0FBQzNELFVBQVksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2pDLFVBQVksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsT0FBUztBQUNULE1BQVEsUUFBUSxFQUFFLENBQUM7QUFDbkIsSUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBSSxrQ0FBVyxNQUFNLGdCQUFrQixRQUFRLG9CQUFzQjtBQUNyRSxNQUFRQSxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTtBQUNsQyxVQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQzdCLE1BQVEsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ25DLFVBQVksT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsT0FBUztBQUNULE1BQVEsUUFBUSxFQUFFLENBQUM7QUFDbkIsSUFDQzs7QUNyTkQ7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGlEQUFzQjtBQUM3QjtBQUNBLElBQU0seUJBQXlCLEdBTTNCLGtDQUFXLEdBQUc7QUFDbEIsSUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQixFQUFDO0FBQ0w7b0NBQ0ksOEJBQVMsTUFBTSx1QkFBMkIsUUFBUSxxQkFBeUI7QUFDL0UsSUFBZTtRQUFLO1FBQVUsdUNBQXVCO0FBQ3JEO0FBQ0EsSUFBUUEsSUFBTSxXQUFXLEdBQUcsQ0FBQyxXQUFXLElBQUksWUFBWSxZQUFZLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUNsSSxJQUFRQSxJQUFNLEdBQUcsR0FBRyxJQUFJa1MsbUJBQU8sQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzVELElBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUN4QyxJQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQy9CLElBQVEsUUFBUSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFDO0FBQ0w7b0NBQ0ksc0NBQWEsU0FBUyxrQkFBMEI7QUFDcEQ7QUFDQSxJQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO0FBQ25FO0FBQ0EsUUFBWSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFGLFFBQVksSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hGLEtBQVM7QUFDVDtBQUNBLElBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUNyRCxJQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDdkQ7QUFDQSxJQUFRLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEc7QUFDQSxJQUFRbFMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BILElBQVEsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0csSUFBUSxPQUFPLElBQUltUyxxQkFBUyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkYsRUFBQztBQUNMO29DQUNJLGtDQUFXLE1BQU0sY0FBa0I7QUFDdkMsSUFBUW5TLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO0FBQ2xDLFFBQVksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDN0IsSUFBUSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDbkMsUUFBWSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixLQUFTO0FBQ0wsRUFDSDs7QUMxREQsaUJBQWMsR0FBRyxNQUFNLENBQUM7QUFDeEI7QUFDQSxTQUFTLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFO0FBQzNCLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDO0FBQ0EsSUFBSSxJQUFJLElBQUksS0FBSyxtQkFBbUIsRUFBRTtBQUN0QyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUM7QUFDL0U7QUFDQSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssb0JBQW9CLEVBQUU7QUFDOUMsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFDO0FBQ25GO0FBQ0EsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUNuQyxRQUFRLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25DO0FBQ0EsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUNuQyxRQUFRLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDO0FBQ0EsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLGNBQWMsRUFBRTtBQUN4QyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUM7QUFDMUYsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFDRDtBQUNBLFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDbkMsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFFLFNBQU87QUFDbkM7QUFDQSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDaEMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxRQUFRLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUMvQixJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNqQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQ3RFLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEUsS0FBSztBQUNMLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFDO0FBQzVDOztBQ3hDQTtBQUNBLElBSU0sU0FBUyxHQUFHMk0sZUFBRyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7QUFDNUQ7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTSxjQUFjLEdBUWhCLHVCQUFXLENBQUMsT0FBTyxPQUFXO0FBQ2xDLElBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7QUFDaEM7QUFDQSxJQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcxSCxrQkFBTSxDQUFDO0FBQzdCLElBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ2pDLElBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBUSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25ELFFBQVksSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQyxLQUFTO0FBQ0wsRUFBQztBQUNMO3lCQUNJLHdDQUFlO0FBQ25CLElBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDdEMsUUFBWWpGLElBQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFZLHVCQUFvQixJQUFJLENBQUMsUUFBUSxDQUFDLGlDQUFRLEVBQUU7QUFDeEQsWUFEaUJBLElBQU07O2dCQUNQLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJcUIsbUJBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELFNBQWE7QUFDYixRQUFZLE9BQU8sUUFBUSxDQUFDO0FBQzVCLEtBQVMsTUFBTTtBQUNmLFFBQVlyQixJQUFNb1MsVUFBUSxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFZLDJCQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLHVDQUFRLEVBQUU7QUFDdkQsWUFEaUJwUyxJQUFNOztnQkFDUEEsSUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ25DLFlBQWdCLDJCQUFvQixtQ0FBSSxFQUFFO0FBQzFDLGdCQURxQkEsSUFBTTBDOztvQkFDUCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUlyQixtQkFBSyxDQUFDcUIsT0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFQSxPQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLGFBQWlCO0FBQ2pCLFlBQWdCMFAsVUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QyxTQUFhO0FBQ2IsUUFBWSxPQUFPQSxVQUFRLENBQUM7QUFDNUIsS0FBUztBQUNMLEVBQUM7QUFDTDt5QkFDSSxrQ0FBVSxDQUFDLE1BQVUsQ0FBQyxNQUFVLENBQUMsTUFBVTtBQUMvQyxJQUFRLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QyxFQUNIO0FBQ0Q7QUFDQSxJQUFNLGNBQWMsR0FPaEIsdUJBQVcsQ0FBQyxRQUFRLGNBQWtCO0FBQzFDLElBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xELElBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztBQUN4QyxJQUFRLElBQUksQ0FBQyxNQUFNLEdBQUduTixrQkFBTSxDQUFDO0FBQzdCLElBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0FBQ3RDLElBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFDOUIsRUFBQztBQUNMO3lCQUNJLDRCQUFRLENBQUMscUJBQTZCO0FBQzFDLElBQVEsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsRUFDSDs7QUMzRkQsWUFBWSxDQUFDO0FBQ2I7QUFDOEM7QUFDOUM7QUFDQSxxQkFBYyxHQUFHLGlCQUFpQixDQUFDO0FBQ25DO0FBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQzNEO0FBQ0EsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEI7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7QUFDcEIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztBQUMxQjtBQUNBLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFDRDtBQUNBLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFDO0FBQ2hELFNBQVMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUM7QUFDN0MsU0FBUyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUUsT0FBTyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUM7QUFDdkQsU0FBUyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFDO0FBQ25ELENBQUM7QUFDRDtBQUNBLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFDL0IsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN6QztBQUNBLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUMxQixRQUFRLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2pELFlBQVksS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDdEQsUUFBUSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN4QyxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsaUJBQWlCLENBQUMsS0FBSyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEU7QUFDQSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFdBQVc7QUFDdEQsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3hCLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQzdCO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUc7QUFDeEMsUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLFFBQVEsTUFBTSxHQUFHLENBQUM7QUFDbEIsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUNiLFFBQVEsQ0FBQyxHQUFHLENBQUM7QUFDYixRQUFRLEtBQUssR0FBRyxFQUFFO0FBQ2xCLFFBQVEsSUFBSSxDQUFDO0FBQ2I7QUFDQSxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDMUIsUUFBUSxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUU7QUFDekIsWUFBWSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDMUMsWUFBWSxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUMvQixZQUFZLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxFQUFFLENBQUM7QUFDakI7QUFDQSxRQUFRLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ3BDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbkM7QUFDQSxZQUFZLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUMzQixnQkFBZ0IsSUFBSSxJQUFJLElBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBQztBQUMzQyxnQkFBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUMxQixhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTVELG1CQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkM7QUFDQSxTQUFTLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQzlCO0FBQ0E7QUFDQSxZQUFZLElBQUksSUFBSSxFQUFFO0FBQ3RCLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLGFBQWE7QUFDYjtBQUNBLFNBQVMsTUFBTTtBQUNmLFlBQVksTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN0RCxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksSUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFDO0FBQy9CO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDLENBQUM7QUFDRjtBQUNBLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVztBQUM5QyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDeEIsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7QUFDN0I7QUFDQSxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRztBQUN4QyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ2YsUUFBUSxNQUFNLEdBQUcsQ0FBQztBQUNsQixRQUFRLENBQUMsR0FBRyxDQUFDO0FBQ2IsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUNiLFFBQVEsRUFBRSxHQUFHLFFBQVE7QUFDckIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO0FBQ3RCLFFBQVEsRUFBRSxHQUFHLFFBQVE7QUFDckIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7QUFDdkI7QUFDQSxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDMUIsUUFBUSxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUU7QUFDekIsWUFBWSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDMUMsWUFBWSxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUMvQixZQUFZLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxFQUFFLENBQUM7QUFDakI7QUFDQSxRQUFRLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ3BDLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbkMsWUFBWSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUUsRUFBRSxHQUFHLENBQUMsR0FBQztBQUMvQixZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFDO0FBQy9CLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUM7QUFDL0IsWUFBWSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUUsRUFBRSxHQUFHLENBQUMsR0FBQztBQUMvQjtBQUNBLFNBQVMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDOUIsWUFBWSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFDRjtBQUNBLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxRCxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztBQUM1QixRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDNUIsUUFBUSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRTtBQUNwQyxRQUFRLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUNqRCxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYjtBQUNBLElBQUksU0FBUyxPQUFPLENBQUMsSUFBSSxFQUFFO0FBQzNCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsWUFBWSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDaEUsWUFBWSxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BELFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQ3RCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRztBQUM3QyxnQkFBZ0IsS0FBSyxFQUFFLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQzNGLGFBQWEsQ0FBQztBQUNkLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUk7QUFDckIsSUFBSSxLQUFLLENBQUM7QUFDVixRQUFRLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN4QixRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsU0FBUztBQUNULFFBQVEsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUN4QixRQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4QixRQUFRLE1BQU07QUFDZDtBQUNBLElBQUksS0FBSyxDQUFDO0FBQ1YsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsWUFBWSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsU0FBUztBQUNULFFBQVEsTUFBTTtBQUNkO0FBQ0EsSUFBSSxLQUFLLENBQUM7QUFDVixRQUFRLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkMsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsWUFBWSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkQsZ0JBQWdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsTUFBTTtBQUNkLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUM3QixRQUFRLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsS0FBSyxNQUFNO0FBQ1gsUUFBUSxJQUFJLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksTUFBTSxHQUFHO0FBQ2pCLFFBQVEsSUFBSSxFQUFFLFNBQVM7QUFDdkIsUUFBUSxRQUFRLEVBQUU7QUFDbEIsWUFBWSxJQUFJLEVBQUUsSUFBSTtBQUN0QixZQUFZLFdBQVcsRUFBRSxNQUFNO0FBQy9CLFNBQVM7QUFDVCxRQUFRLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtBQUNuQyxLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQ3RCLFFBQVEsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzVCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsU0FBUyxhQUFhLENBQUMsS0FBSyxFQUFFO0FBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUMzQjtBQUNBLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBQztBQUNqQztBQUNBLElBQUksSUFBSSxRQUFRLEdBQUcsRUFBRTtBQUNyQixRQUFRLE9BQU87QUFDZixRQUFRLEdBQUcsQ0FBQztBQUNaO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2xDLFFBQVEsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFFLFdBQVM7QUFDakM7QUFDQSxRQUFRLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBQztBQUM5QztBQUNBLFFBQVEsSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLENBQUMsRUFBRTtBQUM5QixZQUFZLElBQUksT0FBTyxJQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUM7QUFDaEQsWUFBWSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQztBQUNBLFNBQVMsTUFBTTtBQUNmLFlBQVksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksSUFBSSxPQUFPLElBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBQztBQUN4QztBQUNBLElBQUksT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQzFCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUM5RSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLEtBQUs7QUFDTCxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2Y7O0FDek9BLFlBQVksQ0FBQztBQUNiO0FBQzBEO0FBQzFEO0FBQ0EsbUJBQWMsR0FBRyxlQUFlLENBQUM7QUFDakM7QUFDQSxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ25DO0FBQ0EsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNwQjtBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNwQixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUN4QjtBQUNBLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3hDLENBQUM7QUFDRDtBQUNBLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0FBQ3BDLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFDO0FBQ3JELFNBQVMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFDO0FBQ3RELFNBQVMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFDO0FBQ3hELFNBQVMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBQztBQUN0RCxTQUFTLElBQUksR0FBRyxLQUFLLENBQUMsSUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBQztBQUMzRCxTQUFTLElBQUksR0FBRyxLQUFLLENBQUMsSUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFDO0FBQ2xFLENBQUM7QUFDRDtBQUNBLFNBQVMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFO0FBQy9CLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSTtBQUNwQixRQUFRLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN6QztBQUNBLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUMxQixRQUFRLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEM7QUFDQSxRQUFRLEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDNUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUU7QUFDdkMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDeEMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUU7QUFDMUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDeEMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUU7QUFDekMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDakQsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxFQUFFO0FBQ2hELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLEdBQUM7QUFDNUY7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEM7QUFDQSxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDckQsSUFBSSxPQUFPLElBQUltTCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hGLENBQUM7O0FDNURELFlBQVksQ0FBQztBQUNiO0FBQ21EO0FBQ25EO0FBQ0EsY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUM1QjtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtBQUNwQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNuQixRQUFRLElBQUksS0FBSyxHQUFHLElBQUlDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RSxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBQztBQUNyRCxLQUFLO0FBQ0w7O0FDZkEsZ0JBQXlCLEdBQUc1TSxVQUE4QixDQUFDO0FBQzNELHVCQUFnQyxHQUFHQyxpQkFBcUMsQ0FBQztBQUN6RSxxQkFBOEIsR0FBRzRNLGVBQW1DOzs7Ozs7OztBQ0ZwRSxhQUFZO0FBQ1o7QUFDNkM7QUFDN0MsSUFBSUYsbUJBQWlCLEdBQUczTSxVQUE4QixDQUFDLGtCQUFpQjtBQUN4RTtBQUNBLG1CQUFjLEdBQUd3UyxpQkFBYztBQUMvQjtBQUNBO0FBQ0EsU0FBU0EsZ0JBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFO0FBQzVDLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksR0FBRTtBQUM5QixFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUTtBQUMxQixFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU07QUFDL0IsQ0FBQztBQUNEO0FBQ0FBLGdCQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsRUFBRTtBQUNoRCxFQUFFLE9BQU8sSUFBSUMsZ0JBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ2xFLEVBQUM7QUFDRDtBQUNBLFNBQVNBLGdCQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMxQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLFVBQVM7QUFDbkUsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFJO0FBQzFCLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUTtBQUMvRSxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUk7QUFDaEMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxLQUFJO0FBQzlCLENBQUM7QUFDRDtBQUNBQSxnQkFBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsWUFBWTtBQUNwRCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFXO0FBQzlCLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFFO0FBQ3BCO0FBQ0EsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUM7QUFDdkIsSUFBSSxJQUFJLE9BQU8sR0FBRyxHQUFFO0FBQ3BCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUlqUixtQkFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztBQUNyRCxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUM7QUFDL0IsR0FBRztBQUNILEVBQUUsT0FBTyxJQUFJLENBQUMsUUFBUTtBQUN0QixFQUFDO0FBQ0Q7QUFDQWlSLGdCQUFjLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxZQUFZO0FBQzVDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUUsSUFBSSxDQUFDLFlBQVksS0FBRTtBQUN6QztBQUNBLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVE7QUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFRO0FBQ25CLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxTQUFRO0FBQ3BCLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUTtBQUNuQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsU0FBUTtBQUNwQjtBQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFDO0FBQ3ZCO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxNQUFNLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUM7QUFDekI7QUFDQSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFDO0FBQ2hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUM7QUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBQztBQUNoQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFDO0FBQ2hDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDekIsRUFBQztBQUNEO0FBQ0FBLGdCQUFjLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRzlGLG1CQUFpQixDQUFDLFNBQVMsQ0FBQzs7QUMvRGpFLFNBQWMsR0FBRyxpQkFBZ0I7QUFDakMsc0JBQStCLEdBQUcsaUJBQWdCO0FBQ2xELG1CQUE0QixHQUFHLGNBQWE7QUFDNUMsb0JBQTZCLEdBQUc2RixnQkFBYztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUUsZUFBRyxHQUFFO0FBQ3JCLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUM7QUFDdEIsRUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUU7QUFDckIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxhQUFhLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtBQUN6QyxFQUFFLE9BQU8sR0FBRyxPQUFPLElBQUksR0FBRTtBQUN6QixFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUU7QUFDWixFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksTUFBTSxFQUFFO0FBQ3hCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUlGLGVBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQztBQUMxRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBQztBQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQU87QUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFNO0FBQ2hDLEdBQUc7QUFDSCxFQUFFLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUMvQixFQUFFLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUMvQixJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0FBQ3JELEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBQztBQUM5QyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFDO0FBQy9DO0FBQ0EsRUFBRSxJQUFJLEVBQUM7QUFDUCxFQUFFLElBQUksT0FBTyxHQUFHO0FBQ2hCLElBQUksSUFBSSxFQUFFLEVBQUU7QUFDWixJQUFJLE1BQU0sRUFBRSxFQUFFO0FBQ2QsSUFBSSxRQUFRLEVBQUUsRUFBRTtBQUNoQixJQUFJLFVBQVUsRUFBRSxFQUFFO0FBQ2xCLElBQUc7QUFDSDtBQUNBLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JDLElBQUksT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQztBQUN0QyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUM7QUFDOUMsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSTtBQUN6QixFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQ3BDLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU07QUFDN0IsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDO0FBQzlDLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQU87QUFDL0I7QUFDQSxFQUFFLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUU7QUFDaEMsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUM7QUFDdkMsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFDO0FBQy9DLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBQztBQUM3QyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGVBQWUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQU87QUFDL0IsRUFBRSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSTtBQUN6QixFQUFFLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFNO0FBQzdCLEVBQUUsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFNBQVE7QUFDakMsRUFBRSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVTtBQUNyQztBQUNBLEVBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO0FBQ3RDLElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBQztBQUNoQyxJQUFJLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO0FBQ3pDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUM7QUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFDO0FBQ2hDLE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVE7QUFDOUIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUM7QUFDN0I7QUFDQSxJQUFJLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFDO0FBQ3ZDLElBQUksSUFBSSxJQUFJLEdBQUcsT0FBTyxNQUFLO0FBQzNCLElBQUksSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUN0RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBQztBQUNuQyxLQUFLO0FBQ0wsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLE1BQUs7QUFDckMsSUFBSSxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFDO0FBQ3pDLElBQUksSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUU7QUFDM0MsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBQztBQUN4QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUM7QUFDcEMsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVTtBQUN2QyxLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBQztBQUMvQixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0EsU0FBUyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRTtBQUMvQixFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDcEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQ3RDLEVBQUUsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksR0FBRTtBQUN2QyxFQUFFLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFJO0FBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQztBQUNYLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQztBQUNYLEVBQUUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU07QUFDN0IsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2xDLElBQUksSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBQztBQUMxQixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUM7QUFDakIsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU07QUFDekIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFDO0FBQ3RDO0FBQ0EsSUFBSSxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFNO0FBQzlELElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN4QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ2pDLFFBQVEsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBQztBQUNsRCxPQUFPO0FBQ1AsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUM7QUFDNUIsTUFBTSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUM7QUFDNUIsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBQztBQUNqQyxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFDO0FBQ2pDLE1BQU0sQ0FBQyxJQUFJLEdBQUU7QUFDYixNQUFNLENBQUMsSUFBSSxHQUFFO0FBQ2IsS0FBSztBQUNMLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ3BCLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDO0FBQ3BDLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtBQUNqQyxFQUFFLElBQUksSUFBSSxHQUFHLE9BQU8sTUFBSztBQUN6QixFQUFFLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUN6QixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFDO0FBQ2xDLEdBQUcsTUFBTSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDakMsSUFBSSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQztBQUNuQyxHQUFHLE1BQU0sSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQ2hDLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN6QixNQUFNLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFDO0FBQ3BDLEtBQUssTUFBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFDMUIsTUFBTSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQztBQUNyQyxLQUFLLE1BQU07QUFDWCxNQUFNLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFDO0FBQ3BDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7Ozs7O0FDOUtlLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQzFFLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLFFBQVEsSUFBRSxTQUFPO0FBQ3pDO0FBQ0EsSUFBSXJTLElBQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDbEM7QUFDQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRDtBQUNBLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUNEO0FBQ0EsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDbEQ7QUFDQSxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRTtBQUN6QixRQUFRLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUU7QUFDaEMsWUFBWUEsSUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdkMsWUFBWUEsSUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbkMsWUFBWUEsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxZQUFZQSxJQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hELFlBQVlBLElBQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixZQUFZQSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNFLFlBQVlBLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkYsWUFBWSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzRCxTQUFTO0FBQ1Q7QUFDQSxRQUFRQSxJQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN0QyxRQUFRRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckIsUUFBUUEsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3RCO0FBQ0EsUUFBUSxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUM7QUFDNUU7QUFDQSxRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUN0QixZQUFZLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QyxZQUFZLENBQUMsRUFBRSxDQUFDO0FBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUM7QUFDaEIsWUFBWSxPQUFPLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLEVBQUUsR0FBQztBQUNoRCxZQUFZLE9BQU8sTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsRUFBRSxHQUFDO0FBQ2hELFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFDO0FBQ3pFLGFBQWE7QUFDYixZQUFZLENBQUMsRUFBRSxDQUFDO0FBQ2hCLFlBQVksUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFDO0FBQ2xDLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekIsSUFBSUMsSUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsQ0FBQzs7QUM3RGMsU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQzdFLElBQUlBLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLElBQUlBLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN0QixJQUFJRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYjtBQUNBLElBQUksT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQ3pCLFFBQVFDLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRQSxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUUEsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksUUFBUSxFQUFFO0FBQ3RDLFlBQVksS0FBS0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEQsZ0JBQWdCLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLGdCQUFnQixDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDO0FBQzFGLGFBQWE7QUFDYixZQUFZLFNBQVM7QUFDckIsU0FBUztBQUNUO0FBQ0EsUUFBUUMsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakQ7QUFDQSxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlCO0FBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQztBQUNsRjtBQUNBLFFBQVFBLElBQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEM7QUFDQSxRQUFRLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUU7QUFDaEQsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFNBQVM7QUFDVCxRQUFRLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUU7QUFDaEQsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUIsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7O0FDekNjLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFO0FBQ2pFLElBQUlBLElBQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLElBQUlBLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN0QixJQUFJQSxJQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDekIsUUFBUUEsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVFBLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQyxRQUFRQSxJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakM7QUFDQSxRQUFRLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxRQUFRLEVBQUU7QUFDdEMsWUFBWSxLQUFLRCxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUM7QUFDaEcsYUFBYTtBQUNiLFlBQVksU0FBUztBQUNyQixTQUFTO0FBQ1Q7QUFDQSxRQUFRQyxJQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqRDtBQUNBLFFBQVFBLElBQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBUUEsSUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDO0FBQzVEO0FBQ0EsUUFBUUEsSUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QztBQUNBLFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3BELFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQyxTQUFTO0FBQ1QsUUFB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LEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RDtBQUNBLElBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtBQUN0QyxRQUFZLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMxQixRQUFZLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDekIsS0FBUyxNQUFNLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRTtBQUNwQyxRQUFZQSxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckYsUUFBWUEsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEYsUUFBWSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakQsS0FBUztBQUNUO0FBQ0EsSUFBUUEsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkQsSUFBUUEsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvQyxJQUFRQSxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9DLElBQVFBLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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QUM7QUFDdEI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QixJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3ZCLENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7QUFDekUsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxRQUFRLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN0QixRQUFRLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDM0UsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDckIsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLENBQUM7QUFDRDtBQUNBLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyQixJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDcEUsSUFB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QUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFDO0FBQ3hEO0FBQ0E7QUFDQSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QixJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzlGLFFBQVEsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDdEIsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFDeEIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDbkIsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDN0IsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDekIsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUMzRCxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25FLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqQyxJ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S0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDM0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDMUQ7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsUUFBUSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUM7QUFDL0MsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFDO0FBQy9DLFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBQztBQUMvQyxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUM7QUFDL0MsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQ3ZEO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRyxPQUFPLENB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LEVBQUUsQ0FBQztBQUNqQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDekIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFNBQVMsSUFBRTRTLFFBQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUM7QUFDekM7QUFDQSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUNEO0FBQ0EsU0FBU0EsUUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDakMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDakIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUM1RSxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsS0FBSztBQUNMLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUNoQyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzVE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QUFDLElBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBQztBQUNoRDtBQUNBO0FBQ0EsUUFBUSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTTtBQUN0RCxZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUN6QixZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUN6QixZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUN2QixZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQ3hDO0FBQ0EsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckYsUUFBUSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckYsUUFBUSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3hCO0FBQ0EsUUFBUSxJQUFJLElBQUksRUFBRTtBQUNsQixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRixZQUFZLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEtBQUssRUFBRTtBQUNuQixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRixZQUFZLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDekIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBQztBQUNuRDtBQUNBLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFELEtBQUs7QUFDTCxDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakQsSUFBSSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTztBQUM5QixRQUFRLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTTtBQUMvQixRQUFRLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQzlCO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBRSxPQUFPLElBQUksR0FBQztBQUNyQztBQUNBLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzdCO0FBQ0EsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzQixJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBRSxPQUFPNlIsYUFBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUM7QUFDakU7QUFDQSxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsSUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUM7QUFDdEU7QUFDQSxJQUFJLElBQUksRUFBRSxHQUFHLENBQUM7QUFDZCxRQUFRLEVBQUUsR0FBRyxDQUFDO0FBQ2QsUUFBUSxFQUFFLEdBQUcsQ0FBQztBQUNkLFFBQVEsTUFBTSxDQUFDO0FBQ2Y7QUFDQSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtBQUM5QixRQUFRLEVBQUUsRUFBRSxDQUFDO0FBQ2IsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBUSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlDLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUUsT0FBTyxJQUFJLEdBQUM7QUFDL0M7QUFDQTtBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBQztBQUMxRTtBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUM7QUFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RCxJQUFJ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RUFBRSxJQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFRCxHQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsWUFBWTBFLHFCQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHekUsR0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUVELEdBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixZQUFZMEUscUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTFFLEdBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRUMsR0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixZQUFZeUUscUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRzFFLEdBQUMsS0FBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFQyxHQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdGLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBSztBQUNMO0FBQ0EsMkJBQUksb0NBQWE7QUFDakIsUUFBUSxJQUFJLENBQUMsMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQzlDLE1BQUs7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O0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDbEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQ3BGLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO0FBQ3JDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQ2pDO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ25ELElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDbkQsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQztBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBQ0Q7QUFDQSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUFVLElBQUksRUFBRTtBQUN6QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQ7QUFDQSxJQUFJLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEUsSUFBSSxJQUFJLFlBQVksR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BFO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BELFFBQVEsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUYsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVGLEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUU7QUFDQSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUcsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFlBQVksQ0FBQztBQUN4QixDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0EsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzlDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkMsU0FBUztBQUNULFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsQyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3JDLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqQyxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFNBQVM7QUFDVCxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakMsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxZQUFZLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDOUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDaEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDaEI7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENB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QUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxRQUFZLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzlELFFBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUQsUUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM1RCxRQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUMvQyxRQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUM3QyxRQUFZLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFFBQVksS0FBSyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBWSxJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RCxRQUFZLEtBQUssR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELEtBQVM7QUFDVCxJQUFRQSxJQUFNLEtBQUssR0FBRztB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U0FBUyxDQUFDO0FBQzNDLFFBQVFBLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QztBQUNBLFFBQVFBLElBQU0sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUNqRCxRQUFRQSxJQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3RFLFFBQVFBLElBQU0sRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUNqRCxRQUFRQSxJQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM1RTtBQUNBLFFBQVFBLElBQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQ3BDO0FBQ0EsUUFBUSxnQkFBZ0IsQ0FBQyxJQUFJbVIsNEJBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pJLFFBQVEsZ0JBQWdCLENBQUMsSUFBSUEsNEJBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hJO0FBQ0E7QUFDQSxRQUFRLElB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LE1BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLE1BQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLE1BQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLE1BQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLE1BQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzFDLE1BQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUss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Q0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EscUJBQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EscUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EscUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EscUJBQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUMzRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EscUJBQU8sQ0FBQyxN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bUIsQ0FBQyxTQUFTLDZCQUE2QjtBQUNuRSxJQUFJaGIsSUFBTSxRQUFRLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJQSxJQUFNLEtBQUssR0FBRyxJQUFJaWIsaUNBQWlCLEVBQUUsQ0FBQztBQUMxQztBQUNBLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNsQjtBQUNBO0FBQ0EsSUFBSSxLQUFLbGIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdkMsUUFBUUMsSUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQjtBQUNBLFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxLQUFLLENB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QUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFZLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25FLEtBQVM7QUFDVDtBQUNBLElBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO0FBQzNCLFFBQVlBLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDM0MsUUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFZLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFFBQVksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkUsS0FBUztBQUNUO0FBQ0EsSUFBUUEsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNqQztBQUNBO0FBQ0EsSUFBUUEsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM3QztBQUNBLElBQVEsSUFBSSxDQUFDLEVBQUU7QUFDZixRQUFZLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJcUIsaUJBQUs7QUFDbEQsWUFBZ0IsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDaEQsWUFBZ0IsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFB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QUcsV0FBVyxHQUFHLGNBQWMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlLLElBQVExVyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ2pDLElBQVFBLElBQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkM7QUFDQTtBQUNBLElBQVFBLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0FBQzVIO0FBQ0EsSUFBUUEsSUFBTSxJQUFJLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFRQSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUN2QztBQUNBO0FBQ0EsSUFBUUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckMsSUFBUXVkLHVCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUU7QUFDQTtBQUNBLElBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUMxQyxJQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzFDO0FBQ0EsSUFBUTNILGlCQUFVLENBQUMs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RSxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoQyxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQUksMEJBQU8sT0FBTyxxQkFBcUIsU0FBUyxXQUFXO0FBQzNELFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1RCxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBSSw0QkFBUSxPQUFPLHFCQUFxQixTQUFTLFdBQVc7QUFDNUQsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzVELFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFJLDRDQUFxQixFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQUksa0NBQVcsT0FBTyxVQUFVLFNBQVMsV0FBVztBQUNwRCxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQyxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxQyxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLE1BQUs7QUFDTDtBQUNB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SCxZQUFZLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsU0FBUztBQUNUO0FBQ0EsUUFBUSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDckUsUUFBUSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDckUsUUFBUSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN0RDtBQUNBO0FBQ0EsUUFBUUEsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLFFBQVFELElBQUksQ0FBQywwQkFBMEIsVUFBVSxDQUFDLEVBQUU7QUFDcEQsWUFBWSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNuRCxTQUFTLENBQUM7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRQSxJQUFJLENBQUMsMEJBQTBCLFVBQVUsQ0FBQyxFQUFFO0FBQ3BELFlBQVksT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FB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OUI7QUFDRDtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xzQkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBM1QsSUFBTTBmLGdCQUFjLFlBQVk7QUFDaEMsSUFBSSxRQUFRLEVBQUUsR0FBRztBQUNqQixJQUFJLElBQUksRUFBRSxRQUFRO0FBQ2xCLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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